define([], function() {
  'use strict';
  const dart = Object.create(null);
  const dartx = Object.create(null);
  const _debugger = Object.create(null);
  const _foreign_helper = Object.create(null);
  const _interceptors = Object.create(null);
  const _internal = Object.create(null);
  const _isolate_helper = Object.create(null);
  const _js_embedded_names = Object.create(null);
  const _js_helper = Object.create(null);
  const _js_mirrors = Object.create(null);
  const _js_primitives = Object.create(null);
  const _metadata = Object.create(null);
  const _native_typed_data = Object.create(null);
  const async = Object.create(null);
  const collection = Object.create(null);
  const convert = Object.create(null);
  const core = Object.create(null);
  const developer = Object.create(null);
  const isolate = Object.create(null);
  const js = Object.create(null);
  const js_util = Object.create(null);
  const math = Object.create(null);
  const mirrors = Object.create(null);
  const typed_data = Object.create(null);
  const indexed_db = Object.create(null);
  const html$ = Object.create(null);
  const html_common = Object.create(null);
  const svg$ = Object.create(null);
  const web_audio = Object.create(null);
  const web_gl = Object.create(null);
  const web_sql = Object.create(null);
  let ListOfObject = () => (ListOfObject = dart.constFn(core.List$(core.Object)))();
  let JSArrayOfListOfObject = () => (JSArrayOfListOfObject = dart.constFn(_interceptors.JSArray$(ListOfObject())))();
  let JSArrayOfObject = () => (JSArrayOfObject = dart.constFn(_interceptors.JSArray$(core.Object)))();
  let MapOfSymbol$dynamic = () => (MapOfSymbol$dynamic = dart.constFn(core.Map$(core.Symbol, dart.dynamic)))();
  let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
  let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
  let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
  let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
  let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
  let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
  let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
  let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
  let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
  let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
  let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
  let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
  let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
  let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
  let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
  let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
  let JSMutableArray = () => (JSMutableArray = dart.constFn(_interceptors.JSMutableArray$()))();
  let JSFixedArray = () => (JSFixedArray = dart.constFn(_interceptors.JSFixedArray$()))();
  let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
  let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
  let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
  let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
  let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
  let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
  let ComparableOfnum = () => (ComparableOfnum = dart.constFn(core.Comparable$(core.num)))();
  let StringTonum = () => (StringTonum = dart.constFn(dart.functionType(core.num, [core.String])))();
  let StringTodouble = () => (StringTodouble = dart.constFn(dart.functionType(core.double, [core.String])))();
  let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.functionType(core.bool, [dart.dynamic])))();
  let ListMixin = () => (ListMixin = dart.constFn(collection.ListMixin$()))();
  let ListBase = () => (ListBase = dart.constFn(collection.ListBase$()))();
  let UnmodifiableListMixin = () => (UnmodifiableListMixin = dart.constFn(_internal.UnmodifiableListMixin$()))();
  let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
  let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
  let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
  let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
  let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
  let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
  let _Transformation = () => (_Transformation = dart.constFn(_internal._Transformation$()))();
  let MappedIterable = () => (MappedIterable = dart.constFn(_internal.MappedIterable$()))();
  let EfficientLengthMappedIterable = () => (EfficientLengthMappedIterable = dart.constFn(_internal.EfficientLengthMappedIterable$()))();
  let Iterator = () => (Iterator = dart.constFn(core.Iterator$()))();
  let MappedIterator = () => (MappedIterator = dart.constFn(_internal.MappedIterator$()))();
  let MappedListIterable = () => (MappedListIterable = dart.constFn(_internal.MappedListIterable$()))();
  let _ElementPredicate = () => (_ElementPredicate = dart.constFn(_internal._ElementPredicate$()))();
  let WhereIterable = () => (WhereIterable = dart.constFn(_internal.WhereIterable$()))();
  let WhereIterator = () => (WhereIterator = dart.constFn(_internal.WhereIterator$()))();
  let _ExpandFunction = () => (_ExpandFunction = dart.constFn(_internal._ExpandFunction$()))();
  let ExpandIterable = () => (ExpandIterable = dart.constFn(_internal.ExpandIterable$()))();
  let ExpandIterator = () => (ExpandIterator = dart.constFn(_internal.ExpandIterator$()))();
  let TakeIterable = () => (TakeIterable = dart.constFn(_internal.TakeIterable$()))();
  let EfficientLengthTakeIterable = () => (EfficientLengthTakeIterable = dart.constFn(_internal.EfficientLengthTakeIterable$()))();
  let TakeIterator = () => (TakeIterator = dart.constFn(_internal.TakeIterator$()))();
  let TakeWhileIterable = () => (TakeWhileIterable = dart.constFn(_internal.TakeWhileIterable$()))();
  let TakeWhileIterator = () => (TakeWhileIterator = dart.constFn(_internal.TakeWhileIterator$()))();
  let SkipIterable = () => (SkipIterable = dart.constFn(_internal.SkipIterable$()))();
  let EfficientLengthSkipIterable = () => (EfficientLengthSkipIterable = dart.constFn(_internal.EfficientLengthSkipIterable$()))();
  let SkipIterator = () => (SkipIterator = dart.constFn(_internal.SkipIterator$()))();
  let SkipWhileIterable = () => (SkipWhileIterable = dart.constFn(_internal.SkipWhileIterable$()))();
  let SkipWhileIterator = () => (SkipWhileIterator = dart.constFn(_internal.SkipWhileIterator$()))();
  let EmptyIterable = () => (EmptyIterable = dart.constFn(_internal.EmptyIterable$()))();
  let EmptyIterator = () => (EmptyIterator = dart.constFn(_internal.EmptyIterator$()))();
  let FixedLengthListMixin = () => (FixedLengthListMixin = dart.constFn(_internal.FixedLengthListMixin$()))();
  let FixedLengthListBase = () => (FixedLengthListBase = dart.constFn(_internal.FixedLengthListBase$()))();
  let ListMapView = () => (ListMapView = dart.constFn(_internal.ListMapView$()))();
  let ReversedListIterable = () => (ReversedListIterable = dart.constFn(_internal.ReversedListIterable$()))();
  let MapOfint$_IsolateContext = () => (MapOfint$_IsolateContext = dart.constFn(core.Map$(core.int, _isolate_helper._IsolateContext)))();
  let MapOfint$dynamic = () => (MapOfint$dynamic = dart.constFn(core.Map$(core.int, dart.dynamic)))();
  let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
  let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
  let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
  let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
  let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
  let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
  let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
  let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
  let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic])))();
  let StringTovoid = () => (StringTovoid = dart.constFn(dart.functionType(dart.void, [core.String])))();
  let ExpandoOfint = () => (ExpandoOfint = dart.constFn(core.Expando$(core.int)))();
  let _FutureOfString = () => (_FutureOfString = dart.constFn(async._Future$(core.String)))();
  let _FutureOfbool = () => (_FutureOfbool = dart.constFn(async._Future$(core.bool)))();
  let _FutureOfint = () => (_FutureOfint = dart.constFn(async._Future$(core.int)))();
  let VoidToObject = () => (VoidToObject = dart.constFn(dart.functionType(core.Object, [])))();
  let Stream = () => (Stream = dart.constFn(async.Stream$()))();
  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.functionType(dart.void, [])))();
  let TimerTovoid = () => (TimerTovoid = dart.constFn(dart.functionType(dart.void, [async.Timer])))();
  let MapOfdynamic$int = () => (MapOfdynamic$int = dart.constFn(core.Map$(dart.dynamic, core.int)))();
  let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic])))();
  let InternalMap = () => (InternalMap = dart.constFn(_js_helper.InternalMap$()))();
  let JSArrayOfint = () => (JSArrayOfint = dart.constFn(_interceptors.JSArray$(core.int)))();
  let ListOfint = () => (ListOfint = dart.constFn(core.List$(core.int)))();
  let SyncIterator = () => (SyncIterator = dart.constFn(_js_helper.SyncIterator$()))();
  let IterableBase = () => (IterableBase = dart.constFn(collection.IterableBase$()))();
  let SyncIterable = () => (SyncIterable = dart.constFn(_js_helper.SyncIterable$()))();
  let JsLinkedHashMap = () => (JsLinkedHashMap = dart.constFn(_js_helper.JsLinkedHashMap$()))();
  let Es6LinkedHashMap = () => (Es6LinkedHashMap = dart.constFn(_js_helper.Es6LinkedHashMap$()))();
  let LinkedHashMapCell = () => (LinkedHashMapCell = dart.constFn(_js_helper.LinkedHashMapCell$()))();
  let LinkedHashMapKeyIterable = () => (LinkedHashMapKeyIterable = dart.constFn(_js_helper.LinkedHashMapKeyIterable$()))();
  let LinkedHashMapKeyIterator = () => (LinkedHashMapKeyIterator = dart.constFn(_js_helper.LinkedHashMapKeyIterator$()))();
  let IteratorOfMatch = () => (IteratorOfMatch = dart.constFn(core.Iterator$(core.Match)))();
  let IterableOfMatch = () => (IterableOfMatch = dart.constFn(core.Iterable$(core.Match)))();
  let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
  let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
  let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
  let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
  let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
  let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
  let JSArrayOfClassMirror = () => (JSArrayOfClassMirror = dart.constFn(_interceptors.JSArray$(mirrors.ClassMirror)))();
  let ListOfClassMirror = () => (ListOfClassMirror = dart.constFn(core.List$(mirrors.ClassMirror)))();
  let ListOfTypeVariableMirror = () => (ListOfTypeVariableMirror = dart.constFn(core.List$(mirrors.TypeVariableMirror)))();
  let MapOfSymbol$MethodMirror = () => (MapOfSymbol$MethodMirror = dart.constFn(core.Map$(core.Symbol, mirrors.MethodMirror)))();
  let JSArrayOfType = () => (JSArrayOfType = dart.constFn(_interceptors.JSArray$(core.Type)))();
  let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
  let ListOfFloat32x4 = () => (ListOfFloat32x4 = dart.constFn(core.List$(typed_data.Float32x4)))();
  let ListOfInt32x4 = () => (ListOfInt32x4 = dart.constFn(core.List$(typed_data.Int32x4)))();
  let ListOfFloat64x2 = () => (ListOfFloat64x2 = dart.constFn(core.List$(typed_data.Float64x2)))();
  let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
  let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
  let ListOfdouble = () => (ListOfdouble = dart.constFn(core.List$(core.double)))();
  let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
  let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
  let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
  let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
  let ZoneBinaryCallbackOfdynamic$Object$StackTrace = () => (ZoneBinaryCallbackOfdynamic$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, core.Object, core.StackTrace)))();
  let _BufferingStreamSubscription = () => (_BufferingStreamSubscription = dart.constFn(async._BufferingStreamSubscription$()))();
  let _ControllerSubscription = () => (_ControllerSubscription = dart.constFn(async._ControllerSubscription$()))();
  let _BroadcastSubscription = () => (_BroadcastSubscription = dart.constFn(async._BroadcastSubscription$()))();
  let _BroadcastStreamController = () => (_BroadcastStreamController = dart.constFn(async._BroadcastStreamController$()))();
  let _SyncBroadcastStreamController = () => (_SyncBroadcastStreamController = dart.constFn(async._SyncBroadcastStreamController$()))();
  let _AsyncBroadcastStreamController = () => (_AsyncBroadcastStreamController = dart.constFn(async._AsyncBroadcastStreamController$()))();
  let _AsBroadcastStreamController = () => (_AsBroadcastStreamController = dart.constFn(async._AsBroadcastStreamController$()))();
  let _DoneSubscription = () => (_DoneSubscription = dart.constFn(async._DoneSubscription$()))();
  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.functionType(dart.dynamic, [])))();
  let Future = () => (Future = dart.constFn(async.Future$()))();
  let Completer = () => (Completer = dart.constFn(async.Completer$()))();
  let _FutureOnValue = () => (_FutureOnValue = dart.constFn(async._FutureOnValue$()))();
  let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
  let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
  let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
  let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
  let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
  let _Future = () => (_Future = dart.constFn(async._Future$()))();
  let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
  let EventSink = () => (EventSink = dart.constFn(async.EventSink$()))();
  let StreamView = () => (StreamView = dart.constFn(async.StreamView$()))();
  let StreamConsumer = () => (StreamConsumer = dart.constFn(async.StreamConsumer$()))();
  let StreamSink = () => (StreamSink = dart.constFn(async.StreamSink$()))();
  let StreamTransformer = () => (StreamTransformer = dart.constFn(async.StreamTransformer$()))();
  let StreamIterator = () => (StreamIterator = dart.constFn(async.StreamIterator$()))();
  let _ControllerEventSinkWrapper = () => (_ControllerEventSinkWrapper = dart.constFn(async._ControllerEventSinkWrapper$()))();
  let StreamController = () => (StreamController = dart.constFn(async.StreamController$()))();
  let SynchronousStreamController = () => (SynchronousStreamController = dart.constFn(async.SynchronousStreamController$()))();
  let _StreamControllerLifecycle = () => (_StreamControllerLifecycle = dart.constFn(async._StreamControllerLifecycle$()))();
  let _StreamController = () => (_StreamController = dart.constFn(async._StreamController$()))();
  let _SyncStreamControllerDispatch = () => (_SyncStreamControllerDispatch = dart.constFn(async._SyncStreamControllerDispatch$()))();
  let _AsyncStreamControllerDispatch = () => (_AsyncStreamControllerDispatch = dart.constFn(async._AsyncStreamControllerDispatch$()))();
  let _AsyncStreamController = () => (_AsyncStreamController = dart.constFn(async._AsyncStreamController$()))();
  let _SyncStreamController = () => (_SyncStreamController = dart.constFn(async._SyncStreamController$()))();
  let _StreamSinkWrapper = () => (_StreamSinkWrapper = dart.constFn(async._StreamSinkWrapper$()))();
  let _AddStreamState = () => (_AddStreamState = dart.constFn(async._AddStreamState$()))();
  let _StreamControllerAddStreamState = () => (_StreamControllerAddStreamState = dart.constFn(async._StreamControllerAddStreamState$()))();
  let _EventSink = () => (_EventSink = dart.constFn(async._EventSink$()))();
  let _EventDispatch = () => (_EventDispatch = dart.constFn(async._EventDispatch$()))();
  let _EventGenerator = () => (_EventGenerator = dart.constFn(async._EventGenerator$()))();
  let _GeneratedStreamImpl = () => (_GeneratedStreamImpl = dart.constFn(async._GeneratedStreamImpl$()))();
  let _PendingEvents = () => (_PendingEvents = dart.constFn(async._PendingEvents$()))();
  let _IterablePendingEvents = () => (_IterablePendingEvents = dart.constFn(async._IterablePendingEvents$()))();
  let _DataHandler = () => (_DataHandler = dart.constFn(async._DataHandler$()))();
  let _DelayedEvent = () => (_DelayedEvent = dart.constFn(async._DelayedEvent$()))();
  let _DelayedData = () => (_DelayedData = dart.constFn(async._DelayedData$()))();
  let _StreamImplEvents = () => (_StreamImplEvents = dart.constFn(async._StreamImplEvents$()))();
  let _BroadcastCallback = () => (_BroadcastCallback = dart.constFn(async._BroadcastCallback$()))();
  let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
  let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
  let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
  let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
  let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
  let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
  let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
  let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
  let _WhereStream = () => (_WhereStream = dart.constFn(async._WhereStream$()))();
  let _Transformation$ = () => (_Transformation$ = dart.constFn(async._Transformation$()))();
  let _MapStream = () => (_MapStream = dart.constFn(async._MapStream$()))();
  let _ExpandStream = () => (_ExpandStream = dart.constFn(async._ExpandStream$()))();
  let _HandleErrorStream = () => (_HandleErrorStream = dart.constFn(async._HandleErrorStream$()))();
  let _TakeStream = () => (_TakeStream = dart.constFn(async._TakeStream$()))();
  let _StateStreamSubscription = () => (_StateStreamSubscription = dart.constFn(async._StateStreamSubscription$()))();
  let _TakeWhileStream = () => (_TakeWhileStream = dart.constFn(async._TakeWhileStream$()))();
  let _SkipStream = () => (_SkipStream = dart.constFn(async._SkipStream$()))();
  let _SkipWhileStream = () => (_SkipWhileStream = dart.constFn(async._SkipWhileStream$()))();
  let _Equality = () => (_Equality = dart.constFn(async._Equality$()))();
  let _DistinctStream = () => (_DistinctStream = dart.constFn(async._DistinctStream$()))();
  let _EventSinkWrapper = () => (_EventSinkWrapper = dart.constFn(async._EventSinkWrapper$()))();
  let _SinkTransformerStreamSubscription = () => (_SinkTransformerStreamSubscription = dart.constFn(async._SinkTransformerStreamSubscription$()))();
  let _SinkMapper = () => (_SinkMapper = dart.constFn(async._SinkMapper$()))();
  let _StreamSinkTransformer = () => (_StreamSinkTransformer = dart.constFn(async._StreamSinkTransformer$()))();
  let _BoundSinkStream = () => (_BoundSinkStream = dart.constFn(async._BoundSinkStream$()))();
  let _TransformDataHandler = () => (_TransformDataHandler = dart.constFn(async._TransformDataHandler$()))();
  let _TransformErrorHandler = () => (_TransformErrorHandler = dart.constFn(async._TransformErrorHandler$()))();
  let _TransformDoneHandler = () => (_TransformDoneHandler = dart.constFn(async._TransformDoneHandler$()))();
  let _HandlerEventSink = () => (_HandlerEventSink = dart.constFn(async._HandlerEventSink$()))();
  let _StreamHandlerTransformer = () => (_StreamHandlerTransformer = dart.constFn(async._StreamHandlerTransformer$()))();
  let _SubscriptionTransformer = () => (_SubscriptionTransformer = dart.constFn(async._SubscriptionTransformer$()))();
  let _StreamSubscriptionTransformer = () => (_StreamSubscriptionTransformer = dart.constFn(async._StreamSubscriptionTransformer$()))();
  let _BoundSubscriptionStream = () => (_BoundSubscriptionStream = dart.constFn(async._BoundSubscriptionStream$()))();
  let ZoneCallback = () => (ZoneCallback = dart.constFn(async.ZoneCallback$()))();
  let ZoneUnaryCallback = () => (ZoneUnaryCallback = dart.constFn(async.ZoneUnaryCallback$()))();
  let ZoneBinaryCallback = () => (ZoneBinaryCallback = dart.constFn(async.ZoneBinaryCallback$()))();
  let HandleUncaughtErrorHandler = () => (HandleUncaughtErrorHandler = dart.constFn(async.HandleUncaughtErrorHandler$()))();
  let RunHandler = () => (RunHandler = dart.constFn(async.RunHandler$()))();
  let RunUnaryHandler = () => (RunUnaryHandler = dart.constFn(async.RunUnaryHandler$()))();
  let RunBinaryHandler = () => (RunBinaryHandler = dart.constFn(async.RunBinaryHandler$()))();
  let RegisterCallbackHandler = () => (RegisterCallbackHandler = dart.constFn(async.RegisterCallbackHandler$()))();
  let RegisterUnaryCallbackHandler = () => (RegisterUnaryCallbackHandler = dart.constFn(async.RegisterUnaryCallbackHandler$()))();
  let RegisterBinaryCallbackHandler = () => (RegisterBinaryCallbackHandler = dart.constFn(async.RegisterBinaryCallbackHandler$()))();
  let _ZoneFunction = () => (_ZoneFunction = dart.constFn(async._ZoneFunction$()))();
  let _ZoneFunctionOfRunHandler = () => (_ZoneFunctionOfRunHandler = dart.constFn(async._ZoneFunction$(async.RunHandler)))();
  let _ZoneFunctionOfRunUnaryHandler = () => (_ZoneFunctionOfRunUnaryHandler = dart.constFn(async._ZoneFunction$(async.RunUnaryHandler)))();
  let _ZoneFunctionOfRunBinaryHandler = () => (_ZoneFunctionOfRunBinaryHandler = dart.constFn(async._ZoneFunction$(async.RunBinaryHandler)))();
  let _ZoneFunctionOfRegisterCallbackHandler = () => (_ZoneFunctionOfRegisterCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterCallbackHandler)))();
  let _ZoneFunctionOfRegisterUnaryCallbackHandler = () => (_ZoneFunctionOfRegisterUnaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterUnaryCallbackHandler)))();
  let _ZoneFunctionOfRegisterBinaryCallbackHandler = () => (_ZoneFunctionOfRegisterBinaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterBinaryCallbackHandler)))();
  let _ZoneFunctionOfErrorCallbackHandler = () => (_ZoneFunctionOfErrorCallbackHandler = dart.constFn(async._ZoneFunction$(async.ErrorCallbackHandler)))();
  let _ZoneFunctionOfScheduleMicrotaskHandler = () => (_ZoneFunctionOfScheduleMicrotaskHandler = dart.constFn(async._ZoneFunction$(async.ScheduleMicrotaskHandler)))();
  let _ZoneFunctionOfCreateTimerHandler = () => (_ZoneFunctionOfCreateTimerHandler = dart.constFn(async._ZoneFunction$(async.CreateTimerHandler)))();
  let _ZoneFunctionOfCreatePeriodicTimerHandler = () => (_ZoneFunctionOfCreatePeriodicTimerHandler = dart.constFn(async._ZoneFunction$(async.CreatePeriodicTimerHandler)))();
  let _ZoneFunctionOfPrintHandler = () => (_ZoneFunctionOfPrintHandler = dart.constFn(async._ZoneFunction$(async.PrintHandler)))();
  let _ZoneFunctionOfForkHandler = () => (_ZoneFunctionOfForkHandler = dart.constFn(async._ZoneFunction$(async.ForkHandler)))();
  let _ZoneFunctionOfHandleUncaughtErrorHandler = () => (_ZoneFunctionOfHandleUncaughtErrorHandler = dart.constFn(async._ZoneFunction$(async.HandleUncaughtErrorHandler)))();
  let _HashMap = () => (_HashMap = dart.constFn(collection._HashMap$()))();
  let _IdentityHashMap = () => (_IdentityHashMap = dart.constFn(collection._IdentityHashMap$()))();
  let _PredicateOfObject = () => (_PredicateOfObject = dart.constFn(collection._Predicate$(core.Object)))();
  let _CustomHashMap = () => (_CustomHashMap = dart.constFn(collection._CustomHashMap$()))();
  let _HashMapKeyIterable = () => (_HashMapKeyIterable = dart.constFn(collection._HashMapKeyIterable$()))();
  let _HashMapKeyIterator = () => (_HashMapKeyIterator = dart.constFn(collection._HashMapKeyIterator$()))();
  let _LinkedIdentityHashMap = () => (_LinkedIdentityHashMap = dart.constFn(collection._LinkedIdentityHashMap$()))();
  let _Es6LinkedIdentityHashMap = () => (_Es6LinkedIdentityHashMap = dart.constFn(collection._Es6LinkedIdentityHashMap$()))();
  let _Es6MapIterable = () => (_Es6MapIterable = dart.constFn(collection._Es6MapIterable$()))();
  let _Es6MapIterator = () => (_Es6MapIterator = dart.constFn(collection._Es6MapIterator$()))();
  let _LinkedCustomHashMap = () => (_LinkedCustomHashMap = dart.constFn(collection._LinkedCustomHashMap$()))();
  let IterableOfObject = () => (IterableOfObject = dart.constFn(core.Iterable$(core.Object)))();
  let SetOfObject = () => (SetOfObject = dart.constFn(core.Set$(core.Object)))();
  let SetMixin = () => (SetMixin = dart.constFn(collection.SetMixin$()))();
  let SetBase = () => (SetBase = dart.constFn(collection.SetBase$()))();
  let _HashSetBase = () => (_HashSetBase = dart.constFn(collection._HashSetBase$()))();
  let _HashSet = () => (_HashSet = dart.constFn(collection._HashSet$()))();
  let _IdentityHashSet = () => (_IdentityHashSet = dart.constFn(collection._IdentityHashSet$()))();
  let _CustomHashSet = () => (_CustomHashSet = dart.constFn(collection._CustomHashSet$()))();
  let _HashSetIterator = () => (_HashSetIterator = dart.constFn(collection._HashSetIterator$()))();
  let _LinkedHashSet = () => (_LinkedHashSet = dart.constFn(collection._LinkedHashSet$()))();
  let _LinkedIdentityHashSet = () => (_LinkedIdentityHashSet = dart.constFn(collection._LinkedIdentityHashSet$()))();
  let _LinkedCustomHashSet = () => (_LinkedCustomHashSet = dart.constFn(collection._LinkedCustomHashSet$()))();
  let _LinkedHashSetCell = () => (_LinkedHashSetCell = dart.constFn(collection._LinkedHashSetCell$()))();
  let _LinkedHashSetIterator = () => (_LinkedHashSetIterator = dart.constFn(collection._LinkedHashSetIterator$()))();
  let UnmodifiableListView = () => (UnmodifiableListView = dart.constFn(collection.UnmodifiableListView$()))();
  let _Equality$ = () => (_Equality$ = dart.constFn(collection._Equality$()))();
  let _Hasher = () => (_Hasher = dart.constFn(collection._Hasher$()))();
  let HashMap = () => (HashMap = dart.constFn(collection.HashMap$()))();
  let HashSet = () => (HashSet = dart.constFn(collection.HashSet$()))();
  let IterableMixin = () => (IterableMixin = dart.constFn(collection.IterableMixin$()))();
  let HasNextIterator = () => (HasNextIterator = dart.constFn(collection.HasNextIterator$()))();
  let LinkedHashMap = () => (LinkedHashMap = dart.constFn(collection.LinkedHashMap$()))();
  let LinkedHashSet = () => (LinkedHashSet = dart.constFn(collection.LinkedHashSet$()))();
  let LinkedList = () => (LinkedList = dart.constFn(collection.LinkedList$()))();
  let _LinkedListIterator = () => (_LinkedListIterator = dart.constFn(collection._LinkedListIterator$()))();
  let LinkedListEntry = () => (LinkedListEntry = dart.constFn(collection.LinkedListEntry$()))();
  let MapMixin = () => (MapMixin = dart.constFn(collection.MapMixin$()))();
  let MapBase = () => (MapBase = dart.constFn(collection.MapBase$()))();
  let _UnmodifiableMapMixin = () => (_UnmodifiableMapMixin = dart.constFn(collection._UnmodifiableMapMixin$()))();
  let UnmodifiableMapBase = () => (UnmodifiableMapBase = dart.constFn(collection.UnmodifiableMapBase$()))();
  let _MapBaseValueIterable = () => (_MapBaseValueIterable = dart.constFn(collection._MapBaseValueIterable$()))();
  let _MapBaseValueIterator = () => (_MapBaseValueIterator = dart.constFn(collection._MapBaseValueIterator$()))();
  let MapView = () => (MapView = dart.constFn(collection.MapView$()))();
  let UnmodifiableMapView = () => (UnmodifiableMapView = dart.constFn(collection.UnmodifiableMapView$()))();
  let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic, dart.dynamic])))();
  let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
  let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
  let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
  let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
  let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
  let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
  let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
  let DoubleLinkedQueue = () => (DoubleLinkedQueue = dart.constFn(collection.DoubleLinkedQueue$()))();
  let _DoubleLinkedQueueIterator = () => (_DoubleLinkedQueueIterator = dart.constFn(collection._DoubleLinkedQueueIterator$()))();
  let ListQueue = () => (ListQueue = dart.constFn(collection.ListQueue$()))();
  let _ListQueueIterator = () => (_ListQueueIterator = dart.constFn(collection._ListQueueIterator$()))();
  let _Predicate$ = () => (_Predicate$ = dart.constFn(collection._Predicate$()))();
  let _SplayTreeNode = () => (_SplayTreeNode = dart.constFn(collection._SplayTreeNode$()))();
  let _SplayTreeMapNode = () => (_SplayTreeMapNode = dart.constFn(collection._SplayTreeMapNode$()))();
  let _SplayTree = () => (_SplayTree = dart.constFn(collection._SplayTree$()))();
  let _TypeTest = () => (_TypeTest = dart.constFn(collection._TypeTest$()))();
  let SplayTreeMap = () => (SplayTreeMap = dart.constFn(collection.SplayTreeMap$()))();
  let _SplayTreeIterator = () => (_SplayTreeIterator = dart.constFn(collection._SplayTreeIterator$()))();
  let _SplayTreeKeyIterable = () => (_SplayTreeKeyIterable = dart.constFn(collection._SplayTreeKeyIterable$()))();
  let _SplayTreeValueIterable = () => (_SplayTreeValueIterable = dart.constFn(collection._SplayTreeValueIterable$()))();
  let _SplayTreeKeyIterator = () => (_SplayTreeKeyIterator = dart.constFn(collection._SplayTreeKeyIterator$()))();
  let _SplayTreeValueIterator = () => (_SplayTreeValueIterator = dart.constFn(collection._SplayTreeValueIterator$()))();
  let _SplayTreeNodeIterator = () => (_SplayTreeNodeIterator = dart.constFn(collection._SplayTreeNodeIterator$()))();
  let SplayTreeSet = () => (SplayTreeSet = dart.constFn(collection.SplayTreeSet$()))();
  let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
  let MappedIterableOfString$dynamic = () => (MappedIterableOfString$dynamic = dart.constFn(_internal.MappedIterable$(core.String, dart.dynamic)))();
  let SinkOfObject = () => (SinkOfObject = dart.constFn(core.Sink$(core.Object)))();
  let Codec = () => (Codec = dart.constFn(convert.Codec$()))();
  let ComparableOfString = () => (ComparableOfString = dart.constFn(core.Comparable$(core.String)))();
  let List = () => (List = dart.constFn(core.List$()))();
  let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
  let MapOfString$Encoding = () => (MapOfString$Encoding = dart.constFn(core.Map$(core.String, convert.Encoding)))();
  let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
  let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
  let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
  let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
  let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
  let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.functionType(dart.void, [ListOfint()])))();
  let _ChunkedConversionCallback = () => (_ChunkedConversionCallback = dart.constFn(convert._ChunkedConversionCallback$()))();
  let ChunkedConverter = () => (ChunkedConverter = dart.constFn(convert.ChunkedConverter$()))();
  let _SimpleCallbackSink = () => (_SimpleCallbackSink = dart.constFn(convert._SimpleCallbackSink$()))();
  let _ConverterStreamEventSink = () => (_ConverterStreamEventSink = dart.constFn(convert._ConverterStreamEventSink$()))();
  let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
  let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
  let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
  let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
  let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
  let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
  let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
  let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
  let Comparator = () => (Comparator = dart.constFn(core.Comparator$()))();
  let Comparable = () => (Comparable = dart.constFn(core.Comparable$()))();
  let ComparableOfDateTime = () => (ComparableOfDateTime = dart.constFn(core.Comparable$(core.DateTime)))();
  let ComparableOfDuration = () => (ComparableOfDuration = dart.constFn(core.Comparable$(core.Duration)))();
  let Expando = () => (Expando = dart.constFn(core.Expando$()))();
  let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
  let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
  let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
  let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
  let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
  let Set = () => (Set = dart.constFn(core.Set$()))();
  let Sink = () => (Sink = dart.constFn(core.Sink$()))();
  let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
  let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
  let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
  let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
  let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
  let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
  let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
  let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
  let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
  let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
  let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
  let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
  let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
  let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
  let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
  let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
  let Point$ = () => (Point$ = dart.constFn(math.Point$()))();
  let RectangleOfnum = () => (RectangleOfnum = dart.constFn(math.Rectangle$(core.num)))();
  let _RectangleBase = () => (_RectangleBase = dart.constFn(math._RectangleBase$()))();
  let Rectangle = () => (Rectangle = dart.constFn(math.Rectangle$()))();
  let MutableRectangle = () => (MutableRectangle = dart.constFn(math.MutableRectangle$()))();
  let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html$.EventStreamProvider$(html$.Event)))();
  let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html$.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
  let FutureOfDatabase = () => (FutureOfDatabase = dart.constFn(async.Future$(indexed_db.Database)))();
  let CompleterOfIdbFactory = () => (CompleterOfIdbFactory = dart.constFn(async.Completer$(indexed_db.IdbFactory)))();
  let FutureOfIdbFactory = () => (FutureOfIdbFactory = dart.constFn(async.Future$(indexed_db.IdbFactory)))();
  let FutureOfListOfString = () => (FutureOfListOfString = dart.constFn(async.Future$(ListOfString())))();
  let EventTovoid = () => (EventTovoid = dart.constFn(dart.functionType(dart.void, [html$.Event])))();
  let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
  let CompleterOfDatabase = () => (CompleterOfDatabase = dart.constFn(async.Completer$(indexed_db.Database)))();
  let ListOfEventTarget = () => (ListOfEventTarget = dart.constFn(core.List$(html$.EventTarget)))();
  let RectangleOfint = () => (RectangleOfint = dart.constFn(math.Rectangle$(core.int)))();
  let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html$.Node)))();
  let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html$.Node)))();
  let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html$.Element)))();
  let IterableOfMapOfString$dynamic = () => (IterableOfMapOfString$dynamic = dart.constFn(core.Iterable$(MapOfString$dynamic())))();
  let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html$.EventStreamProvider$(html$.WheelEvent)))();
  let EventStreamProviderOfTransitionEvent = () => (EventStreamProviderOfTransitionEvent = dart.constFn(html$.EventStreamProvider$(html$.TransitionEvent)))();
  let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html$.EventStreamProvider$(html$.MouseEvent)))();
  let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html$.EventStreamProvider$(html$.ClipboardEvent)))();
  let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyboardEvent)))();
  let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html$.EventStreamProvider$(html$.TouchEvent)))();
  let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.WheelEvent)))();
  let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.TransitionEvent)))();
  let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html$.Entry)))();
  let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html$.EventStreamProvider$(html$.ProgressEvent)))();
  let EventStreamProviderOfMediaKeyEvent = () => (EventStreamProviderOfMediaKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaKeyEvent)))();
  let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MessageEvent)))();
  let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html$.EventStreamProvider$(html$.PopStateEvent)))();
  let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html$.EventStreamProvider$(html$.StorageEvent)))();
  let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html$.EventStreamProvider$(web_gl.ContextEvent)))();
  let ListOfnum = () => (ListOfnum = dart.constFn(core.List$(core.num)))();
  let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html$.MessagePort)))();
  let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html$.FileSystem)))();
  let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html$.Entry)))();
  let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html$.CssRule)))();
  let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html$.Element)))();
  let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html$.CssStyleDeclaration)))();
  let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html$.File)))();
  let CompleterOfString = () => (CompleterOfString = dart.constFn(async.Completer$(core.String)))();
  let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html$.Metadata)))();
  let CompleterOfListOfEntry = () => (CompleterOfListOfEntry = dart.constFn(async.Completer$(ListOfEntry())))();
  let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
  let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
  let ImmutableListMixin = () => (ImmutableListMixin = dart.constFn(html$.ImmutableListMixin$()))();
  let ElementAndElementToint = () => (ElementAndElementToint = dart.constFn(dart.functionType(core.int, [html$.Element, html$.Element])))();
  let ElementTobool = () => (ElementTobool = dart.constFn(dart.functionType(core.bool, [html$.Element])))();
  let ElementList = () => (ElementList = dart.constFn(html$.ElementList$()))();
  let _FrozenElementList = () => (_FrozenElementList = dart.constFn(html$._FrozenElementList$()))();
  let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html$._EventStream$(html$.Event)))();
  let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.Event)))();
  let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html$.FileWriter)))();
  let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(html$.File)))();
  let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html$.FontFace)))();
  let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html$.GamepadButton)))();
  let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html$.Geoposition)))();
  let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
  let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
  let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
  let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
  let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
  let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
  let ListOfSourceInfo = () => (ListOfSourceInfo = dart.constFn(core.List$(html$.SourceInfo)))();
  let CompleterOfListOfSourceInfo = () => (CompleterOfListOfSourceInfo = dart.constFn(async.Completer$(ListOfSourceInfo())))();
  let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MidiMessageEvent)))();
  let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html$.MimeType)))();
  let ListOfMutationRecord = () => (ListOfMutationRecord = dart.constFn(core.List$(html$.MutationRecord)))();
  let MapOfString$bool = () => (MapOfString$bool = dart.constFn(core.Map$(core.String, core.bool)))();
  let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html$.MediaStream)))();
  let NodeTobool = () => (NodeTobool = dart.constFn(dart.functionType(core.bool, [html$.Node])))();
  let ComparatorOfNode = () => (ComparatorOfNode = dart.constFn(core.Comparator$(html$.Node)))();
  let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html$.Plugin)))();
  let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDtmfToneChangeEvent)))();
  let JSArrayOfMapOfString$String = () => (JSArrayOfMapOfString$String = dart.constFn(_interceptors.JSArray$(MapOfString$String())))();
  let ListOfMapOfString$String = () => (ListOfMapOfString$String = dart.constFn(core.List$(MapOfString$String())))();
  let CompleterOfRtcSessionDescription = () => (CompleterOfRtcSessionDescription = dart.constFn(async.Completer$(html$.RtcSessionDescription)))();
  let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html$.RtcStatsResponse)))();
  let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaStreamEvent)))();
  let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDataChannelEvent)))();
  let EventStreamProviderOfRtcIceCandidateEvent = () => (EventStreamProviderOfRtcIceCandidateEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcIceCandidateEvent)))();
  let ListOfOptionElement = () => (ListOfOptionElement = dart.constFn(core.List$(html$.OptionElement)))();
  let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html$.OptionElement)))();
  let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html$.OptionElement)))();
  let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html$.SourceBuffer)))();
  let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html$.SpeechGrammar)))();
  let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionError)))();
  let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionEvent)))();
  let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html$.SpeechRecognitionResult)))();
  let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechSynthesisEvent)))();
  let VoidToString = () => (VoidToString = dart.constFn(dart.functionType(core.String, [])))();
  let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, core.String])))();
  let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html$._WrappedList$(html$.TableSectionElement)))();
  let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html$._WrappedList$(html$.TableRowElement)))();
  let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html$._WrappedList$(html$.TableCellElement)))();
  let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html$.TextTrackCue)))();
  let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html$.TextTrack)))();
  let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html$.EventStreamProvider$(html$.TrackEvent)))();
  let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html$.Touch)))();
  let ListOfTrackDefault = () => (ListOfTrackDefault = dart.constFn(core.List$(html$.TrackDefault)))();
  let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html$.EventStreamProvider$(html$.CloseEvent)))();
  let CompleterOfnum = () => (CompleterOfnum = dart.constFn(async.Completer$(core.num)))();
  let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceMotionEvent)))();
  let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceOrientationEvent)))();
  let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html$.EventStreamProvider$(html$.AnimationEvent)))();
  let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html$.EventStreamProvider$(html$.BeforeUnloadEvent)))();
  let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html$.BeforeUnloadEvent)))();
  let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.BeforeUnloadEvent)))();
  let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementListEventStreamImpl$(html$.BeforeUnloadEvent)))();
  let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
  let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
  let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
  let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
  let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
  let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
  let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.functionType(core.String, [core.String, core.String])))();
  let SetOfStringTodynamic = () => (SetOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [SetOfString()])))();
  let EventStreamProvider = () => (EventStreamProvider = dart.constFn(html$.EventStreamProvider$()))();
  let ElementStream = () => (ElementStream = dart.constFn(html$.ElementStream$()))();
  let _EventStream = () => (_EventStream = dart.constFn(html$._EventStream$()))();
  let _ElementEventStreamImpl = () => (_ElementEventStreamImpl = dart.constFn(html$._ElementEventStreamImpl$()))();
  let _ElementListEventStreamImpl = () => (_ElementListEventStreamImpl = dart.constFn(html$._ElementListEventStreamImpl$()))();
  let _EventListener = () => (_EventListener = dart.constFn(html$._EventListener$()))();
  let _wrapZoneCallbackOfEvent$dynamic = () => (_wrapZoneCallbackOfEvent$dynamic = dart.constFn(html$._wrapZoneCallback$(html$.Event, dart.dynamic)))();
  let _EventStreamSubscription = () => (_EventStreamSubscription = dart.constFn(html$._EventStreamSubscription$()))();
  let CustomStream = () => (CustomStream = dart.constFn(html$.CustomStream$()))();
  let _CustomEventStreamImpl = () => (_CustomEventStreamImpl = dart.constFn(html$._CustomEventStreamImpl$()))();
  let EventStreamProviderOfKeyEvent = () => (EventStreamProviderOfKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyEvent)))();
  let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html$.CustomStream$(html$.KeyEvent)))();
  let _StreamPool = () => (_StreamPool = dart.constFn(html$._StreamPool$()))();
  let _CustomEventStreamProvider = () => (_CustomEventStreamProvider = dart.constFn(html$._CustomEventStreamProvider$()))();
  let MapOfString$Function = () => (MapOfString$Function = dart.constFn(core.Map$(core.String, core.Function)))();
  let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html$.KeyEvent)))();
  let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html$.KeyEvent)))();
  let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))();
  let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html$.NodeValidator)))();
  let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html$.NodeValidator)))();
  let _WrappedList = () => (_WrappedList = dart.constFn(html$._WrappedList$()))();
  let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html$.Node)))();
  let _WrappedIterator = () => (_WrappedIterator = dart.constFn(html$._WrappedIterator$()))();
  let HttpRequestTodynamic = () => (HttpRequestTodynamic = dart.constFn(dart.functionType(dart.dynamic, [html$.HttpRequest])))();
  let FixedSizeListIterator = () => (FixedSizeListIterator = dart.constFn(html$.FixedSizeListIterator$()))();
  let _VariableSizeListIterator = () => (_VariableSizeListIterator = dart.constFn(html$._VariableSizeListIterator$()))();
  let _wrapZoneCallback = () => (_wrapZoneCallback = dart.constFn(html$._wrapZoneCallback$()))();
  let _wrapZoneBinaryCallback = () => (_wrapZoneBinaryCallback = dart.constFn(html$._wrapZoneBinaryCallback$()))();
  let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.functionType(dart.void, [html$.Element])))();
  let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg$.Length)))();
  let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg$.Number)))();
  let ListOfPathSeg = () => (ListOfPathSeg = dart.constFn(core.List$(svg$.PathSeg)))();
  let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
  let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
  let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
  let dynamicTodynamic$ = () => (dynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic])))();
  let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.String])))();
  let VoidTo_MethodStats = () => (VoidTo_MethodStats = dart.constFn(dart.definiteFunctionType(dart._MethodStats, [])))();
  let dynamicToString = () => (dynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic])))();
  let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
  let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
  let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
  let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
  let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
  let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
  let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
  let intAnddynamicTovoid = () => (intAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, dart.dynamic])))();
  let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
  let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
  let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
  let StringAndObjectTovoid = () => (StringAndObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Object])))();
  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
  let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
  let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
  let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
  let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
  let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
  let dynamicTovoid$ = () => (dynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
  let TypeTodynamic = () => (TypeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type])))();
  let VoidToString$ = () => (VoidToString$ = dart.constFn(dart.definiteFunctionType(core.String, [])))();
  let StringToString$ = () => (StringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String])))();
  let StringAndStringTodynamic = () => (StringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String])))();
  let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
  let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
  let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
  let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
  let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
  let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
  let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
  let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
  let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
  let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
  let ListTodynamic = () => (ListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.List])))();
  let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
  let TimerTovoid$ = () => (TimerTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Timer])))();
  let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
  let boolTodynamic = () => (boolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.bool])))();
  let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
  let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
  let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
  let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicTodynamic = () => (dynamicAnddynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicToArgumentError = () => (dynamicToArgumentError = dart.constFn(dart.definiteFunctionType(core.ArgumentError, [dart.dynamic])))();
  let dynamicToStackTrace = () => (dynamicToStackTrace = dart.constFn(dart.definiteFunctionType(core.StackTrace, [dart.dynamic])))();
  let dynamicToint = () => (dynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic])))();
  let dynamicAndMapTodynamic = () => (dynamicAndMapTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Map])))();
  let dynamicAndStringTodynamic = () => (dynamicAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])))();
  let dynamicAndStringAnddynamicTovoid = () => (dynamicAndStringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, dart.dynamic])))();
  let FAndintToF = () => (FAndintToF = dart.constFn(dart.definiteFunctionType(F => [F, [F, core.int]])))();
  let JSSyntaxRegExpTodynamic = () => (JSSyntaxRegExpTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_js_helper.JSSyntaxRegExp])))();
  let JSSyntaxRegExpToint = () => (JSSyntaxRegExpToint = dart.constFn(dart.definiteFunctionType(core.int, [_js_helper.JSSyntaxRegExp])))();
  let JSSyntaxRegExpAndStringAndintToMatch = () => (JSSyntaxRegExpAndStringAndintToMatch = dart.constFn(dart.definiteFunctionType(core.Match, [_js_helper.JSSyntaxRegExp, core.String, core.int])))();
  let dynamicAnddynamicAnddynamicToint = () => (dynamicAnddynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicToString = () => (dynamicAnddynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAnddynamicTobool = () => (dynamicAnddynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let StringAndStringAndintToIterableOfMatch = () => (StringAndStringAndintToIterableOfMatch = dart.constFn(dart.definiteFunctionType(IterableOfMatch(), [core.String, core.String, core.int])))();
  let StringAnddynamicAndintTobool = () => (StringAnddynamicAndintTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String, dart.dynamic, core.int])))();
  let StringAndJSSyntaxRegExpAndString__ToString = () => (StringAndJSSyntaxRegExpAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, _js_helper.JSSyntaxRegExp, core.String, core.int])))();
  let StringAndPatternAndStringToString = () => (StringAndPatternAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String])))();
  let MatchToString$ = () => (MatchToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.Match])))();
  let StringAndPatternAndFn__ToString = () => (StringAndPatternAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), StringToString()])))();
  let StringAndFnAndFnToString = () => (StringAndFnAndFnToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, MatchToString(), StringToString()])))();
  let StringAndStringAndFn__ToString = () => (StringAndStringAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String, MatchToString(), StringToString()])))();
  let StringAndPatternAndString__ToString = () => (StringAndPatternAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String, core.int])))();
  let StringAndPatternAndFn__ToString$ = () => (StringAndPatternAndFn__ToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), core.int])))();
  let StringAndintAndint__ToString = () => (StringAndintAndint__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.String])))();
  let dynamicToType = () => (dynamicToType = dart.constFn(dart.definiteFunctionType(core.Type, [dart.dynamic])))();
  let dynamicAndintTodynamic = () => (dynamicAndintTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.int])))();
  let SymbolToString = () => (SymbolToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Symbol])))();
  let dynamicAnddynamicToSymbol = () => (dynamicAnddynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic, dart.dynamic])))();
  let dynamicToInstanceMirror = () => (dynamicToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [dart.dynamic])))();
  let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
  let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
  let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
  let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
  let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
  let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
  let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
  let SymbolAnddynamicTovoid = () => (SymbolAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Symbol, dart.dynamic])))();
  let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
  let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
  let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
  let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
  let intTobool = () => (intTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.int])))();
  let intAndListAndintTovoid = () => (intAndListAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.List, core.int])))();
  let intAndintAndintToint = () => (intAndintAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int, core.int])))();
  let FunctionAndObjectAndStackTraceTodynamic = () => (FunctionAndObjectAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.Object, core.StackTrace])))();
  let FunctionAndZoneToFunction = () => (FunctionAndZoneToFunction = dart.constFn(dart.definiteFunctionType(R => [core.Function, [core.Function, async.Zone]])))();
  let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
  let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
  let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [dart.dynamic])))();
  let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
  let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
  let FnTodynamic = () => (FnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTovoid()])))();
  let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
  let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
  let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
  let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
  let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
  let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
  let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
  let _EventSinkAnddynamicAnddynamicTovoid = () => (_EventSinkAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._EventSink, dart.dynamic, dart.dynamic])))();
  let _ZoneToZoneDelegate = () => (_ZoneToZoneDelegate = dart.constFn(dart.definiteFunctionType(async.ZoneDelegate, [async._Zone])))();
  let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]])))();
  let ObjectAndStackTraceTovoid = () => (ObjectAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])))();
  let ZoneAndZoneDelegateAndZone__ToR$ = () => (ZoneAndZoneDelegateAndZone__ToR$ = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
  let ZoneAndZoneDelegateAndZone__ToR$0 = () => (ZoneAndZoneDelegateAndZone__ToR$0 = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
  let ZoneAndZoneDelegateAndZone__ToR$1 = () => (ZoneAndZoneDelegateAndZone__ToR$1 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]])))();
  let ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = () => (ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = dart.constFn(dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
  let ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = () => (ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = dart.constFn(dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]])))();
  let ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = () => (ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]])))();
  let ZoneAndZoneDelegateAndZone__ToAsyncError = () => (ZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(dart.definiteFunctionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
  let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTodynamic()])))();
  let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()])))();
  let ZoneAndZoneDelegateAndZone__ToTimer$ = () => (ZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
  let ZoneAndZoneDelegateAndZone__Tovoid$ = () => (ZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
  let ZoneAndZoneDelegateAndZone__ToZone = () => (ZoneAndZoneDelegateAndZone__ToZone = dart.constFn(dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])))();
  let ZoneAndZoneDelegateAndZone__Todynamic = () => (ZoneAndZoneDelegateAndZone__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace])))();
  let Fn__ToR = () => (Fn__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [dart.functionType(R, [])], {zoneValues: core.Map, zoneSpecification: async.ZoneSpecification, onError: core.Function}])))();
  let ObjectTobool = () => (ObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object])))();
  let dynamicAnddynamicTobool = () => (dynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic])))();
  let IterableAndListTovoid = () => (IterableAndListTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Iterable, core.List])))();
  let _SplayTreeMapNodeTobool = () => (_SplayTreeMapNodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [collection._SplayTreeMapNode])))();
  let dynamicAndFnTodynamic = () => (dynamicAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dynamicAnddynamicTodynamic()])))();
  let Uint8ListAndintAndintTovoid$ = () => (Uint8ListAndintAndintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
  let StringAndFnTodynamic = () => (StringAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, dynamicAnddynamicTodynamic()])))();
  let EventSinkOfStringTo_LineSplitterEventSink = () => (EventSinkOfStringTo_LineSplitterEventSink = dart.constFn(dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])))();
  let intAndintToint = () => (intAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int])))();
  let dynamicAndintToint = () => (dynamicAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, core.int])))();
  let intAndintTovoid = () => (intAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int])))();
  let StringToint$ = () => (StringToint$ = dart.constFn(dart.definiteFunctionType(core.int, [core.String])))();
  let intToString = () => (intToString = dart.constFn(dart.definiteFunctionType(core.String, [core.int])))();
  let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
  let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
  let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
  let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
  let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
  let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
  let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
  let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
  let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
  let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
  let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
  let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
  let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
  let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
  let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
  let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
  let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
  let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
  let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
  let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
  let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
  let dynamicToJsObject = () => (dynamicToJsObject = dart.constFn(dart.definiteFunctionType(js.JsObject, [dart.dynamic])))();
  let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
  let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
  let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
  let FunctionAndListTodynamic = () => (FunctionAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.List])))();
  let TAndTToT = () => (TAndTToT = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
  let TAndTToT$ = () => (TAndTToT$ = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
  let numAndnumTodouble = () => (numAndnumTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num, core.num])))();
  let numAndnumTonum = () => (numAndnumTonum = dart.constFn(dart.definiteFunctionType(core.num, [core.num, core.num])))();
  let numTodouble = () => (numTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num])))();
  let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T => [T, [T]])))();
  let LibraryMirrorTobool = () => (LibraryMirrorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [mirrors.LibraryMirror])))();
  let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
  let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
  let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
  let EventTovoid$ = () => (EventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Event])))();
  let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
  let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
  let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.Event])))();
  let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
  let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
  let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
  let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
  let FileSystemTovoid = () => (FileSystemTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileSystem])))();
  let FileErrorTovoid = () => (FileErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileError])))();
  let EntryTovoid = () => (EntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Entry])))();
  let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
  let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
  let MetadataTovoid = () => (MetadataTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Metadata])))();
  let ListOfEntryTovoid = () => (ListOfEntryTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfEntry()])))();
  let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
  let FileWriterTovoid = () => (FileWriterTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.FileWriter])))();
  let FileTovoid = () => (FileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.File])))();
  let GeopositionTovoid = () => (GeopositionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Geoposition])))();
  let PositionErrorTovoid = () => (PositionErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.PositionError])))();
  let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
  let ProgressEventTovoid$ = () => (ProgressEventTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.ProgressEvent])))();
  let ListOfSourceInfoTovoid = () => (ListOfSourceInfoTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfSourceInfo()])))();
  let MediaStreamTovoid = () => (MediaStreamTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.MediaStream])))();
  let NavigatorUserMediaErrorTovoid = () => (NavigatorUserMediaErrorTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.NavigatorUserMediaError])))();
  let RtcSessionDescriptionTovoid = () => (RtcSessionDescriptionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription])))();
  let RtcStatsResponseTovoid = () => (RtcStatsResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.RtcStatsResponse])))();
  let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
  let numTovoid = () => (numTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.num])))();
  let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
  let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
  let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
  let boolAndCssClassSetImplTobool = () => (boolAndCssClassSetImplTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.bool, html_common.CssClassSetImpl])))();
  let SetOfStringTobool = () => (SetOfStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [SetOfString()])))();
  let SetOfStringTovoid = () => (SetOfStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [SetOfString()])))();
  let EventAndStringTobool = () => (EventAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Event, core.String])))();
  let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.KeyEvent])))();
  let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.NodeValidator])))();
  let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.definiteFunctionType(core.int, [html$.Node, html$.Node])))();
  let FromToTo = () => (FromToTo = dart.constFn(dart.definiteFunctionType((From, To) => [To, [From]])))();
  let dynamicToWindowBase = () => (dynamicToWindowBase = dart.constFn(dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])))();
  let dynamicToEventTarget = () => (dynamicToEventTarget = dart.constFn(dart.definiteFunctionType(html$.EventTarget, [dart.dynamic])))();
  let dynamicAnddynamicAnddynamic__Todynamic = () => (dynamicAnddynamicAnddynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
  let dynamicAnddynamicAndString__Tovoid = () => (dynamicAnddynamicAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, core.String, core.Type, core.String])))();
  let _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = () => (_wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = dart.constFn(dart.definiteFunctionType((A, R) => [html$._wrapZoneCallback$(A, R), [html$._wrapZoneCallback$(A, R)]])))();
  let _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = () => (_wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = dart.constFn(dart.definiteFunctionType((A, B, R) => [html$._wrapZoneBinaryCallback$(A, B, R), [html$._wrapZoneBinaryCallback$(A, B, R)]])))();
  let StringToElement = () => (StringToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [core.String])))();
  let StringToElementListOfElement = () => (StringToElementListOfElement = dart.constFn(dart.definiteFunctionType(ElementListOfElement(), [core.String])))();
  let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
  let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
  let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
  let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
  let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
  let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
  let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
  let dynamic__Todynamic$ = () => (dynamic__Todynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
  let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
  let AudioBufferTovoid = () => (AudioBufferTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [web_audio.AudioBuffer])))();
  dart.mixin = function(base, ...mixins) {
    class Mixin extends base {}
    for (let m of mixins) {
      dart.copyProperties(Mixin.prototype, m.prototype);
    }
    Mixin.prototype.new = function(...args) {
      for (let i = mixins.length - 1; i >= 0; i--) {
        mixins[i].prototype.new.call(this);
      }
      base.prototype.new.apply(this, args);
    };
    dart.setSignature(Mixin, {
      methods: () => {
        let s = {};
        for (let m of mixins) {
          dart.copyProperties(s, m[dart._methodSig]);
        }
        return s;
      }
    });
    Mixin[dart._mixins] = mixins;
    return Mixin;
  };
  dart.getMixins = function(clazz) {
    return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
  };
  dart.getImplements = function(clazz) {
    return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
  };
  dart.flattenFutures = function(builder) {
    function flatten(T) {
      if (!T) return builder(dart.dynamic);
      let futureClass = dart.getGenericClass(async.Future);
      if (dart.getGenericClass(T) == futureClass) {
        let args = dart.getGenericArgs(T);
        if (args) return builder(args[0]);
      }
      return builder(T);
    }
    return flatten;
  };
  dart.generic = function(typeConstructor, setBaseClass) {
    if (setBaseClass === void 0) setBaseClass = null;
    return (() => {
      let length = typeConstructor.length;
      if (length < 1) {
        dart.throwInternalError('must have at least one generic type argument');
      }
      let resultMap = new Map();
      function makeGenericType(...args) {
        if (args.length != length && args.length != 0) {
          dart.throwInternalError('requires ' + length + ' or 0 type arguments');
        }
        while (args.length < length)
          args.push(dart.dynamic);
        let value = resultMap;
        for (let i = 0; i < length; i++) {
          let arg = args[i];
          if (arg == null) {
            dart.throwInternalError('type arguments should not be null: ' + typeConstructor);
          }
          let map = value;
          value = map.get(arg);
          if (value === void 0) {
            if (i + 1 == length) {
              value = typeConstructor.apply(null, args);
              if (value) {
                value[dart._typeArguments] = args;
                value[dart._originalDeclaration] = makeGenericType;
              }
              map.set(arg, value);
              if (setBaseClass) setBaseClass(value);
            } else {
              value = new Map();
              map.set(arg, value);
            }
          }
        }
        return value;
      }
      makeGenericType[dart._genericTypeCtor] = typeConstructor;
      return makeGenericType;
    })();
  };
  dart.getGenericClass = function(type) {
    return dart.safeGetOwnProperty(type, dart._originalDeclaration);
  };
  dart.getGenericArgs = function(type) {
    return dart.safeGetOwnProperty(type, dart._typeArguments);
  };
  dart.getConstructorSig = function(value) {
    return value[dart._constructorSig];
  };
  dart.getMethodSig = function(value) {
    return value[dart._methodSig];
  };
  dart.getFieldSig = function(value) {
    return value[dart._fieldSig];
  };
  dart.getGetterSig = function(value) {
    return value[dart._getterSig];
  };
  dart.getSetterSig = function(value) {
    return value[dart._setterSig];
  };
  dart.getStaticSig = function(value) {
    return value[dart._staticSig];
  };
  dart.getStaticFieldSig = function(value) {
    return value[dart._staticFieldSig];
  };
  dart.getStaticGetterSig = function(value) {
    return value[dart._staticGetterSig];
  };
  dart.getStaticSetterSig = function(value) {
    return value[dart._staticSetterSig];
  };
  dart.getGenericTypeCtor = function(value) {
    return value[dart._genericTypeCtor];
  };
  dart.getMethodType = function(obj, name) {
    let type = obj == null ? core.Object : obj.__proto__.constructor;
    return dart.getMethodTypeFromType(type, name);
  };
  dart.getMethodTypeFromType = function(type, name) {
    let sigObj = type[dart._methodSig];
    if (sigObj === void 0) return void 0;
    return sigObj[name];
  };
  dart.classGetConstructorType = function(cls, name) {
    if (!name) name = 'new';
    if (cls === void 0) return void 0;
    if (cls == null) return void 0;
    let sigCtor = cls[dart._constructorSig];
    if (sigCtor === void 0) return void 0;
    return sigCtor[name];
  };
  dart.bind = function(obj, name, f) {
    if (f === void 0) f = obj[name];
    f = f.bind(obj);
    let sig = dart.getMethodType(obj, name);
    dart.assert(sig);
    dart.tag(f, sig);
    return f;
  };
  dart.gbind = function(f, ...typeArgs) {
    let result = f.apply(null, typeArgs);
    let sig = dart._getRuntimeType(f).apply(null, typeArgs);
    dart.tag(result, sig);
    return result;
  };
  dart._setInstanceSignature = function(f, sigF, kind) {
    dart.defineMemoizedGetter(f, kind, () => {
      let sigObj = sigF();
      sigObj.__proto__ = f.__proto__[kind];
      return sigObj;
    });
  };
  dart._setMethodSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._methodSig);
  };
  dart._setFieldSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._fieldSig);
  };
  dart._setGetterSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._getterSig);
  };
  dart._setSetterSignature = function(f, sigF) {
    return dart._setInstanceSignature(f, sigF, dart._setterSig);
  };
  dart._setConstructorSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._constructorSig, sigF);
  };
  dart._setStaticSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticSig, sigF);
  };
  dart._setStaticFieldSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticFieldSig, sigF);
  };
  dart._setStaticGetterSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticGetterSig, sigF);
  };
  dart._setStaticSetterSignature = function(f, sigF) {
    return dart.defineMemoizedGetter(f, dart._staticSetterSig, sigF);
  };
  dart._setStaticTypes = function(f, names) {
    for (let name of names) {
      if (!f[name]) continue;
      dart.tagLazy(f[name], function() {
        return f[dart._staticSig][name];
      });
    }
  };
  dart.setSignature = function(f, signature) {
    let constructors = 'constructors' in signature ? signature.constructors : () => ({});
    let methods = 'methods' in signature ? signature.methods : () => ({});
    let fields = 'fields' in signature ? signature.fields : () => ({});
    let getters = 'getters' in signature ? signature.getters : () => ({});
    let setters = 'setters' in signature ? signature.setters : () => ({});
    let statics = 'statics' in signature ? signature.statics : () => ({});
    let staticFields = 'sfields' in signature ? signature.sfields : () => ({});
    let staticGetters = 'sgetters' in signature ? signature.sgetters : () => ({});
    let staticSetters = 'ssetters' in signature ? signature.ssetters : () => ({});
    let names = 'names' in signature ? signature.names : [];
    dart._setConstructorSignature(f, constructors);
    dart._setMethodSignature(f, methods);
    dart._setFieldSignature(f, fields);
    dart._setGetterSignature(f, getters);
    dart._setSetterSignature(f, setters);
    dart._setStaticSignature(f, statics);
    dart._setStaticFieldSignature(f, staticFields);
    dart._setStaticGetterSignature(f, staticGetters);
    dart._setStaticSetterSignature(f, staticSetters);
    dart._setStaticTypes(f, names);
  };
  dart.hasMethod = function(obj, name) {
    return dart.getMethodType(obj, name) !== void 0;
  };
  dart.defineNamedConstructor = function(clazz, name) {
    let proto = clazz.prototype;
    let initMethod = proto[name];
    let ctor = function(...args) {
      initMethod.apply(this, args);
    };
    ctor[dart.isNamedConstructor] = true;
    ctor.prototype = proto;
    dart.defineProperty(clazz, name, {value: ctor, configurable: true});
  };
  dart.getExtensionType = function(obj) {
    return obj[dart._extensionType];
  };
  dart.getExtensionSymbol = function(name) {
    let sym = dartx[name];
    if (sym == null) {
      sym = Symbol("dartx." + name.toString());
      dartx[name] = sym;
    }
    return sym;
  };
  dart.defineExtensionNames = function(names) {
    return names.forEach(dart.getExtensionSymbol);
  };
  dart._installProperties = function(jsProto, extProto) {
    let coreObjProto = core.Object.prototype;
    let parentsExtension = jsProto.__proto__[dart._extensionType];
    let installedParent = parentsExtension && parentsExtension.prototype;
    dart._installProperties2(jsProto, extProto, coreObjProto, installedParent);
  };
  dart._installProperties2 = function(jsProto, extProto, coreObjProto, installedParent) {
    if (extProto === coreObjProto) {
      dart._installPropertiesForObject(jsProto, coreObjProto);
      return;
    }
    if (jsProto !== extProto) {
      let extParent = extProto.__proto__;
      if (installedParent !== extParent) {
        dart._installProperties2(jsProto, extParent, coreObjProto, installedParent);
      }
    }
    dart.copyTheseProperties(jsProto, extProto, dart.getOwnPropertySymbols(extProto));
  };
  dart._installPropertiesForObject = function(jsProto, coreObjProto) {
    let names = dart.getOwnPropertyNames(coreObjProto);
    for (let i = 0; i < names.length; ++i) {
      let name = names[i];
      let desc = dart.getOwnPropertyDescriptor(coreObjProto, name);
      dart.defineProperty(jsProto, dart.getExtensionSymbol(name), desc);
    }
    return;
  };
  dart.registerExtension = function(jsType, dartExtType) {
    if (!jsType) return;
    let extProto = dartExtType.prototype;
    let jsProto = jsType.prototype;
    if (!jsProto) return;
    jsProto[dart._extensionType] = dartExtType;
    dart._installProperties(jsProto, extProto);
    let originalSigFn = dart.getOwnPropertyDescriptor(dartExtType, dart._methodSig).get;
    dart.assert(originalSigFn);
    dart.defineMemoizedGetter(jsType, dart._methodSig, originalSigFn);
  };
  dart.defineExtensionMembers = function(type, methodNames) {
    let proto = type.prototype;
    for (let name of methodNames) {
      let method = dart.getOwnPropertyDescriptor(proto, name);
      dart.defineProperty(proto, dart.getExtensionSymbol(name), method);
    }
    let originalSigFn = dart.getOwnPropertyDescriptor(type, dart._methodSig).get;
    dart.defineMemoizedGetter(type, dart._methodSig, function() {
      let sig = originalSigFn();
      for (let name of methodNames) {
        sig[dart.getExtensionSymbol(name)] = sig[name];
      }
      return sig;
    });
  };
  dart.setType = function(obj, type) {
    obj.__proto__ = type.prototype;
    return obj;
  };
  dart.list = function(obj, elementType) {
    return dart.setType(obj, dart.getGenericClass(_interceptors.JSArray)(elementType));
  };
  dart.setBaseClass = function(derived, base) {
    derived.prototype.__proto__ = base.prototype;
    derived.__proto__ = base;
  };
  dart.setExtensionBaseClass = function(derived, base) {
    if (base) {
      derived.prototype[dart._extensionType] = derived;
      derived.prototype.__proto__ = base.prototype;
    }
  };
  dart.callableClass = function(callableCtor, classExpr) {
    callableCtor.prototype = classExpr.prototype;
    callableCtor.prototype.constructor = callableCtor;
    callableCtor.__proto__ = classExpr;
    return callableCtor;
  };
  dart.defineNamedConstructorCallable = function(clazz, name, ctor) {
    ctor.prototype = clazz.prototype;
    dart.defineProperty(clazz, name, {value: ctor, configurable: true});
  };
  dart.defineEnumValues = function(enumClass, names) {
    let values = [];
    for (var i = 0; i < names.length; i++) {
      let value = dart.const(new enumClass(i));
      values.push(value);
      Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
    }
    enumClass.values = dart.constList(values, enumClass);
  };
  dart.fn = function(closure, t) {
    if (t == null) {
      t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
    }
    dart.tag(closure, t);
    return closure;
  };
  dart.lazyFn = function(closure, computeType) {
    dart.tagLazy(closure, computeType);
    return closure;
  };
  dart._checkPrimitiveType = function(obj) {
    if (obj == null) return core.Null;
    if (typeof obj == "number") {
      if (Math.floor(obj) == obj) {
        return core.int;
      }
      return core.double;
    }
    if (typeof obj == "boolean") {
      return core.bool;
    }
    if (typeof obj == "string") {
      return core.String;
    }
    if (typeof obj == "symbol") {
      return dart.jsobject;
    }
    return null;
  };
  dart.getFunctionType = function(obj) {
    let args = Array(obj.length).fill(dart.dynamic);
    return dart.definiteFunctionType(dart.bottom, args, void 0);
  };
  dart.getReifiedType = function(obj) {
    let result = dart._checkPrimitiveType(obj);
    if (result != null) return result;
    return dart._nonPrimitiveRuntimeType(obj);
  };
  dart._nonPrimitiveRuntimeType = function(obj) {
    let result = dart._getRuntimeType(obj);
    if (result != null) return result;
    result = dart.getExtensionType(obj);
    if (result != null) return result;
    result = obj.constructor;
    if (result === Function) {
      return dart.jsobject;
    }
    if (result == null) {
      return dart.jsobject;
    }
    return result;
  };
  dart.wrapType = function(type) {
    if (type.hasOwnProperty(dart._typeObject)) {
      return type[dart._typeObject];
    }
    return type[dart._typeObject] = new dart.WrappedType(type);
  };
  dart.lazyJSType = function(getJSTypeCallback, name) {
    let key = getJSTypeCallback.toString();
    if (dart._lazyJSTypes.has(key)) {
      return dart._lazyJSTypes.get(key);
    }
    let ret = new dart.LazyJSType(getJSTypeCallback, name);
    dart._lazyJSTypes.set(key, ret);
    return ret;
  };
  dart.lazyAnonymousJSType = function(name) {
    if (dart._lazyJSTypes.has(name)) {
      return dart._lazyJSTypes.get(name);
    }
    let ret = new dart.LazyJSType(null, name);
    dart._lazyJSTypes.set(name, ret);
    return ret;
  };
  const _wrappedType = Symbol('_wrappedType');
  dart.unwrapType = function(obj) {
    return dart.dload(obj, _wrappedType);
  };
  dart._getRuntimeType = function(value) {
    return value[dart._runtimeType];
  };
  dart.getIsNamedConstructor = function(value) {
    return value[dart.isNamedConstructor];
  };
  dart.getDartLibraryName = function(value) {
    return value[dart_library.dartLibraryName];
  };
  dart.tag = function(value, t) {
    value[dart._runtimeType] = t;
  };
  dart.tagComputed = function(value, compute) {
    dart.defineProperty(value, dart._runtimeType, {get: compute});
  };
  dart.tagLazy = function(value, compute) {
    dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
  };
  const _jsTypeCallback = Symbol('_jsTypeCallback');
  const _rawJSType = Symbol('_rawJSType');
  dart._isInstanceOfLazyJSType = function(o, t) {
    if (t[_jsTypeCallback] != null) {
      return dart.is(o, t[_rawJSType]);
    }
    if (o == null) return false;
    return dart._isJSObject(o);
  };
  dart._asInstanceOfLazyJSType = function(o, t) {
    if (t[_jsTypeCallback] != null) {
      return dart.as(o, t[_rawJSType]);
    }
    if (o == null) return null;
    if (!dart.test(dart._isJSObject(o))) dart._throwCastError(o, t, true);
    return o;
  };
  dart._isJSObject = function(o) {
    return !dart.getReifiedType(o)[dart._runtimeType];
  };
  dart._initialize2 = function() {
    dart.TypeRep.prototype.is = function is_T(object) {
      return dart.is(object, this);
    };
    dart.TypeRep.prototype.as = function as_T(object) {
      return dart.as(object, this);
    };
    dart.TypeRep.prototype._check = function check_T(object) {
      return dart.check(object, this);
    };
    dart.Dynamic.prototype.is = function is_Dynamic(object) {
      return true;
    };
    dart.Dynamic.prototype.as = function as_Dynamic(object) {
      return object;
    };
    dart.Dynamic.prototype._check = function check_Dynamic(object) {
      return object;
    };
    dart.LazyJSType.prototype.is = function is_T(object) {
      return dart._isInstanceOfLazyJSType(object, this);
    };
    dart.LazyJSType.prototype.as = function as_T(object) {
      return dart._asInstanceOfLazyJSType(object, this);
    };
  };
  dart._functionType = function(definite, returnType, args, extra) {
    if (args === void 0 && extra === void 0) {
      const fnTypeParts = returnType;
      function makeGenericFnType(...types) {
        let parts = fnTypeParts.apply(null, types);
        return dart.FunctionType.create(definite, parts[0], parts[1], parts[2]);
      }
      makeGenericFnType[dart._typeFormalCount] = fnTypeParts.length;
      return makeGenericFnType;
    }
    return dart.FunctionType.create(definite, returnType, args, extra);
  };
  dart.functionType = function(returnType, args, extra) {
    return dart._functionType(false, returnType, args, extra);
  };
  dart.definiteFunctionType = function(returnType, args, extra) {
    return dart._functionType(true, returnType, args, extra);
  };
  dart.typedef = function(name, closure) {
    return new dart.Typedef(name, closure);
  };
  dart.typeName = function(type) {
    if (type === void 0) return "undefined type";
    if (type === null) return "null type";
    if (type instanceof dart.TypeRep) {
      if (type instanceof dart.Typedef) {
        return type.name + "(" + type.functionType.toString() + ")";
      }
      return type.toString();
    }
    if (type instanceof dart.WrappedType) {
      return "Wrapped(" + dart.unwrapType(type) + ")";
    }
    let tag = dart._getRuntimeType(type);
    if (tag === core.Type) {
      let name = type.name;
      let args = dart.getGenericArgs(type);
      if (!args) return name;
      let result = name;
      let allDynamic = true;
      result += '<';
      for (let i = 0; i < args.length; ++i) {
        if (i > 0) result += ', ';
        let argName = dart.typeName(args[i]);
        if (argName != 'dynamic') allDynamic = false;
        result += argName;
      }
      result += '>';
      if (allDynamic) return name;
      return result;
    }
    if (tag) return "Not a type: " + tag.name;
    return "JSObject<" + type.name + ">";
  };
  dart.getImplicitFunctionType = function(type) {
    if (dart.test(dart.isFunctionType(type))) return type;
    return dart.getMethodTypeFromType(type, 'call');
  };
  dart.isFunctionType = function(type) {
    return type instanceof dart.AbstractFunctionType || type === core.Function;
  };
  dart.isLazyJSSubtype = function(t1, t2, covariant) {
    if (dart.equals(t1, t2)) return true;
    if (t1[_jsTypeCallback] == null || t2[_jsTypeCallback] == null) return true;
    return dart.isClassSubType(t1[_rawJSType], t2[_rawJSType], covariant);
  };
  dart.isFunctionSubtype = function(ft1, ft2, covariant) {
    if (ft2 === core.Function) {
      return true;
    }
    if (ft1 === core.Function) {
      return false;
    }
    let ret1 = ft1.returnType;
    let ret2 = ft2.returnType;
    let args1 = ft1.args;
    let args2 = ft2.args;
    if (args1.length > args2.length) {
      return covariant ? false : null;
    }
    for (let i = 0; i < args1.length; ++i) {
      if (!dart._isSubtype(args2[i], args1[i], !covariant)) {
        return null;
      }
    }
    let optionals1 = ft1.optionals;
    let optionals2 = ft2.optionals;
    if (args1.length + optionals1.length < args2.length + optionals2.length) {
      return covariant ? false : null;
    }
    let j = 0;
    for (let i = args1.length; i < args2.length; ++i, ++j) {
      if (!dart._isSubtype(args2[i], optionals1[j], !covariant)) {
        return null;
      }
    }
    for (let i = 0; i < optionals2.length; ++i, ++j) {
      if (!dart._isSubtype(optionals2[i], optionals1[j], !covariant)) {
        return null;
      }
    }
    let named1 = ft1.named;
    let named2 = ft2.named;
    let names = dart.getOwnPropertyNames(named2);
    for (let i = 0; i < names.length; ++i) {
      let name = names[i];
      let n1 = named1[name];
      let n2 = named2[name];
      if (n1 === void 0) {
        return covariant ? false : null;
      }
      if (!dart._isSubtype(n2, n1, !covariant)) {
        return null;
      }
    }
    if (ret2 === dart.void) return true;
    if (ret1 === dart.void) return ret2 === dart.dynamic;
    if (!dart._isSubtype(ret1, ret2, covariant)) return null;
    return true;
  };
  dart._subtypeMemo = function(f) {
    let memo = new Map();
    return (t1, t2) => {
      let map = memo.get(t1);
      let result;
      if (map) {
        result = map.get(t2);
        if (result !== void 0) return result;
      } else {
        memo.set(t1, map = new Map());
      }
      result = f(t1, t2);
      map.set(t2, result);
      return result;
    };
  };
  dart._isBottom = function(type) {
    return type == dart.bottom;
  };
  dart._isTop = function(type) {
    return type == core.Object || type == dart.dynamic;
  };
  dart._isSubtype = function(t1, t2, covariant) {
    if (t1 === t2) return true;
    if (dart._isTop(t2) || dart._isBottom(t1)) {
      return true;
    }
    if (dart._isBottom(t2)) return null;
    if (dart._isTop(t1)) {
      if (t1 === dart.dynamic) return null;
      return false;
    }
    if (!(t1 instanceof dart.AbstractFunctionType) && !(t2 instanceof dart.AbstractFunctionType)) {
      let result = dart.isClassSubType(t1, t2, covariant);
      if (result === true || result === null) return result;
    }
    t1 = dart.getImplicitFunctionType(t1);
    if (!t1) return false;
    if (dart.isFunctionType(t1) && dart.isFunctionType(t2)) {
      return dart.isFunctionSubtype(t1, t2, covariant);
    }
    if (t1 instanceof dart.LazyJSType && t2 instanceof dart.LazyJSType) {
      return dart.isLazyJSSubtype(t1, t2, covariant);
    }
    return false;
  };
  dart.isClassSubType = function(t1, t2, covariant) {
    if (t1 == t2) return true;
    if (t1 == core.Object) return false;
    if (t1 == null) return t2 == core.Object || t2 == dart.dynamic;
    let raw1 = dart.getGenericClass(t1);
    let raw2 = dart.getGenericClass(t2);
    if (raw1 != null && raw1 == raw2) {
      let typeArguments1 = dart.getGenericArgs(t1);
      let typeArguments2 = dart.getGenericArgs(t2);
      let length = typeArguments1.length;
      if (typeArguments2.length == 0) {
        return true;
      } else if (length == 0) {
        if (typeArguments2.every(dart._isTop)) return true;
        return null;
      }
      dart.assert(length == typeArguments2.length);
      for (let i = 0; i < length; ++i) {
        let result = dart._isSubtype(typeArguments1[i], typeArguments2[i], covariant);
        if (!result) {
          return result;
        }
      }
      return true;
    }
    let indefinite = false;
    function definitive(t1, t2) {
      let result = dart.isClassSubType(t1, t2, covariant);
      if (result == null) {
        indefinite = true;
        return false;
      }
      return result;
    }
    if (definitive(t1.__proto__, t2)) return true;
    let mixins = dart.getMixins(t1);
    if (mixins) {
      for (let m1 of mixins) {
        if (m1 != null && definitive(m1, t2)) return true;
      }
    }
    let getInterfaces = dart.getImplements(t1);
    if (getInterfaces) {
      for (let i1 of getInterfaces()) {
        if (i1 != null && definitive(i1, t2)) return true;
      }
    }
    if (indefinite) return null;
    return false;
  };
  dart.isGroundType = function(type) {
    if (type instanceof dart.AbstractFunctionType) {
      if (!dart._isTop(type.returnType)) return false;
      for (let i = 0; i < type.args.length; ++i) {
        if (!dart._isBottom(type.args[i])) return false;
      }
      for (let i = 0; i < type.optionals.length; ++i) {
        if (!dart._isBottom(type.optionals[i])) return false;
      }
      let names = dart.getOwnPropertyNames(type.named);
      for (let i = 0; i < names.length; ++i) {
        if (!dart._isBottom(type.named[names[i]])) return false;
      }
      return true;
    }
    let typeArgs = dart.getGenericArgs(type);
    if (!typeArgs) return true;
    for (let t of typeArgs) {
      if (t != core.Object && t != dart.dynamic) return false;
    }
    return true;
  };
  dart.throwCastError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.CastErrorImplementation(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwTypeError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.TypeErrorImplementation(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwStrongModeCastError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.StrongModeCastError(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwStrongModeTypeError = function(object, actual, type) {
    debugger;
    dart.throw(new _js_helper.StrongModeTypeError(object, dart.typeName(actual), dart.typeName(type)));
  };
  dart.throwUnimplementedError = function(message) {
    debugger;
    dart.throw(new core.UnimplementedError(message));
  };
  dart.throwAssertionError = function() {
    debugger;
    dart.throw(new core.AssertionError());
  };
  dart.throwNullValueError = function() {
    debugger;
    dart.throw(new core.NoSuchMethodError(null, new core.Symbol('<Unexpected Null Value>'), null, null, null));
  };
  dart.syncStar = function(gen, E, ...args) {
    const SyncIterable_E = dart.getGenericClass(_js_helper.SyncIterable)(E);
    return new SyncIterable_E(gen, args);
  };
  dart.async = function(gen, T, ...args) {
    let iter;
    function onValue(res) {
      if (res === void 0) res = null;
      return next(iter.next(res));
    }
    function onError(err) {
      return next(iter.throw(err));
    }
    function next(ret) {
      if (ret.done) return ret.value;
      let future = ret.value;
      if (!dart.is(future, dart.getGenericClass(async.Future))) {
        future = async.Future.value(future);
      }
      return future.then(dart.dynamic)(onValue, {onError: onError});
    }
    return dart.getGenericClass(async.Future)(T).new(function() {
      iter = gen.apply(null, args)[Symbol.iterator]();
      return onValue();
    });
  };
  dart.asyncStar = function(gen, T, ...args) {
    return new dart._AsyncStarStreamController(gen, T, args).controller.stream;
  };
  dart.dload = function(obj, field) {
    let f = dart._canonicalMember(obj, field);
    dart._trackCall(obj);
    if (f != null) {
      if (dart.test(dart.hasMethod(obj, f))) return dart.bind(obj, f, void 0);
      return obj[f];
    }
    return dart.noSuchMethod(obj, new dart.InvocationImpl(core.String._check(field), [], {isGetter: true}));
  };
  dart.dput = function(obj, field, value) {
    let f = dart._canonicalMember(obj, field);
    dart._trackCall(obj);
    if (f != null) {
      return obj[f] = value;
    }
    return dart.noSuchMethod(obj, new dart.InvocationImpl(core.String._check(field), [value], {isSetter: true}));
  };
  dart._checkApply = function(type, actuals) {
    if (actuals.length < type.args.length) return false;
    let index = 0;
    for (let i = 0; i < type.args.length; ++i) {
      if (!dart.instanceOfOrNull(actuals[i], type.args[i])) return false;
      ++index;
    }
    if (actuals.length == type.args.length) return true;
    let extras = actuals.length - type.args.length;
    if (type.optionals.length > 0) {
      if (extras > type.optionals.length) return false;
      for (let i = 0, j = index; i < extras; ++i, ++j) {
        if (!dart.instanceOfOrNull(actuals[j], type.optionals[i])) return false;
      }
      return true;
    }
    if (extras != 1) return false;
    if (dart.getOwnPropertyNames(type.named).length == 0) return false;
    let opts = actuals[index];
    let names = dart.getOwnPropertyNames(opts);
    if (names.length == 0) return false;
    for (var name of names) {
      if (!dart.hasOwnProperty.call(type.named, name)) {
        return false;
      }
      if (!dart.instanceOfOrNull(opts[name], type.named[name])) return false;
    }
    return true;
  };
  dart._dartSymbol = function(name) {
    return dart.const(core.Symbol.new(name.toString()));
  };
  dart.extractNamedArgs = function(args) {
    if (args.length > 0) {
      let last = args[args.length - 1];
      if (last != null && last.__proto__ === Object.prototype) {
        return args.pop();
      }
    }
    return null;
  };
  dart._checkAndCall = function(f, ftype, obj, typeArgs, args, name) {
    dart._trackCall(obj);
    let originalTarget = obj === void 0 ? f : obj;
    function callNSM() {
      return dart.noSuchMethod(originalTarget, new dart.InvocationImpl(name, args, {namedArguments: dart.extractNamedArgs(args), isMethod: true}));
    }
    if (!(f instanceof Function)) {
      if (f != null) {
        ftype = dart.getMethodType(f, 'call');
        f = f.call;
      }
      if (!(f instanceof Function)) {
        return callNSM();
      }
    }
    if (ftype === void 0) {
      ftype = dart._getRuntimeType(f);
    }
    if (!ftype) {
      if (typeArgs != null) {
        dart.throwStrongModeError('call to JS object `' + obj + '` with type arguments <' + typeArgs + '> is not supported.');
      }
      return f.apply(obj, args);
    }
    let formalCount = ftype[dart._typeFormalCount];
    if (formalCount != null) {
      if (typeArgs == null) {
        typeArgs = Array(formalCount).fill(dart.dynamic);
      } else if (typeArgs.length != formalCount) {
        dart.throwStrongModeError('incorrect number of arguments to generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected ' + formalCount + '.');
      }
      ftype = ftype.apply(null, typeArgs);
    } else if (typeArgs != null) {
      dart.throwStrongModeError('got type arguments to non-generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected none.');
    }
    if (dart._checkApply(ftype, args)) {
      if (typeArgs != null) {
        return f.apply(obj, typeArgs).apply(obj, args);
      }
      return f.apply(obj, args);
    }
    return callNSM();
  };
  dart.dcall = function(f, ...args) {
    return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, null, args, 'call');
  };
  dart.dgcall = function(f, typeArgs, ...args) {
    return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, typeArgs, args, 'call');
  };
  dart._dhelperRepl = function(object, field, callback) {
    let rawField = field;
    if (typeof field == 'symbol') {
      if (field in object) return callback(field);
      field = field.toString();
      field = field.substring('Symbol('.length, field.length - 1);
    } else if (field.charAt(0) != '_') {
      return callback(field);
    }
    if (field in object) return callback(field);
    let proto = object;
    while (proto !== null) {
      let symbols = Object.getOwnPropertySymbols(proto);
      let target = 'Symbol(' + field + ')';
      for (let s = 0; s < symbols.length; s++) {
        let sym = symbols[s];
        if (target == sym.toString()) return callback(sym);
      }
      proto = proto.__proto__;
    }
    return callback(rawField);
  };
  dart.dloadRepl = function(obj, field) {
    return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dload(obj, resolvedField), dynamicTodynamic$()));
  };
  dart.dputRepl = function(obj, field, value) {
    return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dput(obj, resolvedField, value), dynamicTodynamic$()));
  };
  dart._callMethodRepl = function(obj, method, typeArgs, args) {
    return dart._dhelperRepl(obj, method, dart.fn(resolvedField => dart._callMethod(obj, resolvedField, typeArgs, args, method), dynamicTodynamic$()));
  };
  dart.dsendRepl = function(obj, method, ...args) {
    return dart._callMethodRepl(obj, method, null, args);
  };
  dart.dgsendRepl = function(obj, typeArgs, method, ...args) {
    return dart._callMethodRepl(obj, method, typeArgs, args);
  };
  dart.getDynamicStats = function() {
    let ret = JSArrayOfListOfObject().of([]);
    let keys = dart._callMethodStats[dartx.keys][dartx.toList]();
    keys[dartx.sort](dart.fn((a, b) => dart._callMethodStats[dartx._get](b).count[dartx.compareTo](dart._callMethodStats[dartx._get](a).count), StringAndStringToint()));
    for (let key of keys) {
      let stats = dart._callMethodStats[dartx._get](key);
      ret[dartx.add](JSArrayOfObject().of([stats.typeName, stats.frame, stats.count]));
    }
    return ret;
  };
  dart.clearDynamicStats = function() {
    dart._callMethodStats[dartx.clear]();
  };
  dart._trackCall = function(obj) {
    if (!dart.trackProfile) return;
    let actual = dart.getReifiedType(obj);
    let stackStr = new Error().stack;
    let stack = stackStr[dartx.split]('\n    at ');
    let src = '';
    for (let i = 2; i < dart.notNull(stack[dartx.length]); ++i) {
      let frame = stack[dartx._get](i);
      if (!dart.test(frame[dartx.contains]('dart_sdk.js'))) {
        src = frame;
        break;
      }
    }
    let actualTypeName = dart.typeName(actual);
    let o = dart._callMethodStats[dartx.putIfAbsent](dart.str`${actualTypeName} <${src}>`, dart.fn(() => new dart._MethodStats(core.String._check(actualTypeName), src), VoidTo_MethodStats()));
    o.count = dart.notNull(o.count) + 1;
  };
  dart._callMethod = function(obj, name, typeArgs, args, displayName) {
    let symbol = dart._canonicalMember(obj, name);
    if (symbol == null) {
      return dart.noSuchMethod(obj, new dart.InvocationImpl(core.String._check(displayName), core.List._check(args), {isMethod: true}));
    }
    let f = obj != null ? obj[symbol] : null;
    let ftype = dart.getMethodType(obj, symbol);
    return dart._checkAndCall(f, ftype, obj, typeArgs, args, displayName);
  };
  dart.dsend = function(obj, method, ...args) {
    return dart._callMethod(obj, method, null, args, method);
  };
  dart.dgsend = function(obj, typeArgs, method, ...args) {
    return dart._callMethod(obj, method, typeArgs, args, method);
  };
  dart.dindex = function(obj, index) {
    return dart._callMethod(obj, '_get', null, [index], '[]');
  };
  dart.dsetindex = function(obj, index, value) {
    return dart._callMethod(obj, '_set', null, [index, value], '[]=');
  };
  dart._ignoreMemo = function(f) {
    let memo = new Map();
    return (t1, t2) => {
      let map = memo.get(t1);
      let result;
      if (map) {
        result = map.get(t2);
        if (result !== void 0) return result;
      } else {
        memo.set(t1, map = new Map());
      }
      result = f(t1, t2);
      map.set(t2, result);
      return result;
    };
  };
  dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) {
    let actual = dart.getReifiedType(obj);
    let result = dart.isSubtype(actual, type);
    if (result || actual == dart.jsobject || actual == core.int && type == core.double) return true;
    if (result === false) return false;
    if (ignoreFromWhiteList == void 0) return result;
    if (dart._ignoreTypeFailure(actual, type)) return true;
    return result;
  };
  dart.instanceOfOrNull = function(obj, type) {
    if (obj == null || dart.strongInstanceOf(obj, type, true)) return true;
    return false;
  };
  dart.is = function(obj, type) {
    let result = dart.strongInstanceOf(obj, type);
    if (result !== null) return result;
    let actual = dart.getReifiedType(obj);
    dart.throwStrongModeError('Strong mode is-check failure: ' + dart.typeName(actual) + ' does not soundly subtype ' + dart.typeName(type));
  };
  dart.as = function(obj, type) {
    if (type == dart.dynamic || obj == null) return obj;
    let result = dart.strongInstanceOf(obj, type, true);
    if (result) return obj;
    dart._throwCastError(obj, type, result);
  };
  dart.check = function(obj, type) {
    if (type == dart.dynamic || obj == null) return obj;
    let result = dart.strongInstanceOf(obj, type, true);
    if (result) return obj;
    dart._throwTypeError(obj, type, result);
  };
  dart.test = function(obj) {
    if (typeof obj == 'boolean') return obj;
    return dart.booleanConversionFailed(obj);
  };
  dart.booleanConversionFailed = function(obj) {
    if (obj == null) {
      dart.throw(new _js_helper.BooleanConversionAssertionError());
    }
    let actual = dart.getReifiedType(obj);
    let expected = core.bool;
    dart.throw(new _js_helper.TypeErrorImplementation.fromMessage(dart.str`type '${dart.typeName(actual)}' is not a subtype of ` + dart.str`type '${dart.typeName(expected)}' in boolean expression`));
  };
  dart._throwCastError = function(obj, type, result) {
    let actual = dart.getReifiedType(obj);
    if (result == false) dart.throwCastError(obj, actual, type);
    dart.throwStrongModeCastError(obj, actual, type);
  };
  dart._throwTypeError = function(obj, type, result) {
    let actual = dart.getReifiedType(obj);
    if (result == false) dart.throwTypeError(obj, actual, type);
    dart.throwStrongModeTypeError(obj, actual, type);
  };
  dart.asInt = function(obj) {
    if (obj == null) return null;
    if (Math.floor(obj) != obj) {
      dart.throwCastError(obj, dart.getReifiedType(obj), core.int);
    }
    return obj;
  };
  dart.addSimpleTypeTests = function(ctor) {
    ctor.is = function is_C(object) {
      if (object instanceof this) return true;
      return dart.is(object, this);
    };
    ctor.as = function as_C(object) {
      if (object instanceof this) return object;
      return dart.as(object, this);
    };
    ctor._check = function check_C(object) {
      if (object instanceof this) return object;
      return dart.check(object, this);
    };
  };
  dart.addTypeTests = function(ctor) {
    ctor.as = function as_G(object) {
      return dart.as(object, this);
    };
    ctor.is = function is_G(object) {
      return dart.is(object, this);
    };
    ctor._check = function check_G(object) {
      return dart.check(object, this);
    };
  };
  dart.equals = function(x, y) {
    if (x == null || y == null) return x == y;
    let eq = x['=='];
    return eq ? eq.call(x, y) : x === y;
  };
  dart.notNull = function(x) {
    if (x == null) dart.throwNullValueError();
    return x;
  };
  dart.map = function(values, K, V) {
    if (K === void 0) K = null;
    if (V === void 0) V = null;
    return (() => {
      if (K == null) K = dart.dynamic;
      if (V == null) V = dart.dynamic;
      let map = dart.getGenericClass(collection.LinkedHashMap)(K, V).new();
      if (Array.isArray(values)) {
        for (let i = 0, end = values.length - 1; i < end; i += 2) {
          let key = values[i];
          let value = values[i + 1];
          map._set(key, value);
        }
      } else if (typeof values === 'object') {
        for (let key of dart.getOwnPropertyNames(values)) {
          map._set(key, values[key]);
        }
      }
      return map;
    })();
  };
  dart.assert = function(condition) {
    if (!condition) dart.throwAssertionError();
  };
  dart.throw = function(obj) {
    if (obj != null && (typeof obj == 'object' || typeof obj == 'function')) {
      dart._stack.set(obj, new Error());
    }
    throw obj;
  };
  dart.getError = function(exception) {
    var stack = dart._stack.get(exception);
    return stack !== void 0 ? stack : exception;
  };
  dart.stackPrint = function(exception) {
    var error = dart.getError(exception);
    console.log(error.stack ? error.stack : 'No stack trace for: ' + error);
  };
  dart.stackTrace = function(exception) {
    var error = dart.getError(exception);
    return _js_helper.getTraceFromException(error);
  };
  dart.nullSafe = function(obj, ...callbacks) {
    if (obj == null) return obj;
    for (let callback of callbacks) {
      obj = callback(obj);
      if (obj == null) break;
    }
    return obj;
  };
  dart.multiKeyPutIfAbsent = function(map, keys, valueFn) {
    for (let k of keys) {
      let value = map.get(k);
      if (!value) {
        map.set(k, value = new Map());
      }
      map = value;
    }
    if (map.has(dart._value)) return map.get(dart._value);
    let value = valueFn();
    map.set(dart._value, value);
    return value;
  };
  dart.const = function(obj) {
    function lookupNonTerminal(map, key) {
      let result = map.get(key);
      if (result !== void 0) return result;
      map.set(key, result = new Map());
      return result;
    }
    let names = dart.getOwnNamesAndSymbols(obj);
    let count = names.length;
    let map = lookupNonTerminal(dart.constants, count);
    for (let i = 0; i < count; i++) {
      let name = names[i];
      map = lookupNonTerminal(map, name);
      map = lookupNonTerminal(map, obj[name]);
    }
    let type = dart.getReifiedType(obj);
    let value = map.get(type);
    if (value) return value;
    map.set(type, obj);
    return obj;
  };
  dart.constList = function(elements, elementType) {
    function lookupNonTerminal(map, key) {
      let result = map.get(key);
      if (result !== void 0) return result;
      map.set(key, result = new Map());
      return result;
    }
    let count = elements.length;
    let map = lookupNonTerminal(dart.constantLists, count);
    for (let i = 0; i < count; i++) {
      map = lookupNonTerminal(map, elements[i]);
    }
    let value = map.get(elementType);
    if (value) return value;
    value = dart.list(elements, elementType);
    map.set(elementType, value);
    return value;
  };
  dart.hashCode = function(obj) {
    if (obj == null) return 0;
    switch (typeof obj) {
      case "number":
      {
        return obj & 0x1FFFFFFF;
      }
      case "boolean":
      {
        return obj ? 2 * 3 * 23 * 3761 : 269 * 811;
      }
      case "function":
      {
        return _js_helper.Primitives.objectHashCode(obj);
      }
    }
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      return obj[dartx.hashCode];
    }
    return obj.hashCode;
  };
  dart.toString = function(obj) {
    if (obj == null) return "null";
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      return obj[dartx.toString]();
    }
    if (typeof obj == "function") {
      return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
    }
    return obj.toString();
  };
  dart.noSuchMethod = function(obj, invocation) {
    if (obj == null || typeof obj == "function") {
      dart.throw(new core.NoSuchMethodError(obj, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
    }
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      return obj[dartx.noSuchMethod](invocation);
    }
    return obj.noSuchMethod(invocation);
  };
  dart.constFn = function(x) {
    return () => x;
  };
  dart.runtimeType = function(obj) {
    let result = dart._checkPrimitiveType(obj);
    if (result != null) return dart.wrapType(result);
    let extension = dart.getExtensionType(obj);
    if (extension != null) {
      result = obj[dartx.runtimeType];
      return result != null ? result : dart.wrapType(extension);
    }
    if (typeof obj == "function") {
      return dart.wrapType(dart.getReifiedType(obj));
    }
    return obj.runtimeType;
  };
  dart.str = function(strings, ...values) {
    let s = strings[0];
    for (let i = 0, len = values.length; i < len;) {
      s += dart.notNull(dart.toString(values[i])) + strings[++i];
    }
    return s;
  };
  dart._canonicalMember = function(obj, name) {
    if (typeof name === "symbol") return name;
    if (obj != null && dart.getExtensionType(obj) != null) {
      return dartx[name];
    }
    if (dart.equals(name, 'constructor') || dart.equals(name, 'prototype')) {
      name = '+' + dart.notNull(core.String._check(name));
    }
    return name;
  };
  dart.loadLibrary = function() {
    return async.Future.value();
  };
  dart.defineProperty = function(obj, name, desc) {
    return Object.defineProperty(obj, name, desc);
  };
  dart.getOwnPropertyDescriptor = function(obj, name) {
    return Object.getOwnPropertyDescriptor(obj, name);
  };
  dart.getOwnPropertyNames = function(obj) {
    return Object.getOwnPropertyNames(obj);
  };
  dart.getOwnPropertySymbols = function(obj) {
    return Object.getOwnPropertySymbols(obj);
  };
  dart.throwStrongModeError = function(message) {
    debugger;
    throw new _js_helper.StrongModeErrorImplementation(message);
  };
  dart.throwInternalError = function(message) {
    debugger;
    throw Error(message);
  };
  dart.getOwnNamesAndSymbols = function(obj) {
    let names = dart.getOwnPropertyNames(obj);
    let symbols = dart.getOwnPropertySymbols(obj);
    return names.concat(symbols);
  };
  dart.safeGetOwnProperty = function(obj, name) {
    let desc = dart.getOwnPropertyDescriptor(obj, name);
    if (desc != null) return desc.value;
  };
  dart.defineLazyProperty = function(to, name, desc) {
    let init = desc.get;
    let value = null;
    function lazySetter(x) {
      init = null;
      value = x;
    }
    function circularInitError() {
      dart.throwInternalError('circular initialization for field ' + name);
    }
    function lazyGetter() {
      if (init == null) return value;
      let f = init;
      init = circularInitError;
      lazySetter(f());
      return value;
    }
    desc.get = lazyGetter;
    desc.configurable = true;
    if (desc.set) desc.set = lazySetter;
    return dart.defineProperty(to, name, desc);
  };
  dart.defineLazy = function(to, from) {
    for (let name of dart.getOwnNamesAndSymbols(from)) {
      dart.defineLazyProperty(to, name, dart.getOwnPropertyDescriptor(from, name));
    }
  };
  dart.defineMemoizedGetter = function(obj, name, getter) {
    return dart.defineLazyProperty(obj, name, {get: getter});
  };
  dart.copyTheseProperties = function(to, from, names) {
    for (let i = 0; i < names.length; ++i) {
      dart.copyProperty(to, from, names[i]);
    }
    return to;
  };
  dart.copyProperty = function(to, from, name) {
    let desc = dart.getOwnPropertyDescriptor(from, name);
    if (name == Symbol.iterator) {
      let existing = dart.getOwnPropertyDescriptor(to, name);
      if (existing != null) {
        if (existing.writable) {
          to[name] = desc.value;
        }
        return;
      }
    }
    dart.defineProperty(to, name, desc);
  };
  dart.export = function(to, from, name) {
    return dart.copyProperty(to, from, name);
  };
  dart.copyProperties = function(to, from) {
    return dart.copyTheseProperties(to, from, dart.getOwnNamesAndSymbols(from));
  };
  dart.global = typeof window == "undefined" ? global : window;
  dart.JsSymbol = Symbol;
  dart._mixins = Symbol("mixins");
  dart.implements = Symbol("implements");
  dart._typeArguments = Symbol("typeArguments");
  dart._originalDeclaration = Symbol("originalDeclaration");
  dart._constructorSig = Symbol("sigCtor");
  dart._methodSig = Symbol("sigMethod");
  dart._fieldSig = Symbol("sigField");
  dart._getterSig = Symbol("sigGetter");
  dart._setterSig = Symbol("sigSetter");
  dart._staticSig = Symbol("sigStaticMethod");
  dart._staticFieldSig = Symbol("sigStaticField");
  dart._staticGetterSig = Symbol("sigStaticGetter");
  dart._staticSetterSig = Symbol("sigStaticSetter");
  dart._genericTypeCtor = Symbol("genericType");
  dart._extensionType = Symbol("extensionType");
  dart.dartx = dartx;
  dart._runtimeType = Symbol("_runtimeType");
  dart.isNamedConstructor = Symbol("isNamedConstructor");
  dart.defineLazy(dart, {
    get _lazyJSTypes() {
      return new Map();
    },
    set _lazyJSTypes(_) {}
  });
  dart.metadata = Symbol("metadata");
  dart._typeObject = Symbol("typeObject");
  core.Object = class Object {
    constructor(...args) {
      return this.new.apply(this, args);
    }
    new() {
    }
    ['=='](other) {
      return core.identical(this, other);
    }
    get hashCode() {
      return _js_helper.Primitives.objectHashCode(this);
    }
    toString() {
      return _js_helper.Primitives.objectToString(this);
    }
    noSuchMethod(invocation) {
      dart.throw(new core.NoSuchMethodError(this, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
    }
    get runtimeType() {
      return dart.wrapType(dart.getReifiedType(this));
    }
  };
  core.Object.is = function is_Object(o) {
    if (o instanceof this) return true;
    return dart.is(o, this);
  };
  core.Object.as = function as_Object(o) {
    if (o == null || o instanceof this) return o;
    return dart.as(o, this);
  };
  core.Object._check = function check_Object(o) {
    if (o == null || o instanceof this) return o;
    return dart.check(o, this);
  };
  dart.setSignature(core.Object, {
    constructors: () => ({new: dart.definiteFunctionType(core.Object, [])}),
    getters: () => ({
      hashCode: dart.definiteFunctionType(core.int, []),
      runtimeType: dart.definiteFunctionType(core.Type, [])
    }),
    methods: () => ({
      '==': dart.definiteFunctionType(core.bool, [dart.dynamic]),
      toString: dart.definiteFunctionType(core.String, []),
      noSuchMethod: dart.definiteFunctionType(dart.dynamic, [core.Invocation])
    })
  });
  dart.tagComputed(core.Object, () => core.Type);
  dart.TypeRep = class TypeRep extends core.Object {
    new() {
      dart._initialize;
    }
    get name() {
      return this.toString();
    }
  };
  dart.TypeRep[dart.implements] = () => [core.Type];
  dart.setSignature(dart.TypeRep, {
    constructors: () => ({new: dart.definiteFunctionType(dart.TypeRep, [])}),
    getters: () => ({name: dart.definiteFunctionType(core.String, [])})
  });
  dart.Dynamic = class Dynamic extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'dynamic';
    }
  };
  const _dartName = Symbol('_dartName');
  dart.LazyJSType = class LazyJSType extends core.Object {
    new(jsTypeCallback, dartName) {
      this[_jsTypeCallback] = jsTypeCallback;
      this[_dartName] = dartName;
    }
    get [_rawJSType]() {
      return this[_jsTypeCallback]();
    }
    toString() {
      return core.String._check(this[_jsTypeCallback] != null ? dart.typeName(this[_rawJSType]) : this[_dartName]);
    }
  };
  dart.LazyJSType[dart.implements] = () => [core.Type];
  dart.setSignature(dart.LazyJSType, {
    constructors: () => ({new: dart.definiteFunctionType(dart.LazyJSType, [dart.dynamic, dart.dynamic])}),
    fields: () => ({
      [_jsTypeCallback]: dart.dynamic,
      [_dartName]: dart.dynamic
    }),
    getters: () => ({[_rawJSType]: dart.definiteFunctionType(dart.dynamic, [])})
  });
  dart.dynamic = new dart.Dynamic();
  dart._initialize = dart._initialize2();
  dart.Void = class Void extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'void';
    }
  };
  dart.void = new dart.Void();
  dart.Bottom = class Bottom extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'bottom';
    }
  };
  dart.bottom = new dart.Bottom();
  dart.JSObject = class JSObject extends dart.TypeRep {
    new() {
      super.new();
    }
    toString() {
      return 'NativeJavaScriptObject';
    }
  };
  dart.jsobject = new dart.JSObject();
  core.Type = class Type extends core.Object {};
  dart.WrappedType = class WrappedType extends core.Type {
    new(wrappedType) {
      this[_wrappedType] = wrappedType;
    }
    toString() {
      return core.String._check(dart.typeName(this[_wrappedType]));
    }
  };
  dart.setSignature(dart.WrappedType, {
    constructors: () => ({new: dart.definiteFunctionType(dart.WrappedType, [dart.dynamic])}),
    fields: () => ({[_wrappedType]: dart.dynamic})
  });
  dart.AbstractFunctionType = class AbstractFunctionType extends dart.TypeRep {
    constructor() {
      super();
      this._stringValue = null;
    }
    toString() {
      return this.name;
    }
    get name() {
      if (this._stringValue) return this._stringValue;
      let buffer = '(';
      for (let i = 0; i < this.args.length; ++i) {
        if (i > 0) {
          buffer += ', ';
        }
        buffer += dart.typeName(this.args[i]);
      }
      if (this.optionals.length > 0) {
        if (this.args.length > 0) buffer += ', ';
        buffer += '[';
        for (let i = 0; i < this.optionals.length; ++i) {
          if (i > 0) {
            buffer += ', ';
          }
          buffer += dart.typeName(this.optionals[i]);
        }
        buffer += ']';
      } else if (Object.keys(this.named).length > 0) {
        if (this.args.length > 0) buffer += ', ';
        buffer += '{';
        let names = dart.getOwnPropertyNames(this.named).sort();
        for (let i = 0; i < names.length; ++i) {
          if (i > 0) {
            buffer += ', ';
          }
          buffer += names[i] + ': ' + dart.typeName(this.named[names[i]]);
        }
        buffer += '}';
      }
      buffer += ') -> ' + dart.typeName(this.returnType);
      this._stringValue = buffer;
      return buffer;
    }
  };
  dart._fnTypeNamedArgMap = new Map();
  dart._fnTypeArrayArgMap = new Map();
  dart._fnTypeTypeMap = new Map();
  dart._fnTypeSmallMap = [new Map(), new Map(), new Map()];
  dart.FunctionType = class FunctionType extends dart.AbstractFunctionType {
    static _memoizeArray(map, arr, create) {
      let len = arr.length;
      map = FunctionType._lookupNonTerminal(map, len);
      for (var i = 0; i < len - 1; ++i) {
        map = FunctionType._lookupNonTerminal(map, arr[i]);
      }
      let result = map.get(arr[len - 1]);
      if (result !== void 0) return result;
      map.set(arr[len - 1], result = create());
      return result;
    }
    static _normalizeParameter(a) {
      if (a instanceof Array) {
        let result = [];
        result.push(a[0] == dart.dynamic ? dart.bottom : a[0]);
        result.push(a.slice(1));
        return result;
      }
      return a == dart.dynamic ? dart.bottom : a;
    }
    static _canonicalizeArray(definite, array, map) {
      let arr = definite ? array : array.map(FunctionType._normalizeParameter);
      return FunctionType._memoizeArray(map, arr, () => arr);
    }
    static _canonicalizeNamed(definite, named, map) {
      let key = [];
      let names = dart.getOwnPropertyNames(named);
      let r = {};
      for (var i = 0; i < names.length; ++i) {
        let name = names[i];
        let type = named[name];
        if (!definite) r[name] = type = FunctionType._normalizeParameter(type);
        key.push(name);
        key.push(type);
      }
      if (!definite) named = r;
      return FunctionType._memoizeArray(map, key, () => named);
    }
    static _lookupNonTerminal(map, key) {
      let result = map.get(key);
      if (result !== void 0) return result;
      map.set(key, result = new Map());
      return result;
    }
    static _createSmall(count, definite, returnType, required) {
      let map = dart._fnTypeSmallMap[count];
      let args = definite ? required : required.map(FunctionType._normalizeParameter);
      for (var i = 0; i < count; ++i) {
        map = FunctionType._lookupNonTerminal(map, args[i]);
      }
      let result = map.get(returnType);
      if (result !== void 0) return result;
      result = new FunctionType(returnType, args, [], {});
      map.set(returnType, result);
      return result;
    }
    static create(definite, returnType, args, extra) {
      if (extra === void 0 && args.length < 3) {
        return FunctionType._createSmall(args.length, definite, returnType, args);
      }
      args = FunctionType._canonicalizeArray(definite, args, dart._fnTypeArrayArgMap);
      let keys;
      let create;
      if (extra === void 0) {
        keys = [returnType, args];
        create = () => new FunctionType(returnType, args, [], {});
      } else if (extra instanceof Array) {
        let optionals = FunctionType._canonicalizeArray(definite, extra, dart._fnTypeArrayArgMap);
        keys = [returnType, args, optionals];
        create = () => new FunctionType(returnType, args, optionals, {});
      } else {
        let named = FunctionType._canonicalizeNamed(definite, extra, dart._fnTypeNamedArgMap);
        keys = [returnType, args, named];
        create = () => new FunctionType(returnType, args, [], named);
      }
      return FunctionType._memoizeArray(dart._fnTypeTypeMap, keys, create);
    }
    constructor(returnType, args, optionals, named) {
      super();
      this.returnType = returnType;
      this.args = args;
      this.optionals = optionals;
      this.named = named;
      this.metadata = [];
      function process(array, metadata) {
        var result = [];
        for (var i = 0; i < array.length; ++i) {
          var arg = array[i];
          if (arg instanceof Array) {
            metadata.push(arg.slice(1));
            result.push(arg[0]);
          } else {
            metadata.push([]);
            result.push(arg);
          }
        }
        return result;
      }
      this.args = process(this.args, this.metadata);
      this.optionals = process(this.optionals, this.metadata);
    }
  };
  dart.Typedef = class Typedef extends dart.AbstractFunctionType {
    constructor(name, closure) {
      super();
      this._name = name;
      this._closure = closure;
      this._functionType = null;
    }
    get name() {
      return this._name;
    }
    get functionType() {
      if (!this._functionType) {
        this._functionType = this._closure();
      }
      return this._functionType;
    }
    get returnType() {
      return this.functionType.returnType;
    }
    get args() {
      return this.functionType.args;
    }
    get optionals() {
      return this.functionType.optionals;
    }
    get named() {
      return this.functionType.named;
    }
    get metadata() {
      return this.functionType.metadata;
    }
  };
  dart._typeFormalCount = Symbol("_typeFormalCount");
  dart.isSubtype = dart._subtypeMemo((t1, t2) => t1 === t2 || dart._isSubtype(t1, t2, true));
  dart._jsIterator = Symbol("_jsIterator");
  dart._current = Symbol("_current");
  dart._AsyncStarStreamController = class _AsyncStarStreamController {
    constructor(generator, T, args) {
      this.isAdding = false;
      this.isWaiting = false;
      this.isScheduled = false;
      this.isSuspendedAtYield = false;
      this.canceler = null;
      this.iterator = generator(this, ...args)[Symbol.iterator]();
      this.controller = dart.getGenericClass(async.StreamController)(T).new({
        onListen: () => this.scheduleGenerator(),
        onResume: () => this.onResume(),
        onCancel: () => this.onCancel()
      });
    }
    onResume() {
      if (this.isSuspendedAtYield) {
        this.scheduleGenerator();
      }
    }
    onCancel() {
      if (this.controller.isClosed) {
        return null;
      }
      if (this.canceler == null) {
        this.canceler = async.Completer.new();
        this.scheduleGenerator();
      }
      return this.canceler.future;
    }
    close() {
      if (this.canceler != null && !this.canceler.isCompleted) {
        this.canceler.complete();
      }
      this.controller.close();
    }
    scheduleGenerator() {
      if (this.isScheduled || this.controller.isPaused || this.isAdding || this.isWaiting) {
        return;
      }
      this.isScheduled = true;
      async.scheduleMicrotask(() => this.runBody());
    }
    runBody(opt_awaitValue) {
      this.isScheduled = false;
      this.isSuspendedAtYield = false;
      this.isWaiting = false;
      let iter;
      try {
        iter = this.iterator.next(opt_awaitValue);
      } catch (e) {
        this.addError(e, dart.stackTrace(e));
        this.close();
        return;
      }

      if (iter.done) {
        this.close();
        return;
      }
      if (this.isSuspendedAtYield || this.isAdding) return;
      this.isWaiting = true;
      let future = iter.value;
      if (!dart.is(future, dart.getGenericClass(async.Future))) {
        future = async.Future.value(future);
      }
      return future.then(dart.dynamic)(x => this.runBody(x), {
        onError: (e, s) => this.throwError(e, s)
      });
    }
    add(event) {
      if (!this.controller.hasListener) return true;
      this.controller.add(event);
      this.scheduleGenerator();
      this.isSuspendedAtYield = true;
      return false;
    }
    addStream(stream) {
      if (!this.controller.hasListener) return true;
      this.isAdding = true;
      this.controller.addStream(stream, {cancelOnError: false}).then(dart.dynamic)(() => {
        this.isAdding = false;
        this.scheduleGenerator();
      }, {
        onError: (e, s) => this.throwError(e, s)
      });
    }
    throwError(error, stackTrace) {
      try {
        this.iterator.throw(error);
      } catch (e) {
        this.addError(e, stackTrace);
      }

    }
    addError(error, stackTrace) {
      if (this.canceler != null && !this.canceler.isCompleted) {
        this.canceler.completeError(error, stackTrace);
        return;
      }
      if (!this.controller.hasListener) return;
      this.controller.addError(error, stackTrace);
    }
  };
  core.Invocation = class Invocation extends core.Object {
    get isAccessor() {
      return dart.test(this.isGetter) || dart.test(this.isSetter);
    }
  };
  dart.setSignature(core.Invocation, {
    getters: () => ({isAccessor: dart.definiteFunctionType(core.bool, [])})
  });
  dart.InvocationImpl = class InvocationImpl extends core.Invocation {
    new(memberName, positionalArguments, opts) {
      let namedArguments = opts && 'namedArguments' in opts ? opts.namedArguments : null;
      let isMethod = opts && 'isMethod' in opts ? opts.isMethod : false;
      let isGetter = opts && 'isGetter' in opts ? opts.isGetter : false;
      let isSetter = opts && 'isSetter' in opts ? opts.isSetter : false;
      this.positionalArguments = positionalArguments;
      this.isMethod = isMethod;
      this.isGetter = isGetter;
      this.isSetter = isSetter;
      this.memberName = dart._dartSymbol(memberName);
      this.namedArguments = dart.InvocationImpl._namedArgsToSymbols(namedArguments);
    }
    static _namedArgsToSymbols(namedArgs) {
      if (namedArgs == null) return dart.map({}, core.Symbol, dart.dynamic);
      return MapOfSymbol$dynamic().fromIterable(dart.getOwnPropertyNames(namedArgs), {key: dart._dartSymbol, value: dart.fn(k => namedArgs[k], dynamicTodynamic$())});
    }
  };
  dart.setSignature(dart.InvocationImpl, {
    constructors: () => ({new: dart.definiteFunctionType(dart.InvocationImpl, [core.String, core.List], {namedArguments: dart.dynamic, isMethod: core.bool, isGetter: core.bool, isSetter: core.bool})}),
    fields: () => ({
      memberName: core.Symbol,
      positionalArguments: core.List,
      namedArguments: MapOfSymbol$dynamic(),
      isMethod: core.bool,
      isGetter: core.bool,
      isSetter: core.bool
    }),
    statics: () => ({_namedArgsToSymbols: dart.definiteFunctionType(core.Map$(core.Symbol, dart.dynamic), [dart.dynamic])}),
    names: ['_namedArgsToSymbols']
  });
  dart._MethodStats = class _MethodStats extends core.Object {
    new(typeName, frame) {
      this.typeName = typeName;
      this.frame = frame;
      this.count = null;
      this.count = 0;
    }
  };
  dart.setSignature(dart._MethodStats, {
    constructors: () => ({new: dart.definiteFunctionType(dart._MethodStats, [core.String, core.String])}),
    fields: () => ({
      typeName: core.String,
      frame: core.String,
      count: core.int
    })
  });
  dart.defineLazy(dart, {
    get _callMethodStats() {
      return MapOfString$_MethodStats().new();
    },
    set _callMethodStats(_) {}
  });
  dart.defineLazy(dart, {
    get trackProfile() {
      return dart.global.trackDdcProfile;
    },
    set trackProfile(_) {}
  });
  dart._ignoreTypeFailure = (() => {
    return dart._ignoreMemo((actual, type) => {
      if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || dart.isFunctionType(type) && dart.isFunctionType(actual) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
        console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
        return true;
      }
      return false;
    });
  })();
  dart._stack = new WeakMap();
  dart._value = Symbol("_value");
  dart.constants = new Map();
  dart.constantLists = new Map();
  dart.JsIterator = class JsIterator {
    constructor(dartIterator) {
      this.dartIterator = dartIterator;
    }
    next() {
      let i = this.dartIterator;
      let done = !i.moveNext();
      return {done: done, value: done ? void 0 : i.current};
    }
  };
  dart.hasOwnProperty = Object.prototype.hasOwnProperty;
  _debugger.JsonMLConfig = class JsonMLConfig extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_debugger.JsonMLConfig, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLConfig, [core.String])}),
    fields: () => ({name: core.String}),
    sfields: () => ({
      none: _debugger.JsonMLConfig,
      skipDart: _debugger.JsonMLConfig,
      keyToString: _debugger.JsonMLConfig,
      asClass: _debugger.JsonMLConfig
    })
  });
  dart.defineLazy(_debugger.JsonMLConfig, {
    get none() {
      return dart.const(new _debugger.JsonMLConfig("none"));
    },
    get skipDart() {
      return dart.const(new _debugger.JsonMLConfig("skipDart"));
    },
    get keyToString() {
      return dart.const(new _debugger.JsonMLConfig("keyToString"));
    },
    get asClass() {
      return dart.const(new _debugger.JsonMLConfig("asClass"));
    }
  });
  _debugger._maxSpanLength = 100;
  dart.defineLazy(_debugger, {
    get _devtoolsFormatter() {
      return new _debugger.JsonMLFormatter(new _debugger.DartFormatter());
    },
    set _devtoolsFormatter(_) {}
  });
  _debugger._typeof = function(object) {
    return typeof object;
  };
  dart.lazyFn(_debugger._typeof, () => dynamicToString());
  _debugger.getOwnPropertyNames = function(object) {
    return dart.list(Object.getOwnPropertyNames(object), core.String);
  };
  dart.lazyFn(_debugger.getOwnPropertyNames, () => dynamicToListOfString());
  _debugger.getOwnPropertySymbols = function(object) {
    return Object.getOwnPropertySymbols(object);
  };
  dart.lazyFn(_debugger.getOwnPropertySymbols, () => dynamicToList());
  _debugger.JSNative = class JSNative extends core.Object {
    static getProperty(object, name) {
      return object[name];
    }
    static setProperty(object, name, value) {
      return object[name] = value;
    }
  };
  dart.setSignature(_debugger.JSNative, {
    statics: () => ({
      getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['getProperty', 'setProperty']
  });
  _debugger.addMetadataChildren = function(object, ret) {
    ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
  };
  dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
  _debugger.getObjectTypeName = function(object) {
    let reifiedType = dart.getReifiedType(object);
    if (reifiedType == null) {
      if (_debugger._typeof(object) == 'function') {
        return '[[Raw JavaScript Function]]';
      }
      return '<Error getting type name>';
    }
    return _debugger.getTypeName(core.Type._check(reifiedType));
  };
  dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
  _debugger.getTypeName = function(type) {
    let name = dart.typeName(type);
    if (dart.equals(name, 'JSArray<dynamic>') || dart.equals(name, 'JSObject<Array>')) return 'List<dynamic>';
    return core.String._check(name);
  };
  dart.lazyFn(_debugger.getTypeName, () => TypeToString());
  _debugger._getType = function(object) {
    return core.Type.is(object) ? object : dart.getReifiedType(object);
  };
  dart.fn(_debugger._getType, dynamicToObject());
  const _simpleFormatter = Symbol('_simpleFormatter');
  _debugger.safePreview = function(object, config) {
    try {
      let preview = _debugger._devtoolsFormatter[_simpleFormatter].preview(object, config);
      if (preview != null) return preview;
      return dart.toString(object);
    } catch (e) {
      return dart.str`<Exception thrown> ${e}`;
    }

  };
  dart.lazyFn(_debugger.safePreview, () => dynamicAnddynamicToString());
  _debugger.symbolName = function(symbol) {
    let name = dart.toString(symbol);
    dart.assert(name[dartx.startsWith]('Symbol('));
    return name[dartx.substring]('Symbol('[dartx.length], dart.notNull(name[dartx.length]) - 1);
  };
  dart.lazyFn(_debugger.symbolName, () => dynamicToString());
  _debugger.hasMethod = function(object, name) {
    try {
      return core.bool._check(dart.hasMethod(object, name));
    } catch (e) {
      return false;
    }

  };
  dart.lazyFn(_debugger.hasMethod, () => dynamicAndStringTobool());
  _debugger.NameValuePair = class NameValuePair extends core.Object {
    new(opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      let value = opts && 'value' in opts ? opts.value : null;
      let config = opts && 'config' in opts ? opts.config : _debugger.JsonMLConfig.none;
      let hideName = opts && 'hideName' in opts ? opts.hideName : false;
      this.name = name;
      this.value = value;
      this.config = config;
      this.hideName = hideName;
    }
    ['=='](other) {
      return _debugger.NameValuePair.is(other) && other.name == this.name;
    }
    get hashCode() {
      return dart.hashCode(this.name);
    }
    get displayName() {
      return dart.test(this.hideName) ? '' : this.name;
    }
  };
  dart.setSignature(_debugger.NameValuePair, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.NameValuePair, [], {name: core.String, value: core.Object, config: _debugger.JsonMLConfig, hideName: core.bool})}),
    fields: () => ({
      name: core.String,
      value: core.Object,
      config: _debugger.JsonMLConfig,
      hideName: core.bool
    }),
    getters: () => ({displayName: dart.definiteFunctionType(core.String, [])})
  });
  _debugger.MapEntry = class MapEntry extends core.Object {
    new(opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let value = opts && 'value' in opts ? opts.value : null;
      this.key = key;
      this.value = value;
    }
  };
  dart.setSignature(_debugger.MapEntry, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.MapEntry, [], {key: core.Object, value: core.Object})}),
    fields: () => ({
      key: core.Object,
      value: core.Object
    })
  });
  _debugger.IterableSpan = class IterableSpan extends core.Object {
    new(start, end, iterable) {
      this.start = start;
      this.end = end;
      this.iterable = iterable;
    }
    get length() {
      return dart.notNull(this.end) - dart.notNull(this.start);
    }
    get maxPowerOfSubsetSize() {
      return (dart.notNull(math.log(dart.notNull(this.length) - 0.5)) / dart.notNull(math.log(_debugger._maxSpanLength)))[dartx.truncate]();
    }
    get subsetSize() {
      return dart.asInt(math.pow(_debugger._maxSpanLength, this.maxPowerOfSubsetSize));
    }
    asMap() {
      return this.iterable[dartx.skip](this.start)[dartx.take](this.length)[dartx.toList]()[dartx.asMap]();
    }
    children() {
      let children = JSArrayOfNameValuePair().of([]);
      if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
        this.asMap()[dartx.forEach](dart.fn((i, element) => {
          children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
        }, intAnddynamicTovoid()));
      } else {
        for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
          let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
          if (subSpan.length == 1) {
            children[dartx.add](new _debugger.NameValuePair({name: dart.toString(i), value: this.iterable[dartx.elementAt](i)}));
          } else {
            children[dartx.add](new _debugger.NameValuePair({name: dart.str`[${i}...${dart.notNull(subSpan.end) - 1}]`, value: subSpan, hideName: true}));
          }
        }
      }
      return children;
    }
  };
  dart.setSignature(_debugger.IterableSpan, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.IterableSpan, [core.int, core.int, core.Iterable])}),
    fields: () => ({
      start: core.int,
      end: core.int,
      iterable: core.Iterable
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      maxPowerOfSubsetSize: dart.definiteFunctionType(core.int, []),
      subsetSize: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      asMap: dart.definiteFunctionType(core.Map$(core.int, dart.dynamic), []),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [])
    })
  });
  _debugger.Library = class Library extends core.Object {
    new(name, object) {
      this.name = name;
      this.object = object;
    }
  };
  dart.setSignature(_debugger.Library, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.Library, [core.String, core.Object])}),
    fields: () => ({
      name: core.String,
      object: core.Object
    })
  });
  _debugger.NamedConstructor = class NamedConstructor extends core.Object {
    new(object) {
      this.object = object;
    }
  };
  dart.setSignature(_debugger.NamedConstructor, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.NamedConstructor, [core.Object])}),
    fields: () => ({object: core.Object})
  });
  _debugger.HeritageClause = class HeritageClause extends core.Object {
    new(name, types) {
      this.name = name;
      this.types = types;
    }
  };
  dart.setSignature(_debugger.HeritageClause, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.HeritageClause, [core.String, core.List])}),
    fields: () => ({
      name: core.String,
      types: core.List
    })
  });
  _debugger.safeGetProperty = function(protoChain, name) {
    try {
      return _debugger.JSNative.getProperty(protoChain, name);
    } catch (e) {
      return dart.str`<Exception thrown> ${e}`;
    }

  };
  dart.fn(_debugger.safeGetProperty, ObjectAndObjectToObject());
  _debugger.safeProperties = function(object) {
    return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[dartx.where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool$())), {key: dart.fn(name => name, dynamicTodynamic$()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
  };
  dart.fn(_debugger.safeProperties, dynamicTodynamic$());
  const _attributes = Symbol('_attributes');
  const _jsonML = Symbol('_jsonML');
  _debugger.JsonMLElement = class JsonMLElement extends core.Object {
    new(tagName) {
      this[_attributes] = null;
      this[_jsonML] = null;
      this[_attributes] = {};
      this[_jsonML] = [tagName, this[_attributes]];
    }
    appendChild(element) {
      this[_jsonML][dartx.add](dart.dsend(element, 'toJsonML'));
    }
    createChild(tagName) {
      let c = new _debugger.JsonMLElement(tagName);
      this[_jsonML][dartx.add](c.toJsonML());
      return c;
    }
    createObjectTag(object) {
      return (() => {
        let _ = this.createChild('object');
        _.addAttribute('object', object);
        return _;
      })();
    }
    setStyle(style) {
      dart.dput(this[_attributes], 'style', style);
    }
    addStyle(style) {
      if (dart.dload(this[_attributes], 'style') == null) {
        dart.dput(this[_attributes], 'style', style);
      } else {
        let o = this[_attributes];
        dart.dput(o, 'style', dart.dsend(dart.dload(o, 'style'), '+', style));
      }
    }
    addAttribute(key, value) {
      _debugger.JSNative.setProperty(this[_attributes], key, value);
    }
    createTextChild(text) {
      this[_jsonML][dartx.add](text);
    }
    toJsonML() {
      return this[_jsonML];
    }
  };
  dart.setSignature(_debugger.JsonMLElement, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic])}),
    fields: () => ({
      [_attributes]: dart.dynamic,
      [_jsonML]: core.List
    }),
    methods: () => ({
      appendChild: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      createChild: dart.definiteFunctionType(_debugger.JsonMLElement, [core.String]),
      createObjectTag: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic]),
      setStyle: dart.definiteFunctionType(dart.void, [core.String]),
      addStyle: dart.definiteFunctionType(dart.dynamic, [core.String]),
      addAttribute: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      createTextChild: dart.definiteFunctionType(dart.dynamic, [core.String]),
      toJsonML: dart.definiteFunctionType(dart.dynamic, [])
    })
  });
  _debugger.isNativeJavaScriptObject = function(object) {
    let type = _debugger._typeof(object);
    return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
  };
  dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
  _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
    new(simpleFormatter) {
      this[_simpleFormatter] = simpleFormatter;
      this.customFormattersOn = false;
    }
    setMaxSpanLengthForTestingOnly(spanLength) {
      _debugger._maxSpanLength = spanLength;
    }
    header(object, config) {
      this.customFormattersOn = true;
      if (dart.equals(config, _debugger.JsonMLConfig.skipDart) || dart.test(_debugger.isNativeJavaScriptObject(object))) {
        return null;
      }
      let c = this[_simpleFormatter].preview(object, config);
      if (c == null) return null;
      if (dart.equals(config, _debugger.JsonMLConfig.keyToString)) {
        c = dart.toString(object);
      }
      let element = new _debugger.JsonMLElement('span');
      element.setStyle('background-color: #d9edf7;');
      element.createTextChild(c);
      return element.toJsonML();
    }
    hasBody(object, config) {
      return this[_simpleFormatter].hasChildren(object, config);
    }
    body(object, config) {
      let body = new _debugger.JsonMLElement('ol');
      body.setStyle('list-style-type: none;' + 'padding-left: 0px;' + 'margin-top: 0px;' + 'margin-bottom: 0px;' + 'margin-left: 12px;');
      if (core.StackTrace.is(object)) {
        body.addStyle('color: rgb(196, 26, 22);');
      }
      let children = this[_simpleFormatter].children(object, config);
      for (let child of children) {
        let li = body.createChild('li');
        let nameSpan = new _debugger.JsonMLElement('span');
        nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
        nameSpan.setStyle('color: rgb(136, 19, 145);');
        if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
          nameSpan.addStyle("padding-left: 13px;");
          li.appendChild(nameSpan);
          let objectTag = li.createObjectTag(child.value);
          objectTag.addAttribute('config', child.config);
          if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
            li.setStyle("padding-left: 13px;");
          }
        } else {
          li.setStyle("padding-left: 13px;");
          let _ = li.createChild('span');
          _.appendChild(nameSpan);
          _.createTextChild(_debugger.safePreview(child.value, child.config));
        }
      }
      return body.toJsonML();
    }
  };
  dart.setSignature(_debugger.JsonMLFormatter, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLFormatter, [_debugger.DartFormatter])}),
    fields: () => ({
      [_simpleFormatter]: _debugger.DartFormatter,
      customFormattersOn: core.bool
    }),
    methods: () => ({
      setMaxSpanLengthForTestingOnly: dart.definiteFunctionType(dart.void, [core.int]),
      header: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      hasBody: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      body: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])
    })
  });
  _debugger.Formatter = class Formatter extends core.Object {};
  const _formatters = Symbol('_formatters');
  _debugger.DartFormatter = class DartFormatter extends core.Object {
    new() {
      this[_formatters] = null;
      this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
    }
    preview(object, config) {
      try {
        if (object == null || typeof object == 'number' || typeof object == 'string' || dart.test(_debugger.isNativeJavaScriptObject(object))) {
          return dart.toString(object);
        }
        for (let formatter of this[_formatters]) {
          if (dart.test(formatter.accept(object, config))) return formatter.preview(object);
        }
      } catch (e) {
        let trace = dart.stackTrace(e);
        html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
      }

      return null;
    }
    hasChildren(object, config) {
      if (object == null) return false;
      try {
        for (let formatter of this[_formatters]) {
          if (dart.test(formatter.accept(object, config))) return formatter.hasChildren(object);
        }
      } catch (e) {
        let trace = dart.stackTrace(e);
        html$.window[dartx.console].error(dart.str`[hasChildren] Caught exception ${e}\n trace:\n${trace}`);
      }

      return false;
    }
    children(object, config) {
      try {
        if (object != null) {
          for (let formatter of this[_formatters]) {
            if (dart.test(formatter.accept(object, config))) return formatter.children(object);
          }
        }
      } catch (e) {
        let trace = dart.stackTrace(e);
        html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
      }

      return JSArrayOfNameValuePair().of([]);
    }
  };
  dart.setSignature(_debugger.DartFormatter, {
    constructors: () => ({new: dart.definiteFunctionType(_debugger.DartFormatter, [])}),
    fields: () => ({[_formatters]: ListOfFormatter()}),
    methods: () => ({
      preview: dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic, dart.dynamic])
    })
  });
  _debugger.ObjectFormatter = class ObjectFormatter extends _debugger.Formatter {
    accept(object, config) {
      return !dart.test(_debugger.isNativeJavaScriptObject(object));
    }
    preview(object) {
      return _debugger.getObjectTypeName(object);
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let properties = LinkedHashSetOfNameValuePair().new();
      _debugger.addMetadataChildren(object, properties);
      let current = object;
      let protoChain = JSArrayOfObject().of([]);
      while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
        protoChain[dartx.add](current);
        current = _debugger.safeGetProperty(current, '__proto__');
      }
      for (/* Unimplemented unknown name */current of protoChain) {
        for (let symbol of _debugger.getOwnPropertySymbols(current)) {
          let dartName = _debugger.symbolName(symbol);
          if (dart.test(_debugger.hasMethod(object, dartName))) {
            continue;
          }
          let dartXPrefix = 'dartx.';
          if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
            dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
          } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
            continue;
          }
          let value = _debugger.safeGetProperty(object, symbol);
          properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
        }
      }
      for (/* Unimplemented unknown name */current of protoChain) {
        let className = dart.dload(dart.getReifiedType(current), 'name');
        for (let name of _debugger.getOwnPropertyNames(current)) {
          if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
          if (dart.test(_debugger.hasMethod(object, name))) {
            continue;
          }
          let value = _debugger.safeGetProperty(object, name);
          properties.add(new _debugger.NameValuePair({name: name, value: value}));
        }
      }
      return properties.toList();
    }
  };
  dart.setSignature(_debugger.ObjectFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    }),
    sfields: () => ({_customNames: SetOfString()})
  });
  dart.defineLazy(_debugger.ObjectFormatter, {
    get _customNames() {
      return (() => {
        let _ = SetOfString().new();
        _.add('constructor');
        _.add('prototype');
        _.add('__proto__');
        return _;
      })();
    },
    set _customNames(_) {}
  });
  _debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
    accept(object, config) {
      return dart.getDartLibraryName(object) != null;
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
      if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
        dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
      }
      return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
    }
    children(object) {
      let children = LinkedHashSetOfNameValuePair().new();
      for (let name of _debugger.getOwnPropertyNames(object)) {
        let value = _debugger.safeGetProperty(object, name);
        name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
        children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
      }
      return children.toList();
    }
  };
  _debugger.LibraryModuleFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.LibraryModuleFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.LibraryFormatter = class LibraryFormatter extends core.Object {
    new() {
      this.genericParameters = HashMapOfString$String().new();
    }
    accept(object, config) {
      return _debugger.Library.is(object);
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      return core.String._check(dart.dload(object, 'name'));
    }
    children(object) {
      let children = LinkedHashSetOfNameValuePair().new();
      let nonGenericProperties = LinkedHashMapOfString$Object().new();
      let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
      dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
        let genericTypeConstructor = dart.getGenericTypeCtor(value);
        if (genericTypeConstructor != null) {
          this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
        } else {
          nonGenericProperties._set(core.String._check(name), value);
        }
      }, dynamicAnddynamicTodynamic$()));
      nonGenericProperties.forEach(dart.fn((name, value) => {
        if (core.Type.is(value)) {
          children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
        } else {
          children.add(new _debugger.NameValuePair({name: name, value: value}));
        }
      }, StringAndObjectTovoid()));
      return children.toList();
    }
    recordGenericParameters(name, genericTypeConstructor) {
      this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
    }
    classChild(name, child) {
      let typeName = _debugger.getTypeName(core.Type._check(child));
      let parameterName = dart.str`${name}\$`;
      if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
        typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
        _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
      }
      return new _debugger.NameValuePair({name: typeName, value: child});
    }
  };
  _debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.LibraryFormatter, {
    fields: () => ({genericParameters: HashMapOfString$String()}),
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
      recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
      classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
    })
  });
  _debugger.FunctionFormatter = class FunctionFormatter extends core.Object {
    accept(object, config) {
      if (_debugger._typeof(object) != 'function') return false;
      return dart.getReifiedType(object) != null;
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      return core.String._check(dart.typeName(dart.getReifiedType(object)));
    }
    children(object) {
      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'signature', value: this.preview(object)}), new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
    }
  };
  _debugger.FunctionFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.FunctionFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.MapFormatter = class MapFormatter extends core.Object {
    accept(object, config) {
      return core.Map.is(object);
    }
    hasChildren(object) {
      return true;
    }
    preview(object) {
      let map = core.Map._check(object);
      return dart.str`${_debugger.getObjectTypeName(map)} length ${map[dartx.length]}`;
    }
    children(object) {
      let map = core.Map._check(object);
      let entries = LinkedHashSetOfNameValuePair().new();
      map[dartx.forEach](dart.fn((key, value) => {
        let entryWrapper = new _debugger.MapEntry({key: key, value: value});
        entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
      }, dynamicAnddynamicTovoid$()));
      _debugger.addMetadataChildren(object, entries);
      return entries.toList();
    }
  };
  _debugger.MapFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.MapFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.IterableFormatter = class IterableFormatter extends core.Object {
    accept(object, config) {
      return core.Iterable.is(object);
    }
    preview(object) {
      let iterable = core.Iterable._check(object);
      try {
        let length = iterable[dartx.length];
        return dart.str`${_debugger.getObjectTypeName(iterable)} length ${length}`;
      } catch (_) {
        return dart.str`${_debugger.getObjectTypeName(iterable)}`;
      }

    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let children = LinkedHashSetOfNameValuePair().new();
      children.addAll(new _debugger.IterableSpan(0, core.int._check(dart.dload(object, 'length')), core.Iterable._check(object)).children());
      _debugger.addMetadataChildren(object, children);
      return children.toList();
    }
  };
  _debugger.IterableFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.IterableFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.NamedConstructorFormatter = class NamedConstructorFormatter extends core.Object {
    accept(object, config) {
      return _debugger.NamedConstructor.is(object);
    }
    preview(object) {
      return 'Named Constructor';
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
    }
  };
  _debugger.NamedConstructorFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.NamedConstructorFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.MapEntryFormatter = class MapEntryFormatter extends core.Object {
    accept(object, config) {
      return _debugger.MapEntry.is(object);
    }
    preview(object) {
      let entry = _debugger.MapEntry._check(object);
      return dart.str`${_debugger.safePreview(entry.key, _debugger.JsonMLConfig.none)} => ${_debugger.safePreview(entry.value, _debugger.JsonMLConfig.none)}`;
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'key', value: dart.dload(object, 'key'), config: _debugger.JsonMLConfig.keyToString}), new _debugger.NameValuePair({name: 'value', value: dart.dload(object, 'value')})]);
    }
  };
  _debugger.MapEntryFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.MapEntryFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.HeritageClauseFormatter = class HeritageClauseFormatter extends core.Object {
    accept(object, config) {
      return _debugger.HeritageClause.is(object);
    }
    preview(object) {
      let clause = _debugger.HeritageClause._check(object);
      let typeNames = clause.types[dartx.map](core.String)(_debugger.getTypeName);
      return dart.str`${clause.name} ${typeNames[dartx.join](", ")}`;
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let clause = _debugger.HeritageClause._check(object);
      let children = JSArrayOfNameValuePair().of([]);
      for (let type of clause.types) {
        children[dartx.add](new _debugger.NameValuePair({value: type, config: _debugger.JsonMLConfig.asClass}));
      }
      return children;
    }
  };
  _debugger.HeritageClauseFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.HeritageClauseFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.IterableSpanFormatter = class IterableSpanFormatter extends core.Object {
    accept(object, config) {
      return _debugger.IterableSpan.is(object);
    }
    preview(object) {
      return dart.str`[${dart.dload(object, 'start')}...${dart.dsend(dart.dload(object, 'end'), '-', 1)}]`;
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return ListOfNameValuePair()._check(dart.dsend(object, 'children'));
    }
  };
  _debugger.IterableSpanFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.IterableSpanFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.StackTraceFormatter = class StackTraceFormatter extends core.Object {
    accept(object, config) {
      return core.StackTrace.is(object);
    }
    preview(object) {
      return 'StackTrace';
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      return dart.toString(object)[dartx.split]('\n')[dartx.map](_debugger.NameValuePair)(dart.fn(line => new _debugger.NameValuePair({value: line[dartx.replaceFirst](core.RegExp.new('^\\s+at\\s'), ''), hideName: true}), StringToNameValuePair()))[dartx.toList]();
    }
  };
  _debugger.StackTraceFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.StackTraceFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.ClassFormatter = class ClassFormatter extends core.Object {
    accept(object, config) {
      return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
    }
    preview(object) {
      let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
      if (typeName != null) return core.String._check(typeName);
      let type = _debugger._getType(object);
      let implements$ = dart.getImplements(type);
      typeName = _debugger.getTypeName(core.Type._check(type));
      if (implements$ != null) {
        let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
        return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
      } else {
        return core.String._check(typeName);
      }
    }
    hasChildren(object) {
      return true;
    }
    children(object) {
      let type = _debugger._getType(object);
      let children = JSArrayOfNameValuePair().of([]);
      let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
      let mixins = dart.getMixins(type);
      if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
        children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
      }
      let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
      for (let name of _debugger.getOwnPropertyNames(object)) {
        if (dart.test(hiddenProperties[dartx.contains](name))) continue;
        let value = _debugger.safeGetProperty(object, name);
        if (value != null && dart.getIsNamedConstructor(value) != null) {
          value = new _debugger.NamedConstructor(value);
          name = dart.str`${typeName}.${name}`;
        }
        children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
      }
      let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
      let prototype = object.prototype;
      if (prototype != null) {
        for (let name of _debugger.getOwnPropertyNames(prototype)) {
          if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
          let func = _debugger.safeGetProperty(prototype, name);
          let constructor = _debugger.safeGetProperty(prototype, 'constructor');
          let sigObj = dart.getMethodSig(constructor);
          if (sigObj != null) {
            let value = _debugger.safeGetProperty(sigObj, name);
            if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
              dart.tag(func, value);
              children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
            }
          }
        }
      }
      return children;
    }
  };
  _debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
  dart.setSignature(_debugger.ClassFormatter, {
    methods: () => ({
      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
    })
  });
  _debugger.registerDevtoolsFormatter = function() {
    let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
    dart.global.devtoolsFormatters = formatters;
  };
  dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
  _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
    if (arg0 === void 0) arg0 = null;
    if (arg1 === void 0) arg1 = null;
    if (arg2 === void 0) arg2 = null;
    if (arg3 === void 0) arg3 = null;
    if (arg4 === void 0) arg4 = null;
    if (arg5 === void 0) arg5 = null;
    if (arg6 === void 0) arg6 = null;
    if (arg7 === void 0) arg7 = null;
    if (arg8 === void 0) arg8 = null;
    if (arg9 === void 0) arg9 = null;
    if (arg10 === void 0) arg10 = null;
    if (arg11 === void 0) arg11 = null;
  };
  dart.lazyFn(_foreign_helper.JS, () => StringAndString__Todynamic());
  _foreign_helper.JSExportName = class JSExportName extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_foreign_helper.JSExportName, {
    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JSExportName, [core.String])}),
    fields: () => ({name: core.String})
  });
  _foreign_helper.JS_CURRENT_ISOLATE_CONTEXT = function() {
  };
  dart.lazyFn(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT, () => VoidToIsolateContext());
  _foreign_helper.IsolateContext = class IsolateContext extends core.Object {};
  _foreign_helper.JS_CALL_IN_ISOLATE = function(isolate, func) {
  };
  dart.lazyFn(_foreign_helper.JS_CALL_IN_ISOLATE, () => dynamicAndFunctionTodynamic());
  _foreign_helper.JS_SET_CURRENT_ISOLATE = function(isolate) {
  };
  dart.fn(_foreign_helper.JS_SET_CURRENT_ISOLATE, dynamicTovoid$());
  _foreign_helper.JS_CREATE_ISOLATE = function() {
  };
  dart.fn(_foreign_helper.JS_CREATE_ISOLATE, VoidTodynamic$());
  _foreign_helper.JS_DART_OBJECT_CONSTRUCTOR = function() {
  };
  dart.fn(_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR, VoidTodynamic$());
  _foreign_helper.JS_INTERCEPTOR_CONSTANT = function(type) {
  };
  dart.fn(_foreign_helper.JS_INTERCEPTOR_CONSTANT, TypeTodynamic());
  _foreign_helper.JS_OPERATOR_IS_PREFIX = function() {
  };
  dart.lazyFn(_foreign_helper.JS_OPERATOR_IS_PREFIX, () => VoidToString$());
  _foreign_helper.JS_OPERATOR_AS_PREFIX = function() {
  };
  dart.lazyFn(_foreign_helper.JS_OPERATOR_AS_PREFIX, () => VoidToString$());
  _foreign_helper.JS_OBJECT_CLASS_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_OBJECT_CLASS_NAME, () => VoidToString$());
  _foreign_helper.JS_NULL_CLASS_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_NULL_CLASS_NAME, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_CLASS_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_CLASS_NAME, () => VoidToString$());
  _foreign_helper.JS_IS_INDEXABLE_FIELD_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME, () => VoidToString$());
  _foreign_helper.JS_CURRENT_ISOLATE = function() {
  };
  dart.fn(_foreign_helper.JS_CURRENT_ISOLATE, VoidTodynamic$());
  _foreign_helper.JS_SIGNATURE_NAME = function() {
  };
  dart.lazyFn(_foreign_helper.JS_SIGNATURE_NAME, () => VoidToString$());
  _foreign_helper.JS_TYPEDEF_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_TYPEDEF_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG, () => VoidToString$());
  _foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG = function() {
  };
  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG, () => VoidToString$());
  _foreign_helper.JS_GET_NAME = function(name) {
  };
  dart.lazyFn(_foreign_helper.JS_GET_NAME, () => StringToString$());
  _foreign_helper.JS_EMBEDDED_GLOBAL = function(typeDescription, name) {
  };
  dart.lazyFn(_foreign_helper.JS_EMBEDDED_GLOBAL, () => StringAndStringTodynamic());
  _foreign_helper.JS_GET_FLAG = function(name) {
  };
  dart.lazyFn(_foreign_helper.JS_GET_FLAG, () => StringTobool$());
  _foreign_helper.JS_EFFECT = function(code) {
    dart.dcall(code, null);
  };
  dart.lazyFn(_foreign_helper.JS_EFFECT, () => FunctionTovoid());
  _foreign_helper.JS_CONST = class JS_CONST extends core.Object {
    new(code) {
      this.code = code;
    }
  };
  dart.setSignature(_foreign_helper.JS_CONST, {
    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JS_CONST, [core.String])}),
    fields: () => ({code: core.String})
  });
  _foreign_helper.JS_STRING_CONCAT = function(a, b) {
    return a + b;
  };
  dart.lazyFn(_foreign_helper.JS_STRING_CONCAT, () => StringAndStringToString$());
  _foreign_helper._Rest = class _Rest extends core.Object {
    new() {
    }
  };
  dart.setSignature(_foreign_helper._Rest, {
    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper._Rest, [])})
  });
  _foreign_helper.rest = dart.const(new _foreign_helper._Rest());
  _foreign_helper.spread = function(args) {
    dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
  };
  dart.fn(_foreign_helper.spread, dynamicTodynamic$());
  _interceptors.Interceptor = class Interceptor extends core.Object {
    new() {
    }
  };
  dart.addTypeTests(_interceptors.Interceptor);
  dart.setSignature(_interceptors.Interceptor, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.Interceptor, [])})
  });
  _interceptors.getInterceptor = function(obj) {
    return obj;
  };
  dart.fn(_interceptors.getInterceptor, dynamicTodynamic$());
  dart.defineExtensionNames([
    'toString',
    'hashCode',
    'runtimeType'
  ]);
  _interceptors.JSBool = class JSBool extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    [dartx.toString]() {
      return String(this);
    }
    get [dartx.hashCode]() {
      return this ? 2 * 3 * 23 * 3761 : 269 * 811;
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(core.bool);
    }
  };
  _interceptors.JSBool[dart.implements] = () => [core.bool];
  dart.setSignature(_interceptors.JSBool, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSBool, [])})
  });
  dart.registerExtension(dart.global.Boolean, _interceptors.JSBool);
  _interceptors.JSIndexable$ = dart.generic(E => {
    class JSIndexable extends core.Object {}
    dart.addTypeTests(JSIndexable);
    return JSIndexable;
  });
  _interceptors.JSIndexable = JSIndexable();
  _interceptors.JSObject = class JSObject extends core.Object {};
  _interceptors.JavaScriptObject = class JavaScriptObject extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    get hashCode() {
      return 0;
    }
    get runtimeType() {
      return dart.wrapType(_interceptors.JSObject);
    }
  };
  _interceptors.JavaScriptObject[dart.implements] = () => [_interceptors.JSObject];
  dart.setSignature(_interceptors.JavaScriptObject, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JavaScriptObject, [])})
  });
  _interceptors.PlainJavaScriptObject = class PlainJavaScriptObject extends _interceptors.JavaScriptObject {
    new() {
      super.new();
    }
  };
  dart.setSignature(_interceptors.PlainJavaScriptObject, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.PlainJavaScriptObject, [])})
  });
  _interceptors.UnknownJavaScriptObject = class UnknownJavaScriptObject extends _interceptors.JavaScriptObject {
    new() {
      super.new();
    }
    toString() {
      return String(this);
    }
  };
  dart.setSignature(_interceptors.UnknownJavaScriptObject, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.UnknownJavaScriptObject, [])})
  });
  _interceptors.findInterceptorConstructorForType = function(type) {
  };
  dart.fn(_interceptors.findInterceptorConstructorForType, TypeTodynamic());
  _interceptors.findConstructorForNativeSubclassType = function(type, name) {
  };
  dart.lazyFn(_interceptors.findConstructorForNativeSubclassType, () => TypeAndStringTodynamic());
  _interceptors.getNativeInterceptor = function(object) {
  };
  dart.fn(_interceptors.getNativeInterceptor, dynamicTodynamic$());
  _interceptors.setDispatchProperty = function(object, value) {
  };
  dart.fn(_interceptors.setDispatchProperty, dynamicAnddynamicTodynamic$());
  const _removeWhere = Symbol('_removeWhere');
  _interceptors.JSArray$ = dart.generic(E => {
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ArrayIteratorOfE = () => (ArrayIteratorOfE = dart.constFn(_interceptors.ArrayIterator$(E)))();
    let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
    let JSIndexableOfE = () => (JSIndexableOfE = dart.constFn(_interceptors.JSIndexable$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    dart.defineExtensionNames([
      'checkMutable',
      'checkGrowable',
      'add',
      'removeAt',
      'insert',
      'insertAll',
      'setAll',
      'removeLast',
      'remove',
      'removeWhere',
      'retainWhere',
      'where',
      'expand',
      'addAll',
      'clear',
      'forEach',
      'map',
      'join',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'reduce',
      'fold',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'sublist',
      'getRange',
      'first',
      'last',
      'single',
      'removeRange',
      'setRange',
      'fillRange',
      'replaceRange',
      'any',
      'every',
      'reversed',
      'sort',
      'shuffle',
      'indexOf',
      'lastIndexOf',
      'contains',
      'isEmpty',
      'isNotEmpty',
      'toString',
      'toList',
      'toSet',
      'iterator',
      'hashCode',
      'length',
      'length',
      '_get',
      '_set',
      'asMap'
    ]);
    class JSArray extends core.Object {
      new() {
      }
      static typed(allocation) {
        return dart.list(allocation, E);
      }
      static of(allocation) {
        return dart.setType(allocation, JSArray);
      }
      static markFixed(allocation) {
        return JSArrayOfE().typed(_interceptors.JSArray.markFixedList(core.List._check(allocation)));
      }
      static markGrowable(allocation) {
        return JSArrayOfE().typed(allocation);
      }
      static markFixedList(list) {
        list.fixed$length = Array;
        return list;
      }
      static markUnmodifiableList(list) {
        list.fixed$length = Array;
        list.immutable$list = Array;
        return list;
      }
      [dartx.checkMutable](reason) {
        if (this.immutable$list) {
          dart.throw(new core.UnsupportedError(core.String._check(reason)));
        }
      }
      [dartx.checkGrowable](reason) {
        if (this.fixed$length) {
          dart.throw(new core.UnsupportedError(core.String._check(reason)));
        }
      }
      [dartx.add](value) {
        E._check(value);
        this[dartx.checkGrowable]('add');
        this.push(value);
      }
      [dartx.removeAt](index) {
        this[dartx.checkGrowable]('removeAt');
        if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
        if (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this[dartx.length])) {
          dart.throw(new core.RangeError.value(index));
        }
        return this.splice(index, 1)[0];
      }
      [dartx.insert](index, value) {
        E._check(value);
        this[dartx.checkGrowable]('insert');
        if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
        if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
          dart.throw(new core.RangeError.value(index));
        }
        this.splice(index, 0, value);
      }
      [dartx.insertAll](index, iterable) {
        IterableOfE()._check(iterable);
        this[dartx.checkGrowable]('insertAll');
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        if (!_internal.EfficientLength.is(iterable)) {
          iterable = iterable[dartx.toList]();
        }
        let insertionLength = iterable[dartx.length];
        this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
        let end = dart.notNull(index) + dart.notNull(insertionLength);
        this[dartx.setRange](end, this[dartx.length], this, index);
        this[dartx.setRange](index, end, iterable);
      }
      [dartx.setAll](index, iterable) {
        IterableOfE()._check(iterable);
        this[dartx.checkMutable]('setAll');
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        for (let element of iterable) {
          this[dartx._set]((() => {
            let x = index;
            index = dart.notNull(x) + 1;
            return x;
          })(), element);
        }
      }
      [dartx.removeLast]() {
        this[dartx.checkGrowable]('removeLast');
        if (this[dartx.length] == 0) dart.throw(_js_helper.diagnoseIndexError(this, -1));
        return this.pop();
      }
      [dartx.remove](element) {
        this[dartx.checkGrowable]('remove');
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), element)) {
            this.splice(i, 1);
            return true;
          }
        }
        return false;
      }
      [dartx.removeWhere](test) {
        this[dartx.checkGrowable]('removeWhere');
        this[_removeWhere](test, true);
      }
      [dartx.retainWhere](test) {
        this[dartx.checkGrowable]('retainWhere');
        this[_removeWhere](test, false);
      }
      [_removeWhere](test, removeMatching) {
        let retained = [];
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          if (!dart.test(test(E._check(element))) == removeMatching) {
            retained[dartx.add](element);
          }
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        if (retained[dartx.length] == end) return;
        this[dartx.length] = retained[dartx.length];
        for (let i = 0; i < dart.notNull(retained[dartx.length]); i++) {
          this[dartx._set](i, E._check(retained[dartx._get](i)));
        }
      }
      [dartx.where](f) {
        return new (WhereIterableOfE())(this, f);
      }
      [dartx.expand](T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      [dartx.addAll](collection) {
        IterableOfE()._check(collection);
        let i = this[dartx.length];
        this[dartx.checkGrowable]('addAll');
        for (let e of collection) {
          dart.assert(i == this[dartx.length] || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
          i = dart.notNull(i) + 1;
          this.push(e);
        }
      }
      [dartx.clear]() {
        this[dartx.length] = 0;
      }
      [dartx.forEach](f) {
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          f(element);
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      [dartx.map](T) {
        return f => {
          return new (_internal.MappedListIterable$(E, T))(this, f);
        };
      }
      [dartx.join](separator) {
        if (separator === void 0) separator = "";
        let list = core.List.new(this[dartx.length]);
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          list[dartx._set](i, dart.str`${this[dartx._get](i)}`);
        }
        return list.join(separator);
      }
      [dartx.take](n) {
        return new (SubListIterableOfE())(this, 0, n);
      }
      [dartx.takeWhile](test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      [dartx.skip](n) {
        return new (SubListIterableOfE())(this, n, null);
      }
      [dartx.skipWhile](test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      [dartx.reduce](combine) {
        EAndEToE()._check(combine);
        let length = this[dartx.length];
        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
        let value = this[dartx._get](0);
        for (let i = 1; i < dart.notNull(length); i++) {
          let element = this[i];
          value = combine(value, element);
          if (length != this[dartx.length]) dart.throw(new core.ConcurrentModificationError(this));
        }
        return value;
      }
      [dartx.fold](T) {
        return (initialValue, combine) => {
          let value = initialValue;
          let length = this[dartx.length];
          for (let i = 0; i < dart.notNull(length); i++) {
            let element = this[i];
            value = combine(value, element);
            if (this[dartx.length] != length) dart.throw(new core.ConcurrentModificationError(this));
          }
          return value;
        };
      }
      [dartx.firstWhere](test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); ++i) {
          let element = this[i];
          if (dart.test(test(element))) return element;
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      [dartx.lastWhere](test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this[dartx.length];
        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
          let element = this[i];
          if (dart.test(test(element))) return element;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      [dartx.singleWhere](test) {
        let length = this[dartx.length];
        let match = null;
        let matchFound = false;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this[i];
          if (dart.test(test(E._check(element)))) {
            if (matchFound) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            matchFound = true;
            match = E._check(element);
          }
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (matchFound) return match;
        dart.throw(_internal.IterableElementError.noElement());
      }
      [dartx.elementAt](index) {
        return this[dartx._get](index);
      }
      [dartx.sublist](start, end) {
        if (end === void 0) end = null;
        _js_helper.checkNull(start);
        if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
        if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
          dart.throw(new core.RangeError.range(start, 0, this[dartx.length], "start"));
        }
        if (end == null) {
          end = this[dartx.length];
        } else {
          if (!(typeof end == 'number')) dart.throw(_js_helper.argumentErrorValue(end));
          if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(this[dartx.length])) {
            dart.throw(new core.RangeError.range(end, start, this[dartx.length], "end"));
          }
        }
        if (start == end) return JSArrayOfE().of([]);
        return JSArrayOfE().typed(this.slice(start, end));
      }
      [dartx.getRange](start, end) {
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        return new (SubListIterableOfE())(this, start, end);
      }
      get [dartx.first]() {
        if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](0);
        dart.throw(_internal.IterableElementError.noElement());
      }
      get [dartx.last]() {
        if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
        dart.throw(_internal.IterableElementError.noElement());
      }
      get [dartx.single]() {
        if (this[dartx.length] == 1) return this[dartx._get](0);
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        dart.throw(_internal.IterableElementError.tooMany());
      }
      [dartx.removeRange](start, end) {
        this[dartx.checkGrowable]('removeRange');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let deleteCount = dart.notNull(end) - dart.notNull(start);
        this.splice(start, deleteCount);
      }
      [dartx.setRange](start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        this[dartx.checkMutable]('set range');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let length = dart.notNull(end) - dart.notNull(start);
        if (length == 0) return;
        core.RangeError.checkNotNegative(skipCount, "skipCount");
        let otherList = null;
        let otherStart = null;
        if (core.List.is(iterable)) {
          otherList = ListOfE()._check(iterable);
          otherStart = skipCount;
        } else {
          otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
          otherStart = 0;
        }
        if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
          dart.throw(_internal.IterableElementError.tooFew());
        }
        if (dart.notNull(otherStart) < dart.notNull(start)) {
          for (let i = length - 1; i >= 0; i--) {
            let element = otherList[dartx._get](dart.notNull(otherStart) + i);
            this[dart.notNull(start) + i] = element;
          }
        } else {
          for (let i = 0; i < length; i++) {
            let element = otherList[dartx._get](dart.notNull(otherStart) + i);
            this[dart.notNull(start) + i] = element;
          }
        }
      }
      [dartx.fillRange](start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        this[dartx.checkMutable]('fill range');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          this[i] = fillValue;
        }
      }
      [dartx.replaceRange](start, end, replacement) {
        IterableOfE()._check(replacement);
        this[dartx.checkGrowable]('replace range');
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        if (!_internal.EfficientLength.is(replacement)) {
          replacement = replacement[dartx.toList]();
        }
        let removeLength = dart.notNull(end) - dart.notNull(start);
        let insertLength = replacement[dartx.length];
        if (removeLength >= dart.notNull(insertLength)) {
          let delta = removeLength - dart.notNull(insertLength);
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          let newLength = dart.notNull(this[dartx.length]) - delta;
          this[dartx.setRange](start, insertEnd, replacement);
          if (delta != 0) {
            this[dartx.setRange](insertEnd, newLength, this, end);
            this[dartx.length] = newLength;
          }
        } else {
          let delta = dart.notNull(insertLength) - removeLength;
          let newLength = dart.notNull(this[dartx.length]) + delta;
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          this[dartx.length] = newLength;
          this[dartx.setRange](insertEnd, newLength, this, end);
          this[dartx.setRange](start, insertEnd, replacement);
        }
      }
      [dartx.any](test) {
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          if (dart.test(test(element))) return true;
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        return false;
      }
      [dartx.every](test) {
        let end = this[dartx.length];
        for (let i = 0; i < dart.notNull(end); i++) {
          let element = this[i];
          if (!dart.test(test(element))) return false;
          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
        }
        return true;
      }
      get [dartx.reversed]() {
        return new (ReversedListIterableOfE())(this);
      }
      [dartx.sort](compare) {
        if (compare === void 0) compare = null;
        this[dartx.checkMutable]('sort');
        if (compare == null) {
          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
        } else {
          _internal.Sort.sort(E)(this, compare);
        }
      }
      [dartx.shuffle](random) {
        if (random === void 0) random = null;
        this[dartx.checkMutable]('shuffle');
        if (random == null) random = math.Random.new();
        let length = this[dartx.length];
        while (dart.notNull(length) > 1) {
          let pos = random.nextInt(length);
          length = dart.notNull(length) - 1;
          let tmp = this[dartx._get](length);
          this[dartx._set](length, this[dartx._get](pos));
          this[dartx._set](pos, tmp);
        }
      }
      [dartx.indexOf](element, start) {
        if (start === void 0) start = 0;
        if (dart.notNull(start) >= dart.notNull(this[dartx.length])) {
          return -1;
        }
        if (dart.notNull(start) < 0) {
          start = 0;
        }
        for (let i = start; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      [dartx.lastIndexOf](element, startIndex) {
        if (startIndex === void 0) startIndex = null;
        if (startIndex == null) {
          startIndex = dart.notNull(this[dartx.length]) - 1;
        } else {
          if (dart.notNull(startIndex) < 0) {
            return -1;
          }
          if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
            startIndex = dart.notNull(this[dartx.length]) - 1;
          }
        }
        for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      [dartx.contains](other) {
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), other)) return true;
        }
        return false;
      }
      get [dartx.isEmpty]() {
        return this[dartx.length] == 0;
      }
      get [dartx.isNotEmpty]() {
        return !dart.test(this[dartx.isEmpty]);
      }
      [dartx.toString]() {
        return collection.ListBase.listToString(this);
      }
      [dartx.toList](opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let list = this.slice();
        if (!dart.test(growable)) _interceptors.JSArray.markFixedList(core.List._check(list));
        return JSArrayOfE().typed(list);
      }
      [dartx.toSet]() {
        return SetOfE().from(this);
      }
      get [dartx.iterator]() {
        return new (ArrayIteratorOfE())(this);
      }
      get [dartx.hashCode]() {
        return _js_helper.Primitives.objectHashCode(this);
      }
      get [dartx.length]() {
        return this.length;
      }
      set [dartx.length](newLength) {
        this[dartx.checkGrowable]('set length');
        if (!(typeof newLength == 'number')) {
          dart.throw(new core.ArgumentError.value(newLength, 'newLength'));
        }
        if (dart.notNull(newLength) < 0) {
          dart.throw(new core.RangeError.range(newLength, 0, null, 'newLength'));
        }
        this.length = newLength;
      }
      [dartx._get](index) {
        if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
        if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
        return this[index];
      }
      [dartx._set](index, value) {
        E._check(value);
        this[dartx.checkMutable]('indexed set');
        if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
        if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
        this[index] = value;
        return value;
      }
      [dartx.asMap]() {
        return new (ListMapViewOfE())(this);
      }
    }
    dart.setExtensionBaseClass(JSArray, dart.global.Array);
    dart.addTypeTests(JSArray);
    JSArray[dart.implements] = () => [ListOfE(), JSIndexableOfE()];
    dart.setSignature(JSArray, {
      constructors: () => ({
        new: dart.definiteFunctionType(_interceptors.JSArray$(E), []),
        typed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
        of: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
        markFixed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
        markGrowable: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic])
      }),
      getters: () => ({
        [dartx.first]: dart.definiteFunctionType(E, []),
        [dartx.last]: dart.definiteFunctionType(E, []),
        [dartx.single]: dart.definiteFunctionType(E, []),
        [dartx.reversed]: dart.definiteFunctionType(core.Iterable$(E), []),
        [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
        [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
        [dartx.iterator]: dart.definiteFunctionType(core.Iterator$(E), []),
        [dartx.length]: dart.definiteFunctionType(core.int, [])
      }),
      setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        [dartx.checkMutable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
        [dartx.checkGrowable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
        [dartx.add]: dart.definiteFunctionType(dart.void, [E]),
        [dartx.removeAt]: dart.definiteFunctionType(E, [core.int]),
        [dartx.insert]: dart.definiteFunctionType(dart.void, [core.int, E]),
        [dartx.insertAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        [dartx.setAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        [dartx.removeLast]: dart.definiteFunctionType(E, []),
        [dartx.remove]: dart.definiteFunctionType(core.bool, [core.Object]),
        [dartx.removeWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
        [dartx.retainWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
        [_removeWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        [dartx.where]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        [dartx.expand]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        [dartx.addAll]: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        [dartx.clear]: dart.definiteFunctionType(dart.void, []),
        [dartx.forEach]: dart.definiteFunctionType(dart.void, [ETovoid()]),
        [dartx.map]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        [dartx.join]: dart.definiteFunctionType(core.String, [], [core.String]),
        [dartx.take]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        [dartx.takeWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        [dartx.skip]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        [dartx.skipWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        [dartx.reduce]: dart.definiteFunctionType(E, [EAndEToE()]),
        [dartx.fold]: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        [dartx.firstWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        [dartx.lastWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        [dartx.singleWhere]: dart.definiteFunctionType(E, [ETobool()]),
        [dartx.elementAt]: dart.definiteFunctionType(E, [core.int]),
        [dartx.sublist]: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
        [dartx.getRange]: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
        [dartx.removeRange]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        [dartx.setRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        [dartx.fillRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
        [dartx.replaceRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        [dartx.any]: dart.definiteFunctionType(core.bool, [ETobool()]),
        [dartx.every]: dart.definiteFunctionType(core.bool, [ETobool()]),
        [dartx.sort]: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        [dartx.shuffle]: dart.definiteFunctionType(dart.void, [], [math.Random]),
        [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Object]),
        [dartx.toList]: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        [dartx.toSet]: dart.definiteFunctionType(core.Set$(E), []),
        [dartx._get]: dart.definiteFunctionType(E, [core.int]),
        [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, E]),
        [dartx.asMap]: dart.definiteFunctionType(core.Map$(core.int, E), [])
      }),
      statics: () => ({
        markFixedList: dart.definiteFunctionType(core.List, [core.List]),
        markUnmodifiableList: dart.definiteFunctionType(core.List, [core.List])
      }),
      names: ['markFixedList', 'markUnmodifiableList']
    });
    return JSArray;
  });
  _interceptors.JSArray = JSArray();
  dart.registerExtension(dart.global.Array, _interceptors.JSArray);
  _interceptors.JSMutableArray$ = dart.generic(E => {
    class JSMutableArray extends _interceptors.JSArray$(E) {
      new() {
        super.new();
      }
    }
    return JSMutableArray;
  });
  _interceptors.JSMutableArray = JSMutableArray();
  _interceptors.JSFixedArray$ = dart.generic(E => {
    class JSFixedArray extends _interceptors.JSMutableArray$(E) {
      new() {
        super.new();
      }
    }
    return JSFixedArray;
  });
  _interceptors.JSFixedArray = JSFixedArray();
  _interceptors.JSExtendableArray$ = dart.generic(E => {
    class JSExtendableArray extends _interceptors.JSMutableArray$(E) {
      new() {
        super.new();
      }
    }
    return JSExtendableArray;
  });
  _interceptors.JSExtendableArray = JSExtendableArray();
  _interceptors.JSUnmodifiableArray$ = dart.generic(E => {
    class JSUnmodifiableArray extends _interceptors.JSArray$(E) {
      new() {
        super.new();
      }
    }
    return JSUnmodifiableArray;
  });
  _interceptors.JSUnmodifiableArray = JSUnmodifiableArray();
  const _iterable = Symbol('_iterable');
  const _length = Symbol('_length');
  const _index = Symbol('_index');
  const _current = Symbol('_current');
  _interceptors.ArrayIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    class ArrayIterator extends core.Object {
      new(iterable) {
        this[_iterable] = iterable;
        this[_length] = iterable[dartx.length];
        this[_index] = 0;
        this[_current] = null;
      }
      get current() {
        return this[_current];
      }
      moveNext() {
        let length = this[_iterable][dartx.length];
        if (this[_length] != length) {
          dart.throw(_js_helper.throwConcurrentModificationError(this[_iterable]));
        }
        if (dart.notNull(this[_index]) >= dart.notNull(length)) {
          this[_current] = null;
          return false;
        }
        this[_current] = this[_iterable][dartx._get](this[_index]);
        this[_index] = dart.notNull(this[_index]) + 1;
        return true;
      }
    }
    dart.addTypeTests(ArrayIterator);
    ArrayIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(ArrayIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_interceptors.ArrayIterator$(E), [JSArrayOfE()])}),
      fields: () => ({
        [_iterable]: JSArrayOfE(),
        [_length]: core.int,
        [_index]: core.int,
        [_current]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return ArrayIterator;
  });
  _interceptors.ArrayIterator = ArrayIterator();
  const _isInt32 = Symbol('_isInt32');
  const _tdivSlow = Symbol('_tdivSlow');
  const _shlPositive = Symbol('_shlPositive');
  const _shrOtherPositive = Symbol('_shrOtherPositive');
  const _shrBothPositive = Symbol('_shrBothPositive');
  dart.defineExtensionNames([
    'compareTo',
    'isNegative',
    'isNaN',
    'isInfinite',
    'isFinite',
    'remainder',
    'abs',
    'sign',
    'toInt',
    'truncate',
    'ceil',
    'floor',
    'round',
    'ceilToDouble',
    'floorToDouble',
    'roundToDouble',
    'truncateToDouble',
    'clamp',
    'toDouble',
    'toStringAsFixed',
    'toStringAsExponential',
    'toStringAsPrecision',
    'toRadixString',
    'toString',
    'hashCode',
    '_negate',
    '+',
    '-',
    '/',
    '*',
    '%',
    '~/',
    '<<',
    '>>',
    '&',
    '|',
    '^',
    '<',
    '>',
    '<=',
    '>=',
    'isEven',
    'isOdd',
    'toUnsigned',
    'toSigned',
    'bitLength',
    'modPow',
    'modInverse',
    'gcd',
    '~'
  ]);
  _interceptors.JSNumber = class JSNumber extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    [dartx.compareTo](b) {
      if (this < dart.notNull(b)) {
        return -1;
      } else if (this > dart.notNull(b)) {
        return 1;
      } else if (this == b) {
        if (this == 0) {
          let bIsNegative = b[dartx.isNegative];
          if (this[dartx.isNegative] == bIsNegative) return 0;
          if (dart.test(this[dartx.isNegative])) return -1;
          return 1;
        }
        return 0;
      } else if (dart.test(this[dartx.isNaN])) {
        if (dart.test(b[dartx.isNaN])) {
          return 0;
        }
        return 1;
      } else {
        return -1;
      }
    }
    get [dartx.isNegative]() {
      return this == 0 ? 1 / this < 0 : this < 0;
    }
    get [dartx.isNaN]() {
      return isNaN(this);
    }
    get [dartx.isInfinite]() {
      return this == 1 / 0 || this == -1 / 0;
    }
    get [dartx.isFinite]() {
      return isFinite(this);
    }
    [dartx.remainder](b) {
      if (!(typeof b == 'number')) dart.throw(_js_helper.argumentErrorValue(b));
      return this % b;
    }
    [dartx.abs]() {
      return Math.abs(this);
    }
    get [dartx.sign]() {
      return this > 0 ? 1 : this < 0 ? -1 : this;
    }
    [dartx.toInt]() {
      if (this >= _interceptors.JSNumber._MIN_INT32 && this <= _interceptors.JSNumber._MAX_INT32) {
        return this | 0;
      }
      if (isFinite(this)) {
        return this[dartx.truncateToDouble]() + 0;
      }
      dart.throw(new core.UnsupportedError("" + this));
    }
    [dartx.truncate]() {
      return this[dartx.toInt]();
    }
    [dartx.ceil]() {
      return this[dartx.ceilToDouble]()[dartx.toInt]();
    }
    [dartx.floor]() {
      return this[dartx.floorToDouble]()[dartx.toInt]();
    }
    [dartx.round]() {
      if (this > 0) {
        if (this !== 1 / 0) {
          return Math.round(this);
        }
      } else if (this > -1 / 0) {
        return 0 - Math.round(0 - this);
      }
      dart.throw(new core.UnsupportedError("" + this));
    }
    [dartx.ceilToDouble]() {
      return Math.ceil(this);
    }
    [dartx.floorToDouble]() {
      return Math.floor(this);
    }
    [dartx.roundToDouble]() {
      if (this < 0) {
        return -Math.round(-this);
      } else {
        return Math.round(this);
      }
    }
    [dartx.truncateToDouble]() {
      return this < 0 ? this[dartx.ceilToDouble]() : this[dartx.floorToDouble]();
    }
    [dartx.clamp](lowerLimit, upperLimit) {
      if (dart.notNull(lowerLimit[dartx.compareTo](upperLimit)) > 0) {
        dart.throw(_js_helper.argumentErrorValue(lowerLimit));
      }
      if (dart.notNull(this[dartx.compareTo](lowerLimit)) < 0) return lowerLimit;
      if (dart.notNull(this[dartx.compareTo](upperLimit)) > 0) return upperLimit;
      return this;
    }
    [dartx.toDouble]() {
      return this;
    }
    [dartx.toStringAsFixed](fractionDigits) {
      _js_helper.checkInt(fractionDigits);
      if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
        dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
      }
      let result = this.toFixed(fractionDigits);
      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
      return result;
    }
    [dartx.toStringAsExponential](fractionDigits) {
      if (fractionDigits === void 0) fractionDigits = null;
      let result = null;
      if (fractionDigits != null) {
        _js_helper.checkInt(fractionDigits);
        if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
          dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
        }
        result = this.toExponential(fractionDigits);
      } else {
        result = this.toExponential();
      }
      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
      return result;
    }
    [dartx.toStringAsPrecision](precision) {
      _js_helper.checkInt(precision);
      if (dart.notNull(precision) < 1 || dart.notNull(precision) > 21) {
        dart.throw(new core.RangeError.range(precision, 1, 21, "precision"));
      }
      let result = this.toPrecision(precision);
      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
      return result;
    }
    [dartx.toRadixString](radix) {
      _js_helper.checkInt(radix);
      if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
        dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
      }
      let result = this.toString(radix);
      let rightParenCode = 41;
      if (result[dartx.codeUnitAt](dart.notNull(result[dartx.length]) - 1) != rightParenCode) {
        return result;
      }
      return _interceptors.JSNumber._handleIEtoString(result);
    }
    static _handleIEtoString(result) {
      let match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null) {
        dart.throw(new core.UnsupportedError(dart.str`Unexpected toString result: ${result}`));
      }
      result = dart.dindex(match, 1);
      let exponent = +dart.dindex(match, 3);
      if (dart.dindex(match, 2) != null) {
        result = result + dart.dindex(match, 2);
        exponent = exponent - dart.dindex(match, 2).length;
      }
      return dart.notNull(result) + "0"[dartx['*']](exponent);
    }
    [dartx.toString]() {
      if (this == 0 && 1 / this < 0) {
        return '-0.0';
      } else {
        return "" + this;
      }
    }
    get [dartx.hashCode]() {
      return this & 0x1FFFFFFF;
    }
    [dartx._negate]() {
      return -this;
    }
    [dartx['+']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this + other;
    }
    [dartx['-']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this - other;
    }
    [dartx['/']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this / other;
    }
    [dartx['*']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this * other;
    }
    [dartx['%']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      let result = this % other;
      if (result == 0) return 0;
      if (result > 0) return result;
      if (other < 0) {
        return result - other;
      } else {
        return result + other;
      }
    }
    [_isInt32](value) {
      return (value | 0) === value;
    }
    [dartx['~/']](other) {
      if (dart.test(this[_isInt32](this)) && dart.test(this[_isInt32](other)) && 0 != other && -1 != other) {
        return this / other | 0;
      } else {
        return this[_tdivSlow](other);
      }
    }
    [_tdivSlow](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this / other)[dartx.toInt]();
    }
    [dartx['<<']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
      return this[_shlPositive](other);
    }
    [_shlPositive](other) {
      return other > 31 ? 0 : this << other >>> 0;
    }
    [dartx['>>']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
      return this[_shrOtherPositive](other);
    }
    [_shrOtherPositive](other) {
      return this > 0 ? this[_shrBothPositive](other) : this >> (dart.notNull(other) > 31 ? 31 : other) >>> 0;
    }
    [_shrBothPositive](other) {
      return other > 31 ? 0 : this >>> other;
    }
    [dartx['&']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this & other) >>> 0;
    }
    [dartx['|']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this | other) >>> 0;
    }
    [dartx['^']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return (this ^ other) >>> 0;
    }
    [dartx['<']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this < other;
    }
    [dartx['>']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this > other;
    }
    [dartx['<=']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this <= other;
    }
    [dartx['>=']](other) {
      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
      return this >= other;
    }
    get [dartx.isEven]() {
      return (this & 1) == 0;
    }
    get [dartx.isOdd]() {
      return (this & 1) == 1;
    }
    [dartx.toUnsigned](width) {
      return (this & (1)[dartx['<<']](width) - 1) >>> 0;
    }
    [dartx.toSigned](width) {
      let signMask = (1)[dartx['<<']](dart.notNull(width) - 1);
      return ((this & signMask - 1) >>> 0) - ((this & signMask) >>> 0);
    }
    get [dartx.bitLength]() {
      let nonneg = this < 0 ? -this - 1 : this;
      if (nonneg >= 4294967296) {
        nonneg = (nonneg / 4294967296)[dartx.truncate]();
        return dart.notNull(_interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg))) + 32;
      }
      return _interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg));
    }
    [dartx.modPow](e, m) {
      if (!(typeof e == 'number')) {
        dart.throw(new core.ArgumentError.value(e, "exponent", "not an integer"));
      }
      if (!(typeof m == 'number')) {
        dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
      }
      if (dart.notNull(e) < 0) dart.throw(new core.RangeError.range(e, 0, null, "exponent"));
      if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
      if (e == 0) return 1;
      let b = this;
      if (dart.notNull(b) < 0 || dart.notNull(b) > dart.notNull(m)) {
        b = b[dartx['%']](m);
      }
      let r = 1;
      while (dart.notNull(e) > 0) {
        if (dart.test(e[dartx.isOdd])) {
          r = (r * dart.notNull(b))[dartx['%']](m);
        }
        e = (dart.notNull(e) / 2)[dartx.truncate]();
        b = (dart.notNull(b) * dart.notNull(b))[dartx['%']](m);
      }
      return r;
    }
    static _binaryGcd(x, y, inv) {
      let s = 1;
      if (!dart.test(inv)) {
        while (dart.test(x[dartx.isEven]) && dart.test(y[dartx.isEven])) {
          x = (dart.notNull(x) / 2)[dartx.truncate]();
          y = (dart.notNull(y) / 2)[dartx.truncate]();
          s = s * 2;
        }
        if (dart.test(y[dartx.isOdd])) {
          let t = x;
          x = y;
          y = t;
        }
      }
      let ac = x[dartx.isEven];
      let u = x;
      let v = y;
      let a = 1, b = 0, c = 0, d = 1;
      do {
        while (dart.test(u[dartx.isEven])) {
          u = (dart.notNull(u) / 2)[dartx.truncate]();
          if (dart.test(ac)) {
            if (!dart.test(a[dartx.isEven]) || !dart.test(b[dartx.isEven])) {
              a = dart.notNull(a) + dart.notNull(y);
              b = dart.notNull(b) - dart.notNull(x);
            }
            a = (dart.notNull(a) / 2)[dartx.truncate]();
          } else if (!dart.test(b[dartx.isEven])) {
            b = dart.notNull(b) - dart.notNull(x);
          }
          b = (dart.notNull(b) / 2)[dartx.truncate]();
        }
        while (dart.test(v[dartx.isEven])) {
          v = (dart.notNull(v) / 2)[dartx.truncate]();
          if (dart.test(ac)) {
            if (!dart.test(c[dartx.isEven]) || !dart.test(d[dartx.isEven])) {
              c = dart.notNull(c) + dart.notNull(y);
              d = dart.notNull(d) - dart.notNull(x);
            }
            c = (dart.notNull(c) / 2)[dartx.truncate]();
          } else if (!dart.test(d[dartx.isEven])) {
            d = dart.notNull(d) - dart.notNull(x);
          }
          d = (dart.notNull(d) / 2)[dartx.truncate]();
        }
        if (dart.notNull(u) >= dart.notNull(v)) {
          u = dart.notNull(u) - dart.notNull(v);
          if (dart.test(ac)) {
            a = dart.notNull(a) - dart.notNull(c);
          }
          b = dart.notNull(b) - dart.notNull(d);
        } else {
          v = dart.notNull(v) - dart.notNull(u);
          if (dart.test(ac)) {
            c = dart.notNull(c) - dart.notNull(a);
          }
          d = dart.notNull(d) - dart.notNull(b);
        }
      } while (u != 0);
      if (!dart.test(inv)) return s * dart.notNull(v);
      if (v != 1) dart.throw(core.Exception.new("Not coprime"));
      if (dart.notNull(d) < 0) {
        d = dart.notNull(d) + dart.notNull(x);
        if (dart.notNull(d) < 0) {
          d = dart.notNull(d) + dart.notNull(x);
        }
      } else if (dart.notNull(d) > dart.notNull(x)) {
        d = dart.notNull(d) - dart.notNull(x);
        if (dart.notNull(d) > dart.notNull(x)) {
          d = dart.notNull(d) - dart.notNull(x);
        }
      }
      return d;
    }
    [dartx.modInverse](m) {
      if (!(typeof m == 'number')) {
        dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
      }
      if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
      if (m == 1) return 0;
      let t = this;
      if (dart.notNull(t) < 0 || dart.notNull(t) >= dart.notNull(m)) {
        t = t[dartx['%']](m);
      }
      if (t == 1) return 1;
      if (t == 0 || dart.test(t[dartx.isEven]) && dart.test(m[dartx.isEven])) {
        dart.throw(core.Exception.new("Not coprime"));
      }
      return _interceptors.JSNumber._binaryGcd(m, t, true);
    }
    [dartx.gcd](other) {
      if (!(typeof other == 'number')) {
        dart.throw(new core.ArgumentError.value(other, "other", "not an integer"));
      }
      let x = this[dartx.abs]();
      let y = other[dartx.abs]();
      if (x == 0) return y;
      if (y == 0) return x;
      if (x == 1 || y == 1) return 1;
      return _interceptors.JSNumber._binaryGcd(x, y, false);
    }
    static _bitCount(i) {
      i = dart.notNull(_interceptors.JSNumber._shru(i, 0)) - (dart.notNull(_interceptors.JSNumber._shru(i, 1)) & 1431655765);
      i = (dart.notNull(i) & 858993459) + (dart.notNull(_interceptors.JSNumber._shru(i, 2)) & 858993459);
      i = 252645135 & dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 4));
      i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 8));
      i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 16));
      return dart.notNull(i) & 63;
    }
    static _shru(value, shift) {
      return value >>> shift;
    }
    static _shrs(value, shift) {
      return value >> shift;
    }
    static _ors(a, b) {
      return a | b;
    }
    static _spread(i) {
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 1));
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 2));
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 4));
      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 8));
      i = _interceptors.JSNumber._shru(_interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 16)), 0);
      return i;
    }
    [dartx['~']]() {
      return ~this >>> 0;
    }
  };
  _interceptors.JSNumber[dart.implements] = () => [core.int, core.double];
  dart.setSignature(_interceptors.JSNumber, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSNumber, [])}),
    getters: () => ({
      [dartx.isNegative]: dart.definiteFunctionType(core.bool, []),
      [dartx.isNaN]: dart.definiteFunctionType(core.bool, []),
      [dartx.isInfinite]: dart.definiteFunctionType(core.bool, []),
      [dartx.isFinite]: dart.definiteFunctionType(core.bool, []),
      [dartx.sign]: dart.definiteFunctionType(_interceptors.JSNumber, []),
      [dartx.isEven]: dart.definiteFunctionType(core.bool, []),
      [dartx.isOdd]: dart.definiteFunctionType(core.bool, []),
      [dartx.bitLength]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx.remainder]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx.abs]: dart.definiteFunctionType(_interceptors.JSNumber, []),
      [dartx.toInt]: dart.definiteFunctionType(core.int, []),
      [dartx.truncate]: dart.definiteFunctionType(core.int, []),
      [dartx.ceil]: dart.definiteFunctionType(core.int, []),
      [dartx.floor]: dart.definiteFunctionType(core.int, []),
      [dartx.round]: dart.definiteFunctionType(core.int, []),
      [dartx.ceilToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.floorToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.roundToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.truncateToDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.clamp]: dart.definiteFunctionType(core.num, [core.num, core.num]),
      [dartx.toDouble]: dart.definiteFunctionType(core.double, []),
      [dartx.toStringAsFixed]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.toStringAsExponential]: dart.definiteFunctionType(core.String, [], [core.int]),
      [dartx.toStringAsPrecision]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.toRadixString]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx._negate]: dart.definiteFunctionType(_interceptors.JSNumber, []),
      [dartx['+']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx['-']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx['/']]: dart.definiteFunctionType(core.double, [core.num]),
      [dartx['*']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [dartx['%']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
      [_isInt32]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [dartx['~/']]: dart.definiteFunctionType(core.int, [core.num]),
      [_tdivSlow]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['<<']]: dart.definiteFunctionType(core.int, [core.num]),
      [_shlPositive]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['>>']]: dart.definiteFunctionType(core.int, [core.num]),
      [_shrOtherPositive]: dart.definiteFunctionType(core.int, [core.num]),
      [_shrBothPositive]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['&']]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['|']]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['^']]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx['<']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx['>']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx['<=']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx['>=']]: dart.definiteFunctionType(core.bool, [core.num]),
      [dartx.toUnsigned]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.toSigned]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.modPow]: dart.definiteFunctionType(core.int, [core.int, core.int]),
      [dartx.modInverse]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.gcd]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx['~']]: dart.definiteFunctionType(core.int, [])
    }),
    sfields: () => ({
      _MIN_INT32: core.int,
      _MAX_INT32: core.int
    }),
    statics: () => ({
      _handleIEtoString: dart.definiteFunctionType(core.String, [core.String]),
      _binaryGcd: dart.definiteFunctionType(core.int, [core.int, core.int, core.bool]),
      _bitCount: dart.definiteFunctionType(core.int, [core.int]),
      _shru: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _shrs: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _ors: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _spread: dart.definiteFunctionType(core.int, [core.int])
    }),
    names: ['_handleIEtoString', '_binaryGcd', '_bitCount', '_shru', '_shrs', '_ors', '_spread']
  });
  _interceptors.JSNumber._MIN_INT32 = -2147483648;
  _interceptors.JSNumber._MAX_INT32 = 2147483647;
  dart.registerExtension(dart.global.Number, _interceptors.JSNumber);
  const _defaultSplit = Symbol('_defaultSplit');
  let const$;
  dart.defineExtensionNames([
    'codeUnitAt',
    'allMatches',
    'matchAsPrefix',
    '+',
    'endsWith',
    'replaceAll',
    'replaceAllMapped',
    'splitMapJoin',
    'replaceFirst',
    'replaceFirstMapped',
    'split',
    'replaceRange',
    'startsWith',
    'substring',
    'toLowerCase',
    'toUpperCase',
    'trim',
    'trimLeft',
    'trimRight',
    '*',
    'padLeft',
    'padRight',
    'codeUnits',
    'runes',
    'indexOf',
    'lastIndexOf',
    'contains',
    'isEmpty',
    'isNotEmpty',
    'compareTo',
    'toString',
    'hashCode',
    'runtimeType',
    'length',
    '_get'
  ]);
  _interceptors.JSString = class JSString extends _interceptors.Interceptor {
    new() {
      super.new();
    }
    [dartx.codeUnitAt](index) {
      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) >= dart.notNull(this[dartx.length])) dart.throw(_js_helper.diagnoseIndexError(this, index));
      return this.charCodeAt(index);
    }
    [dartx.allMatches](string, start) {
      if (start === void 0) start = 0;
      _js_helper.checkString(string);
      _js_helper.checkInt(start);
      if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      return _js_helper.allMatchesInStringUnchecked(this, string, start);
    }
    [dartx.matchAsPrefix](string, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      if (dart.notNull(start) + dart.notNull(this[dartx.length]) > dart.notNull(string[dartx.length])) return null;
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        if (string[dartx.codeUnitAt](dart.notNull(start) + i) != this[dartx.codeUnitAt](i)) {
          return null;
        }
      }
      return new _js_helper.StringMatch(start, string, this);
    }
    [dartx['+']](other) {
      if (!(typeof other == 'string')) dart.throw(new core.ArgumentError.value(other));
      return this + other;
    }
    [dartx.endsWith](other) {
      _js_helper.checkString(other);
      let otherLength = other[dartx.length];
      if (dart.notNull(otherLength) > dart.notNull(this[dartx.length])) return false;
      return other == this[dartx.substring](dart.notNull(this[dartx.length]) - dart.notNull(otherLength));
    }
    [dartx.replaceAll](from, to) {
      _js_helper.checkString(to);
      return _js_helper.stringReplaceAllUnchecked(this, from, to);
    }
    [dartx.replaceAllMapped](from, convert) {
      return this[dartx.splitMapJoin](from, {onMatch: convert});
    }
    [dartx.splitMapJoin](from, opts) {
      let onMatch = opts && 'onMatch' in opts ? opts.onMatch : null;
      let onNonMatch = opts && 'onNonMatch' in opts ? opts.onNonMatch : null;
      return _js_helper.stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
    }
    [dartx.replaceFirst](from, to, startIndex) {
      if (startIndex === void 0) startIndex = 0;
      _js_helper.checkString(to);
      _js_helper.checkInt(startIndex);
      core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
      return _js_helper.stringReplaceFirstUnchecked(this, from, to, startIndex);
    }
    [dartx.replaceFirstMapped](from, replace, startIndex) {
      if (startIndex === void 0) startIndex = 0;
      _js_helper.checkNull(replace);
      _js_helper.checkInt(startIndex);
      core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
      return _js_helper.stringReplaceFirstMappedUnchecked(this, from, replace, startIndex);
    }
    [dartx.split](pattern) {
      _js_helper.checkNull(pattern);
      if (typeof pattern == 'string') {
        return this.split(pattern);
      } else if (_js_helper.JSSyntaxRegExp.is(pattern) && _js_helper.regExpCaptureCount(pattern) == 0) {
        let re = _js_helper.regExpGetNative(pattern);
        return this.split(re);
      } else {
        return this[_defaultSplit](pattern);
      }
    }
    [dartx.replaceRange](start, end, replacement) {
      _js_helper.checkString(replacement);
      _js_helper.checkInt(start);
      end = core.RangeError.checkValidRange(start, end, this[dartx.length]);
      _js_helper.checkInt(end);
      return _js_helper.stringReplaceRangeUnchecked(this, start, end, replacement);
    }
    [_defaultSplit](pattern) {
      let result = JSArrayOfString().of([]);
      let start = 0;
      let length = 1;
      for (let match of pattern[dartx.allMatches](this)) {
        let matchStart = match.start;
        let matchEnd = match.end;
        length = dart.notNull(matchEnd) - dart.notNull(matchStart);
        if (length == 0 && start == matchStart) {
          continue;
        }
        let end = matchStart;
        result[dartx.add](this[dartx.substring](start, end));
        start = matchEnd;
      }
      if (dart.notNull(start) < dart.notNull(this[dartx.length]) || length > 0) {
        result[dartx.add](this[dartx.substring](start));
      }
      return result;
    }
    [dartx.startsWith](pattern, index) {
      if (index === void 0) index = 0;
      _js_helper.checkInt(index);
      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(index, 0, this[dartx.length]));
      }
      if (typeof pattern == 'string') {
        let other = pattern;
        let otherLength = other[dartx.length];
        let endIndex = dart.notNull(index) + dart.notNull(otherLength);
        if (endIndex > dart.notNull(this[dartx.length])) return false;
        return other == this.substring(index, endIndex);
      }
      return pattern[dartx.matchAsPrefix](this, index) != null;
    }
    [dartx.substring](startIndex, endIndex) {
      if (endIndex === void 0) endIndex = null;
      _js_helper.checkInt(startIndex);
      if (endIndex == null) endIndex = this[dartx.length];
      _js_helper.checkInt(endIndex);
      if (dart.notNull(startIndex) < 0) dart.throw(new core.RangeError.value(startIndex));
      if (dart.notNull(startIndex) > dart.notNull(endIndex)) dart.throw(new core.RangeError.value(startIndex));
      if (dart.notNull(endIndex) > dart.notNull(this[dartx.length])) dart.throw(new core.RangeError.value(endIndex));
      return this.substring(startIndex, endIndex);
    }
    [dartx.toLowerCase]() {
      return this.toLowerCase();
    }
    [dartx.toUpperCase]() {
      return this.toUpperCase();
    }
    static _isWhitespace(codeUnit) {
      if (dart.notNull(codeUnit) < 256) {
        switch (codeUnit) {
          case 9:
          case 10:
          case 11:
          case 12:
          case 13:
          case 32:
          case 133:
          case 160:
          {
            return true;
          }
          default:
          {
            return false;
          }
        }
      }
      switch (codeUnit) {
        case 5760:
        case 6158:
        case 8192:
        case 8193:
        case 8194:
        case 8195:
        case 8196:
        case 8197:
        case 8198:
        case 8199:
        case 8200:
        case 8201:
        case 8202:
        case 8232:
        case 8233:
        case 8239:
        case 8287:
        case 12288:
        case 65279:
        {
          return true;
        }
        default:
        {
          return false;
        }
      }
    }
    static _skipLeadingWhitespace(string, index) {
      let SPACE = 32;
      let CARRIAGE_RETURN = 13;
      while (dart.notNull(index) < dart.notNull(string[dartx.length])) {
        let codeUnit = string[dartx.codeUnitAt](index);
        if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
          break;
        }
        index = dart.notNull(index) + 1;
      }
      return index;
    }
    static _skipTrailingWhitespace(string, index) {
      let SPACE = 32;
      let CARRIAGE_RETURN = 13;
      while (dart.notNull(index) > 0) {
        let codeUnit = string[dartx.codeUnitAt](dart.notNull(index) - 1);
        if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
          break;
        }
        index = dart.notNull(index) - 1;
      }
      return index;
    }
    [dartx.trim]() {
      let NEL = 133;
      let result = this.trim();
      if (result[dartx.length] == 0) return result;
      let firstCode = result[dartx.codeUnitAt](0);
      let startIndex = 0;
      if (firstCode == NEL) {
        startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
        if (startIndex == result[dartx.length]) return "";
      }
      let endIndex = result[dartx.length];
      let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
      if (lastCode == NEL) {
        endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
      }
      if (startIndex == 0 && endIndex == result[dartx.length]) return result;
      return result.substring(startIndex, endIndex);
    }
    [dartx.trimLeft]() {
      let NEL = 133;
      let result = null;
      let startIndex = 0;
      if (typeof this.trimLeft != "undefined") {
        result = this.trimLeft();
        if (result[dartx.length] == 0) return result;
        let firstCode = result[dartx.codeUnitAt](0);
        if (firstCode == NEL) {
          startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
        }
      } else {
        result = this;
        startIndex = _interceptors.JSString._skipLeadingWhitespace(this, 0);
      }
      if (startIndex == 0) return result;
      if (startIndex == result[dartx.length]) return "";
      return result.substring(startIndex);
    }
    [dartx.trimRight]() {
      let NEL = 133;
      let result = null;
      let endIndex = null;
      if (typeof this.trimRight != "undefined") {
        result = this.trimRight();
        endIndex = result[dartx.length];
        if (endIndex == 0) return result;
        let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
        if (lastCode == NEL) {
          endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
        }
      } else {
        result = this;
        endIndex = _interceptors.JSString._skipTrailingWhitespace(this, this[dartx.length]);
      }
      if (endIndex == result[dartx.length]) return result;
      if (endIndex == 0) return "";
      return result.substring(0, endIndex);
    }
    [dartx['*']](times) {
      if (0 >= dart.notNull(times)) return '';
      if (times == 1 || this[dartx.length] == 0) return this;
      if (times != times >>> 0) {
        dart.throw(const$ || (const$ = dart.const(new core.OutOfMemoryError())));
      }
      let result = '';
      let s = this;
      while (true) {
        if ((dart.notNull(times) & 1) == 1) result = s + result;
        times = times >>> 1;
        if (times == 0) break;
        s = s + s;
      }
      return result;
    }
    [dartx.padLeft](width, padding) {
      if (padding === void 0) padding = ' ';
      let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
      if (delta <= 0) return this;
      return padding[dartx['*']](delta) + this;
    }
    [dartx.padRight](width, padding) {
      if (padding === void 0) padding = ' ';
      let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
      if (delta <= 0) return this;
      return this[dartx['+']](padding[dartx['*']](delta));
    }
    get [dartx.codeUnits]() {
      return new _internal.CodeUnits(this);
    }
    get [dartx.runes]() {
      return new core.Runes(this);
    }
    [dartx.indexOf](pattern, start) {
      if (start === void 0) start = 0;
      _js_helper.checkNull(pattern);
      if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
      }
      if (typeof pattern == 'string') {
        return _js_helper.stringIndexOfStringUnchecked(this, pattern, start);
      }
      if (_js_helper.JSSyntaxRegExp.is(pattern)) {
        let re = pattern;
        let match = _js_helper.firstMatchAfter(re, this, start);
        return match == null ? -1 : match.start;
      }
      for (let i = start; dart.notNull(i) <= dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
        if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
      }
      return -1;
    }
    [dartx.lastIndexOf](pattern, start) {
      if (start === void 0) start = null;
      _js_helper.checkNull(pattern);
      if (start == null) {
        start = this[dartx.length];
      } else if (!(typeof start == 'number')) {
        dart.throw(_js_helper.argumentErrorValue(start));
      } else if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
      }
      if (typeof pattern == 'string') {
        let other = pattern;
        if (dart.notNull(start) + dart.notNull(other[dartx.length]) > dart.notNull(this[dartx.length])) {
          start = dart.notNull(this[dartx.length]) - dart.notNull(other[dartx.length]);
        }
        return core.int._check(_js_helper.stringLastIndexOfUnchecked(this, other, start));
      }
      for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
      }
      return -1;
    }
    [dartx.contains](other, startIndex) {
      if (startIndex === void 0) startIndex = 0;
      _js_helper.checkNull(other);
      if (dart.notNull(startIndex) < 0 || dart.notNull(startIndex) > dart.notNull(this[dartx.length])) {
        dart.throw(new core.RangeError.range(startIndex, 0, this[dartx.length]));
      }
      return _js_helper.stringContainsUnchecked(this, other, startIndex);
    }
    get [dartx.isEmpty]() {
      return this[dartx.length] == 0;
    }
    get [dartx.isNotEmpty]() {
      return !dart.test(this[dartx.isEmpty]);
    }
    [dartx.compareTo](other) {
      if (!(typeof other == 'string')) dart.throw(_js_helper.argumentErrorValue(other));
      return dart.equals(this, other) ? 0 : this < other ? -1 : 1;
    }
    [dartx.toString]() {
      return this;
    }
    get [dartx.hashCode]() {
      let hash = 0;
      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
        hash = 536870911 & hash + this.charCodeAt(i);
        hash = 536870911 & hash + ((524287 & hash) << 10);
        hash = hash ^ hash >> 6;
      }
      hash = 536870911 & hash + ((67108863 & hash) << 3);
      hash = hash ^ hash >> 11;
      return 536870911 & hash + ((16383 & hash) << 15);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(core.String);
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
      if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
      return this[index];
    }
  };
  _interceptors.JSString[dart.implements] = () => [core.String, JSIndexableOfString()];
  dart.setSignature(_interceptors.JSString, {
    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSString, [])}),
    getters: () => ({
      [dartx.codeUnits]: dart.definiteFunctionType(core.List$(core.int), []),
      [dartx.runes]: dart.definiteFunctionType(core.Runes, []),
      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.length]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [dartx.codeUnitAt]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.allMatches]: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
      [dartx.matchAsPrefix]: dart.definiteFunctionType(core.Match, [core.String], [core.int]),
      [dartx['+']]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.endsWith]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.replaceAll]: dart.definiteFunctionType(core.String, [core.Pattern, core.String]),
      [dartx.replaceAllMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()]),
      [dartx.splitMapJoin]: dart.definiteFunctionType(core.String, [core.Pattern], {onMatch: MatchToString(), onNonMatch: StringToString()}),
      [dartx.replaceFirst]: dart.definiteFunctionType(core.String, [core.Pattern, core.String], [core.int]),
      [dartx.replaceFirstMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()], [core.int]),
      [dartx.split]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
      [dartx.replaceRange]: dart.definiteFunctionType(core.String, [core.int, core.int, core.String]),
      [_defaultSplit]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
      [dartx.startsWith]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
      [dartx.substring]: dart.definiteFunctionType(core.String, [core.int], [core.int]),
      [dartx.toLowerCase]: dart.definiteFunctionType(core.String, []),
      [dartx.toUpperCase]: dart.definiteFunctionType(core.String, []),
      [dartx.trim]: dart.definiteFunctionType(core.String, []),
      [dartx.trimLeft]: dart.definiteFunctionType(core.String, []),
      [dartx.trimRight]: dart.definiteFunctionType(core.String, []),
      [dartx['*']]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.padLeft]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
      [dartx.padRight]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
      [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
      [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
      [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.String]),
      [dartx._get]: dart.definiteFunctionType(core.String, [core.int])
    }),
    statics: () => ({
      _isWhitespace: dart.definiteFunctionType(core.bool, [core.int]),
      _skipLeadingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int]),
      _skipTrailingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int])
    }),
    names: ['_isWhitespace', '_skipLeadingWhitespace', '_skipTrailingWhitespace']
  });
  dart.registerExtension(dart.global.String, _interceptors.JSString);
  core.num = class num extends core.Object {
    static parse(input, onError) {
      if (onError === void 0) onError = null;
      let source = input[dartx.trim]();
      let result = core.int.parse(source, {onError: core.num._returnIntNull});
      if (result != null) return result;
      result = core.double.parse(source, core.num._returnDoubleNull);
      if (result != null) return result;
      if (onError == null) dart.throw(new core.FormatException(input));
      return onError(input);
    }
    static _returnIntNull(_) {
      return null;
    }
    static _returnDoubleNull(_) {
      return null;
    }
  };
  core.num.is = function is_num(o) {
    return typeof o == "number";
  };
  core.num.as = function as_num(o) {
    if (typeof o == "number" || o == null) return o;
    return dart.as(o, core.num);
  };
  core.num._check = function check_num(o) {
    if (typeof o == "number" || o == null) return o;
    return dart.check(o, core.num);
  };
  core.num[dart.implements] = () => [ComparableOfnum()];
  dart.setSignature(core.num, {
    statics: () => ({
      parse: dart.definiteFunctionType(core.num, [core.String], [StringTonum()]),
      _returnIntNull: dart.definiteFunctionType(core.int, [core.String]),
      _returnDoubleNull: dart.definiteFunctionType(core.double, [core.String])
    }),
    names: ['parse', '_returnIntNull', '_returnDoubleNull']
  });
  core.double = class double extends core.num {
    static parse(source, onError) {
      if (onError === void 0) onError = null;
      return _js_helper.Primitives.parseDouble(source, onError);
    }
  };
  dart.setSignature(core.double, {
    sfields: () => ({
      NAN: core.double,
      INFINITY: core.double,
      NEGATIVE_INFINITY: core.double,
      MIN_POSITIVE: core.double,
      MAX_FINITE: core.double
    }),
    statics: () => ({parse: dart.definiteFunctionType(core.double, [core.String], [StringTodouble()])}),
    names: ['parse']
  });
  core.double.NAN = 0.0 / 0.0;
  core.double.INFINITY = 1.0 / 0.0;
  core.double.MIN_POSITIVE = 5e-324;
  core.double.MAX_FINITE = 1.7976931348623157e+308;
  dart.defineLazy(core.double, {
    get NEGATIVE_INFINITY() {
      return -core.double.INFINITY;
    }
  });
  _internal.POWERS_OF_TEN = dart.constList([1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0, 1e+21, 1e+22], core.double);
  const _string = Symbol('_string');
  collection.ListMixin$ = dart.generic(E => {
    let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
    let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    dart.defineExtensionNames([
      'iterator',
      'elementAt',
      'forEach',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'expand',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'add',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeLast',
      'sort',
      'shuffle',
      'asMap',
      'sublist',
      'getRange',
      'removeRange',
      'fillRange',
      'setRange',
      'replaceRange',
      'indexOf',
      'lastIndexOf',
      'insert',
      'removeAt',
      'insertAll',
      'setAll',
      'reversed',
      'toString'
    ]);
    class ListMixin extends core.Object {
      get iterator() {
        return new (ListIteratorOfE())(this);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
      elementAt(index) {
        return this[dartx._get](index);
      }
      forEach(action) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          action(this[dartx._get](i));
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      get isEmpty() {
        return this[dartx.length] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this[dartx.isEmpty]);
      }
      get first() {
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[dartx._get](0);
      }
      get last() {
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
      }
      get single() {
        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this[dartx.length]) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this[dartx._get](0);
      }
      contains(element) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), element)) return true;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      every(test) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          if (!dart.test(test(this[dartx._get](i)))) return false;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return true;
      }
      any(test) {
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          if (dart.test(test(this[dartx._get](i)))) return true;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this[dartx._get](i);
          if (dart.test(test(element))) return element;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this[dartx.length];
        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
          let element = this[dartx._get](i);
          if (dart.test(test(element))) return element;
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let length = this[dartx.length];
        let match = null;
        let matchFound = false;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this[dartx._get](i);
          if (dart.test(test(element))) {
            if (matchFound) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            matchFound = true;
            match = element;
          }
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (matchFound) return match;
        dart.throw(_internal.IterableElementError.noElement());
      }
      join(separator) {
        if (separator === void 0) separator = "";
        if (this[dartx.length] == 0) return "";
        let buffer = new core.StringBuffer();
        buffer.writeAll(this, separator);
        return buffer.toString();
      }
      where(test) {
        return new (WhereIterableOfE())(this, test);
      }
      map(T) {
        return f => {
          return new (_internal.MappedListIterable$(E, T))(this, f);
        };
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let length = this[dartx.length];
        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
        let value = this[dartx._get](0);
        for (let i = 1; i < dart.notNull(length); i++) {
          value = combine(value, this[dartx._get](i));
          if (length != this[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          let length = this[dartx.length];
          for (let i = 0; i < dart.notNull(length); i++) {
            value = combine(value, this[dartx._get](i));
            if (length != this[dartx.length]) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return value;
        };
      }
      skip(count) {
        return new (SubListIterableOfE())(this, count, null);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      take(count) {
        return new (SubListIterableOfE())(this, 0, count);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = null;
        if (dart.test(growable)) {
          result = ListOfE().new();
          result[dartx.length] = this[dartx.length];
        } else {
          result = ListOfE().new(this[dartx.length]);
        }
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          result[dartx._set](i, this[dartx._get](i));
        }
        return result;
      }
      toSet() {
        let result = SetOfE().new();
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          result.add(this[dartx._get](i));
        }
        return result;
      }
      add(element) {
        E._check(element);
        this[dartx._set]((() => {
          let x = this[dartx.length];
          this[dartx.length] = dart.notNull(x) + 1;
          return x;
        })(), element);
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        let i = this[dartx.length];
        for (let element of iterable) {
          dart.assert(this[dartx.length] == i || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
          this[dartx.length] = dart.notNull(i) + 1;
          this[dartx._set](i, element);
          i = dart.notNull(i) + 1;
        }
      }
      remove(element) {
        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
          if (dart.equals(this[dartx._get](i), element)) {
            this[dartx.setRange](i, dart.notNull(this[dartx.length]) - 1, this, i + 1);
            this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
            return true;
          }
        }
        return false;
      }
      removeWhere(test) {
        collection.ListMixin._filter(this, test, false);
      }
      retainWhere(test) {
        collection.ListMixin._filter(this, test, true);
      }
      static _filter(source, test, retainMatching) {
        let retained = [];
        let length = source[dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = source[dartx._get](i);
          if (dart.dcall(test, element) == retainMatching) {
            retained[dartx.add](element);
          }
          if (length != source[dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(source));
          }
        }
        if (retained[dartx.length] != source[dartx.length]) {
          source[dartx.setRange](0, retained[dartx.length], retained);
          source[dartx.length] = retained[dartx.length];
        }
      }
      clear() {
        this[dartx.length] = 0;
      }
      removeLast() {
        if (this[dartx.length] == 0) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = this[dartx._get](dart.notNull(this[dartx.length]) - 1);
        this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
        return result;
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        if (compare == null) {
          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
        } else {
          _internal.Sort.sort(E)(this, compare);
        }
      }
      shuffle(random) {
        if (random === void 0) random = null;
        if (random == null) random = math.Random.new();
        let length = this[dartx.length];
        while (dart.notNull(length) > 1) {
          let pos = random.nextInt(length);
          length = dart.notNull(length) - 1;
          let tmp = this[dartx._get](length);
          this[dartx._set](length, this[dartx._get](pos));
          this[dartx._set](pos, tmp);
        }
      }
      asMap() {
        return new (ListMapViewOfE())(this);
      }
      sublist(start, end) {
        if (end === void 0) end = null;
        let listLength = this[dartx.length];
        if (end == null) end = listLength;
        core.RangeError.checkValidRange(start, end, listLength);
        let length = dart.notNull(end) - dart.notNull(start);
        let result = ListOfE().new();
        result[dartx.length] = length;
        for (let i = 0; i < length; i++) {
          result[dartx._set](i, this[dartx._get](dart.notNull(start) + i));
        }
        return result;
      }
      getRange(start, end) {
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        return new (SubListIterableOfE())(this, start, end);
      }
      removeRange(start, end) {
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let length = dart.notNull(end) - dart.notNull(start);
        this[dartx.setRange](start, dart.notNull(this[dartx.length]) - length, this, end);
        this[dartx.length] = dart.notNull(this[dartx.length]) - length;
      }
      fillRange(start, end, fill) {
        if (fill === void 0) fill = null;
        E._check(fill);
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          this[dartx._set](i, fill);
        }
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        let length = dart.notNull(end) - dart.notNull(start);
        if (length == 0) return;
        core.RangeError.checkNotNegative(skipCount, "skipCount");
        let otherList = null;
        let otherStart = null;
        if (ListOfE().is(iterable)) {
          otherList = iterable;
          otherStart = skipCount;
        } else {
          otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
          otherStart = 0;
        }
        if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
          dart.throw(_internal.IterableElementError.tooFew());
        }
        if (dart.notNull(otherStart) < dart.notNull(start)) {
          for (let i = length - 1; i >= 0; i--) {
            this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
          }
        } else {
          for (let i = 0; i < length; i++) {
            this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
          }
        }
      }
      replaceRange(start, end, newContents) {
        IterableOfE()._check(newContents);
        core.RangeError.checkValidRange(start, end, this[dartx.length]);
        if (!_internal.EfficientLength.is(newContents)) {
          newContents = newContents[dartx.toList]();
        }
        let removeLength = dart.notNull(end) - dart.notNull(start);
        let insertLength = newContents[dartx.length];
        if (removeLength >= dart.notNull(insertLength)) {
          let delta = removeLength - dart.notNull(insertLength);
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          let newLength = dart.notNull(this[dartx.length]) - delta;
          this[dartx.setRange](start, insertEnd, newContents);
          if (delta != 0) {
            this[dartx.setRange](insertEnd, newLength, this, end);
            this[dartx.length] = newLength;
          }
        } else {
          let delta = dart.notNull(insertLength) - removeLength;
          let newLength = dart.notNull(this[dartx.length]) + delta;
          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
          this[dartx.length] = newLength;
          this[dartx.setRange](insertEnd, newLength, this, end);
          this[dartx.setRange](start, insertEnd, newContents);
        }
      }
      indexOf(element, startIndex) {
        if (startIndex === void 0) startIndex = 0;
        if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
          return -1;
        }
        if (dart.notNull(startIndex) < 0) {
          startIndex = 0;
        }
        for (let i = startIndex; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      lastIndexOf(element, startIndex) {
        if (startIndex === void 0) startIndex = null;
        if (startIndex == null) {
          startIndex = dart.notNull(this[dartx.length]) - 1;
        } else {
          if (dart.notNull(startIndex) < 0) {
            return -1;
          }
          if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
            startIndex = dart.notNull(this[dartx.length]) - 1;
          }
        }
        for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
          if (dart.equals(this[dartx._get](i), element)) {
            return i;
          }
        }
        return -1;
      }
      insert(index, element) {
        E._check(element);
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        if (index == this[dartx.length]) {
          this[dartx.add](element);
          return;
        }
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError(index));
        this[dartx.length] = dart.notNull(this[dartx.length]) + 1;
        this[dartx.setRange](dart.notNull(index) + 1, this[dartx.length], this, index);
        this[dartx._set](index, element);
      }
      removeAt(index) {
        let result = this[dartx._get](index);
        this[dartx.setRange](index, dart.notNull(this[dartx.length]) - 1, this, dart.notNull(index) + 1);
        this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
        return result;
      }
      insertAll(index, iterable) {
        IterableOfE()._check(iterable);
        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
        if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
          iterable = iterable[dartx.toList]();
        }
        let insertionLength = iterable[dartx.length];
        this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
        if (iterable[dartx.length] != insertionLength) {
          this[dartx.length] = dart.notNull(this[dartx.length]) - dart.notNull(insertionLength);
          dart.throw(new core.ConcurrentModificationError(iterable));
        }
        this[dartx.setRange](dart.notNull(index) + dart.notNull(insertionLength), this[dartx.length], this, index);
        this[dartx.setAll](index, iterable);
      }
      setAll(index, iterable) {
        IterableOfE()._check(iterable);
        if (core.List.is(iterable)) {
          this[dartx.setRange](index, dart.notNull(index) + dart.notNull(iterable[dartx.length]), iterable);
        } else {
          for (let element of iterable) {
            this[dartx._set]((() => {
              let x = index;
              index = dart.notNull(x) + 1;
              return x;
            })(), element);
          }
        }
      }
      get reversed() {
        return new (ReversedListIterableOfE())(this);
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '[', ']');
      }
    }
    dart.addTypeTests(ListMixin);
    ListMixin[dart.implements] = () => [ListOfE()];
    dart.setSignature(ListMixin, {
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, []),
        reversed: dart.definiteFunctionType(core.Iterable$(E), [])
      }),
      methods: () => ({
        elementAt: dart.definiteFunctionType(E, [core.int]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), []),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        clear: dart.definiteFunctionType(dart.void, []),
        removeLast: dart.definiteFunctionType(E, []),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
        asMap: dart.definiteFunctionType(core.Map$(core.int, E), []),
        sublist: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
        getRange: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        indexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        lastIndexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
      }),
      statics: () => ({_filter: dart.definiteFunctionType(dart.void, [core.List, dynamicTobool(), core.bool])}),
      names: ['_filter']
    });
    dart.defineExtensionMembers(ListMixin, [
      'elementAt',
      'forEach',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'expand',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'add',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeLast',
      'sort',
      'shuffle',
      'asMap',
      'sublist',
      'getRange',
      'removeRange',
      'fillRange',
      'setRange',
      'replaceRange',
      'indexOf',
      'lastIndexOf',
      'insert',
      'removeAt',
      'insertAll',
      'setAll',
      'toString',
      'iterator',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single',
      'reversed'
    ]);
    return ListMixin;
  });
  collection.ListMixin = ListMixin();
  collection.ListBase$ = dart.generic(E => {
    class ListBase extends dart.mixin(core.Object, collection.ListMixin$(E)) {
      static listToString(list) {
        return collection.IterableBase.iterableToFullString(list, '[', ']');
      }
    }
    dart.addTypeTests(ListBase);
    dart.setSignature(ListBase, {
      statics: () => ({listToString: dart.definiteFunctionType(core.String, [core.List])}),
      names: ['listToString']
    });
    return ListBase;
  });
  collection.ListBase = ListBase();
  _internal.UnmodifiableListMixin$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
    class UnmodifiableListMixin extends core.Object {
      _set(index, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
        return value;
      }
      set length(newLength) {
        dart.throw(new core.UnsupportedError("Cannot change the length of an unmodifiable list"));
      }
      setAll(at, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      add(value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      insert(index, element) {
        E._check(element);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      insertAll(at, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
      }
      remove(element) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      removeWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      retainWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      shuffle(random) {
        if (random === void 0) random = null;
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot clear an unmodifiable list"));
      }
      removeAt(index) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      removeLast() {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
      removeRange(start, end) {
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
      }
      fillRange(start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
      }
    }
    dart.addTypeTests(UnmodifiableListMixin);
    UnmodifiableListMixin[dart.implements] = () => [ListOfE()];
    dart.setSignature(UnmodifiableListMixin, {
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        add: dart.definiteFunctionType(dart.void, [E]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfE()]),
        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
        clear: dart.definiteFunctionType(dart.void, []),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
      })
    });
    dart.defineExtensionMembers(UnmodifiableListMixin, [
      '_set',
      'setAll',
      'add',
      'insert',
      'insertAll',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'sort',
      'shuffle',
      'clear',
      'removeAt',
      'removeLast',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange',
      'length'
    ]);
    return UnmodifiableListMixin;
  });
  _internal.UnmodifiableListMixin = UnmodifiableListMixin();
  _internal.UnmodifiableListBase$ = dart.generic(E => {
    class UnmodifiableListBase extends dart.mixin(collection.ListBase$(E), _internal.UnmodifiableListMixin$(E)) {
      new() {
        super.new();
      }
    }
    return UnmodifiableListBase;
  });
  _internal.UnmodifiableListBase = UnmodifiableListBase();
  core.int = class int extends core.num {
    static fromEnvironment(name, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
      dart.throw(new core.UnsupportedError('int.fromEnvironment can only be used as a const constructor'));
    }
    static parse(source, opts) {
      let radix = opts && 'radix' in opts ? opts.radix : null;
      let onError = opts && 'onError' in opts ? opts.onError : null;
      return _js_helper.Primitives.parseInt(source, radix, onError);
    }
  };
  core.int.is = function is_int(o) {
    return typeof o == "number" && Math.floor(o) == o;
  };
  core.int.as = function as_int(o) {
    if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
    return dart.as(o, core.int);
  };
  core.int._check = function check_int(o) {
    if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
    return dart.check(o, core.int);
  };
  dart.setSignature(core.int, {
    constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.int, [core.String], {defaultValue: core.int})}),
    statics: () => ({parse: dart.definiteFunctionType(core.int, [core.String], {radix: core.int, onError: StringToint()})}),
    names: ['parse']
  });
  _internal.CodeUnits = class CodeUnits extends _internal.UnmodifiableListBase$(core.int) {
    new(string) {
      this[_string] = string;
    }
    get length() {
      return this[_string][dartx.length];
    }
    set length(value) {
      super.length = value;
    }
    _get(i) {
      return this[_string][dartx.codeUnitAt](i);
    }
    static stringOf(u) {
      return u[_string];
    }
  };
  dart.addSimpleTypeTests(_internal.CodeUnits);
  dart.setSignature(_internal.CodeUnits, {
    constructors: () => ({new: dart.definiteFunctionType(_internal.CodeUnits, [core.String])}),
    fields: () => ({[_string]: core.String}),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({_get: dart.definiteFunctionType(core.int, [core.int])}),
    statics: () => ({stringOf: dart.definiteFunctionType(core.String, [_internal.CodeUnits])}),
    names: ['stringOf']
  });
  dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
  _internal.EfficientLength = class EfficientLength extends core.Object {};
  core.Iterable$ = dart.generic(E => {
    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
    dart.defineExtensionNames([
      'map',
      'where',
      'expand',
      'contains',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'toList',
      'toSet',
      'length',
      'isEmpty',
      'isNotEmpty',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'first',
      'last',
      'single',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'toString'
    ]);
    class Iterable extends core.Object {
      new() {
      }
      static generate(count, generator) {
        if (generator === void 0) generator = null;
        if (dart.notNull(count) <= 0) return new (EmptyIterableOfE())();
        return new (_GeneratorIterableOfE())(count, generator);
      }
      static empty() {
        return new (EmptyIterableOfE())();
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
      map(T) {
        return f => {
          return _internal.MappedIterable$(E, T).new(this, f);
        };
      }
      where(test) {
        return new (WhereIterableOfE())(this, test);
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      contains(element) {
        for (let e of this) {
          if (dart.equals(e, element)) return true;
        }
        return false;
      }
      forEach(f) {
        for (let element of this)
          f(element);
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let iterator = this[dartx.iterator];
        if (!dart.test(iterator.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let value = iterator.current;
        while (dart.test(iterator.moveNext())) {
          value = combine(value, iterator.current);
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          for (let element of this)
            value = combine(value, element);
          return value;
        };
      }
      every(f) {
        for (let element of this) {
          if (!dart.test(f(element))) return false;
        }
        return true;
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let iterator = this[dartx.iterator];
        if (!dart.test(iterator.moveNext())) return "";
        let buffer = new core.StringBuffer();
        if (separator == null || separator == "") {
          do {
            buffer.write(dart.str`${iterator.current}`);
          } while (dart.test(iterator.moveNext()));
        } else {
          buffer.write(dart.str`${iterator.current}`);
          while (dart.test(iterator.moveNext())) {
            buffer.write(separator);
            buffer.write(dart.str`${iterator.current}`);
          }
        }
        return buffer.toString();
      }
      any(f) {
        for (let element of this) {
          if (dart.test(f(element))) return true;
        }
        return false;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        return ListOfE().from(this, {growable: growable});
      }
      toSet() {
        return SetOfE().from(this);
      }
      get length() {
        dart.assert(!_internal.EfficientLength.is(this));
        let count = 0;
        let it = this[dartx.iterator];
        while (dart.test(it.moveNext())) {
          count++;
        }
        return count;
      }
      get isEmpty() {
        return !dart.test(this[dartx.iterator].moveNext());
      }
      get isNotEmpty() {
        return !dart.test(this[dartx.isEmpty]);
      }
      take(count) {
        return TakeIterableOfE().new(this, count);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      skip(count) {
        return SkipIterableOfE().new(this, count);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      get first() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        return it.current;
      }
      get last() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = null;
        do {
          result = it.current;
        } while (dart.test(it.moveNext()));
        return result;
      }
      get single() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
        let result = it.current;
        if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
        return result;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        for (let element of this) {
          if (dart.test(test(element))) return element;
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            if (foundMatching) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
        core.RangeError.checkNotNegative(index, "index");
        let elementIndex = 0;
        for (let element of this) {
          if (index == elementIndex) return element;
          elementIndex++;
        }
        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
      }
      toString() {
        return collection.IterableBase.iterableToShortString(this, '(', ')');
      }
    }
    dart.addTypeTests(Iterable);
    dart.setSignature(Iterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.Iterable$(E), []),
        generate: dart.definiteFunctionType(core.Iterable$(E), [core.int], [intToE()]),
        empty: dart.definiteFunctionType(core.Iterable$(E), [])
      }),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), []),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        elementAt: dart.definiteFunctionType(E, [core.int])
      })
    });
    dart.defineExtensionMembers(Iterable, [
      'map',
      'where',
      'expand',
      'contains',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'toList',
      'toSet',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'toString',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single'
    ]);
    return Iterable;
  });
  core.Iterable = Iterable();
  _internal.ListIterable$ = dart.generic(E => {
    let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let dynamicAndEToE = () => (dynamicAndEToE = dart.constFn(dart.functionType(E, [dart.dynamic, E])))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class ListIterable extends core.Iterable$(E) {
      new() {
        super.new();
      }
      get iterator() {
        return new (ListIteratorOfE())(this);
      }
      forEach(action) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          action(this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      get isEmpty() {
        return this.length == 0;
      }
      get first() {
        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
        return this.elementAt(0);
      }
      get last() {
        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
        return this.elementAt(dart.notNull(this.length) - 1);
      }
      get single() {
        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this.elementAt(0);
      }
      contains(element) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          if (dart.equals(this.elementAt(i), element)) return true;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      every(test) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          if (!dart.test(test(this.elementAt(i)))) return false;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return true;
      }
      any(test) {
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          if (dart.test(test(this.elementAt(i)))) return true;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return false;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this.length;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this.elementAt(i);
          if (dart.test(test(element))) return element;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let length = this.length;
        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
          let element = this.elementAt(i);
          if (dart.test(test(element))) return element;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let length = this.length;
        let match = null;
        let matchFound = false;
        for (let i = 0; i < dart.notNull(length); i++) {
          let element = this.elementAt(i);
          if (dart.test(test(element))) {
            if (matchFound) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            matchFound = true;
            match = element;
          }
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        if (matchFound) return match;
        dart.throw(_internal.IterableElementError.noElement());
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let length = this.length;
        if (!dart.test(separator[dartx.isEmpty])) {
          if (length == 0) return "";
          let first = dart.str`${this.elementAt(0)}`;
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          let buffer = new core.StringBuffer(first);
          for (let i = 1; i < dart.notNull(length); i++) {
            buffer.write(separator);
            buffer.write(this.elementAt(i));
            if (length != this.length) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return buffer.toString();
        } else {
          let buffer = new core.StringBuffer();
          for (let i = 0; i < dart.notNull(length); i++) {
            buffer.write(this.elementAt(i));
            if (length != this.length) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return buffer.toString();
        }
      }
      where(test) {
        return super.where(test);
      }
      map(T) {
        return f => {
          return new (_internal.MappedListIterable$(E, T))(this, f);
        };
      }
      reduce(combine) {
        dynamicAndEToE()._check(combine);
        let length = this.length;
        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
        let value = this.elementAt(0);
        for (let i = 1; i < dart.notNull(length); i++) {
          value = dart.dcall(combine, value, this.elementAt(i));
          if (length != this.length) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          let length = this.length;
          for (let i = 0; i < dart.notNull(length); i++) {
            value = combine(value, this.elementAt(i));
            if (length != this.length) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
          }
          return value;
        };
      }
      skip(count) {
        return new (SubListIterableOfE())(this, count, null);
      }
      skipWhile(test) {
        return super.skipWhile(test);
      }
      take(count) {
        return new (SubListIterableOfE())(this, 0, count);
      }
      takeWhile(test) {
        return super.takeWhile(test);
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = null;
        if (dart.test(growable)) {
          result = ListOfE().new();
          result[dartx.length] = this.length;
        } else {
          result = ListOfE().new(this.length);
        }
        for (let i = 0; i < dart.notNull(this.length); i++) {
          result[dartx._set](i, this.elementAt(i));
        }
        return result;
      }
      toSet() {
        let result = SetOfE().new();
        for (let i = 0; i < dart.notNull(this.length); i++) {
          result.add(this.elementAt(i));
        }
        return result;
      }
    }
    ListIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(ListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterable$(E), [])}),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        reduce: dart.definiteFunctionType(E, [dynamicAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(ListIterable, [
      'forEach',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'iterator',
      'isEmpty',
      'first',
      'last',
      'single'
    ]);
    return ListIterable;
  });
  _internal.ListIterable = ListIterable();
  const _iterable$ = Symbol('_iterable');
  const _start = Symbol('_start');
  const _endOrLength = Symbol('_endOrLength');
  const _endIndex = Symbol('_endIndex');
  const _startIndex = Symbol('_startIndex');
  _internal.SubListIterable$ = dart.generic(E => {
    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class SubListIterable extends _internal.ListIterable$(E) {
      new(iterable, start, endOrLength) {
        this[_iterable$] = iterable;
        this[_start] = start;
        this[_endOrLength] = endOrLength;
        super.new();
        core.RangeError.checkNotNegative(this[_start], "start");
        if (this[_endOrLength] != null) {
          core.RangeError.checkNotNegative(this[_endOrLength], "end");
          if (dart.notNull(this[_start]) > dart.notNull(this[_endOrLength])) {
            dart.throw(new core.RangeError.range(this[_start], 0, this[_endOrLength], "start"));
          }
        }
      }
      get [_endIndex]() {
        let length = this[_iterable$][dartx.length];
        if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) > dart.notNull(length)) return length;
        return this[_endOrLength];
      }
      get [_startIndex]() {
        let length = this[_iterable$][dartx.length];
        if (dart.notNull(this[_start]) > dart.notNull(length)) return length;
        return this[_start];
      }
      get length() {
        let length = this[_iterable$][dartx.length];
        if (dart.notNull(this[_start]) >= dart.notNull(length)) return 0;
        if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) >= dart.notNull(length)) {
          return dart.notNull(length) - dart.notNull(this[_start]);
        }
        return dart.notNull(this[_endOrLength]) - dart.notNull(this[_start]);
      }
      elementAt(index) {
        let realIndex = dart.notNull(this[_startIndex]) + dart.notNull(index);
        if (dart.notNull(index) < 0 || realIndex >= dart.notNull(this[_endIndex])) {
          dart.throw(core.RangeError.index(index, this, "index"));
        }
        return this[_iterable$][dartx.elementAt](realIndex);
      }
      skip(count) {
        core.RangeError.checkNotNegative(count, "count");
        let newStart = dart.notNull(this[_start]) + dart.notNull(count);
        if (this[_endOrLength] != null && newStart >= dart.notNull(this[_endOrLength])) {
          return new (EmptyIterableOfE())();
        }
        return new (SubListIterableOfE())(this[_iterable$], newStart, this[_endOrLength]);
      }
      take(count) {
        core.RangeError.checkNotNegative(count, "count");
        if (this[_endOrLength] == null) {
          return new (SubListIterableOfE())(this[_iterable$], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
        } else {
          let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
          if (dart.notNull(this[_endOrLength]) < newEnd) return this;
          return new (SubListIterableOfE())(this[_iterable$], this[_start], newEnd);
        }
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let start = this[_start];
        let end = this[_iterable$][dartx.length];
        if (this[_endOrLength] != null && dart.notNull(this[_endOrLength]) < dart.notNull(end)) end = this[_endOrLength];
        let length = dart.notNull(end) - dart.notNull(start);
        if (length < 0) length = 0;
        let result = dart.test(growable) ? (() => {
          let _ = ListOfE().new();
          _[dartx.length] = length;
          return _;
        })() : ListOfE().new(length);
        for (let i = 0; i < length; i++) {
          result[dartx._set](i, this[_iterable$][dartx.elementAt](dart.notNull(start) + i));
          if (dart.notNull(this[_iterable$][dartx.length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError(this));
        }
        return result;
      }
    }
    dart.setSignature(SubListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SubListIterable$(E), [IterableOfE(), core.int, core.int])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_start]: core.int,
        [_endOrLength]: core.int
      }),
      getters: () => ({
        [_endIndex]: dart.definiteFunctionType(core.int, []),
        [_startIndex]: dart.definiteFunctionType(core.int, [])
      }),
      methods: () => ({
        elementAt: dart.definiteFunctionType(E, [core.int]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool})
      })
    });
    dart.defineExtensionMembers(SubListIterable, [
      'elementAt',
      'skip',
      'take',
      'toList',
      'length'
    ]);
    return SubListIterable;
  });
  _internal.SubListIterable = SubListIterable();
  const _length$ = Symbol('_length');
  const _index$ = Symbol('_index');
  const _current$ = Symbol('_current');
  _internal.ListIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class ListIterator extends core.Object {
      new(iterable) {
        this[_iterable$] = iterable;
        this[_length$] = iterable[dartx.length];
        this[_index$] = 0;
        this[_current$] = null;
      }
      get current() {
        return this[_current$];
      }
      moveNext() {
        let length = this[_iterable$][dartx.length];
        if (this[_length$] != length) {
          dart.throw(new core.ConcurrentModificationError(this[_iterable$]));
        }
        if (dart.notNull(this[_index$]) >= dart.notNull(length)) {
          this[_current$] = null;
          return false;
        }
        this[_current$] = this[_iterable$][dartx.elementAt](this[_index$]);
        this[_index$] = dart.notNull(this[_index$]) + 1;
        return true;
      }
    }
    dart.addTypeTests(ListIterator);
    ListIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(ListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterator$(E), [IterableOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_length$]: core.int,
        [_index$]: core.int,
        [_current$]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return ListIterator;
  });
  _internal.ListIterator = ListIterator();
  _internal._Transformation$ = dart.generic((S, T) => {
    const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
    return _Transformation;
  });
  _internal._Transformation = _Transformation();
  const _f = Symbol('_f');
  _internal.MappedIterable$ = dart.generic((S, T) => {
    let EfficientLengthMappedIterableOfS$T = () => (EfficientLengthMappedIterableOfS$T = dart.constFn(_internal.EfficientLengthMappedIterable$(S, T)))();
    let MappedIterableOfS$T = () => (MappedIterableOfS$T = dart.constFn(_internal.MappedIterable$(S, T)))();
    let MappedIteratorOfS$T = () => (MappedIteratorOfS$T = dart.constFn(_internal.MappedIterator$(S, T)))();
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
    class MappedIterable extends core.Iterable$(T) {
      static new(iterable, func) {
        if (_internal.EfficientLength.is(iterable)) {
          return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
        }
        return new (MappedIterableOfS$T())._(iterable, func);
      }
      _(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (MappedIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
      }
      get length() {
        return this[_iterable$][dartx.length];
      }
      get isEmpty() {
        return this[_iterable$][dartx.isEmpty];
      }
      get first() {
        return this[_f](this[_iterable$][dartx.first]);
      }
      get last() {
        return this[_f](this[_iterable$][dartx.last]);
      }
      get single() {
        return this[_f](this[_iterable$][dartx.single]);
      }
      elementAt(index) {
        return this[_f](this[_iterable$][dartx.elementAt](index));
      }
    }
    dart.defineNamedConstructor(MappedIterable, '_');
    dart.setSignature(MappedIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()]),
        _: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])
      }),
      fields: () => ({
        [_iterable$]: IterableOfS(),
        [_f]: _TransformationOfS$T()
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(T), []),
        first: dart.definiteFunctionType(T, []),
        last: dart.definiteFunctionType(T, []),
        single: dart.definiteFunctionType(T, [])
      }),
      methods: () => ({elementAt: dart.definiteFunctionType(T, [core.int])})
    });
    dart.defineExtensionMembers(MappedIterable, [
      'elementAt',
      'iterator',
      'length',
      'isEmpty',
      'first',
      'last',
      'single'
    ]);
    return MappedIterable;
  });
  _internal.MappedIterable = MappedIterable();
  _internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let SToT = () => (SToT = dart.constFn(dart.functionType(T, [S])))();
    class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
      new(iterable, func) {
        super._(iterable, func);
      }
    }
    EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EfficientLengthMappedIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthMappedIterable$(S, T), [IterableOfS(), SToT()])})
    });
    return EfficientLengthMappedIterable;
  });
  _internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
  const _iterator = Symbol('_iterator');
  core.Iterator$ = dart.generic(E => {
    class Iterator extends core.Object {}
    dart.addTypeTests(Iterator);
    return Iterator;
  });
  core.Iterator = Iterator();
  _internal.MappedIterator$ = dart.generic((S, T) => {
    let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
    class MappedIterator extends core.Iterator$(T) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_current$] = null;
      }
      moveNext() {
        if (dart.test(this[_iterator].moveNext())) {
          this[_current$] = this[_f](this[_iterator].current);
          return true;
        }
        this[_current$] = null;
        return false;
      }
      get current() {
        return this[_current$];
      }
    }
    dart.setSignature(MappedIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.MappedIterator$(S, T), [IteratorOfS(), _TransformationOfS$T()])}),
      fields: () => ({
        [_current$]: T,
        [_iterator]: IteratorOfS(),
        [_f]: _TransformationOfS$T()
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return MappedIterator;
  });
  _internal.MappedIterator = MappedIterator();
  const _source = Symbol('_source');
  _internal.MappedListIterable$ = dart.generic((S, T) => {
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
    class MappedListIterable extends _internal.ListIterable$(T) {
      new(source, f) {
        this[_source] = source;
        this[_f] = f;
        super.new();
      }
      get length() {
        return this[_source][dartx.length];
      }
      elementAt(index) {
        return this[_f](this[_source][dartx.elementAt](index));
      }
    }
    MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(MappedListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.MappedListIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])}),
      fields: () => ({
        [_source]: IterableOfS(),
        [_f]: _TransformationOfS$T()
      }),
      methods: () => ({elementAt: dart.definiteFunctionType(T, [core.int])})
    });
    dart.defineExtensionMembers(MappedListIterable, ['elementAt', 'length']);
    return MappedListIterable;
  });
  _internal.MappedListIterable = MappedListIterable();
  _internal._ElementPredicate$ = dart.generic(E => {
    const _ElementPredicate = dart.typedef('_ElementPredicate', () => dart.functionType(core.bool, [E]));
    return _ElementPredicate;
  });
  _internal._ElementPredicate = _ElementPredicate();
  _internal.WhereIterable$ = dart.generic(E => {
    let WhereIteratorOfE = () => (WhereIteratorOfE = dart.constFn(_internal.WhereIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class WhereIterable extends core.Iterable$(E) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(WhereIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(WhereIterable, ['iterator']);
    return WhereIterable;
  });
  _internal.WhereIterable = WhereIterable();
  _internal.WhereIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class WhereIterator extends core.Iterator$(E) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
      }
      moveNext() {
        while (dart.test(this[_iterator].moveNext())) {
          if (dart.test(this[_f](this[_iterator].current))) {
            return true;
          }
        }
        return false;
      }
      get current() {
        return this[_iterator].current;
      }
    }
    dart.setSignature(WhereIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return WhereIterator;
  });
  _internal.WhereIterator = WhereIterator();
  _internal._ExpandFunction$ = dart.generic((S, T) => {
    const _ExpandFunction = dart.typedef('_ExpandFunction', () => dart.functionType(core.Iterable$(T), [S]));
    return _ExpandFunction;
  });
  _internal._ExpandFunction = _ExpandFunction();
  _internal.ExpandIterable$ = dart.generic((S, T) => {
    let ExpandIteratorOfS$T = () => (ExpandIteratorOfS$T = dart.constFn(_internal.ExpandIterator$(S, T)))();
    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
    let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class ExpandIterable extends core.Iterable$(T) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (ExpandIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(ExpandIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterable$(S, T), [IterableOfS(), _ExpandFunctionOfS$T()])}),
      fields: () => ({
        [_iterable$]: IterableOfS(),
        [_f]: _ExpandFunctionOfS$T()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
    });
    dart.defineExtensionMembers(ExpandIterable, ['iterator']);
    return ExpandIterable;
  });
  _internal.ExpandIterable = ExpandIterable();
  const _currentExpansion = Symbol('_currentExpansion');
  _internal.ExpandIterator$ = dart.generic((S, T) => {
    let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
    let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
    let EmptyIteratorOfT = () => (EmptyIteratorOfT = dart.constFn(_internal.EmptyIterator$(T)))();
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class ExpandIterator extends core.Object {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_currentExpansion] = dart.const(new (EmptyIteratorOfT())());
        this[_current$] = null;
      }
      get current() {
        return this[_current$];
      }
      moveNext() {
        if (this[_currentExpansion] == null) return false;
        while (!dart.test(this[_currentExpansion].moveNext())) {
          this[_current$] = null;
          if (dart.test(this[_iterator].moveNext())) {
            this[_currentExpansion] = null;
            this[_currentExpansion] = this[_f](this[_iterator].current)[dartx.iterator];
          } else {
            return false;
          }
        }
        this[_current$] = this[_currentExpansion].current;
        return true;
      }
    }
    dart.addTypeTests(ExpandIterator);
    ExpandIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(ExpandIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterator$(S, T), [IteratorOfS(), _ExpandFunctionOfS$T()])}),
      fields: () => ({
        [_iterator]: IteratorOfS(),
        [_f]: _ExpandFunctionOfS$T(),
        [_currentExpansion]: IteratorOfT(),
        [_current$]: T
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return ExpandIterator;
  });
  _internal.ExpandIterator = ExpandIterator();
  const _takeCount = Symbol('_takeCount');
  _internal.TakeIterable$ = dart.generic(E => {
    let EfficientLengthTakeIterableOfE = () => (EfficientLengthTakeIterableOfE = dart.constFn(_internal.EfficientLengthTakeIterable$(E)))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeIteratorOfE = () => (TakeIteratorOfE = dart.constFn(_internal.TakeIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class TakeIterable extends core.Iterable$(E) {
      static new(iterable, takeCount) {
        if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
          dart.throw(new core.ArgumentError(takeCount));
        }
        if (_internal.EfficientLength.is(iterable)) {
          return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
        }
        return new (TakeIterableOfE())._(iterable, takeCount);
      }
      _(iterable, takeCount) {
        this[_iterable$] = iterable;
        this[_takeCount] = takeCount;
        super.new();
      }
      get iterator() {
        return new (TakeIteratorOfE())(this[_iterable$][dartx.iterator], this[_takeCount]);
      }
    }
    dart.defineNamedConstructor(TakeIterable, '_');
    dart.setSignature(TakeIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int]),
        _: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int])
      }),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_takeCount]: core.int
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(TakeIterable, ['iterator']);
    return TakeIterable;
  });
  _internal.TakeIterable = TakeIterable();
  _internal.EfficientLengthTakeIterable$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
      new(iterable, takeCount) {
        super._(iterable, takeCount);
      }
      get length() {
        let iterableLength = this[_iterable$][dartx.length];
        if (dart.notNull(iterableLength) > dart.notNull(this[_takeCount])) return this[_takeCount];
        return iterableLength;
      }
    }
    EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EfficientLengthTakeIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthTakeIterable$(E), [IterableOfE(), core.int])})
    });
    dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
    return EfficientLengthTakeIterable;
  });
  _internal.EfficientLengthTakeIterable = EfficientLengthTakeIterable();
  const _remaining = Symbol('_remaining');
  _internal.TakeIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class TakeIterator extends core.Iterator$(E) {
      new(iterator, remaining) {
        this[_iterator] = iterator;
        this[_remaining] = remaining;
        dart.assert(typeof this[_remaining] == 'number' && dart.notNull(this[_remaining]) >= 0);
      }
      moveNext() {
        this[_remaining] = dart.notNull(this[_remaining]) - 1;
        if (dart.notNull(this[_remaining]) >= 0) {
          return this[_iterator].moveNext();
        }
        this[_remaining] = -1;
        return false;
      }
      get current() {
        if (dart.notNull(this[_remaining]) < 0) return null;
        return this[_iterator].current;
      }
    }
    dart.setSignature(TakeIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeIterator$(E), [IteratorOfE(), core.int])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_remaining]: core.int
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return TakeIterator;
  });
  _internal.TakeIterator = TakeIterator();
  _internal.TakeWhileIterable$ = dart.generic(E => {
    let TakeWhileIteratorOfE = () => (TakeWhileIteratorOfE = dart.constFn(_internal.TakeWhileIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class TakeWhileIterable extends core.Iterable$(E) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (TakeWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(TakeWhileIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(TakeWhileIterable, ['iterator']);
    return TakeWhileIterable;
  });
  _internal.TakeWhileIterable = TakeWhileIterable();
  const _isFinished = Symbol('_isFinished');
  _internal.TakeWhileIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class TakeWhileIterator extends core.Iterator$(E) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_isFinished] = false;
      }
      moveNext() {
        if (dart.test(this[_isFinished])) return false;
        if (!dart.test(this[_iterator].moveNext()) || !dart.test(this[_f](this[_iterator].current))) {
          this[_isFinished] = true;
          return false;
        }
        return true;
      }
      get current() {
        if (dart.test(this[_isFinished])) return null;
        return this[_iterator].current;
      }
    }
    dart.setSignature(TakeWhileIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_f]: _ElementPredicateOfE(),
        [_isFinished]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return TakeWhileIterator;
  });
  _internal.TakeWhileIterator = TakeWhileIterator();
  const _skipCount = Symbol('_skipCount');
  _internal.SkipIterable$ = dart.generic(E => {
    let EfficientLengthSkipIterableOfE = () => (EfficientLengthSkipIterableOfE = dart.constFn(_internal.EfficientLengthSkipIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipIteratorOfE = () => (SkipIteratorOfE = dart.constFn(_internal.SkipIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class SkipIterable extends core.Iterable$(E) {
      static new(iterable, count) {
        if (_internal.EfficientLength.is(iterable)) {
          return new (EfficientLengthSkipIterableOfE())(iterable, count);
        }
        return new (SkipIterableOfE())._(iterable, count);
      }
      _(iterable, skipCount) {
        this[_iterable$] = iterable;
        this[_skipCount] = skipCount;
        super.new();
        if (!(typeof this[_skipCount] == 'number')) {
          dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
        }
        core.RangeError.checkNotNegative(this[_skipCount], "count");
      }
      skip(count) {
        if (!(typeof this[_skipCount] == 'number')) {
          dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
        }
        core.RangeError.checkNotNegative(this[_skipCount], "count");
        return new (SkipIterableOfE())._(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(count));
      }
      get iterator() {
        return new (SkipIteratorOfE())(this[_iterable$][dartx.iterator], this[_skipCount]);
      }
    }
    dart.defineNamedConstructor(SkipIterable, '_');
    dart.setSignature(SkipIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int]),
        _: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int])
      }),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_skipCount]: core.int
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({skip: dart.definiteFunctionType(core.Iterable$(E), [core.int])})
    });
    dart.defineExtensionMembers(SkipIterable, ['skip', 'iterator']);
    return SkipIterable;
  });
  _internal.SkipIterable = SkipIterable();
  _internal.EfficientLengthSkipIterable$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
      new(iterable, skipCount) {
        super._(iterable, skipCount);
      }
      get length() {
        let length = dart.notNull(this[_iterable$][dartx.length]) - dart.notNull(this[_skipCount]);
        if (length >= 0) return length;
        return 0;
      }
    }
    EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EfficientLengthSkipIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthSkipIterable$(E), [IterableOfE(), core.int])})
    });
    dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
    return EfficientLengthSkipIterable;
  });
  _internal.EfficientLengthSkipIterable = EfficientLengthSkipIterable();
  _internal.SkipIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class SkipIterator extends core.Iterator$(E) {
      new(iterator, skipCount) {
        this[_iterator] = iterator;
        this[_skipCount] = skipCount;
        dart.assert(typeof this[_skipCount] == 'number' && dart.notNull(this[_skipCount]) >= 0);
      }
      moveNext() {
        for (let i = 0; i < dart.notNull(this[_skipCount]); i++)
          this[_iterator].moveNext();
        this[_skipCount] = 0;
        return this[_iterator].moveNext();
      }
      get current() {
        return this[_iterator].current;
      }
    }
    dart.setSignature(SkipIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipIterator$(E), [IteratorOfE(), core.int])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_skipCount]: core.int
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return SkipIterator;
  });
  _internal.SkipIterator = SkipIterator();
  _internal.SkipWhileIterable$ = dart.generic(E => {
    let SkipWhileIteratorOfE = () => (SkipWhileIteratorOfE = dart.constFn(_internal.SkipWhileIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class SkipWhileIterable extends core.Iterable$(E) {
      new(iterable, f) {
        this[_iterable$] = iterable;
        this[_f] = f;
        super.new();
      }
      get iterator() {
        return new (SkipWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
      }
    }
    dart.setSignature(SkipWhileIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterable$]: IterableOfE(),
        [_f]: _ElementPredicateOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
    });
    dart.defineExtensionMembers(SkipWhileIterable, ['iterator']);
    return SkipWhileIterable;
  });
  _internal.SkipWhileIterable = SkipWhileIterable();
  const _hasSkipped = Symbol('_hasSkipped');
  _internal.SkipWhileIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
    class SkipWhileIterator extends core.Iterator$(E) {
      new(iterator, f) {
        this[_iterator] = iterator;
        this[_f] = f;
        this[_hasSkipped] = false;
      }
      moveNext() {
        if (!dart.test(this[_hasSkipped])) {
          this[_hasSkipped] = true;
          while (dart.test(this[_iterator].moveNext())) {
            if (!dart.test(this[_f](this[_iterator].current))) return true;
          }
        }
        return this[_iterator].moveNext();
      }
      get current() {
        return this[_iterator].current;
      }
    }
    dart.setSignature(SkipWhileIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
      fields: () => ({
        [_iterator]: IteratorOfE(),
        [_f]: _ElementPredicateOfE(),
        [_hasSkipped]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return SkipWhileIterator;
  });
  _internal.SkipWhileIterator = SkipWhileIterator();
  _internal.EmptyIterable$ = dart.generic(E => {
    let EmptyIteratorOfE = () => (EmptyIteratorOfE = dart.constFn(_internal.EmptyIterator$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class EmptyIterable extends core.Iterable$(E) {
      new() {
        super.new();
      }
      get iterator() {
        return dart.const(new (EmptyIteratorOfE())());
      }
      forEach(action) {}
      get isEmpty() {
        return true;
      }
      get length() {
        return 0;
      }
      get first() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      get last() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      get single() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        dart.throw(new core.RangeError.range(index, 0, 0, "index"));
      }
      contains(element) {
        return false;
      }
      every(test) {
        return true;
      }
      any(test) {
        return false;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      join(separator) {
        if (separator === void 0) separator = "";
        return "";
      }
      where(test) {
        return this;
      }
      map(T) {
        return f => {
          return dart.const(new (_internal.EmptyIterable$(T))());
        };
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        dart.throw(_internal.IterableElementError.noElement());
      }
      fold(T) {
        return (initialValue, combine) => {
          return initialValue;
        };
      }
      skip(count) {
        core.RangeError.checkNotNegative(count, "count");
        return this;
      }
      skipWhile(test) {
        return this;
      }
      take(count) {
        core.RangeError.checkNotNegative(count, "count");
        return this;
      }
      takeWhile(test) {
        return this;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        return dart.test(growable) ? JSArrayOfE().of([]) : ListOfE().new(0);
      }
      toSet() {
        return SetOfE().new();
      }
    }
    EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(EmptyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterable$(E), [])}),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        elementAt: dart.definiteFunctionType(E, [core.int]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(EmptyIterable, [
      'forEach',
      'elementAt',
      'contains',
      'every',
      'any',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'join',
      'where',
      'map',
      'reduce',
      'fold',
      'skip',
      'skipWhile',
      'take',
      'takeWhile',
      'toList',
      'toSet',
      'iterator',
      'isEmpty',
      'length',
      'first',
      'last',
      'single'
    ]);
    return EmptyIterable;
  });
  _internal.EmptyIterable = EmptyIterable();
  _internal.EmptyIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class EmptyIterator extends core.Object {
      new() {
      }
      moveNext() {
        return false;
      }
      get current() {
        return null;
      }
    }
    dart.addTypeTests(EmptyIterator);
    EmptyIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(EmptyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterator$(E), [])}),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return EmptyIterator;
  });
  _internal.EmptyIterator = EmptyIterator();
  _internal.IterableElementError = class IterableElementError extends core.Object {
    static noElement() {
      return new core.StateError("No element");
    }
    static tooMany() {
      return new core.StateError("Too many elements");
    }
    static tooFew() {
      return new core.StateError("Too few elements");
    }
  };
  dart.setSignature(_internal.IterableElementError, {
    statics: () => ({
      noElement: dart.definiteFunctionType(core.StateError, []),
      tooMany: dart.definiteFunctionType(core.StateError, []),
      tooFew: dart.definiteFunctionType(core.StateError, [])
    }),
    names: ['noElement', 'tooMany', 'tooFew']
  });
  _internal.FixedLengthListMixin$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    dart.defineExtensionNames([
      'length',
      'add',
      'insert',
      'insertAll',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeAt',
      'removeLast',
      'removeRange',
      'replaceRange'
    ]);
    class FixedLengthListMixin extends core.Object {
      set length(newLength) {
        dart.throw(new core.UnsupportedError("Cannot change the length of a fixed-length list"));
      }
      add(value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      insert(index, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      insertAll(at, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
      }
      remove(element) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      removeWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      retainWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot clear a fixed-length list"));
      }
      removeAt(index) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      removeLast() {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      removeRange(start, end) {
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
      }
    }
    dart.addTypeTests(FixedLengthListMixin);
    dart.setSignature(FixedLengthListMixin, {
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [E]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        clear: dart.definiteFunctionType(dart.void, []),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()])
      })
    });
    dart.defineExtensionMembers(FixedLengthListMixin, [
      'add',
      'insert',
      'insertAll',
      'addAll',
      'remove',
      'removeWhere',
      'retainWhere',
      'clear',
      'removeAt',
      'removeLast',
      'removeRange',
      'replaceRange',
      'length'
    ]);
    return FixedLengthListMixin;
  });
  _internal.FixedLengthListMixin = FixedLengthListMixin();
  _internal.FixedLengthListBase$ = dart.generic(E => {
    class FixedLengthListBase extends dart.mixin(collection.ListBase$(E), _internal.FixedLengthListMixin$(E)) {
      new() {
        super.new();
      }
    }
    return FixedLengthListBase;
  });
  _internal.FixedLengthListBase = FixedLengthListBase();
  const _backedList = Symbol('_backedList');
  _internal._ListIndicesIterable = class _ListIndicesIterable extends _internal.ListIterable$(core.int) {
    new(backedList) {
      this[_backedList] = backedList;
      super.new();
    }
    get length() {
      return this[_backedList][dartx.length];
    }
    elementAt(index) {
      core.RangeError.checkValidIndex(index, this);
      return index;
    }
  };
  dart.addSimpleTypeTests(_internal._ListIndicesIterable);
  dart.setSignature(_internal._ListIndicesIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_internal._ListIndicesIterable, [core.List])}),
    fields: () => ({[_backedList]: core.List}),
    methods: () => ({elementAt: dart.definiteFunctionType(core.int, [core.int])})
  });
  dart.defineExtensionMembers(_internal._ListIndicesIterable, ['elementAt', 'length']);
  const _values = Symbol('_values');
  _internal.ListMapView$ = dart.generic(E => {
    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let MapOfint$E = () => (MapOfint$E = dart.constFn(core.Map$(core.int, E)))();
    let intAndETovoid = () => (intAndETovoid = dart.constFn(dart.functionType(dart.void, [core.int, E])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    class ListMapView extends core.Object {
      new(values) {
        this[_values] = values;
      }
      _get(key) {
        return dart.test(this.containsKey(key)) ? this[_values][dartx._get](core.int._check(key)) : null;
      }
      get length() {
        return this[_values][dartx.length];
      }
      get values() {
        return new (SubListIterableOfE())(this[_values], 0, null);
      }
      get keys() {
        return new _internal._ListIndicesIterable(this[_values]);
      }
      get isEmpty() {
        return this[_values][dartx.isEmpty];
      }
      get isNotEmpty() {
        return this[_values][dartx.isNotEmpty];
      }
      containsValue(value) {
        return this[_values][dartx.contains](value);
      }
      containsKey(key) {
        return typeof key == 'number' && dart.notNull(key) >= 0 && dart.notNull(key) < dart.notNull(this.length);
      }
      forEach(f) {
        let length = this[_values][dartx.length];
        for (let i = 0; i < dart.notNull(length); i++) {
          f(i, this[_values][dartx._get](i));
          if (length != this[_values][dartx.length]) {
            dart.throw(new core.ConcurrentModificationError(this[_values]));
          }
        }
      }
      _set(key, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
        return value;
      }
      putIfAbsent(key, ifAbsent) {
        VoidToE()._check(ifAbsent);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      remove(key) {
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      addAll(other) {
        MapOfint$E()._check(other);
        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    dart.addTypeTests(ListMapView);
    ListMapView[dart.implements] = () => [MapOfint$E()];
    dart.setSignature(ListMapView, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ListMapView$(E), [ListOfE()])}),
      fields: () => ({[_values]: ListOfE()}),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        values: dart.definiteFunctionType(core.Iterable$(E), []),
        keys: dart.definiteFunctionType(core.Iterable$(core.int), []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(E, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [intAndETovoid()]),
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        putIfAbsent: dart.definiteFunctionType(E, [core.int, VoidToE()]),
        remove: dart.definiteFunctionType(E, [core.Object]),
        clear: dart.definiteFunctionType(dart.void, []),
        addAll: dart.definiteFunctionType(dart.void, [MapOfint$E()])
      })
    });
    dart.defineExtensionMembers(ListMapView, [
      '_get',
      'containsValue',
      'containsKey',
      'forEach',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'addAll',
      'length',
      'values',
      'keys',
      'isEmpty',
      'isNotEmpty'
    ]);
    return ListMapView;
  });
  _internal.ListMapView = ListMapView();
  _internal.ReversedListIterable$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class ReversedListIterable extends _internal.ListIterable$(E) {
      new(source) {
        this[_source] = source;
        super.new();
      }
      get length() {
        return this[_source][dartx.length];
      }
      elementAt(index) {
        return this[_source][dartx.elementAt](dart.notNull(this[_source][dartx.length]) - 1 - dart.notNull(index));
      }
    }
    dart.setSignature(ReversedListIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_internal.ReversedListIterable$(E), [IterableOfE()])}),
      fields: () => ({[_source]: IterableOfE()}),
      methods: () => ({elementAt: dart.definiteFunctionType(E, [core.int])})
    });
    dart.defineExtensionMembers(ReversedListIterable, ['elementAt', 'length']);
    return ReversedListIterable;
  });
  _internal.ReversedListIterable = ReversedListIterable();
  _internal.UnmodifiableListError = class UnmodifiableListError extends core.Object {
    static add() {
      return new core.UnsupportedError("Cannot add to unmodifiable List");
    }
    static change() {
      return new core.UnsupportedError("Cannot change the content of an unmodifiable List");
    }
    static length() {
      return new core.UnsupportedError("Cannot change length of unmodifiable List");
    }
    static remove() {
      return new core.UnsupportedError("Cannot remove from unmodifiable List");
    }
  };
  dart.setSignature(_internal.UnmodifiableListError, {
    statics: () => ({
      add: dart.definiteFunctionType(core.UnsupportedError, []),
      change: dart.definiteFunctionType(core.UnsupportedError, []),
      length: dart.definiteFunctionType(core.UnsupportedError, []),
      remove: dart.definiteFunctionType(core.UnsupportedError, [])
    }),
    names: ['add', 'change', 'length', 'remove']
  });
  _internal.NonGrowableListError = class NonGrowableListError extends core.Object {
    static add() {
      return new core.UnsupportedError("Cannot add to non-growable List");
    }
    static length() {
      return new core.UnsupportedError("Cannot change length of non-growable List");
    }
    static remove() {
      return new core.UnsupportedError("Cannot remove from non-growable List");
    }
  };
  dart.setSignature(_internal.NonGrowableListError, {
    statics: () => ({
      add: dart.definiteFunctionType(core.UnsupportedError, []),
      length: dart.definiteFunctionType(core.UnsupportedError, []),
      remove: dart.definiteFunctionType(core.UnsupportedError, [])
    }),
    names: ['add', 'length', 'remove']
  });
  _internal.makeListFixedLength = function(E) {
    return growableList => {
      _interceptors.JSArray.markFixedList(growableList);
      return growableList;
    };
  };
  dart.lazyFn(_internal.makeListFixedLength, () => ListOfEToListOfE());
  _internal.makeFixedListUnmodifiable = function(E) {
    return fixedLengthList => {
      _interceptors.JSArray.markUnmodifiableList(fixedLengthList);
      return fixedLengthList;
    };
  };
  dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
  _internal.Lists = class Lists extends core.Object {
    static copy(src, srcStart, dst, dstStart, count) {
      if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
        for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
          dst[dartx._set](j, src[dartx._get](i));
        }
      } else {
        for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
          dst[dartx._set](j, src[dartx._get](i));
        }
      }
    }
    static areEqual(a, b) {
      if (core.identical(a, b)) return true;
      if (!core.List.is(b)) return false;
      let length = a[dartx.length];
      if (!dart.equals(length, dart.dload(b, 'length'))) return false;
      for (let i = 0; i < dart.notNull(length); i++) {
        if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
      }
      return true;
    }
    static indexOf(a, element, startIndex, endIndex) {
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        return -1;
      }
      if (dart.notNull(startIndex) < 0) {
        startIndex = 0;
      }
      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static lastIndexOf(a, element, startIndex) {
      if (dart.notNull(startIndex) < 0) {
        return -1;
      }
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        startIndex = dart.notNull(a[dartx.length]) - 1;
      }
      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static indicesCheck(a, start, end) {
      core.RangeError.checkValidRange(start, end, a[dartx.length]);
    }
    static rangeCheck(a, start, length) {
      core.RangeError.checkNotNegative(length);
      core.RangeError.checkNotNegative(start);
      if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
        let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
        dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
      }
    }
  };
  dart.setSignature(_internal.Lists, {
    statics: () => ({
      copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
      areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
      indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
      rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
    }),
    names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
  });
  _internal.printToZone = null;
  _internal.printToConsole = function(line) {
    _js_primitives.printString(dart.str`${line}`);
  };
  dart.lazyFn(_internal.printToConsole, () => StringTovoid$());
  _internal.Sort = class Sort extends core.Object {
    static sort(E) {
      return (a, compare) => {
        _internal.Sort._doSort(E)(a, 0, dart.notNull(a[dartx.length]) - 1, compare);
      };
    }
    static sortRange(E) {
      return (a, from, to, compare) => {
        if (dart.notNull(from) < 0 || dart.notNull(to) > dart.notNull(a[dartx.length]) || dart.notNull(to) < dart.notNull(from)) {
          dart.throw("OutOfRange");
        }
        _internal.Sort._doSort(E)(a, from, dart.notNull(to) - 1, compare);
      };
    }
    static _doSort(E) {
      return (a, left, right, compare) => {
        if (dart.notNull(right) - dart.notNull(left) <= _internal.Sort._INSERTION_SORT_THRESHOLD) {
          _internal.Sort._insertionSort(E)(a, left, right, compare);
        } else {
          _internal.Sort._dualPivotQuicksort(E)(a, left, right, compare);
        }
      };
    }
    static _insertionSort(E) {
      return (a, left, right, compare) => {
        for (let i = dart.notNull(left) + 1; i <= dart.notNull(right); i++) {
          let el = a[dartx._get](i);
          let j = i;
          while (j > dart.notNull(left) && dart.notNull(compare(a[dartx._get](j - 1), el)) > 0) {
            a[dartx._set](j, a[dartx._get](j - 1));
            j--;
          }
          a[dartx._set](j, el);
        }
      };
    }
    static _dualPivotQuicksort(E) {
      return (a, left, right, compare) => {
        dart.assert(dart.notNull(right) - dart.notNull(left) > _internal.Sort._INSERTION_SORT_THRESHOLD);
        let sixth = ((dart.notNull(right) - dart.notNull(left) + 1) / 6)[dartx.truncate]();
        let index1 = dart.notNull(left) + sixth;
        let index5 = dart.notNull(right) - sixth;
        let index3 = ((dart.notNull(left) + dart.notNull(right)) / 2)[dartx.truncate]();
        let index2 = index3 - sixth;
        let index4 = index3 + sixth;
        let el1 = a[dartx._get](index1);
        let el2 = a[dartx._get](index2);
        let el3 = a[dartx._get](index3);
        let el4 = a[dartx._get](index4);
        let el5 = a[dartx._get](index5);
        if (dart.notNull(compare(el1, el2)) > 0) {
          let t = el1;
          el1 = el2;
          el2 = t;
        }
        if (dart.notNull(compare(el4, el5)) > 0) {
          let t = el4;
          el4 = el5;
          el5 = t;
        }
        if (dart.notNull(compare(el1, el3)) > 0) {
          let t = el1;
          el1 = el3;
          el3 = t;
        }
        if (dart.notNull(compare(el2, el3)) > 0) {
          let t = el2;
          el2 = el3;
          el3 = t;
        }
        if (dart.notNull(compare(el1, el4)) > 0) {
          let t = el1;
          el1 = el4;
          el4 = t;
        }
        if (dart.notNull(compare(el3, el4)) > 0) {
          let t = el3;
          el3 = el4;
          el4 = t;
        }
        if (dart.notNull(compare(el2, el5)) > 0) {
          let t = el2;
          el2 = el5;
          el5 = t;
        }
        if (dart.notNull(compare(el2, el3)) > 0) {
          let t = el2;
          el2 = el3;
          el3 = t;
        }
        if (dart.notNull(compare(el4, el5)) > 0) {
          let t = el4;
          el4 = el5;
          el5 = t;
        }
        let pivot1 = el2;
        let pivot2 = el4;
        a[dartx._set](index1, el1);
        a[dartx._set](index3, el3);
        a[dartx._set](index5, el5);
        a[dartx._set](index2, a[dartx._get](left));
        a[dartx._set](index4, a[dartx._get](right));
        let less = dart.notNull(left) + 1;
        let great = dart.notNull(right) - 1;
        let pivots_are_equal = compare(pivot1, pivot2) == 0;
        if (pivots_are_equal) {
          let pivot = pivot1;
          for (let k = less; k <= great; k++) {
            let ak = a[dartx._get](k);
            let comp = compare(ak, pivot);
            if (comp == 0) continue;
            if (dart.notNull(comp) < 0) {
              if (k != less) {
                a[dartx._set](k, a[dartx._get](less));
                a[dartx._set](less, ak);
              }
              less++;
            } else {
              while (true) {
                comp = compare(a[dartx._get](great), pivot);
                if (dart.notNull(comp) > 0) {
                  great--;
                  continue;
                } else if (dart.notNull(comp) < 0) {
                  a[dartx._set](k, a[dartx._get](less));
                  a[dartx._set](less++, a[dartx._get](great));
                  a[dartx._set](great--, ak);
                  break;
                } else {
                  a[dartx._set](k, a[dartx._get](great));
                  a[dartx._set](great--, ak);
                  break;
                }
              }
            }
          }
        } else {
          for (let k = less; k <= great; k++) {
            let ak = a[dartx._get](k);
            let comp_pivot1 = compare(ak, pivot1);
            if (dart.notNull(comp_pivot1) < 0) {
              if (k != less) {
                a[dartx._set](k, a[dartx._get](less));
                a[dartx._set](less, ak);
              }
              less++;
            } else {
              let comp_pivot2 = compare(ak, pivot2);
              if (dart.notNull(comp_pivot2) > 0) {
                while (true) {
                  let comp = compare(a[dartx._get](great), pivot2);
                  if (dart.notNull(comp) > 0) {
                    great--;
                    if (great < k) break;
                    continue;
                  } else {
                    comp = compare(a[dartx._get](great), pivot1);
                    if (dart.notNull(comp) < 0) {
                      a[dartx._set](k, a[dartx._get](less));
                      a[dartx._set](less++, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    } else {
                      a[dartx._set](k, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    }
                    break;
                  }
                }
              }
            }
          }
        }
        a[dartx._set](left, a[dartx._get](less - 1));
        a[dartx._set](less - 1, pivot1);
        a[dartx._set](right, a[dartx._get](great + 1));
        a[dartx._set](great + 1, pivot2);
        _internal.Sort._doSort(E)(a, left, less - 2, compare);
        _internal.Sort._doSort(E)(a, great + 2, right, compare);
        if (pivots_are_equal) {
          return;
        }
        if (less < index1 && great > index5) {
          while (compare(a[dartx._get](less), pivot1) == 0) {
            less++;
          }
          while (compare(a[dartx._get](great), pivot2) == 0) {
            great--;
          }
          for (let k = less; k <= great; k++) {
            let ak = a[dartx._get](k);
            let comp_pivot1 = compare(ak, pivot1);
            if (comp_pivot1 == 0) {
              if (k != less) {
                a[dartx._set](k, a[dartx._get](less));
                a[dartx._set](less, ak);
              }
              less++;
            } else {
              let comp_pivot2 = compare(ak, pivot2);
              if (comp_pivot2 == 0) {
                while (true) {
                  let comp = compare(a[dartx._get](great), pivot2);
                  if (comp == 0) {
                    great--;
                    if (great < k) break;
                    continue;
                  } else {
                    comp = compare(a[dartx._get](great), pivot1);
                    if (dart.notNull(comp) < 0) {
                      a[dartx._set](k, a[dartx._get](less));
                      a[dartx._set](less++, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    } else {
                      a[dartx._set](k, a[dartx._get](great));
                      a[dartx._set](great--, ak);
                    }
                    break;
                  }
                }
              }
            }
          }
          _internal.Sort._doSort(E)(a, less, great, compare);
        } else {
          _internal.Sort._doSort(E)(a, less, great, compare);
        }
      };
    }
  };
  dart.setSignature(_internal.Sort, {
    sfields: () => ({_INSERTION_SORT_THRESHOLD: core.int}),
    statics: () => ({
      sort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), dart.functionType(core.int, [E, E])]]),
      sortRange: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
      _doSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
      _insertionSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
      _dualPivotQuicksort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]])
    }),
    names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
  });
  _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
  const _name = Symbol('_name');
  const _nativeSymbol = Symbol('_nativeSymbol');
  _internal.Symbol = class Symbol extends core.Object {
    new(name) {
      this[_name] = name;
      this[_nativeSymbol] = null;
    }
    es6(name, nativeSymbol) {
      this[_name] = name;
      this[_nativeSymbol] = nativeSymbol;
    }
    unvalidated(name) {
      this[_name] = name;
      this[_nativeSymbol] = null;
    }
    validated(name) {
      this[_name] = _internal.Symbol.validatePublicSymbol(name);
      this[_nativeSymbol] = null;
    }
    ['=='](other) {
      return _internal.Symbol.is(other) && this[_name] == other[_name] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
    }
    get hashCode() {
      let hash = this._hashCode;
      if (hash != null) return hash;
      let arbitraryPrime = 664597;
      hash = 536870911 & arbitraryPrime * dart.notNull(dart.hashCode(this[_name]));
      this._hashCode = hash;
      return hash;
    }
    toString() {
      return dart.str`Symbol("${this[_name]}")`;
    }
    static getName(symbol) {
      return symbol[_name];
    }
    static getNativeSymbol(symbol) {
      return symbol[_nativeSymbol];
    }
    static validatePublicSymbol(name) {
      if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
      if (dart.test(name[dartx.startsWith]('_'))) {
        dart.throw(new core.ArgumentError(dart.str`"${name}" is a private identifier`));
      }
      dart.throw(new core.ArgumentError(dart.str`"${name}" is not a valid (qualified) symbol name`));
    }
    static isValidSymbol(name) {
      return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
    }
  };
  dart.defineNamedConstructor(_internal.Symbol, 'es6');
  dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
  dart.defineNamedConstructor(_internal.Symbol, 'validated');
  _internal.Symbol[dart.implements] = () => [core.Symbol];
  dart.setSignature(_internal.Symbol, {
    constructors: () => ({
      new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
      es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
      unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
      validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
    }),
    fields: () => ({
      [_name]: core.String,
      [_nativeSymbol]: dart.dynamic
    }),
    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
    sfields: () => ({
      reservedWordRE: core.String,
      publicIdentifierRE: core.String,
      identifierRE: core.String,
      operatorRE: core.String,
      publicSymbolPattern: core.RegExp,
      symbolPattern: core.RegExp
    }),
    statics: () => ({
      getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
      validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
      isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
    }),
    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
  });
  _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
  _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
  dart.defineLazy(_internal.Symbol, {
    get publicIdentifierRE() {
      return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$][\\w$]*';
    },
    get identifierRE() {
      return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$_][\\w$]*';
    },
    get publicSymbolPattern() {
      return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.publicIdentifierRE}(?:=?\$|[.](?!\$)))+?\$`);
    },
    get symbolPattern() {
      return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.identifierRE}(?:=?\$|[.](?!\$)))+?\$`);
    }
  });
  _isolate_helper._callInIsolate = function(isolate, func) {
    let result = isolate.eval(func);
    _isolate_helper._globalState.topEventLoop.run();
    return result;
  };
  dart.lazyFn(_isolate_helper._callInIsolate, () => _IsolateContextAndFunctionTodynamic());
  const _activeJsAsyncCount = Symbol('_activeJsAsyncCount');
  _isolate_helper.enterJsAsync = function() {
    let o = _isolate_helper._globalState.topEventLoop;
    o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) + 1;
  };
  dart.fn(_isolate_helper.enterJsAsync, VoidTodynamic$());
  _isolate_helper.leaveJsAsync = function() {
    let o = _isolate_helper._globalState.topEventLoop;
    o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) - 1;
    dart.assert(dart.notNull(_isolate_helper._globalState.topEventLoop[_activeJsAsyncCount]) >= 0);
  };
  dart.fn(_isolate_helper.leaveJsAsync, VoidTodynamic$());
  _isolate_helper.isWorker = function() {
    return _isolate_helper._globalState.isWorker;
  };
  dart.lazyFn(_isolate_helper.isWorker, () => VoidTobool());
  _isolate_helper._currentIsolate = function() {
    return _isolate_helper._globalState.currentContext;
  };
  dart.lazyFn(_isolate_helper._currentIsolate, () => VoidTo_IsolateContext());
  _isolate_helper.startRootIsolate = function(entry, args) {
    args = args;
    if (args == null) args = [];
    if (!core.List.is(args)) {
      dart.throw(new core.ArgumentError(dart.str`Arguments to main must be a List: ${args}`));
    }
    _isolate_helper._globalState = new _isolate_helper._Manager(core.Function._check(entry));
    if (dart.test(_isolate_helper._globalState.isWorker)) return;
    let rootContext = new _isolate_helper._IsolateContext();
    _isolate_helper._globalState.rootContext = rootContext;
    _isolate_helper._globalState.currentContext = rootContext;
    if (_isolate_helper._MainFunctionArgs.is(entry)) {
      rootContext.eval(dart.fn(() => {
        dart.dcall(entry, args);
      }, VoidTodynamic$()));
    } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
      rootContext.eval(dart.fn(() => {
        dart.dcall(entry, args, null);
      }, VoidTodynamic$()));
    } else {
      rootContext.eval(core.Function._check(entry));
    }
    _isolate_helper._globalState.topEventLoop.run();
  };
  dart.fn(_isolate_helper.startRootIsolate, dynamicAnddynamicTovoid$());
  dart.copyProperties(_isolate_helper, {
    get _globalState() {
      return dart.globalState;
    },
    set _globalState(val) {
      dart.globalState = val;
    }
  });
  const _nativeDetectEnvironment = Symbol('_nativeDetectEnvironment');
  const _nativeInitWorkerMessageHandler = Symbol('_nativeInitWorkerMessageHandler');
  _isolate_helper._Manager = class _Manager extends core.Object {
    get useWorkers() {
      return this.supportsWorkers;
    }
    new(entry) {
      this.entry = entry;
      this.nextIsolateId = 0;
      this.currentManagerId = 0;
      this.nextManagerId = 1;
      this.currentContext = null;
      this.rootContext = null;
      this.topEventLoop = null;
      this.fromCommandLine = null;
      this.isWorker = null;
      this.supportsWorkers = null;
      this.isolates = null;
      this.mainManager = null;
      this.managers = null;
      this[_nativeDetectEnvironment]();
      this.topEventLoop = new _isolate_helper._EventLoop();
      this.isolates = MapOfint$_IsolateContext().new();
      this.managers = MapOfint$dynamic().new();
      if (dart.test(this.isWorker)) {
        this.mainManager = new _isolate_helper._MainManagerStub();
        this[_nativeInitWorkerMessageHandler]();
      }
    }
    [_nativeDetectEnvironment]() {
      let isWindowDefined = _isolate_helper.globalWindow != null;
      let isWorkerDefined = _isolate_helper.globalWorker != null;
      this.isWorker = !isWindowDefined && dart.test(_isolate_helper.globalPostMessageDefined);
      this.supportsWorkers = dart.test(this.isWorker) || isWorkerDefined && _isolate_helper.IsolateNatives.thisScript != null;
      this.fromCommandLine = !isWindowDefined && !dart.test(this.isWorker);
    }
    [_nativeInitWorkerMessageHandler]() {
      let func = (function(f, a) {
        return function(e) {
          f(a, e);
        };
      })(_isolate_helper.IsolateNatives._processWorkerMessage, this.mainManager);
      self.onmessage = func;
      self.dartPrint = self.dartPrint || (function(serialize) {
        return function(object) {
          if (self.console && self.console.log) {
            self.console.log(object);
          } else {
            self.postMessage(serialize(object));
          }
        };
      })(_isolate_helper._Manager._serializePrintMessage);
    }
    static _serializePrintMessage(object) {
      return _isolate_helper._serializeMessage(dart.map({command: "print", msg: object}, core.String, dart.dynamic));
    }
    maybeCloseWorker() {
      if (dart.test(this.isWorker) && dart.test(this.isolates[dartx.isEmpty]) && this.topEventLoop[_activeJsAsyncCount] == 0) {
        this.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'close'}, core.String, core.String)));
      }
    }
  };
  dart.setSignature(_isolate_helper._Manager, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Manager, [core.Function])}),
    fields: () => ({
      nextIsolateId: core.int,
      currentManagerId: core.int,
      nextManagerId: core.int,
      currentContext: _isolate_helper._IsolateContext,
      rootContext: _isolate_helper._IsolateContext,
      topEventLoop: _isolate_helper._EventLoop,
      fromCommandLine: core.bool,
      isWorker: core.bool,
      supportsWorkers: core.bool,
      isolates: MapOfint$_IsolateContext(),
      mainManager: _isolate_helper._MainManagerStub,
      managers: MapOfint$dynamic(),
      entry: core.Function
    }),
    getters: () => ({useWorkers: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      [_nativeDetectEnvironment]: dart.definiteFunctionType(dart.void, []),
      [_nativeInitWorkerMessageHandler]: dart.definiteFunctionType(dart.void, []),
      maybeCloseWorker: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({_serializePrintMessage: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_serializePrintMessage']
  });
  const _scheduledControlEvents = Symbol('_scheduledControlEvents');
  const _isExecutingEvent = Symbol('_isExecutingEvent');
  const _id = Symbol('_id');
  const _updateGlobalState = Symbol('_updateGlobalState');
  const _setGlobals = Symbol('_setGlobals');
  const _addRegistration = Symbol('_addRegistration');
  const _close = Symbol('_close');
  _isolate_helper._IsolateContext = class _IsolateContext extends core.Object {
    new() {
      this.id = (() => {
        let o = _isolate_helper._globalState, x = o.nextIsolateId;
        o.nextIsolateId = dart.notNull(x) + 1;
        return x;
      })();
      this.ports = MapOfint$RawReceivePortImpl().new();
      this.weakPorts = SetOfint().new();
      this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
      this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
      this.pauseCapability = isolate.Capability.new();
      this.terminateCapability = isolate.Capability.new();
      this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
      this.pauseTokens = SetOfCapability().new();
      this.errorPorts = SetOfSendPort().new();
      this.initialized = false;
      this.isPaused = false;
      this.doneHandlers = null;
      this[_scheduledControlEvents] = null;
      this[_isExecutingEvent] = false;
      this.errorsAreFatal = true;
      this.registerWeak(this.controlPort[_id], this.controlPort);
    }
    addPause(authentification, resume) {
      if (!dart.equals(this.pauseCapability, authentification)) return;
      if (dart.test(this.pauseTokens.add(resume)) && !dart.test(this.isPaused)) {
        this.isPaused = true;
      }
      this[_updateGlobalState]();
    }
    removePause(resume) {
      if (!dart.test(this.isPaused)) return;
      this.pauseTokens.remove(resume);
      if (dart.test(this.pauseTokens.isEmpty)) {
        while (dart.test(this.delayedEvents[dartx.isNotEmpty])) {
          let event = this.delayedEvents[dartx.removeLast]();
          _isolate_helper._globalState.topEventLoop.prequeue(event);
        }
        this.isPaused = false;
      }
      this[_updateGlobalState]();
    }
    addDoneListener(responsePort) {
      if (this.doneHandlers == null) {
        this.doneHandlers = [];
      }
      if (dart.test(dart.dsend(this.doneHandlers, 'contains', responsePort))) return;
      dart.dsend(this.doneHandlers, 'add', responsePort);
    }
    removeDoneListener(responsePort) {
      if (this.doneHandlers == null) return;
      dart.dsend(this.doneHandlers, 'remove', responsePort);
    }
    setErrorsFatal(authentification, errorsAreFatal) {
      if (!dart.equals(this.terminateCapability, authentification)) return;
      this.errorsAreFatal = errorsAreFatal;
    }
    handlePing(responsePort, pingType) {
      if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
        responsePort.send(null);
        return;
      }
      function respond() {
        responsePort.send(null);
      }
      dart.fn(respond, VoidTovoid$());
      if (pingType == isolate.Isolate.AS_EVENT) {
        _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
        return;
      }
      dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
      if (this[_scheduledControlEvents] == null) {
        this[_scheduledControlEvents] = collection.Queue.new();
      }
      dart.dsend(this[_scheduledControlEvents], 'addLast', respond);
    }
    handleKill(authentification, priority) {
      if (!dart.equals(this.terminateCapability, authentification)) return;
      if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
        this.kill();
        return;
      }
      if (priority == isolate.Isolate.AS_EVENT) {
        _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
        return;
      }
      dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
      if (this[_scheduledControlEvents] == null) {
        this[_scheduledControlEvents] = collection.Queue.new();
      }
      dart.dsend(this[_scheduledControlEvents], 'addLast', dart.bind(this, 'kill'));
    }
    addErrorListener(port) {
      this.errorPorts.add(port);
    }
    removeErrorListener(port) {
      this.errorPorts.remove(port);
    }
    handleUncaughtError(error, stackTrace) {
      if (dart.test(this.errorPorts.isEmpty)) {
        if (dart.test(this.errorsAreFatal) && core.identical(this, _isolate_helper._globalState.rootContext)) {
          return;
        }
        if (self.console && self.console.error) {
          self.console.error(error, stackTrace);
        } else {
          core.print(error);
          if (stackTrace != null) core.print(stackTrace);
        }
        return;
      }
      let message = core.List.new(2);
      message[dartx._set](0, dart.toString(error));
      message[dartx._set](1, stackTrace == null ? null : dart.toString(stackTrace));
      for (let port of this.errorPorts)
        port.send(message);
    }
    eval(code) {
      let old = _isolate_helper._globalState.currentContext;
      _isolate_helper._globalState.currentContext = this;
      this[_setGlobals]();
      let result = null;
      this[_isExecutingEvent] = true;
      try {
        result = dart.dcall(code);
      } catch (e) {
        let s = dart.stackTrace(e);
        this.handleUncaughtError(e, s);
        if (dart.test(this.errorsAreFatal)) {
          this.kill();
          if (core.identical(this, _isolate_helper._globalState.rootContext)) {
            throw e;
          }
        }
      }
 finally {
        this[_isExecutingEvent] = false;
        _isolate_helper._globalState.currentContext = old;
        if (old != null) old[_setGlobals]();
        if (this[_scheduledControlEvents] != null) {
          while (dart.test(dart.dload(this[_scheduledControlEvents], 'isNotEmpty'))) {
            dart.dcall(dart.dsend(this[_scheduledControlEvents], 'removeFirst'));
          }
        }
      }
      return result;
    }
    [_setGlobals]() {
      _foreign_helper.JS_SET_CURRENT_ISOLATE(this.isolateStatics);
    }
    handleControlMessage(message) {
      switch (dart.dindex(message, 0)) {
        case "pause":
        {
          this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
          break;
        }
        case "resume":
        {
          this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
          break;
        }
        case 'add-ondone':
        {
          this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        case 'remove-ondone':
        {
          this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        case 'set-errors-fatal':
        {
          this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
          break;
        }
        case "ping":
        {
          this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
          break;
        }
        case "kill":
        {
          this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
          break;
        }
        case "getErrors":
        {
          this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        case "stopErrors":
        {
          this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
          break;
        }
        default:
      }
    }
    lookup(portId) {
      return this.ports[dartx._get](portId);
    }
    [_addRegistration](portId, port) {
      if (dart.test(this.ports[dartx.containsKey](portId))) {
        dart.throw(core.Exception.new("Registry: ports must be registered only once."));
      }
      this.ports[dartx._set](portId, port);
    }
    register(portId, port) {
      this[_addRegistration](portId, port);
      this[_updateGlobalState]();
    }
    registerWeak(portId, port) {
      this.weakPorts.add(portId);
      this[_addRegistration](portId, port);
    }
    [_updateGlobalState]() {
      if (dart.notNull(this.ports[dartx.length]) - dart.notNull(this.weakPorts.length) > 0 || dart.test(this.isPaused) || !dart.test(this.initialized)) {
        _isolate_helper._globalState.isolates[dartx._set](this.id, this);
      } else {
        this.kill();
      }
    }
    kill() {
      if (this[_scheduledControlEvents] != null) {
        dart.dsend(this[_scheduledControlEvents], 'clear');
      }
      for (let port of this.ports[dartx.values]) {
        port[_close]();
      }
      this.ports[dartx.clear]();
      this.weakPorts.clear();
      _isolate_helper._globalState.isolates[dartx.remove](this.id);
      this.errorPorts.clear();
      if (this.doneHandlers != null) {
        for (let port of core.Iterable._check(this.doneHandlers)) {
          isolate.SendPort._check(port);
          port.send(null);
        }
        this.doneHandlers = null;
      }
    }
    unregister(portId) {
      this.ports[dartx.remove](portId);
      this.weakPorts.remove(portId);
      this[_updateGlobalState]();
    }
  };
  _isolate_helper._IsolateContext[dart.implements] = () => [_foreign_helper.IsolateContext];
  dart.setSignature(_isolate_helper._IsolateContext, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateContext, [])}),
    fields: () => ({
      id: core.int,
      ports: MapOfint$RawReceivePortImpl(),
      weakPorts: SetOfint(),
      isolateStatics: dart.dynamic,
      controlPort: _isolate_helper.RawReceivePortImpl,
      pauseCapability: isolate.Capability,
      terminateCapability: isolate.Capability,
      initialized: core.bool,
      isPaused: core.bool,
      delayedEvents: ListOf_IsolateEvent(),
      pauseTokens: SetOfCapability(),
      doneHandlers: dart.dynamic,
      [_scheduledControlEvents]: dart.dynamic,
      [_isExecutingEvent]: core.bool,
      errorsAreFatal: core.bool,
      errorPorts: SetOfSendPort()
    }),
    methods: () => ({
      addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
      removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
      addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
      handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
      handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
      eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
      [_setGlobals]: dart.definiteFunctionType(dart.void, []),
      handleControlMessage: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      lookup: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.int]),
      [_addRegistration]: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
      register: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
      registerWeak: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
      [_updateGlobalState]: dart.definiteFunctionType(dart.void, []),
      kill: dart.definiteFunctionType(dart.void, []),
      unregister: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  const _runHelper = Symbol('_runHelper');
  _isolate_helper._EventLoop = class _EventLoop extends core.Object {
    new() {
      this.events = QueueOf_IsolateEvent().new();
      this[_activeJsAsyncCount] = 0;
    }
    enqueue(isolate, fn, msg) {
      this.events.addLast(new _isolate_helper._IsolateEvent(_isolate_helper._IsolateContext._check(isolate), core.Function._check(fn), core.String._check(msg)));
    }
    prequeue(event) {
      this.events.addFirst(event);
    }
    dequeue() {
      if (dart.test(this.events.isEmpty)) return null;
      return this.events.removeFirst();
    }
    checkOpenReceivePortsFromCommandLine() {
      if (_isolate_helper._globalState.rootContext != null && dart.test(_isolate_helper._globalState.isolates[dartx.containsKey](_isolate_helper._globalState.rootContext.id)) && dart.test(_isolate_helper._globalState.fromCommandLine) && dart.test(_isolate_helper._globalState.rootContext.ports[dartx.isEmpty])) {
        dart.throw(core.Exception.new("Program exited with open ReceivePorts."));
      }
    }
    runIteration() {
      let event = this.dequeue();
      if (event == null) {
        this.checkOpenReceivePortsFromCommandLine();
        _isolate_helper._globalState.maybeCloseWorker();
        return false;
      }
      event.process();
      return true;
    }
    [_runHelper]() {
      if (_isolate_helper.globalWindow != null) {
        const next = (function() {
          if (!dart.test(this.runIteration())) return;
          async.Timer.run(next);
        }).bind(this);
        dart.fn(next, VoidTodynamic$());
        next();
      } else {
        while (dart.test(this.runIteration())) {
        }
      }
    }
    run() {
      if (!dart.test(_isolate_helper._globalState.isWorker)) {
        this[_runHelper]();
      } else {
        try {
          this[_runHelper]();
        } catch (e) {
          let trace = dart.stackTrace(e);
          _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'error', msg: dart.str`${e}\n${trace}`}, core.String, core.String)));
        }

      }
    }
  };
  dart.setSignature(_isolate_helper._EventLoop, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._EventLoop, [])}),
    fields: () => ({
      events: QueueOf_IsolateEvent(),
      [_activeJsAsyncCount]: core.int
    }),
    methods: () => ({
      enqueue: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      prequeue: dart.definiteFunctionType(dart.void, [_isolate_helper._IsolateEvent]),
      dequeue: dart.definiteFunctionType(_isolate_helper._IsolateEvent, []),
      checkOpenReceivePortsFromCommandLine: dart.definiteFunctionType(dart.void, []),
      runIteration: dart.definiteFunctionType(core.bool, []),
      [_runHelper]: dart.definiteFunctionType(dart.void, []),
      run: dart.definiteFunctionType(dart.void, [])
    })
  });
  _isolate_helper._IsolateEvent = class _IsolateEvent extends core.Object {
    new(isolate, fn, message) {
      this.isolate = isolate;
      this.fn = fn;
      this.message = message;
    }
    process() {
      if (dart.test(this.isolate.isPaused)) {
        this.isolate.delayedEvents[dartx.add](this);
        return;
      }
      this.isolate.eval(this.fn);
    }
  };
  dart.setSignature(_isolate_helper._IsolateEvent, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateEvent, [_isolate_helper._IsolateContext, core.Function, core.String])}),
    fields: () => ({
      isolate: _isolate_helper._IsolateContext,
      fn: core.Function,
      message: core.String
    }),
    methods: () => ({process: dart.definiteFunctionType(dart.void, [])})
  });
  dart.defineLazy(_isolate_helper, {
    get _global() {
      return typeof global == 'undefined' ? self : global;
    }
  });
  _isolate_helper._MainManagerStub = class _MainManagerStub extends core.Object {
    postMessage(msg) {
      _isolate_helper._global.postMessage(msg);
    }
  };
  dart.setSignature(_isolate_helper._MainManagerStub, {
    methods: () => ({postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  _isolate_helper._SPAWNED_SIGNAL = "spawned";
  _isolate_helper._SPAWN_FAILED_SIGNAL = "spawn failed";
  dart.copyProperties(_isolate_helper, {
    get globalWindow() {
      return _isolate_helper._global.window;
    }
  });
  dart.copyProperties(_isolate_helper, {
    get globalWorker() {
      return _isolate_helper._global.Worker;
    }
  });
  dart.copyProperties(_isolate_helper, {
    get globalPostMessageDefined() {
      return !!_isolate_helper._global.postMessage;
    }
  });
  _isolate_helper._MainFunction = dart.typedef('_MainFunction', () => dart.functionType(dart.dynamic, []));
  _isolate_helper._MainFunctionArgs = dart.typedef('_MainFunctionArgs', () => dart.functionType(dart.dynamic, [dart.dynamic]));
  _isolate_helper._MainFunctionArgsMessage = dart.typedef('_MainFunctionArgsMessage', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
  _isolate_helper.IsolateNatives = class IsolateNatives extends core.Object {
    static computeThisScript() {
      let currentScript = document.currentScript;
      if (currentScript != null) {
        return String(currentScript.src);
      }
      if (dart.test(_js_helper.Primitives.isD8)) return _isolate_helper.IsolateNatives.computeThisScriptD8();
      if (dart.test(_js_helper.Primitives.isJsshell)) return _isolate_helper.IsolateNatives.computeThisScriptJsshell();
      if (_isolate_helper._globalState != null && dart.test(_isolate_helper._globalState.isWorker)) {
        return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
      }
      return null;
    }
    static computeThisScriptJsshell() {
      return thisFilename();
    }
    static computeThisScriptD8() {
      return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
    }
    static computeThisScriptFromTrace() {
      let stack = new Error().stack;
      if (stack == null) {
        stack = (function() {
          try {
            throw new Error();
          } catch (e) {
            return e.stack;
          }

        })();
        if (stack == null) dart.throw(new core.UnsupportedError('No stack trace'));
      }
      let pattern = null, matches = null;
      pattern = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m");
      matches = stack.match(pattern);
      if (matches != null) return matches[1];
      pattern = new RegExp("^[^@]*@(.*):[0-9]*$", "m");
      matches = stack.match(pattern);
      if (matches != null) return matches[1];
      dart.throw(new core.UnsupportedError(dart.str`Cannot extract URI from "${stack}"`));
    }
    static _getEventData(e) {
      return e.data;
    }
    static _processWorkerMessage(sender, e) {
      let msg = _isolate_helper._deserializeMessage(_isolate_helper.IsolateNatives._getEventData(e));
      switch (dart.dindex(msg, 'command')) {
        case 'start':
        {
          _isolate_helper._globalState.currentManagerId = core.int._check(dart.dindex(msg, 'id'));
          let functionName = core.String._check(dart.dindex(msg, 'functionName'));
          let entryPoint = core.Function._check(functionName == null ? _isolate_helper._globalState.entry : _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName));
          let args = dart.dindex(msg, 'args');
          let message = _isolate_helper._deserializeMessage(dart.dindex(msg, 'msg'));
          let isSpawnUri = dart.dindex(msg, 'isSpawnUri');
          let startPaused = dart.dindex(msg, 'startPaused');
          let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
          let context = new _isolate_helper._IsolateContext();
          _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
            _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
          }, VoidTodynamic$()), 'worker-start');
          _isolate_helper._globalState.currentContext = context;
          _isolate_helper._globalState.topEventLoop.run();
          break;
        }
        case 'spawn-worker':
        {
          if (_isolate_helper.IsolateNatives.enableSpawnWorker != null) _isolate_helper.IsolateNatives.handleSpawnWorkerRequest(msg);
          break;
        }
        case 'message':
        {
          let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
          if (port != null) {
            dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
          }
          _isolate_helper._globalState.topEventLoop.run();
          break;
        }
        case 'close':
        {
          _isolate_helper._globalState.managers[dartx.remove](_isolate_helper.IsolateNatives.workerIds._get(sender));
          sender.terminate();
          _isolate_helper._globalState.topEventLoop.run();
          break;
        }
        case 'log':
        {
          _isolate_helper.IsolateNatives._log(dart.dindex(msg, 'msg'));
          break;
        }
        case 'print':
        {
          if (dart.test(_isolate_helper._globalState.isWorker)) {
            _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'print', msg: msg}, core.String, dart.dynamic)));
          } else {
            core.print(dart.dindex(msg, 'msg'));
          }
          break;
        }
        case 'error':
        {
          dart.throw(dart.dindex(msg, 'msg'));
        }
      }
    }
    static handleSpawnWorkerRequest(msg) {
      let replyPort = dart.dindex(msg, 'replyPort');
      _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
        dart.dsend(replyPort, 'send', msg);
      }, ListTodynamic()), {onError: dart.fn(errorMessage => {
          dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
        }, StringTodynamic())});
    }
    static _log(msg) {
      if (dart.test(_isolate_helper._globalState.isWorker)) {
        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'log', msg: msg}, core.String, dart.dynamic)));
      } else {
        try {
          _isolate_helper.IsolateNatives._consoleLog(msg);
        } catch (e) {
          let trace = dart.stackTrace(e);
          dart.throw(core.Exception.new(trace));
        }

      }
    }
    static _consoleLog(msg) {
      self.console.log(msg);
    }
    static _getJSFunctionFromName(functionName) {
      let globalFunctionsContainer = _foreign_helper.JS_EMBEDDED_GLOBAL("", _js_embedded_names.GLOBAL_FUNCTIONS);
      return globalFunctionsContainer[functionName]();
    }
    static _getJSFunctionName(f) {
      return f.$name;
    }
    static _allocate(ctor) {
      return new ctor();
    }
    static spawnFunction(topLevelFunction, message, startPaused) {
      _isolate_helper.IsolateNatives.enableSpawnWorker = true;
      let name = _isolate_helper.IsolateNatives._getJSFunctionName(topLevelFunction);
      if (name == null) {
        dart.throw(new core.UnsupportedError("only top-level functions can be spawned."));
      }
      let isLight = false;
      let isSpawnUri = false;
      return _isolate_helper.IsolateNatives.spawn(name, null, null, message, isLight, isSpawnUri, startPaused);
    }
    static spawnUri(uri, args, message, startPaused) {
      _isolate_helper.IsolateNatives.enableSpawnWorker = true;
      let isLight = false;
      let isSpawnUri = true;
      return _isolate_helper.IsolateNatives.spawn(null, dart.toString(uri), args, message, isLight, isSpawnUri, startPaused);
    }
    static spawn(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
      if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
        uri = dart.notNull(uri) + ".js";
      }
      let port = isolate.ReceivePort.new();
      let completer = CompleterOfList().new();
      port.first.then(dart.dynamic)(dart.fn(msg => {
        if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
          completer.complete(msg);
        } else {
          dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
          completer.completeError(dart.dindex(msg, 1));
        }
      }, dynamicTodynamic$()));
      let signalReply = port.sendPort;
      if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
        _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
      } else {
        _isolate_helper.IsolateNatives._startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
      }
      return completer.future;
    }
    static _startWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
      if (args != null) args = ListOfString().from(args);
      if (dart.test(_isolate_helper._globalState.isWorker)) {
        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'spawn-worker', functionName: functionName, args: args, msg: message, uri: uri, isSpawnUri: isSpawnUri, startPaused: startPaused, replyPort: replyPort}, core.String, core.Object)));
      } else {
        _isolate_helper.IsolateNatives._spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError);
      }
    }
    static _startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
      if (uri != null) {
        dart.throw(new core.UnsupportedError("Currently spawnUri is not supported without web workers."));
      }
      message = _isolate_helper._clone(message);
      if (args != null) args = ListOfString().from(args);
      _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
        let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
        _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
      }, VoidTodynamic$()), 'nonworker start');
    }
    static get currentIsolate() {
      let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
      return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
    }
    static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
      let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
      _js_helper.Primitives.initializeStatics(context.id);
      replyTo.send(JSArrayOfObject().of([_isolate_helper._SPAWNED_SIGNAL, context.controlPort.sendPort, context.pauseCapability, context.terminateCapability]));
      function runStartFunction() {
        context.initialized = true;
        if (!dart.test(isSpawnUri)) {
          dart.dcall(topLevel, message);
        } else if (_isolate_helper._MainFunctionArgsMessage.is(topLevel)) {
          dart.dcall(topLevel, args, message);
        } else if (_isolate_helper._MainFunctionArgs.is(topLevel)) {
          dart.dcall(topLevel, args);
        } else {
          dart.dcall(topLevel);
        }
      }
      dart.fn(runStartFunction, VoidTovoid$());
      if (dart.test(startPaused)) {
        context.addPause(context.pauseCapability, context.pauseCapability);
        _isolate_helper._globalState.topEventLoop.enqueue(context, runStartFunction, 'start isolate');
      } else {
        runStartFunction();
      }
    }
    static _spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
      if (uri == null) uri = _isolate_helper.IsolateNatives.thisScript;
      let worker = new Worker(uri);
      let onerrorTrampoline = (function(f, u, c) {
        return function(e) {
          return f(e, u, c);
        };
      })(_isolate_helper.IsolateNatives.workerOnError, uri, onError);
      worker.onerror = onerrorTrampoline;
      let processWorkerMessageTrampoline = (function(f, a) {
        return function(e) {
          e.onerror = null;
          return f(a, e);
        };
      })(_isolate_helper.IsolateNatives._processWorkerMessage, worker);
      worker.onmessage = processWorkerMessageTrampoline;
      let o = _isolate_helper._globalState;
      let workerId = o.nextManagerId;
      o.nextManagerId = dart.notNull(workerId) + 1;
      _isolate_helper.IsolateNatives.workerIds._set(worker, workerId);
      _isolate_helper._globalState.managers[dartx._set](workerId, worker);
      worker.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'start', id: workerId, replyTo: _isolate_helper._serializeMessage(replyPort), args: args, msg: _isolate_helper._serializeMessage(message), isSpawnUri: isSpawnUri, startPaused: startPaused, functionName: functionName}, core.String, core.Object)));
    }
    static workerOnError(event, uri, onError) {
      event.preventDefault();
      let message = event.message;
      if (message == null) {
        message = dart.str`Error spawning worker for ${uri}`;
      } else {
        message = dart.str`Error spawning worker for ${uri} (${message})`;
      }
      onError(message);
      return true;
    }
  };
  dart.setSignature(_isolate_helper.IsolateNatives, {
    sfields: () => ({
      enableSpawnWorker: dart.dynamic,
      thisScript: core.String,
      workerIds: ExpandoOfint()
    }),
    sgetters: () => ({currentIsolate: dart.definiteFunctionType(isolate.Isolate, [])}),
    statics: () => ({
      computeThisScript: dart.definiteFunctionType(core.String, []),
      computeThisScriptJsshell: dart.definiteFunctionType(core.String, []),
      computeThisScriptD8: dart.definiteFunctionType(core.String, []),
      computeThisScriptFromTrace: dart.definiteFunctionType(core.String, []),
      _getEventData: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _processWorkerMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      handleSpawnWorkerRequest: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _log: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _consoleLog: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      _getJSFunctionFromName: dart.definiteFunctionType(dart.dynamic, [core.String]),
      _getJSFunctionName: dart.definiteFunctionType(core.String, [core.Function]),
      _allocate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
      spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
      spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
      _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
      _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
      _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
      _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
      workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
    }),
    names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
  });
  _isolate_helper.IsolateNatives.enableSpawnWorker = null;
  dart.defineLazy(_isolate_helper.IsolateNatives, {
    get thisScript() {
      return _isolate_helper.IsolateNatives.computeThisScript();
    },
    set thisScript(_) {},
    get workerIds() {
      return new (ExpandoOfint())();
    }
  });
  const _isolateId = Symbol('_isolateId');
  const _checkReplyTo = Symbol('_checkReplyTo');
  _isolate_helper._BaseSendPort = class _BaseSendPort extends core.Object {
    new(isolateId) {
      this[_isolateId] = isolateId;
    }
    [_checkReplyTo](replyTo) {
      if (replyTo != null && !_isolate_helper._NativeJsSendPort.is(replyTo) && !_isolate_helper._WorkerSendPort.is(replyTo)) {
        dart.throw(core.Exception.new("SendPort.send: Illegal replyTo port type"));
      }
    }
  };
  _isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
  dart.setSignature(_isolate_helper._BaseSendPort, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._BaseSendPort, [core.int])}),
    fields: () => ({[_isolateId]: core.int}),
    methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
  });
  const _receivePort = Symbol('_receivePort');
  const _isClosed = Symbol('_isClosed');
  const _add = Symbol('_add');
  _isolate_helper._NativeJsSendPort = class _NativeJsSendPort extends _isolate_helper._BaseSendPort {
    new(receivePort, isolateId) {
      this[_receivePort] = receivePort;
      super.new(isolateId);
    }
    send(message) {
      let isolate = _isolate_helper._globalState.isolates[dartx._get](this[_isolateId]);
      if (isolate == null) return;
      if (dart.test(this[_receivePort][_isClosed])) return;
      let msg = _isolate_helper._clone(message);
      if (dart.equals(isolate.controlPort, this[_receivePort])) {
        isolate.handleControlMessage(msg);
        return;
      }
      _isolate_helper._globalState.topEventLoop.enqueue(isolate, dart.fn(() => {
        if (!dart.test(this[_receivePort][_isClosed])) {
          this[_receivePort][_add](msg);
        }
      }, VoidTodynamic$()), dart.str`receive ${message}`);
    }
    ['=='](other) {
      return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
    }
    get hashCode() {
      return this[_receivePort][_id];
    }
  };
  _isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
  dart.setSignature(_isolate_helper._NativeJsSendPort, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._NativeJsSendPort, [_isolate_helper.RawReceivePortImpl, core.int])}),
    fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
    methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  const _workerId = Symbol('_workerId');
  const _receivePortId = Symbol('_receivePortId');
  _isolate_helper._WorkerSendPort = class _WorkerSendPort extends _isolate_helper._BaseSendPort {
    new(workerId, isolateId, receivePortId) {
      this[_workerId] = workerId;
      this[_receivePortId] = receivePortId;
      super.new(isolateId);
    }
    send(message) {
      let workerMessage = _isolate_helper._serializeMessage(dart.map({command: 'message', port: this, msg: message}, core.String, core.Object));
      if (dart.test(_isolate_helper._globalState.isWorker)) {
        _isolate_helper._globalState.mainManager.postMessage(workerMessage);
      } else {
        let manager = _isolate_helper._globalState.managers[dartx._get](this[_workerId]);
        if (manager != null) {
          manager.postMessage(workerMessage);
        }
      }
    }
    ['=='](other) {
      return _isolate_helper._WorkerSendPort.is(other) && this[_workerId] == other[_workerId] && this[_isolateId] == other[_isolateId] && this[_receivePortId] == other[_receivePortId];
    }
    get hashCode() {
      return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
    }
  };
  _isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
  dart.setSignature(_isolate_helper._WorkerSendPort, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._WorkerSendPort, [core.int, core.int, core.int])}),
    fields: () => ({
      [_workerId]: core.int,
      [_receivePortId]: core.int
    }),
    methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  const _handler = Symbol('_handler');
  _isolate_helper.RawReceivePortImpl = class RawReceivePortImpl extends core.Object {
    new(handler) {
      this[_handler] = handler;
      this[_id] = (() => {
        let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
        _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
        return x;
      })();
      this[_isClosed] = false;
      _isolate_helper._globalState.currentContext.register(this[_id], this);
    }
    weak(handler) {
      this[_handler] = handler;
      this[_id] = (() => {
        let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
        _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
        return x;
      })();
      this[_isClosed] = false;
      _isolate_helper._globalState.currentContext.registerWeak(this[_id], this);
    }
    _controlPort() {
      this[_handler] = null;
      this[_id] = 0;
      this[_isClosed] = false;
    }
    set handler(newHandler) {
      this[_handler] = newHandler;
    }
    [_close]() {
      this[_isClosed] = true;
      this[_handler] = null;
    }
    close() {
      if (dart.test(this[_isClosed])) return;
      this[_isClosed] = true;
      this[_handler] = null;
      _isolate_helper._globalState.currentContext.unregister(this[_id]);
    }
    [_add](dataEvent) {
      if (dart.test(this[_isClosed])) return;
      dart.dcall(this[_handler], dataEvent);
    }
    get sendPort() {
      return new _isolate_helper._NativeJsSendPort(this, _isolate_helper._globalState.currentContext.id);
    }
  };
  dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
  dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
  _isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
  dart.setSignature(_isolate_helper.RawReceivePortImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
      weak: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
      _controlPort: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [])
    }),
    fields: () => ({
      [_id]: core.int,
      [_handler]: core.Function,
      [_isClosed]: core.bool
    }),
    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
    setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
    methods: () => ({
      [_close]: dart.definiteFunctionType(dart.void, []),
      close: dart.definiteFunctionType(dart.void, []),
      [_add]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    sfields: () => ({_nextFreeId: core.int})
  });
  _isolate_helper.RawReceivePortImpl._nextFreeId = 1;
  const _rawPort = Symbol('_rawPort');
  const _controller = Symbol('_controller');
  const _add$ = Symbol('_add');
  const _closeUnchecked = Symbol('_closeUnchecked');
  const _addError = Symbol('_addError');
  const _completeError = Symbol('_completeError');
  const _complete = Symbol('_complete');
  const _sink = Symbol('_sink');
  async.Stream$ = dart.generic(T => {
    let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
    let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
    let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
    let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
    let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
    let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
    let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
    let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    let _FutureOfListOfT = () => (_FutureOfListOfT = dart.constFn(async._Future$(ListOfT())))();
    let SetOfT = () => (SetOfT = dart.constFn(core.Set$(T)))();
    let _FutureOfSetOfT = () => (_FutureOfSetOfT = dart.constFn(async._Future$(SetOfT())))();
    let _TakeStreamOfT = () => (_TakeStreamOfT = dart.constFn(async._TakeStream$(T)))();
    let _TakeWhileStreamOfT = () => (_TakeWhileStreamOfT = dart.constFn(async._TakeWhileStream$(T)))();
    let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
    let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
    let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
    let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
    let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
    let IterableOfFutureOfT = () => (IterableOfFutureOfT = dart.constFn(core.Iterable$(FutureOfT())))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
    let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
    let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
    let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
    let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
    class Stream extends core.Object {
      new() {
      }
      _internal() {
      }
      static empty() {
        return new (_EmptyStreamOfT())();
      }
      static fromFuture(future) {
        let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
        future.then(dart.dynamic)(dart.fn(value => {
          controller[_add$](value);
          controller[_closeUnchecked]();
        }, TTodynamic$()), {onError: dart.fn((error, stackTrace) => {
            controller[_addError](error, core.StackTrace._check(stackTrace));
            controller[_closeUnchecked]();
          }, dynamicAnddynamicTodynamic$())});
        return controller.stream;
      }
      static fromFutures(futures) {
        let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
        let count = 0;
        let onValue = dart.fn(value => {
          if (!dart.test(controller.isClosed)) {
            controller[_add$](value);
            if (--count == 0) controller[_closeUnchecked]();
          }
        }, TTodynamic$());
        let onError = dart.fn((error, stack) => {
          if (!dart.test(controller.isClosed)) {
            controller[_addError](error, core.StackTrace._check(stack));
            if (--count == 0) controller[_closeUnchecked]();
          }
        }, dynamicAnddynamicTodynamic$());
        for (let future of futures) {
          count++;
          future.then(dart.dynamic)(onValue, {onError: onError});
        }
        if (count == 0) async.scheduleMicrotask(dart.bind(controller, 'close'));
        return controller.stream;
      }
      static fromIterable(data) {
        return new (_GeneratedStreamImplOfT())(dart.fn(() => new (_IterablePendingEventsOfT())(data), VoidTo_IterablePendingEventsOfT()));
      }
      static periodic(period, computation) {
        if (computation === void 0) computation = null;
        let timer = null;
        let computationCount = 0;
        let controller = null;
        let watch = new core.Stopwatch();
        function sendEvent() {
          watch.reset();
          let data = null;
          if (computation != null) {
            try {
              data = computation(computationCount++);
            } catch (e) {
              let s = dart.stackTrace(e);
              controller.addError(e, s);
              return;
            }

          }
          controller.add(data);
        }
        dart.fn(sendEvent, VoidTovoid$());
        function startPeriodicTimer() {
          dart.assert(timer == null);
          timer = async.Timer.periodic(period, dart.fn(timer => {
            sendEvent();
          }, TimerTovoid$()));
        }
        dart.fn(startPeriodicTimer, VoidTovoid$());
        controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
            watch.start();
            startPeriodicTimer();
          }, VoidTovoid$()), onPause: dart.fn(() => {
            timer.cancel();
            timer = null;
            watch.stop();
          }, VoidTovoid$()), onResume: dart.fn(() => {
            dart.assert(timer == null);
            let elapsed = watch.elapsed;
            watch.start();
            timer = async.Timer.new(period['-'](elapsed), dart.fn(() => {
              timer = null;
              startPeriodicTimer();
              sendEvent();
            }, VoidTovoid$()));
          }, VoidTovoid$()), onCancel: dart.fn(() => {
            if (timer != null) timer.cancel();
            timer = null;
          }, VoidTodynamic$())});
        return controller.stream;
      }
      static eventTransformed(source, mapSink) {
        return new (_BoundSinkStreamOfdynamic$T())(source, mapSink);
      }
      get isBroadcast() {
        return false;
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return new (_AsBroadcastStreamOfT())(this, onListen, onCancel);
      }
      where(test) {
        return new (_WhereStreamOfT())(this, test);
      }
      map(S) {
        return convert => {
          return new (async._MapStream$(T, S))(this, convert);
        };
      }
      asyncMap(E) {
        return convert => {
          let controller = null;
          let subscription = null;
          const onListen = (function() {
            let add = dart.bind(controller, 'add');
            dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
            let eventSink = async._EventSink$(E).as(controller);
            let addError = dart.bind(eventSink, _addError);
            subscription = this.listen(dart.fn(event => {
              let newValue = null;
              try {
                newValue = convert(event);
              } catch (e) {
                let s = dart.stackTrace(e);
                controller.addError(e, s);
                return;
              }

              if (async.Future.is(newValue)) {
                subscription.pause();
                newValue.then(dart.dynamic)(add, {onError: addError}).whenComplete(dart.bind(subscription, 'resume'));
              } else {
                controller.add(E.as(newValue));
              }
            }, TTovoid$()), {onError: addError, onDone: dart.bind(controller, 'close')});
          }).bind(this);
          dart.fn(onListen, VoidTovoid$());
          if (dart.test(this.isBroadcast)) {
            controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTovoid$()), sync: true});
          } else {
            controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                subscription.pause();
              }, VoidTovoid$()), onResume: dart.fn(() => {
                subscription.resume();
              }, VoidTovoid$()), onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTodynamic$()), sync: true});
          }
          return controller.stream;
        };
      }
      asyncExpand(E) {
        return convert => {
          let controller = null;
          let subscription = null;
          const onListen = (function() {
            dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
            let eventSink = async._EventSink$(E).as(controller);
            subscription = this.listen(dart.fn(event => {
              let newStream = null;
              try {
                newStream = convert(event);
              } catch (e) {
                let s = dart.stackTrace(e);
                controller.addError(e, s);
                return;
              }

              if (newStream != null) {
                subscription.pause();
                controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
              }
            }, TTovoid$()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
          }).bind(this);
          dart.fn(onListen, VoidTovoid$());
          if (dart.test(this.isBroadcast)) {
            controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTovoid$()), sync: true});
          } else {
            controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
                subscription.pause();
              }, VoidTovoid$()), onResume: dart.fn(() => {
                subscription.resume();
              }, VoidTovoid$()), onCancel: dart.fn(() => {
                subscription.cancel();
              }, VoidTodynamic$()), sync: true});
          }
          return controller.stream;
        };
      }
      handleError(onError, opts) {
        let test = opts && 'test' in opts ? opts.test : null;
        return new (_HandleErrorStreamOfT())(this, onError, test);
      }
      expand(S) {
        return convert => {
          return new (async._ExpandStream$(T, S))(this, convert);
        };
      }
      pipe(streamConsumer) {
        StreamConsumerOfT()._check(streamConsumer);
        return streamConsumer.addStream(this).then(dart.dynamic)(dart.fn(_ => streamConsumer.close(), dynamicToFuture()));
      }
      transform(S) {
        return streamTransformer => {
          async.StreamTransformer$(T, S)._check(streamTransformer);
          return streamTransformer.bind(this);
        };
      }
      reduce(combine) {
        TAndTToT()._check(combine);
        let result = new (_FutureOfT())();
        let seenFirst = false;
        let value = null;
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          if (seenFirst) {
            async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
              value = newValue;
            }, TTodynamic$()), async._cancelAndErrorClosure(subscription, result));
          } else {
            value = element;
            seenFirst = true;
          }
        }, TTovoid$()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
            if (!seenFirst) {
              try {
                dart.throw(_internal.IterableElementError.noElement());
              } catch (e) {
                let s = dart.stackTrace(e);
                async._completeWithErrorCallback(result, e, s);
              }

            } else {
              result[_complete](value);
            }
          }, VoidTovoid$()), cancelOnError: true});
        return result;
      }
      fold(S) {
        return (initialValue, combine) => {
          let result = new (async._Future$(S))();
          let value = initialValue;
          let subscription = null;
          subscription = this.listen(dart.fn(element => {
            async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
              value = newValue;
            }, dart.definiteFunctionType(dart.dynamic, [S])), async._cancelAndErrorClosure(subscription, result));
          }, TTovoid$()), {onError: dart.fn((e, st) => {
              result[_completeError](e, core.StackTrace._check(st));
            }, dynamicAnddynamicTodynamic$()), onDone: dart.fn(() => {
              result[_complete](value);
            }, VoidTovoid$()), cancelOnError: true});
          return result;
        };
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let result = new (_FutureOfString())();
        let buffer = new core.StringBuffer();
        let subscription = null;
        let first = true;
        subscription = this.listen(dart.fn(element => {
          if (!first) {
            buffer.write(separator);
          }
          first = false;
          try {
            buffer.write(element);
          } catch (e) {
            let s = dart.stackTrace(e);
            async._cancelAndErrorWithReplacement(subscription, result, e, s);
          }

        }, TTovoid$()), {onError: dart.fn(e => {
            result[_completeError](e);
          }, dynamicTodynamic$()), onDone: dart.fn(() => {
            result[_complete](buffer.toString());
          }, VoidTovoid$()), cancelOnError: true});
        return result;
      }
      contains(needle) {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => dart.equals(element, needle), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, true);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](false);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      forEach(action) {
        let future = new async._Future();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
          }, dynamicTodynamic$()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](null);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      every(test) {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
            if (!dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, false);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](true);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      any(test) {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(element => {
          async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, true);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](false);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get length() {
        let future = new (_FutureOfint())();
        let count = 0;
        this.listen(dart.fn(_ => {
          count++;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](count);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get isEmpty() {
        let future = new (_FutureOfbool())();
        let subscription = null;
        subscription = this.listen(dart.fn(_ => {
          async._cancelAndValue(subscription, future, false);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](true);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      toList() {
        let result = JSArrayOfT().of([]);
        let future = new (_FutureOfListOfT())();
        this.listen(dart.fn(data => {
          result[dartx.add](data);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](result);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      toSet() {
        let result = SetOfT().new();
        let future = new (_FutureOfSetOfT())();
        this.listen(dart.fn(data => {
          result.add(data);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_complete](result);
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      drain(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          return this.listen(null, {cancelOnError: true}).asFuture(E)(futureValue);
        };
      }
      take(count) {
        return new (_TakeStreamOfT())(this, count);
      }
      takeWhile(test) {
        return new (_TakeWhileStreamOfT())(this, test);
      }
      skip(count) {
        return new (_SkipStreamOfT())(this, count);
      }
      skipWhile(test) {
        return new (_SkipWhileStreamOfT())(this, test);
      }
      distinct(equals) {
        if (equals === void 0) equals = null;
        return new (_DistinctStreamOfT())(this, equals);
      }
      get first() {
        let future = new (_FutureOfT())();
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._cancelAndValue(subscription, future, value);
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get last() {
        let future = new (_FutureOfT())();
        let result = null;
        let foundResult = false;
        this.listen(dart.fn(value => {
          foundResult = true;
          result = value;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      get single() {
        let future = new (_FutureOfT())();
        let result = null;
        let foundResult = false;
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          if (foundResult) {
            try {
              dart.throw(_internal.IterableElementError.tooMany());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._cancelAndErrorWithReplacement(subscription, future, e, s);
            }

            return;
          }
          foundResult = true;
          result = value;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      firstWhere(test, opts) {
        let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
        let future = new async._Future();
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._runUserCode(dart.fn(() => test(value), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              async._cancelAndValue(subscription, future, value);
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (defaultValue != null) {
              async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      lastWhere(test, opts) {
        let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
        let future = new async._Future();
        let result = null;
        let foundResult = false;
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              foundResult = true;
              result = value;
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            if (defaultValue != null) {
              async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      singleWhere(test) {
        let future = new (_FutureOfT())();
        let result = null;
        let foundResult = false;
        let subscription = null;
        subscription = this.listen(dart.fn(value => {
          async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
            if (dart.test(isMatch)) {
              if (foundResult) {
                try {
                  dart.throw(_internal.IterableElementError.tooMany());
                } catch (e) {
                  let s = dart.stackTrace(e);
                  async._cancelAndErrorWithReplacement(subscription, future, e, s);
                }

                return;
              }
              foundResult = true;
              result = value;
            }
          }, boolTodynamic()), async._cancelAndErrorClosure(subscription, future));
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            if (foundResult) {
              future[_complete](result);
              return;
            }
            try {
              dart.throw(_internal.IterableElementError.noElement());
            } catch (e) {
              let s = dart.stackTrace(e);
              async._completeWithErrorCallback(future, e, s);
            }

          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      elementAt(index) {
        if (!(typeof index == 'number') || dart.notNull(index) < 0) dart.throw(new core.ArgumentError(index));
        let future = new (_FutureOfT())();
        let subscription = null;
        let elementIndex = 0;
        subscription = this.listen(dart.fn(value => {
          if (index == elementIndex) {
            async._cancelAndValue(subscription, future, value);
            return;
          }
          elementIndex = elementIndex + 1;
        }, TTovoid$()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
            future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
          }, VoidTovoid$()), cancelOnError: true});
        return future;
      }
      timeout(timeLimit, opts) {
        let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
        let controller = null;
        let subscription = null;
        let timer = null;
        let zone = null;
        let timeout = null;
        function onData(event) {
          timer.cancel();
          controller.add(event);
          timer = zone.createTimer(timeLimit, timeout);
        }
        dart.fn(onData, TTovoid$());
        function onError(error, stackTrace) {
          timer.cancel();
          dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
          let eventSink = controller;
          dart.dsend(eventSink, _addError, error, stackTrace);
          timer = zone.createTimer(timeLimit, timeout);
        }
        dart.fn(onError, dynamicAndStackTraceTovoid());
        function onDone() {
          timer.cancel();
          controller.close();
        }
        dart.fn(onDone, VoidTovoid$());
        const onListen = (function() {
          zone = async.Zone.current;
          if (onTimeout == null) {
            timeout = dart.fn(() => {
              controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
            }, VoidTovoid$());
          } else {
            let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
            let wrapper = new async._ControllerEventSinkWrapper(null);
            timeout = dart.fn(() => {
              wrapper[_sink] = controller;
              zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
              wrapper[_sink] = null;
            }, VoidTovoid$());
          }
          subscription = this.listen(onData, {onError: onError, onDone: onDone});
          timer = zone.createTimer(timeLimit, timeout);
        }).bind(this);
        dart.fn(onListen, VoidTovoid$());
        function onCancel() {
          timer.cancel();
          let result = subscription.cancel();
          subscription = null;
          return result;
        }
        dart.fn(onCancel, VoidToFuture());
        controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
          timer.cancel();
          subscription.pause();
        }, VoidTovoid$()), dart.fn(() => {
          subscription.resume();
          timer = zone.createTimer(timeLimit, timeout);
        }, VoidTovoid$()), onCancel);
        return controller.stream;
      }
    }
    dart.addTypeTests(Stream);
    dart.defineNamedConstructor(Stream, '_internal');
    dart.setSignature(Stream, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.Stream$(T), []),
        _internal: dart.definiteFunctionType(async.Stream$(T), []),
        empty: dart.definiteFunctionType(async.Stream$(T), []),
        fromFuture: dart.definiteFunctionType(async.Stream$(T), [FutureOfT()]),
        fromFutures: dart.definiteFunctionType(async.Stream$(T), [IterableOfFutureOfT()]),
        fromIterable: dart.definiteFunctionType(async.Stream$(T), [IterableOfT()]),
        periodic: dart.definiteFunctionType(async.Stream$(T), [core.Duration], [intToT()]),
        eventTransformed: dart.definiteFunctionType(async.Stream$(T), [async.Stream, EventSinkOfTToEventSink()])
      }),
      getters: () => ({
        isBroadcast: dart.definiteFunctionType(core.bool, []),
        length: dart.definiteFunctionType(async.Future$(core.int), []),
        isEmpty: dart.definiteFunctionType(async.Future$(core.bool), []),
        first: dart.definiteFunctionType(async.Future$(T), []),
        last: dart.definiteFunctionType(async.Future$(T), []),
        single: dart.definiteFunctionType(async.Future$(T), [])
      }),
      methods: () => ({
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        where: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
        map: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(S, [T])]]),
        asyncMap: dart.definiteFunctionType(E => [async.Stream$(E), [TTodynamic()]]),
        asyncExpand: dart.definiteFunctionType(E => [async.Stream$(E), [dart.functionType(async.Stream$(E), [T])]]),
        handleError: dart.definiteFunctionType(async.Stream$(T), [core.Function], {test: dynamicTobool()}),
        expand: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(core.Iterable$(S), [T])]]),
        pipe: dart.definiteFunctionType(async.Future, [StreamConsumerOfT()]),
        transform: dart.definiteFunctionType(S => [async.Stream$(S), [async.StreamTransformer$(T, S)]]),
        reduce: dart.definiteFunctionType(async.Future$(T), [TAndTToT()]),
        fold: dart.definiteFunctionType(S => [async.Future$(S), [S, dart.functionType(S, [S, T])]]),
        join: dart.definiteFunctionType(async.Future$(core.String), [], [core.String]),
        contains: dart.definiteFunctionType(async.Future$(core.bool), [core.Object]),
        forEach: dart.definiteFunctionType(async.Future, [TTovoid()]),
        every: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
        any: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
        toList: dart.definiteFunctionType(async.Future$(core.List$(T)), []),
        toSet: dart.definiteFunctionType(async.Future$(core.Set$(T)), []),
        drain: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
        take: dart.definiteFunctionType(async.Stream$(T), [core.int]),
        takeWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
        skip: dart.definiteFunctionType(async.Stream$(T), [core.int]),
        skipWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
        distinct: dart.definiteFunctionType(async.Stream$(T), [], [TAndTTobool()]),
        firstWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
        lastWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
        singleWhere: dart.definiteFunctionType(async.Future$(T), [TTobool()]),
        elementAt: dart.definiteFunctionType(async.Future$(T), [core.int]),
        timeout: dart.definiteFunctionType(async.Stream$(T), [core.Duration], {onTimeout: EventSinkOfTTovoid()})
      })
    });
    return Stream;
  });
  async.Stream = Stream();
  _isolate_helper.ReceivePortImpl = class ReceivePortImpl extends async.Stream {
    new() {
      ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl(null));
    }
    weak() {
      ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl.weak(null));
    }
    fromRawReceivePort(rawPort) {
      this[_rawPort] = rawPort;
      this[_controller] = null;
      super.new();
      this[_controller] = async.StreamController.new({onCancel: dart.bind(this, 'close'), sync: true});
      this[_rawPort].handler = dart.bind(this[_controller], 'add');
    }
    listen(onData, opts) {
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
      return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
    close() {
      this[_rawPort].close();
      this[_controller].close();
    }
    get sendPort() {
      return this[_rawPort].sendPort;
    }
  };
  dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
  dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
  dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
  _isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
  dart.setSignature(_isolate_helper.ReceivePortImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
      weak: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
      fromRawReceivePort: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, [isolate.RawReceivePort])
    }),
    fields: () => ({
      [_rawPort]: isolate.RawReceivePort,
      [_controller]: async.StreamController
    }),
    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
    methods: () => ({
      listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _once = Symbol('_once');
  const _inEventLoop = Symbol('_inEventLoop');
  const _handle = Symbol('_handle');
  _isolate_helper.TimerImpl = class TimerImpl extends core.Object {
    new(milliseconds, callback) {
      this[_once] = true;
      this[_inEventLoop] = false;
      this[_handle] = null;
      if (milliseconds == 0 && (!dart.test(_isolate_helper.hasTimer()) || dart.test(_isolate_helper._globalState.isWorker))) {
        const internalCallback = (function() {
          this[_handle] = null;
          callback();
        }).bind(this);
        dart.fn(internalCallback, VoidTovoid$());
        this[_handle] = 1;
        _isolate_helper._globalState.topEventLoop.enqueue(_isolate_helper._globalState.currentContext, internalCallback, 'timer');
        this[_inEventLoop] = true;
      } else if (dart.test(_isolate_helper.hasTimer())) {
        const internalCallback = (function() {
          this[_handle] = null;
          _isolate_helper.leaveJsAsync();
          callback();
        }).bind(this);
        dart.fn(internalCallback, VoidTovoid$());
        _isolate_helper.enterJsAsync();
        this[_handle] = self.setTimeout(internalCallback, milliseconds);
      } else {
        dart.assert(dart.notNull(milliseconds) > 0);
        dart.throw(new core.UnsupportedError("Timer greater than 0."));
      }
    }
    periodic(milliseconds, callback) {
      this[_once] = false;
      this[_inEventLoop] = false;
      this[_handle] = null;
      if (dart.test(_isolate_helper.hasTimer())) {
        _isolate_helper.enterJsAsync();
        this[_handle] = self.setInterval(dart.fn(() => {
          callback(this);
        }, VoidTodynamic$()), milliseconds);
      } else {
        dart.throw(new core.UnsupportedError("Periodic timer."));
      }
    }
    cancel() {
      if (dart.test(_isolate_helper.hasTimer())) {
        if (dart.test(this[_inEventLoop])) {
          dart.throw(new core.UnsupportedError("Timer in event loop cannot be canceled."));
        }
        if (this[_handle] == null) return;
        _isolate_helper.leaveJsAsync();
        if (dart.test(this[_once])) {
          self.clearTimeout(this[_handle]);
        } else {
          self.clearInterval(this[_handle]);
        }
        this[_handle] = null;
      } else {
        dart.throw(new core.UnsupportedError("Canceling a timer."));
      }
    }
    get isActive() {
      return this[_handle] != null;
    }
  };
  dart.defineNamedConstructor(_isolate_helper.TimerImpl, 'periodic');
  _isolate_helper.TimerImpl[dart.implements] = () => [async.Timer];
  dart.setSignature(_isolate_helper.TimerImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, VoidTovoid()]),
      periodic: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, TimerTovoid()])
    }),
    fields: () => ({
      [_once]: core.bool,
      [_inEventLoop]: core.bool,
      [_handle]: core.int
    }),
    getters: () => ({isActive: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({cancel: dart.definiteFunctionType(dart.void, [])})
  });
  _isolate_helper.hasTimer = function() {
    return self.setTimeout != null;
  };
  dart.lazyFn(_isolate_helper.hasTimer, () => VoidTobool());
  _isolate_helper.CapabilityImpl = class CapabilityImpl extends core.Object {
    new() {
      CapabilityImpl.prototype._internal.call(this, _js_helper.random64());
    }
    _internal(id) {
      this[_id] = id;
    }
    get hashCode() {
      let hash = this[_id];
      hash = (hash[dartx['>>']](0) ^ (dart.notNull(hash) / 4294967296)[dartx.truncate]()) >>> 0;
      hash = ((~dart.notNull(hash) >>> 0) + (dart.notNull(hash) << 15 >>> 0) & 4294967295) >>> 0;
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](12)) >>> 0;
      hash = (dart.notNull(hash) * 5 & 4294967295) >>> 0;
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](4)) >>> 0;
      hash = (dart.notNull(hash) * 2057 & 4294967295) >>> 0;
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](16)) >>> 0;
      return hash;
    }
    ['=='](other) {
      if (core.identical(other, this)) return true;
      if (_isolate_helper.CapabilityImpl.is(other)) {
        return core.identical(this[_id], other[_id]);
      }
      return false;
    }
  };
  dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
  _isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
  dart.setSignature(_isolate_helper.CapabilityImpl, {
    constructors: () => ({
      new: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, []),
      _internal: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, [core.int])
    }),
    fields: () => ({[_id]: core.int}),
    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
  });
  _isolate_helper._serializeMessage = function(message) {
    return new _isolate_helper._Serializer().serialize(message);
  };
  dart.fn(_isolate_helper._serializeMessage, dynamicTodynamic$());
  _isolate_helper._deserializeMessage = function(message) {
    return new _isolate_helper._Deserializer().deserialize(message);
  };
  dart.fn(_isolate_helper._deserializeMessage, dynamicTodynamic$());
  _isolate_helper._clone = function(message) {
    let serializer = new _isolate_helper._Serializer({serializeSendPorts: false});
    let deserializer = new _isolate_helper._Deserializer();
    return deserializer.deserialize(serializer.serialize(message));
  };
  dart.fn(_isolate_helper._clone, dynamicTodynamic$());
  const _serializeSendPorts = Symbol('_serializeSendPorts');
  _isolate_helper._Serializer = class _Serializer extends core.Object {
    new(opts) {
      let serializeSendPorts = opts && 'serializeSendPorts' in opts ? opts.serializeSendPorts : true;
      this.serializedObjectIds = MapOfdynamic$int().identity();
      this[_serializeSendPorts] = core.bool._check(serializeSendPorts);
    }
    serialize(x) {
      if (dart.test(this.isPrimitive(x))) return this.serializePrimitive(x);
      let serializationId = this.serializedObjectIds[dartx._get](x);
      if (serializationId != null) return this.makeRef(serializationId);
      serializationId = this.serializedObjectIds[dartx.length];
      this.serializedObjectIds[dartx._set](x, serializationId);
      if (_native_typed_data.NativeByteBuffer.is(x)) return this.serializeByteBuffer(x);
      if (_native_typed_data.NativeTypedData.is(x)) return this.serializeTypedData(x);
      if (_interceptors.JSIndexable.is(x)) return this.serializeJSIndexable(x);
      if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
      if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
      if (_interceptors.Interceptor.is(x)) this.unsupported(x);
      if (isolate.RawReceivePort.is(x)) {
        this.unsupported(x, "RawReceivePorts can't be transmitted:");
      }
      if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
      if (_isolate_helper._WorkerSendPort.is(x)) return this.serializeWorkerSendPort(x);
      if (core.Function.is(x)) return this.serializeClosure(x);
      return this.serializeDartObject(x);
    }
    unsupported(x, message) {
      if (message === void 0) message = null;
      if (message == null) message = "Can't transmit:";
      dart.throw(new core.UnsupportedError(dart.str`${message} ${x}`));
    }
    makeRef(serializationId) {
      return JSArrayOfObject().of(["ref", serializationId]);
    }
    isPrimitive(x) {
      return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
    }
    serializePrimitive(primitive) {
      return primitive;
    }
    serializeByteBuffer(buffer) {
      return JSArrayOfObject().of(["buffer", buffer]);
    }
    serializeTypedData(data) {
      return JSArrayOfObject().of(["typed", data]);
    }
    serializeJSIndexable(indexable) {
      dart.assert(!(typeof indexable == 'string'));
      let serialized = core.List._check(this.serializeArray(_interceptors.JSArray._check(indexable)));
      if (_interceptors.JSFixedArray.is(indexable)) return JSArrayOfObject().of(["fixed", serialized]);
      if (_interceptors.JSExtendableArray.is(indexable)) return JSArrayOfObject().of(["extendable", serialized]);
      if (_interceptors.JSMutableArray.is(indexable)) return JSArrayOfObject().of(["mutable", serialized]);
      if (_interceptors.JSArray.is(indexable)) return JSArrayOfObject().of(["const", serialized]);
      this.unsupported(indexable, "Can't serialize indexable: ");
      return null;
    }
    serializeArray(x) {
      let serialized = [];
      serialized[dartx.length] = x[dartx.length];
      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
        serialized[dartx._set](i, this.serialize(x[dartx._get](i)));
      }
      return serialized;
    }
    serializeArrayInPlace(x) {
      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
        x[dartx._set](i, this.serialize(x[dartx._get](i)));
      }
      return x;
    }
    serializeMap(x) {
      let serializeTearOff = dart.bind(this, 'serialize');
      return JSArrayOfObject().of(['map', x.keys[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList](), x.values[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList]()]);
    }
    serializeJSObject(x) {
      if (!!x.constructor && x.constructor !== Object) {
        this.unsupported(x, "Only plain JS Objects are supported:");
      }
      let keys = Object.keys(x);
      let values = [];
      values[dartx.length] = keys[dartx.length];
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        values[dartx._set](i, this.serialize(x[keys[dartx._get](i)]));
      }
      return JSArrayOfObject().of(['js-object', keys, values]);
    }
    serializeWorkerSendPort(x) {
      if (dart.test(this[_serializeSendPorts])) {
        return JSArrayOfObject().of(['sendport', x[_workerId], x[_isolateId], x[_receivePortId]]);
      }
      return JSArrayOfObject().of(['raw sendport', x]);
    }
    serializeJsSendPort(x) {
      if (dart.test(this[_serializeSendPorts])) {
        let workerId = _isolate_helper._globalState.currentManagerId;
        return JSArrayOfObject().of(['sendport', workerId, x[_isolateId], x[_receivePort][_id]]);
      }
      return JSArrayOfObject().of(['raw sendport', x]);
    }
    serializeCapability(x) {
      return JSArrayOfObject().of(['capability', x[_id]]);
    }
    serializeClosure(x) {
      let name = _isolate_helper.IsolateNatives._getJSFunctionName(x);
      if (name == null) {
        this.unsupported(x, "Closures can't be transmitted:");
      }
      return JSArrayOfString().of(['function', name]);
    }
    serializeDartObject(x) {
      let classExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_ID_EXTRACTOR);
      let fieldsExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_FIELDS_EXTRACTOR);
      let classId = classExtractor(x);
      let fields = fieldsExtractor(x);
      return ['dart', classId, this.serializeArrayInPlace(_interceptors.JSArray._check(fields))];
    }
  };
  dart.setSignature(_isolate_helper._Serializer, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Serializer, [], {serializeSendPorts: dart.dynamic})}),
    fields: () => ({
      [_serializeSendPorts]: core.bool,
      serializedObjectIds: MapOfdynamic$int()
    }),
    methods: () => ({
      serialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      unsupported: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
      makeRef: dart.definiteFunctionType(dart.dynamic, [core.int]),
      isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      serializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      serializeByteBuffer: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeByteBuffer]),
      serializeTypedData: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeTypedData]),
      serializeJSIndexable: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSIndexable]),
      serializeArray: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
      serializeArrayInPlace: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
      serializeMap: dart.definiteFunctionType(dart.dynamic, [_js_helper.InternalMap]),
      serializeJSObject: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSObject]),
      serializeWorkerSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._WorkerSendPort]),
      serializeJsSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._NativeJsSendPort]),
      serializeCapability: dart.definiteFunctionType(dart.dynamic, [_isolate_helper.CapabilityImpl]),
      serializeClosure: dart.definiteFunctionType(dart.dynamic, [core.Function]),
      serializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  const _adjustSendPorts = Symbol('_adjustSendPorts');
  _isolate_helper._Deserializer = class _Deserializer extends core.Object {
    new(opts) {
      let adjustSendPorts = opts && 'adjustSendPorts' in opts ? opts.adjustSendPorts : true;
      this.deserializedObjects = core.List.new();
      this[_adjustSendPorts] = core.bool._check(adjustSendPorts);
    }
    deserialize(x) {
      if (dart.test(this.isPrimitive(x))) return this.deserializePrimitive(x);
      if (!_interceptors.JSArray.is(x)) dart.throw(new core.ArgumentError(dart.str`Bad serialized message: ${x}`));
      switch (dart.dload(x, 'first')) {
        case "ref":
        {
          return this.deserializeRef(x);
        }
        case "buffer":
        {
          return this.deserializeByteBuffer(x);
        }
        case "typed":
        {
          return this.deserializeTypedData(x);
        }
        case "fixed":
        {
          return this.deserializeFixed(x);
        }
        case "extendable":
        {
          return this.deserializeExtendable(x);
        }
        case "mutable":
        {
          return this.deserializeMutable(x);
        }
        case "const":
        {
          return this.deserializeConst(x);
        }
        case "map":
        {
          return this.deserializeMap(_js_helper.InternalMap._check(x));
        }
        case "sendport":
        {
          return this.deserializeSendPort(x);
        }
        case "raw sendport":
        {
          return this.deserializeRawSendPort(x);
        }
        case "js-object":
        {
          return this.deserializeJSObject(x);
        }
        case "function":
        {
          return this.deserializeClosure(x);
        }
        case "dart":
        {
          return this.deserializeDartObject(x);
        }
        default:
        {
          dart.throw(dart.str`couldn't deserialize: ${x}`);
        }
      }
    }
    isPrimitive(x) {
      return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
    }
    deserializePrimitive(x) {
      return x;
    }
    deserializeRef(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'ref'));
      let serializationId = core.int._check(dart.dindex(x, 1));
      return this.deserializedObjects[dartx._get](serializationId);
    }
    deserializeByteBuffer(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'buffer'));
      let result = _native_typed_data.NativeByteBuffer._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeTypedData(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'typed'));
      let result = _native_typed_data.NativeTypedData._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeArrayInPlace(x) {
      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
        x[dartx._set](i, this.deserialize(x[dartx._get](i)));
      }
      return x;
    }
    deserializeFixed(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'fixed'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
    }
    deserializeExtendable(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'extendable'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return _interceptors.JSArray.markGrowable(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
    }
    deserializeMutable(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'mutable'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return this.deserializeArrayInPlace(_interceptors.JSArray._check(result));
    }
    deserializeConst(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'const'));
      let result = core.List._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
    }
    deserializeMap(x) {
      dart.assert(dart.equals(x._get(0), 'map'));
      let keys = core.List._check(x._get(1));
      let values = core.List._check(x._get(2));
      let result = dart.map();
      this.deserializedObjects[dartx.add](result);
      keys = keys[dartx.map](dart.dynamic)(dart.bind(this, 'deserialize'))[dartx.toList]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        result[dartx._set](keys[dartx._get](i), this.deserialize(values[dartx._get](i)));
      }
      return result;
    }
    deserializeSendPort(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'sendport'));
      let managerId = core.int._check(dart.dindex(x, 1));
      let isolateId = core.int._check(dart.dindex(x, 2));
      let receivePortId = core.int._check(dart.dindex(x, 3));
      let result = null;
      if (managerId == _isolate_helper._globalState.currentManagerId) {
        let isolate = _isolate_helper._globalState.isolates[dartx._get](isolateId);
        if (isolate == null) return null;
        let receivePort = isolate.lookup(receivePortId);
        if (receivePort == null) return null;
        result = new _isolate_helper._NativeJsSendPort(receivePort, isolateId);
      } else {
        result = new _isolate_helper._WorkerSendPort(managerId, isolateId, receivePortId);
      }
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeRawSendPort(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
      let result = isolate.SendPort._check(dart.dindex(x, 1));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeJSObject(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'js-object'));
      let keys = core.List._check(dart.dindex(x, 1));
      let values = core.List._check(dart.dindex(x, 2));
      let o = {};
      this.deserializedObjects[dartx.add](o);
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        o[keys[dartx._get](i)] = this.deserialize(values[dartx._get](i));
      }
      return o;
    }
    deserializeClosure(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'function'));
      let name = core.String._check(dart.dindex(x, 1));
      let result = core.Function._check(_isolate_helper.IsolateNatives._getJSFunctionFromName(name));
      this.deserializedObjects[dartx.add](result);
      return result;
    }
    deserializeDartObject(x) {
      dart.assert(dart.equals(dart.dindex(x, 0), 'dart'));
      let classId = core.String._check(dart.dindex(x, 1));
      let fields = core.List._check(dart.dindex(x, 2));
      let instanceFromClassId = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INSTANCE_FROM_CLASS_ID);
      let initializeObject = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INITIALIZE_EMPTY_INSTANCE);
      let emptyInstance = instanceFromClassId(classId);
      this.deserializedObjects[dartx.add](emptyInstance);
      this.deserializeArrayInPlace(_interceptors.JSArray._check(fields));
      return initializeObject(classId, emptyInstance, fields);
    }
  };
  dart.setSignature(_isolate_helper._Deserializer, {
    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Deserializer, [], {adjustSendPorts: dart.dynamic})}),
    fields: () => ({
      [_adjustSendPorts]: core.bool,
      deserializedObjects: core.List
    }),
    methods: () => ({
      deserialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      deserializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      deserializeRef: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      deserializeByteBuffer: dart.definiteFunctionType(_native_typed_data.NativeByteBuffer, [dart.dynamic]),
      deserializeTypedData: dart.definiteFunctionType(_native_typed_data.NativeTypedData, [dart.dynamic]),
      deserializeArrayInPlace: dart.definiteFunctionType(core.List, [_interceptors.JSArray]),
      deserializeFixed: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeExtendable: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
      deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
      deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
      deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
      deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
      deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  _js_embedded_names.DISPATCH_PROPERTY_NAME = "dispatchPropertyName";
  _js_embedded_names.TYPE_INFORMATION = 'typeInformation';
  _js_embedded_names.GLOBAL_FUNCTIONS = 'globalFunctions';
  _js_embedded_names.STATICS = 'statics';
  _js_embedded_names.INTERCEPTED_NAMES = 'interceptedNames';
  _js_embedded_names.MANGLED_GLOBAL_NAMES = 'mangledGlobalNames';
  _js_embedded_names.MANGLED_NAMES = 'mangledNames';
  _js_embedded_names.LIBRARIES = 'libraries';
  _js_embedded_names.FINISHED_CLASSES = 'finishedClasses';
  _js_embedded_names.ALL_CLASSES = 'allClasses';
  _js_embedded_names.METADATA = 'metadata';
  _js_embedded_names.INTERCEPTORS_BY_TAG = 'interceptorsByTag';
  _js_embedded_names.LEAF_TAGS = 'leafTags';
  _js_embedded_names.LAZIES = 'lazies';
  _js_embedded_names.GET_ISOLATE_TAG = 'getIsolateTag';
  _js_embedded_names.ISOLATE_TAG = 'isolateTag';
  _js_embedded_names.CURRENT_SCRIPT = 'currentScript';
  _js_embedded_names.DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
  _js_embedded_names.DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
  _js_embedded_names.INITIALIZE_LOADED_HUNK = 'initializeLoadedHunk';
  _js_embedded_names.IS_HUNK_LOADED = 'isHunkLoaded';
  _js_embedded_names.IS_HUNK_INITIALIZED = 'isHunkInitialized';
  _js_embedded_names.DEFERRED_INITIALIZED = 'deferredInitialized';
  _js_embedded_names.CLASS_ID_EXTRACTOR = 'classIdExtractor';
  _js_embedded_names.CLASS_FIELDS_EXTRACTOR = 'classFieldsExtractor';
  _js_embedded_names.INSTANCE_FROM_CLASS_ID = "instanceFromClassId";
  _js_embedded_names.INITIALIZE_EMPTY_INSTANCE = "initializeEmptyInstance";
  _js_embedded_names.TYPEDEF_TYPE_PROPERTY_NAME = "$typedefType";
  _js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
  _js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
  _js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
  _js_helper._Patch = class _Patch extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper._Patch, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._Patch, [])})
  });
  _js_helper.patch = dart.const(new _js_helper._Patch());
  _js_helper.InternalMap$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    class InternalMap extends core.Object {}
    dart.addTypeTests(InternalMap);
    InternalMap[dart.implements] = () => [MapOfK$V()];
    return InternalMap;
  });
  _js_helper.InternalMap = InternalMap();
  _js_helper.Primitives = class Primitives extends core.Object {
    static initializeStatics(id) {
      _js_helper.Primitives.mirrorFunctionCacheName = dart.notNull(_js_helper.Primitives.mirrorFunctionCacheName) + dart.str`_${id}`;
      _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
    }
    static objectHashCode(object) {
      let hash = object.$identityHash;
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object.$identityHash = hash;
      }
      return hash;
    }
    static _parseIntError(source, handleError) {
      if (handleError == null) dart.throw(new core.FormatException(source));
      return handleError(source);
    }
    static parseInt(source, radix, handleError) {
      _js_helper.checkString(source);
      let re = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i;
      let match = re.exec(source);
      let digitsIndex = 1;
      let hexIndex = 2;
      let decimalIndex = 3;
      let nonDecimalHexIndex = 4;
      if (match == null) {
        return _js_helper.Primitives._parseIntError(source, handleError);
      }
      let decimalMatch = match[dartx._get](decimalIndex);
      if (radix == null) {
        if (decimalMatch != null) {
          return parseInt(source, 10);
        }
        if (match[dartx._get](hexIndex) != null) {
          return parseInt(source, 16);
        }
        return _js_helper.Primitives._parseIntError(source, handleError);
      }
      if (!(typeof radix == 'number')) {
        dart.throw(new core.ArgumentError.value(radix, 'radix', 'is not an integer'));
      }
      if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
        dart.throw(new core.RangeError.range(radix, 2, 36, 'radix'));
      }
      if (radix == 10 && decimalMatch != null) {
        return parseInt(source, 10);
      }
      if (dart.notNull(radix) < 10 || decimalMatch == null) {
        let maxCharCode = null;
        if (dart.notNull(radix) <= 10) {
          maxCharCode = 48 - 1 + dart.notNull(radix);
        } else {
          maxCharCode = 97 - 10 - 1 + dart.notNull(radix);
        }
        dart.assert(typeof match[dartx._get](digitsIndex) == 'string');
        let digitsPart = match[digitsIndex];
        for (let i = 0; i < dart.notNull(digitsPart[dartx.length]); i++) {
          let characterCode = (dart.notNull(digitsPart[dartx.codeUnitAt](i)) | 32) >>> 0;
          if (characterCode > dart.notNull(maxCharCode)) {
            return _js_helper.Primitives._parseIntError(source, handleError);
          }
        }
      }
      return parseInt(source, radix);
    }
    static _parseDoubleError(source, handleError) {
      if (handleError == null) {
        dart.throw(new core.FormatException('Invalid double', source));
      }
      return handleError(source);
    }
    static parseDouble(source, handleError) {
      _js_helper.checkString(source);
      if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source)) {
        return _js_helper.Primitives._parseDoubleError(source, handleError);
      }
      let result = parseFloat(source);
      if (dart.test(result[dartx.isNaN])) {
        let trimmed = source[dartx.trim]();
        if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
          return result;
        }
        return _js_helper.Primitives._parseDoubleError(source, handleError);
      }
      return result;
    }
    static objectTypeName(object) {
      return dart.toString(_js_helper.getRuntimeType(object));
    }
    static objectToString(object) {
      let name = dart.typeName(dart.getReifiedType(object));
      return dart.str`Instance of '${name}'`;
    }
    static dateNow() {
      return Date.now();
    }
    static initTicker() {
      if (_js_helper.Primitives.timerFrequency != null) return;
      _js_helper.Primitives.timerFrequency = 1000;
      _js_helper.Primitives.timerTicks = _js_helper.Primitives.dateNow;
      if (typeof window == "undefined") return;
      let jsWindow = window;
      if (jsWindow == null) return;
      let performance = jsWindow.performance;
      if (performance == null) return;
      if (typeof performance.now != "function") return;
      _js_helper.Primitives.timerFrequency = 1000000;
      _js_helper.Primitives.timerTicks = dart.fn(() => (1000 * performance.now())[dartx.floor](), VoidToint());
    }
    static get isD8() {
      return typeof version == "function" && typeof os == "object" && "system" in os;
    }
    static get isJsshell() {
      return typeof version == "function" && typeof system == "function";
    }
    static currentUri() {
      if (!!self.location) {
        return self.location.href;
      }
      return null;
    }
    static _fromCharCodeApply(array) {
      let kMaxApply = 500;
      let end = array[dartx.length];
      if (dart.notNull(end) <= kMaxApply) {
        return String.fromCharCode.apply(null, array);
      }
      let result = '';
      for (let i = 0; i < dart.notNull(end); i = i + kMaxApply) {
        let chunkEnd = i + kMaxApply < dart.notNull(end) ? i + kMaxApply : end;
        result = result + String.fromCharCode.apply(null, array.slice(i, chunkEnd));
      }
      return result;
    }
    static stringFromCodePoints(codePoints) {
      let a = JSArrayOfint().of([]);
      for (let i of codePoints) {
        if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
        if (dart.notNull(i) <= 65535) {
          a[dartx.add](i);
        } else if (dart.notNull(i) <= 1114111) {
          a[dartx.add](55296 + (dart.notNull(i) - 65536 >> 10 & 1023));
          a[dartx.add](56320 + (dart.notNull(i) & 1023));
        } else {
          dart.throw(_js_helper.argumentErrorValue(i));
        }
      }
      return _js_helper.Primitives._fromCharCodeApply(a);
    }
    static stringFromCharCodes(charCodes) {
      for (let i of charCodes) {
        if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
        if (dart.notNull(i) < 0) dart.throw(_js_helper.argumentErrorValue(i));
        if (dart.notNull(i) > 65535) return _js_helper.Primitives.stringFromCodePoints(charCodes);
      }
      return _js_helper.Primitives._fromCharCodeApply(charCodes);
    }
    static stringFromNativeUint8List(charCodes, start, end) {
      let kMaxApply = 500;
      if (dart.notNull(end) <= kMaxApply && start == 0 && end == charCodes[dartx.length]) {
        return String.fromCharCode.apply(null, charCodes);
      }
      let result = '';
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + kMaxApply) {
        let chunkEnd = dart.notNull(i) + kMaxApply < dart.notNull(end) ? dart.notNull(i) + kMaxApply : end;
        result = result + String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
      }
      return result;
    }
    static stringFromCharCode(charCode) {
      if (0 <= dart.notNull(charCode)) {
        if (dart.notNull(charCode) <= 65535) {
          return String.fromCharCode(charCode);
        }
        if (dart.notNull(charCode) <= 1114111) {
          let bits = dart.notNull(charCode) - 65536;
          let low = 56320 | bits & 1023;
          let high = (55296 | bits[dartx['>>']](10)) >>> 0;
          return String.fromCharCode(high, low);
        }
      }
      dart.throw(new core.RangeError.range(charCode, 0, 1114111));
    }
    static stringConcatUnchecked(string1, string2) {
      return _foreign_helper.JS_STRING_CONCAT(string1, string2);
    }
    static flattenString(str) {
      return str.charCodeAt(0) == 0 ? str : str;
    }
    static getTimeZoneName(receiver) {
      let d = _js_helper.Primitives.lazyAsJsDate(receiver);
      let match = /\((.*)\)/.exec(d.toString());
      if (match != null) return core.String._check(match[dartx._get](1));
      match = /^[A-Z,a-z]{3}\s[A-Z,a-z]{3}\s\d+\s\d{2}:\d{2}:\d{2}\s([A-Z]{3,5})\s\d{4}$/.exec(d.toString());
      if (match != null) return core.String._check(match[dartx._get](1));
      match = /(?:GMT|UTC)[+-]\d{4}/.exec(d.toString());
      if (match != null) return core.String._check(match[dartx._get](0));
      return "";
    }
    static getTimeZoneOffsetInMinutes(receiver) {
      return -_js_helper.Primitives.lazyAsJsDate(receiver).getTimezoneOffset();
    }
    static valueFromDecomposedDate(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
      let MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
      _js_helper.checkInt(years);
      _js_helper.checkInt(month);
      _js_helper.checkInt(day);
      _js_helper.checkInt(hours);
      _js_helper.checkInt(minutes);
      _js_helper.checkInt(seconds);
      _js_helper.checkInt(milliseconds);
      _js_helper.checkBool(isUtc);
      let jsMonth = dart.notNull(month) - 1;
      let value = null;
      if (dart.test(isUtc)) {
        value = Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds);
      } else {
        value = new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
      }
      if (dart.test(value[dartx.isNaN]) || dart.notNull(value) < -MAX_MILLISECONDS_SINCE_EPOCH || dart.notNull(value) > MAX_MILLISECONDS_SINCE_EPOCH) {
        return null;
      }
      if (dart.notNull(years) <= 0 || dart.notNull(years) < 100) return core.num._check(_js_helper.Primitives.patchUpY2K(value, years, isUtc));
      return value;
    }
    static patchUpY2K(value, years, isUtc) {
      let date = new Date(value);
      if (dart.test(isUtc)) {
        date.setUTCFullYear(years);
      } else {
        date.setFullYear(years);
      }
      return date.valueOf();
    }
    static lazyAsJsDate(receiver) {
      if (receiver.date === void 0) {
        receiver.date = new Date(receiver.millisecondsSinceEpoch);
      }
      return receiver.date;
    }
    static getYear(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCFullYear() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getFullYear() + 0;
    }
    static getMonth(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMonth() + 1 : _js_helper.Primitives.lazyAsJsDate(receiver).getMonth() + 1;
    }
    static getDay(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDate() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDate() + 0;
    }
    static getHours(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCHours() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getHours() + 0;
    }
    static getMinutes(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMinutes() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMinutes() + 0;
    }
    static getSeconds(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCSeconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getSeconds() + 0;
    }
    static getMilliseconds(receiver) {
      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMilliseconds() + 0;
    }
    static getWeekday(receiver) {
      let weekday = dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDay() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDay() + 0;
      return (weekday + 6)[dartx['%']](7) + 1;
    }
    static valueFromDateString(str) {
      if (!(typeof str == 'string')) dart.throw(_js_helper.argumentErrorValue(str));
      let value = Date.parse(str);
      if (dart.test(value[dartx.isNaN])) dart.throw(_js_helper.argumentErrorValue(str));
      return value;
    }
    static getProperty(object, key) {
      if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
        dart.throw(_js_helper.argumentErrorValue(object));
      }
      return object[key];
    }
    static setProperty(object, key, value) {
      if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
        dart.throw(_js_helper.argumentErrorValue(object));
      }
      object[key] = value;
    }
    static extractStackTrace(error) {
      return _js_helper.getTraceFromException(error.$thrownJsError);
    }
  };
  dart.setSignature(_js_helper.Primitives, {
    sfields: () => ({
      mirrorFunctionCacheName: core.String,
      mirrorInvokeCacheName: core.String,
      DOLLAR_CHAR_VALUE: core.int,
      timerFrequency: core.int,
      timerTicks: core.Function
    }),
    sgetters: () => ({
      isD8: dart.definiteFunctionType(core.bool, []),
      isJsshell: dart.definiteFunctionType(core.bool, [])
    }),
    statics: () => ({
      initializeStatics: dart.definiteFunctionType(dart.void, [core.int]),
      objectHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
      _parseIntError: dart.definiteFunctionType(core.int, [core.String, StringToint()]),
      parseInt: dart.definiteFunctionType(core.int, [core.String, core.int, StringToint()]),
      _parseDoubleError: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
      parseDouble: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
      objectTypeName: dart.definiteFunctionType(core.String, [core.Object]),
      objectToString: dart.definiteFunctionType(core.String, [core.Object]),
      dateNow: dart.definiteFunctionType(core.int, []),
      initTicker: dart.definiteFunctionType(dart.void, []),
      currentUri: dart.definiteFunctionType(core.String, []),
      _fromCharCodeApply: dart.definiteFunctionType(core.String, [ListOfint()]),
      stringFromCodePoints: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
      stringFromCharCodes: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
      stringFromNativeUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
      stringFromCharCode: dart.definiteFunctionType(core.String, [core.int]),
      stringConcatUnchecked: dart.definiteFunctionType(core.String, [core.String, core.String]),
      flattenString: dart.definiteFunctionType(core.String, [core.String]),
      getTimeZoneName: dart.definiteFunctionType(core.String, [core.DateTime]),
      getTimeZoneOffsetInMinutes: dart.definiteFunctionType(core.int, [core.DateTime]),
      valueFromDecomposedDate: dart.definiteFunctionType(core.num, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
      patchUpY2K: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic]),
      lazyAsJsDate: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getYear: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getMonth: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getDay: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getHours: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getMinutes: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getSeconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getMilliseconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      getWeekday: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
      valueFromDateString: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      setProperty: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      extractStackTrace: dart.definiteFunctionType(core.StackTrace, [core.Error])
    }),
    names: ['initializeStatics', 'objectHashCode', '_parseIntError', 'parseInt', '_parseDoubleError', 'parseDouble', 'objectTypeName', 'objectToString', 'dateNow', 'initTicker', 'currentUri', '_fromCharCodeApply', 'stringFromCodePoints', 'stringFromCharCodes', 'stringFromNativeUint8List', 'stringFromCharCode', 'stringConcatUnchecked', 'flattenString', 'getTimeZoneName', 'getTimeZoneOffsetInMinutes', 'valueFromDecomposedDate', 'patchUpY2K', 'lazyAsJsDate', 'getYear', 'getMonth', 'getDay', 'getHours', 'getMinutes', 'getSeconds', 'getMilliseconds', 'getWeekday', 'valueFromDateString', 'getProperty', 'setProperty', 'extractStackTrace']
  });
  _js_helper.Primitives.mirrorFunctionCacheName = '$cachedFunction';
  _js_helper.Primitives.mirrorInvokeCacheName = '$cachedInvocation';
  _js_helper.Primitives.DOLLAR_CHAR_VALUE = 36;
  _js_helper.Primitives.timerFrequency = null;
  _js_helper.Primitives.timerTicks = null;
  _js_helper.diagnoseIndexError = function(indexable, index) {
    if (!(typeof index == 'number')) return new core.ArgumentError.value(index, 'index');
    let length = core.int._check(dart.dload(indexable, 'length'));
    if (dart.test(dart.dsend(index, '<', 0)) || dart.test(dart.dsend(index, '>=', length))) {
      return core.RangeError.index(core.int._check(index), indexable, 'index', null, length);
    }
    return new core.RangeError.value(core.num._check(index), 'index');
  };
  dart.lazyFn(_js_helper.diagnoseIndexError, () => dynamicAnddynamicToError());
  _js_helper.diagnoseRangeError = function(start, end, length) {
    if (!(typeof start == 'number')) {
      return new core.ArgumentError.value(start, 'start');
    }
    if (dart.test(dart.dsend(start, '<', 0)) || dart.test(dart.dsend(start, '>', length))) {
      return new core.RangeError.range(core.num._check(start), 0, core.int._check(length), 'start');
    }
    if (end != null) {
      if (!(typeof end == 'number')) {
        return new core.ArgumentError.value(end, 'end');
      }
      if (dart.test(dart.dsend(end, '<', start)) || dart.test(dart.dsend(end, '>', length))) {
        return new core.RangeError.range(core.num._check(end), core.int._check(start), core.int._check(length), 'end');
      }
    }
    return new core.ArgumentError.value(end, "end");
  };
  dart.lazyFn(_js_helper.diagnoseRangeError, () => dynamicAnddynamicAnddynamicToError());
  _js_helper.stringLastIndexOfUnchecked = function(receiver, element, start) {
    return receiver.lastIndexOf(element, start);
  };
  dart.fn(_js_helper.stringLastIndexOfUnchecked, dynamicAnddynamicAnddynamicTodynamic());
  _js_helper.argumentErrorValue = function(object) {
    return new core.ArgumentError.value(object);
  };
  dart.lazyFn(_js_helper.argumentErrorValue, () => dynamicToArgumentError());
  _js_helper.checkNull = function(object) {
    if (object == null) dart.throw(_js_helper.argumentErrorValue(object));
    return object;
  };
  dart.fn(_js_helper.checkNull, dynamicTodynamic$());
  _js_helper.checkNum = function(value) {
    if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkNum, dynamicTodynamic$());
  _js_helper.checkInt = function(value) {
    if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkInt, dynamicTodynamic$());
  _js_helper.checkBool = function(value) {
    if (!(typeof value == 'boolean')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkBool, dynamicTodynamic$());
  _js_helper.checkString = function(value) {
    if (!(typeof value == 'string')) dart.throw(_js_helper.argumentErrorValue(value));
    return value;
  };
  dart.fn(_js_helper.checkString, dynamicTodynamic$());
  _js_helper.throwRuntimeError = function(message) {
    dart.throw(new _js_helper.RuntimeError(message));
  };
  dart.fn(_js_helper.throwRuntimeError, dynamicTodynamic$());
  _js_helper.throwAbstractClassInstantiationError = function(className) {
    dart.throw(new core.AbstractClassInstantiationError(core.String._check(className)));
  };
  dart.fn(_js_helper.throwAbstractClassInstantiationError, dynamicTodynamic$());
  _js_helper.throwConcurrentModificationError = function(collection) {
    dart.throw(new core.ConcurrentModificationError(collection));
  };
  dart.fn(_js_helper.throwConcurrentModificationError, dynamicTodynamic$());
  const _message = Symbol('_message');
  const _method = Symbol('_method');
  core.Error = class Error extends core.Object {
    new() {
    }
    static safeToString(object) {
      if (typeof object == 'number' || typeof object == 'boolean' || null == object) {
        return dart.toString(object);
      }
      if (typeof object == 'string') {
        return core.Error._stringToSafeString(object);
      }
      return core.Error._objectToString(object);
    }
    static _stringToSafeString(string) {
      return _js_helper.jsonEncodeNative(string);
    }
    static _objectToString(object) {
      return _js_helper.Primitives.objectToString(object);
    }
    get stackTrace() {
      return _js_helper.Primitives.extractStackTrace(this);
    }
  };
  dart.setSignature(core.Error, {
    constructors: () => ({new: dart.definiteFunctionType(core.Error, [])}),
    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])}),
    statics: () => ({
      safeToString: dart.definiteFunctionType(core.String, [core.Object]),
      _stringToSafeString: dart.definiteFunctionType(core.String, [core.String]),
      _objectToString: dart.definiteFunctionType(core.String, [core.Object])
    }),
    names: ['safeToString', '_stringToSafeString', '_objectToString']
  });
  _js_helper.NullError = class NullError extends core.Error {
    new(message, match) {
      this[_message] = message;
      this[_method] = core.String._check(match == null ? null : match.method);
      super.new();
    }
    toString() {
      if (this[_method] == null) return dart.str`NullError: ${this[_message]}`;
      return dart.str`NullError: method not found: '${this[_method]}' on null`;
    }
  };
  _js_helper.NullError[dart.implements] = () => [core.NoSuchMethodError];
  dart.setSignature(_js_helper.NullError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NullError, [core.String, dart.dynamic])}),
    fields: () => ({
      [_message]: core.String,
      [_method]: core.String
    })
  });
  const _receiver = Symbol('_receiver');
  _js_helper.JsNoSuchMethodError = class JsNoSuchMethodError extends core.Error {
    new(message, match) {
      this[_message] = message;
      this[_method] = core.String._check(match == null ? null : match.method);
      this[_receiver] = core.String._check(match == null ? null : match.receiver);
      super.new();
    }
    toString() {
      if (this[_method] == null) return dart.str`NoSuchMethodError: ${this[_message]}`;
      if (this[_receiver] == null) {
        return dart.str`NoSuchMethodError: method not found: '${this[_method]}' (${this[_message]})`;
      }
      return "NoSuchMethodError: " + dart.str`method not found: '${this[_method]}' on '${this[_receiver]}' (${this[_message]})`;
    }
  };
  _js_helper.JsNoSuchMethodError[dart.implements] = () => [core.NoSuchMethodError];
  dart.setSignature(_js_helper.JsNoSuchMethodError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsNoSuchMethodError, [core.String, dart.dynamic])}),
    fields: () => ({
      [_message]: core.String,
      [_method]: core.String,
      [_receiver]: core.String
    })
  });
  _js_helper.UnknownJsTypeError = class UnknownJsTypeError extends core.Error {
    new(message) {
      this[_message] = message;
      super.new();
    }
    toString() {
      return dart.test(this[_message][dartx.isEmpty]) ? 'Error' : dart.str`Error: ${this[_message]}`;
    }
  };
  dart.setSignature(_js_helper.UnknownJsTypeError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.UnknownJsTypeError, [core.String])}),
    fields: () => ({[_message]: core.String})
  });
  _js_helper.getTraceFromException = function(exception) {
    return new _js_helper._StackTrace(exception);
  };
  dart.lazyFn(_js_helper.getTraceFromException, () => dynamicToStackTrace());
  const _exception = Symbol('_exception');
  const _trace = Symbol('_trace');
  _js_helper._StackTrace = class _StackTrace extends core.Object {
    new(exception) {
      this[_exception] = exception;
      this[_trace] = null;
    }
    toString() {
      if (this[_trace] != null) return this[_trace];
      let trace = null;
      if (this[_exception] !== null && typeof this[_exception] === "object") {
        trace = this[_exception].stack;
      }
      return this[_trace] = trace == null ? '' : trace;
    }
  };
  _js_helper._StackTrace[dart.implements] = () => [core.StackTrace];
  dart.setSignature(_js_helper._StackTrace, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StackTrace, [dart.dynamic])}),
    fields: () => ({
      [_exception]: dart.dynamic,
      [_trace]: core.String
    })
  });
  _js_helper.objectHashCode = function(object) {
    if (object == null || typeof object != 'object') {
      return dart.hashCode(object);
    } else {
      return _js_helper.Primitives.objectHashCode(object);
    }
  };
  dart.fn(_js_helper.objectHashCode, dynamicToint());
  _js_helper.fillLiteralMap = function(keyValuePairs, result) {
    let index = 0;
    let length = _js_helper.getLength(keyValuePairs);
    while (index < dart.notNull(length)) {
      let key = _js_helper.getIndex(keyValuePairs, index++);
      let value = _js_helper.getIndex(keyValuePairs, index++);
      result[dartx._set](key, value);
    }
    return result;
  };
  dart.lazyFn(_js_helper.fillLiteralMap, () => dynamicAndMapTodynamic());
  _js_helper.jsHasOwnProperty = function(jsObject, property) {
    return jsObject.hasOwnProperty(property);
  };
  dart.lazyFn(_js_helper.jsHasOwnProperty, () => dynamicAndStringTobool());
  _js_helper.jsPropertyAccess = function(jsObject, property) {
    return jsObject[property];
  };
  dart.lazyFn(_js_helper.jsPropertyAccess, () => dynamicAndStringTodynamic());
  _js_helper.getFallThroughError = function() {
    return new _js_helper.FallThroughErrorImplementation();
  };
  dart.fn(_js_helper.getFallThroughError, VoidTodynamic$());
  _js_helper.Creates = class Creates extends core.Object {
    new(types) {
      this.types = types;
    }
  };
  dart.setSignature(_js_helper.Creates, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Creates, [core.String])}),
    fields: () => ({types: core.String})
  });
  _js_helper.Returns = class Returns extends core.Object {
    new(types) {
      this.types = types;
    }
  };
  dart.setSignature(_js_helper.Returns, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Returns, [core.String])}),
    fields: () => ({types: core.String})
  });
  _js_helper.JSName = class JSName extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_js_helper.JSName, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSName, [core.String])}),
    fields: () => ({name: core.String})
  });
  _js_helper.JavaScriptIndexingBehavior = class JavaScriptIndexingBehavior extends core.Object {};
  _js_helper.TypeErrorImplementation = class TypeErrorImplementation extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}'`;
      super.new();
    }
    fromMessage(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  dart.defineNamedConstructor(_js_helper.TypeErrorImplementation, 'fromMessage');
  _js_helper.TypeErrorImplementation[dart.implements] = () => [core.TypeError];
  dart.setSignature(_js_helper.TypeErrorImplementation, {
    constructors: () => ({
      new: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.Object, core.Object, core.Object]),
      fromMessage: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.String])
    }),
    fields: () => ({message: core.String})
  });
  _js_helper.CastErrorImplementation = class CastErrorImplementation extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` incompatible type '${expectedType}'`;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.CastErrorImplementation[dart.implements] = () => [core.CastError];
  dart.setSignature(_js_helper.CastErrorImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.CastErrorImplementation, [core.Object, core.Object, core.Object])}),
    fields: () => ({message: core.String})
  });
  _js_helper.StrongModeTypeError = class StrongModeTypeError extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}' in strong mode`;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.StrongModeTypeError[dart.implements] = () => [core.TypeError, core.StrongModeError];
  dart.setSignature(_js_helper.StrongModeTypeError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeTypeError, [core.Object, core.Object, core.Object])}),
    fields: () => ({message: core.String})
  });
  _js_helper.StrongModeCastError = class StrongModeCastError extends core.Error {
    new(value, actualType, expectedType) {
      this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` type '${expectedType}' which is incompatible in strong mode`;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.StrongModeCastError[dart.implements] = () => [core.CastError, core.StrongModeError];
  dart.setSignature(_js_helper.StrongModeCastError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeCastError, [core.Object, core.Object, core.Object])}),
    fields: () => ({message: core.String})
  });
  _js_helper.StrongModeErrorImplementation = class StrongModeErrorImplementation extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return this.message;
    }
  };
  _js_helper.StrongModeErrorImplementation[dart.implements] = () => [core.StrongModeError];
  dart.setSignature(_js_helper.StrongModeErrorImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeErrorImplementation, [core.String])}),
    fields: () => ({message: core.String})
  });
  core.FallThroughError = class FallThroughError extends core.Error {
    new() {
      super.new();
    }
  };
  dart.setSignature(core.FallThroughError, {
    constructors: () => ({new: dart.definiteFunctionType(core.FallThroughError, [])})
  });
  _js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
    new() {
      super.new();
    }
    toString() {
      return "Switch case fall-through.";
    }
  };
  dart.setSignature(_js_helper.FallThroughErrorImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.FallThroughErrorImplementation, [])})
  });
  _js_helper.RuntimeError = class RuntimeError extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return dart.str`RuntimeError: ${this.message}`;
    }
  };
  dart.setSignature(_js_helper.RuntimeError, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.RuntimeError, [dart.dynamic])}),
    fields: () => ({message: dart.dynamic})
  });
  _js_helper.random64 = function() {
    let int32a = Math.random() * 0x100000000 >>> 0;
    let int32b = Math.random() * 0x100000000 >>> 0;
    return int32a + int32b * 4294967296;
  };
  dart.fn(_js_helper.random64, VoidToint());
  _js_helper.jsonEncodeNative = function(string) {
    return JSON.stringify(string);
  };
  dart.lazyFn(_js_helper.jsonEncodeNative, () => StringToString$());
  const _jsIterator = Symbol('_jsIterator');
  const _current$0 = Symbol('_current');
  _js_helper.SyncIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class SyncIterator extends core.Object {
      new(jsIterator) {
        this[_jsIterator] = jsIterator;
        this[_current$0] = null;
      }
      get current() {
        return this[_current$0];
      }
      moveNext() {
        let ret = this[_jsIterator].next();
        this[_current$0] = ret.value;
        return !ret.done;
      }
    }
    dart.addTypeTests(SyncIterator);
    SyncIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(SyncIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterator$(E), [dart.dynamic])}),
      fields: () => ({
        [_jsIterator]: dart.dynamic,
        [_current$0]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return SyncIterator;
  });
  _js_helper.SyncIterator = SyncIterator();
  const _generator = Symbol('_generator');
  const _args = Symbol('_args');
  collection.IterableBase$ = dart.generic(E => {
    class IterableBase extends core.Iterable$(E) {
      new() {
        super.new();
      }
      static iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
        if (leftDelimiter === void 0) leftDelimiter = '(';
        if (rightDelimiter === void 0) rightDelimiter = ')';
        if (dart.test(collection._isToStringVisiting(iterable))) {
          if (leftDelimiter == "(" && rightDelimiter == ")") {
            return "(...)";
          }
          return dart.str`${leftDelimiter}...${rightDelimiter}`;
        }
        let parts = [];
        collection._toStringVisiting[dartx.add](iterable);
        try {
          collection._iterablePartsToStrings(iterable, parts);
        } finally {
          dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
          collection._toStringVisiting[dartx.removeLast]();
        }
        return (() => {
          let _ = new core.StringBuffer(leftDelimiter);
          _.writeAll(parts, ", ");
          _.write(rightDelimiter);
          return _;
        })().toString();
      }
      static iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
        if (leftDelimiter === void 0) leftDelimiter = '(';
        if (rightDelimiter === void 0) rightDelimiter = ')';
        if (dart.test(collection._isToStringVisiting(iterable))) {
          return dart.str`${leftDelimiter}...${rightDelimiter}`;
        }
        let buffer = new core.StringBuffer(leftDelimiter);
        collection._toStringVisiting[dartx.add](iterable);
        try {
          buffer.writeAll(iterable, ", ");
        } finally {
          dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
          collection._toStringVisiting[dartx.removeLast]();
        }
        buffer.write(rightDelimiter);
        return buffer.toString();
      }
    }
    dart.setSignature(IterableBase, {
      constructors: () => ({new: dart.definiteFunctionType(collection.IterableBase$(E), [])}),
      statics: () => ({
        iterableToShortString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String]),
        iterableToFullString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String])
      }),
      names: ['iterableToShortString', 'iterableToFullString']
    });
    return IterableBase;
  });
  collection.IterableBase = IterableBase();
  _js_helper.SyncIterable$ = dart.generic(E => {
    let SyncIteratorOfE = () => (SyncIteratorOfE = dart.constFn(_js_helper.SyncIterator$(E)))();
    class SyncIterable extends collection.IterableBase$(E) {
      new(generator, args) {
        this[_generator] = generator;
        this[_args] = args;
        super.new();
      }
      [_jsIterator]() {
        return this[_generator](...this[_args]);
      }
      get iterator() {
        return new (SyncIteratorOfE())(this[_jsIterator]());
      }
    }
    dart.setSignature(SyncIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterable$(E), [dart.dynamic, dart.dynamic])}),
      fields: () => ({
        [_generator]: dart.dynamic,
        [_args]: dart.dynamic
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({[_jsIterator]: dart.definiteFunctionType(dart.dynamic, [])})
    });
    dart.defineExtensionMembers(SyncIterable, ['iterator']);
    return SyncIterable;
  });
  _js_helper.SyncIterable = SyncIterable();
  core.AssertionError = class AssertionError extends core.Error {
    new() {
      super.new();
    }
    toString() {
      return "Assertion failed";
    }
  };
  dart.setSignature(core.AssertionError, {
    constructors: () => ({new: dart.definiteFunctionType(core.AssertionError, [])})
  });
  _js_helper.BooleanConversionAssertionError = class BooleanConversionAssertionError extends core.AssertionError {
    new() {
      super.new();
    }
    toString() {
      return 'Failed assertion: boolean expression must not be null';
    }
  };
  _js_helper.NoThrows = class NoThrows extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper.NoThrows, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoThrows, [])})
  });
  _js_helper.NoInline = class NoInline extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper.NoInline, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoInline, [])})
  });
  _js_helper.Native = class Native extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_js_helper.Native, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Native, [core.String])}),
    fields: () => ({name: core.String})
  });
  _js_helper.JsPeerInterface = class JsPeerInterface extends core.Object {
    new(opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      this.name = name;
    }
  };
  dart.setSignature(_js_helper.JsPeerInterface, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsPeerInterface, [], {name: core.String})}),
    fields: () => ({name: core.String})
  });
  _js_helper.SupportJsExtensionMethods = class SupportJsExtensionMethods extends core.Object {
    new() {
    }
  };
  dart.setSignature(_js_helper.SupportJsExtensionMethods, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.SupportJsExtensionMethods, [])})
  });
  const _length$0 = Symbol('_length');
  const _strings = Symbol('_strings');
  const _nums = Symbol('_nums');
  const _rest = Symbol('_rest');
  const _first = Symbol('_first');
  const _last = Symbol('_last');
  const _modifications = Symbol('_modifications');
  const _containsTableEntry = Symbol('_containsTableEntry');
  const _getBucket = Symbol('_getBucket');
  const _getTableCell = Symbol('_getTableCell');
  const _newHashTable = Symbol('_newHashTable');
  const _addHashTableEntry = Symbol('_addHashTableEntry');
  const _getTableBucket = Symbol('_getTableBucket');
  const _newLinkedCell = Symbol('_newLinkedCell');
  const _setTableEntry = Symbol('_setTableEntry');
  const _removeHashTableEntry = Symbol('_removeHashTableEntry');
  const _unlinkCell = Symbol('_unlinkCell');
  const _modified = Symbol('_modified');
  const _next = Symbol('_next');
  const _deleteTableEntry = Symbol('_deleteTableEntry');
  const _previous = Symbol('_previous');
  _js_helper.JsLinkedHashMap$ = dart.generic((K, V) => {
    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
    let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
    let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
    let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
    let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    class JsLinkedHashMap extends core.Object {
      new() {
        this[_length$0] = 0;
        this[_strings] = null;
        this[_nums] = null;
        this[_rest] = null;
        this[_first] = null;
        this[_last] = null;
        this[_modifications] = 0;
      }
      static es6() {
        return new (JsLinkedHashMapOfK$V())();
      }
      get length() {
        return this[_length$0];
      }
      get isEmpty() {
        return this[_length$0] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      get keys() {
        return new (LinkedHashMapKeyIterableOfK())(this);
      }
      get values() {
        return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
      }
      containsKey(key) {
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          let strings = this[_strings];
          if (strings == null) return false;
          return this[_containsTableEntry](strings, key);
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          let nums = this[_nums];
          if (nums == null) return false;
          return this[_containsTableEntry](nums, key);
        } else {
          return this.internalContainsKey(key);
        }
      }
      internalContainsKey(key) {
        let rest = this[_rest];
        if (rest == null) return false;
        let bucket = this[_getBucket](rest, key);
        return dart.notNull(this.internalFindBucketIndex(bucket, key)) >= 0;
      }
      containsValue(value) {
        return this.keys[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      _get(key) {
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          let strings = this[_strings];
          if (strings == null) return null;
          let cell = this[_getTableCell](strings, key);
          return cell == null ? null : cell.hashMapCellValue;
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          let nums = this[_nums];
          if (nums == null) return null;
          let cell = this[_getTableCell](nums, key);
          return cell == null ? null : cell.hashMapCellValue;
        } else {
          return this.internalGet(key);
        }
      }
      internalGet(key) {
        let rest = this[_rest];
        if (rest == null) return null;
        let bucket = this[_getBucket](rest, key);
        let index = this.internalFindBucketIndex(bucket, key);
        if (dart.notNull(index) < 0) return null;
        let cell = bucket[index];
        return cell.hashMapCellValue;
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          let strings = this[_strings];
          if (strings == null) this[_strings] = strings = this[_newHashTable]();
          this[_addHashTableEntry](strings, key, value);
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          let nums = this[_nums];
          if (nums == null) this[_nums] = nums = this[_newHashTable]();
          this[_addHashTableEntry](nums, key, value);
        } else {
          this.internalSet(key, value);
        }
        return value;
      }
      internalSet(key, value) {
        K._check(key);
        V._check(value);
        let rest = this[_rest];
        if (rest == null) this[_rest] = rest = this[_newHashTable]();
        let hash = this.internalComputeHashCode(key);
        let bucket = this[_getTableBucket](rest, hash);
        if (bucket == null) {
          let cell = this[_newLinkedCell](key, value);
          this[_setTableEntry](rest, hash, [cell]);
        } else {
          let index = this.internalFindBucketIndex(bucket, key);
          if (dart.notNull(index) >= 0) {
            let cell = bucket[index];
            cell.hashMapCellValue = value;
          } else {
            let cell = this[_newLinkedCell](key, value);
            bucket.push(cell);
          }
        }
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) return this._get(key);
        let value = ifAbsent();
        this._set(key, value);
        return value;
      }
      remove(key) {
        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
          return this[_removeHashTableEntry](this[_strings], key);
        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
          return this[_removeHashTableEntry](this[_nums], key);
        } else {
          return this.internalRemove(key);
        }
      }
      internalRemove(key) {
        let rest = this[_rest];
        if (rest == null) return null;
        let bucket = this[_getBucket](rest, key);
        let index = this.internalFindBucketIndex(bucket, key);
        if (dart.notNull(index) < 0) return null;
        let cell = bucket.splice(index, 1)[0];
        this[_unlinkCell](cell);
        return cell.hashMapCellValue;
      }
      clear() {
        if (dart.notNull(this[_length$0]) > 0) {
          this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
          this[_length$0] = 0;
          this[_modified]();
        }
      }
      forEach(action) {
        let cell = this[_first];
        let modifications = this[_modifications];
        while (cell != null) {
          action(cell.hashMapCellKey, cell.hashMapCellValue);
          if (modifications != this[_modifications]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          cell = cell[_next];
        }
      }
      [_addHashTableEntry](table, key, value) {
        K._check(key);
        V._check(value);
        let cell = this[_getTableCell](table, key);
        if (cell == null) {
          this[_setTableEntry](table, key, this[_newLinkedCell](key, value));
        } else {
          cell.hashMapCellValue = value;
        }
      }
      [_removeHashTableEntry](table, key) {
        if (table == null) return null;
        let cell = this[_getTableCell](table, key);
        if (cell == null) return null;
        this[_unlinkCell](cell);
        this[_deleteTableEntry](table, key);
        return cell.hashMapCellValue;
      }
      [_modified]() {
        this[_modifications] = dart.notNull(this[_modifications]) + 1 & 67108863;
      }
      [_newLinkedCell](key, value) {
        K._check(key);
        V._check(value);
        let cell = new (LinkedHashMapCellOfK$V())(key, value);
        if (this[_first] == null) {
          this[_first] = this[_last] = cell;
        } else {
          let last = this[_last];
          cell[_previous] = last;
          this[_last] = last[_next] = cell;
        }
        this[_length$0] = dart.notNull(this[_length$0]) + 1;
        this[_modified]();
        return cell;
      }
      [_unlinkCell](cell) {
        LinkedHashMapCellOfK$V()._check(cell);
        let previous = cell[_previous];
        let next = cell[_next];
        if (previous == null) {
          dart.assert(dart.equals(cell, this[_first]));
          this[_first] = next;
        } else {
          previous[_next] = next;
        }
        if (next == null) {
          dart.assert(dart.equals(cell, this[_last]));
          this[_last] = previous;
        } else {
          next[_previous] = previous;
        }
        this[_length$0] = dart.notNull(this[_length$0]) - 1;
        this[_modified]();
      }
      static _isStringKey(key) {
        return typeof key == 'string';
      }
      static _isNumericKey(key) {
        return typeof key == 'number' && (key & 0x3ffffff) === key;
      }
      internalComputeHashCode(key) {
        return dart.hashCode(key) & 0x3ffffff;
      }
      [_getBucket](table, key) {
        let hash = this.internalComputeHashCode(key);
        return this[_getTableBucket](table, hash);
      }
      internalFindBucketIndex(bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.equals(cell.hashMapCellKey, key)) return i;
        }
        return -1;
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
      [_getTableCell](table, key) {
        return table[key];
      }
      [_getTableBucket](table, key) {
        return table[key];
      }
      [_setTableEntry](table, key, value) {
        dart.assert(value != null);
        table[key] = value;
      }
      [_deleteTableEntry](table, key) {
        delete table[key];
      }
      [_containsTableEntry](table, key) {
        let cell = this[_getTableCell](table, key);
        return cell != null;
      }
      [_newHashTable]() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        this[_setTableEntry](table, temporaryKey, table);
        this[_deleteTableEntry](table, temporaryKey);
        return table;
      }
    }
    dart.addTypeTests(JsLinkedHashMap);
    JsLinkedHashMap[dart.implements] = () => [LinkedHashMapOfK$V(), InternalMapOfK$V()];
    dart.setSignature(JsLinkedHashMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), []),
        es6: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), [])
      }),
      fields: () => ({
        [_length$0]: core.int,
        [_strings]: dart.dynamic,
        [_nums]: dart.dynamic,
        [_rest]: dart.dynamic,
        [_first]: LinkedHashMapCellOfK$V(),
        [_last]: LinkedHashMapCellOfK$V(),
        [_modifications]: core.int
      }),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        internalContainsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        internalGet: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        internalSet: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        internalRemove: dart.definiteFunctionType(V, [core.Object]),
        clear: dart.definiteFunctionType(dart.void, []),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        [_addHashTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
        [_removeHashTableEntry]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
        [_modified]: dart.definiteFunctionType(dart.void, []),
        [_newLinkedCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V]),
        [_unlinkCell]: dart.definiteFunctionType(dart.void, [LinkedHashMapCellOfK$V()]),
        internalComputeHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
        internalFindBucketIndex: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
        [_getTableCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [dart.dynamic, dart.dynamic]),
        [_getTableBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
        [_setTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        [_deleteTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        [_containsTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
        [_newHashTable]: dart.definiteFunctionType(dart.dynamic, [])
      }),
      statics: () => ({
        _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic])
      }),
      names: ['_isStringKey', '_isNumericKey']
    });
    dart.defineExtensionMembers(JsLinkedHashMap, [
      'containsKey',
      'containsValue',
      'addAll',
      '_get',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'forEach',
      'length',
      'isEmpty',
      'isNotEmpty',
      'keys',
      'values'
    ]);
    return JsLinkedHashMap;
  });
  _js_helper.JsLinkedHashMap = JsLinkedHashMap();
  _js_helper.Es6LinkedHashMap$ = dart.generic((K, V) => {
    class Es6LinkedHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
      new() {
        super.new();
      }
      [_getTableCell](table, key) {
        return table.get(key);
      }
      [_getTableBucket](table, key) {
        return table.get(key);
      }
      [_setTableEntry](table, key, value) {
        table.set(key, value);
      }
      [_deleteTableEntry](table, key) {
        table.delete(key);
      }
      [_containsTableEntry](table, key) {
        return table.has(key);
      }
      [_newHashTable]() {
        return new Map();
      }
    }
    dart.setSignature(Es6LinkedHashMap, {
      methods: () => ({
        [_getTableCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [dart.dynamic, dart.dynamic]),
        [_getTableBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic])
      })
    });
    return Es6LinkedHashMap;
  });
  _js_helper.Es6LinkedHashMap = Es6LinkedHashMap();
  _js_helper.LinkedHashMapCell$ = dart.generic((K, V) => {
    let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
    class LinkedHashMapCell extends core.Object {
      new(hashMapCellKey, hashMapCellValue) {
        this.hashMapCellKey = hashMapCellKey;
        this.hashMapCellValue = hashMapCellValue;
        this[_next] = null;
        this[_previous] = null;
      }
    }
    dart.addTypeTests(LinkedHashMapCell);
    dart.setSignature(LinkedHashMapCell, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V])}),
      fields: () => ({
        hashMapCellKey: K,
        hashMapCellValue: V,
        [_next]: LinkedHashMapCellOfK$V(),
        [_previous]: LinkedHashMapCellOfK$V()
      })
    });
    return LinkedHashMapCell;
  });
  _js_helper.LinkedHashMapCell = LinkedHashMapCell();
  const _map = Symbol('_map');
  _js_helper.LinkedHashMapKeyIterable$ = dart.generic(E => {
    let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
    class LinkedHashMapKeyIterable extends core.Iterable$(E) {
      new(map) {
        this[_map] = map;
        super.new();
      }
      get length() {
        return this[_map][_length$0];
      }
      get isEmpty() {
        return this[_map][_length$0] == 0;
      }
      get iterator() {
        return new (LinkedHashMapKeyIteratorOfE())(this[_map], this[_map][_modifications]);
      }
      contains(element) {
        return this[_map].containsKey(element);
      }
      forEach(f) {
        let cell = this[_map][_first];
        let modifications = this[_map][_modifications];
        while (cell != null) {
          f(cell.hashMapCellKey);
          if (modifications != this[_map][_modifications]) {
            dart.throw(new core.ConcurrentModificationError(this[_map]));
          }
          cell = cell[_next];
        }
      }
    }
    LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(LinkedHashMapKeyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterable$(E), [JsLinkedHashMapOfE$dynamic()])}),
      fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({forEach: dart.definiteFunctionType(dart.void, [ETovoid()])})
    });
    dart.defineExtensionMembers(LinkedHashMapKeyIterable, [
      'contains',
      'forEach',
      'length',
      'isEmpty',
      'iterator'
    ]);
    return LinkedHashMapKeyIterable;
  });
  _js_helper.LinkedHashMapKeyIterable = LinkedHashMapKeyIterable();
  const _cell = Symbol('_cell');
  _js_helper.LinkedHashMapKeyIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
    let LinkedHashMapCellOfE$dynamic = () => (LinkedHashMapCellOfE$dynamic = dart.constFn(_js_helper.LinkedHashMapCell$(E, dart.dynamic)))();
    class LinkedHashMapKeyIterator extends core.Object {
      new(map, modifications) {
        this[_map] = map;
        this[_modifications] = modifications;
        this[_cell] = null;
        this[_current$0] = null;
        this[_cell] = this[_map][_first];
      }
      get current() {
        return this[_current$0];
      }
      moveNext() {
        if (this[_modifications] != this[_map][_modifications]) {
          dart.throw(new core.ConcurrentModificationError(this[_map]));
        } else if (this[_cell] == null) {
          this[_current$0] = null;
          return false;
        } else {
          this[_current$0] = this[_cell].hashMapCellKey;
          this[_cell] = this[_cell][_next];
          return true;
        }
      }
    }
    dart.addTypeTests(LinkedHashMapKeyIterator);
    LinkedHashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(LinkedHashMapKeyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterator$(E), [JsLinkedHashMapOfE$dynamic(), core.int])}),
      fields: () => ({
        [_map]: JsLinkedHashMapOfE$dynamic(),
        [_modifications]: core.int,
        [_cell]: LinkedHashMapCellOfE$dynamic(),
        [_current$0]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return LinkedHashMapKeyIterator;
  });
  _js_helper.LinkedHashMapKeyIterator = LinkedHashMapKeyIterator();
  _js_helper.defineProperty = function(obj, property, value) {
    Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
  };
  dart.lazyFn(_js_helper.defineProperty, () => dynamicAndStringAnddynamicTovoid());
  _js_helper.convertDartClosureToJS = function(F) {
    return (closure, arity) => {
      return closure;
    };
  };
  dart.fn(_js_helper.convertDartClosureToJS, FAndintToF());
  _js_helper.setNativeSubclassDispatchRecord = function(proto, interceptor) {
  };
  dart.fn(_js_helper.setNativeSubclassDispatchRecord, dynamicAnddynamicTodynamic$());
  _js_helper.findDispatchTagForInterceptorClass = function(interceptorClassConstructor) {
  };
  dart.fn(_js_helper.findDispatchTagForInterceptorClass, dynamicTodynamic$());
  _js_helper.makeLeafDispatchRecord = function(interceptor) {
  };
  dart.fn(_js_helper.makeLeafDispatchRecord, dynamicTodynamic$());
  const _nativeRegExp = Symbol('_nativeRegExp');
  _js_helper.regExpGetNative = function(regexp) {
    return regexp[_nativeRegExp];
  };
  dart.lazyFn(_js_helper.regExpGetNative, () => JSSyntaxRegExpTodynamic());
  const _nativeGlobalVersion = Symbol('_nativeGlobalVersion');
  _js_helper.regExpGetGlobalNative = function(regexp) {
    let nativeRegexp = regexp[_nativeGlobalVersion];
    nativeRegexp.lastIndex = 0;
    return nativeRegexp;
  };
  dart.lazyFn(_js_helper.regExpGetGlobalNative, () => JSSyntaxRegExpTodynamic());
  const _nativeAnchoredVersion = Symbol('_nativeAnchoredVersion');
  _js_helper.regExpCaptureCount = function(regexp) {
    let nativeAnchoredRegExp = regexp[_nativeAnchoredVersion];
    let match = nativeAnchoredRegExp.exec('');
    return core.int._check(dart.dsend(dart.dload(match, 'length'), '-', 2));
  };
  dart.lazyFn(_js_helper.regExpCaptureCount, () => JSSyntaxRegExpToint());
  const _nativeGlobalRegExp = Symbol('_nativeGlobalRegExp');
  const _nativeAnchoredRegExp = Symbol('_nativeAnchoredRegExp');
  const _isMultiLine = Symbol('_isMultiLine');
  const _isCaseSensitive = Symbol('_isCaseSensitive');
  const _execGlobal = Symbol('_execGlobal');
  const _execAnchored = Symbol('_execAnchored');
  _js_helper.JSSyntaxRegExp = class JSSyntaxRegExp extends core.Object {
    toString() {
      return dart.str`RegExp/${this.pattern}/`;
    }
    new(source, opts) {
      let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
      let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
      this.pattern = source;
      this[_nativeRegExp] = _js_helper.JSSyntaxRegExp.makeNative(source, multiLine, caseSensitive, false);
      this[_nativeGlobalRegExp] = null;
      this[_nativeAnchoredRegExp] = null;
    }
    get [_nativeGlobalVersion]() {
      if (this[_nativeGlobalRegExp] != null) return this[_nativeGlobalRegExp];
      return this[_nativeGlobalRegExp] = _js_helper.JSSyntaxRegExp.makeNative(this.pattern, this[_isMultiLine], this[_isCaseSensitive], true);
    }
    get [_nativeAnchoredVersion]() {
      if (this[_nativeAnchoredRegExp] != null) return this[_nativeAnchoredRegExp];
      return this[_nativeAnchoredRegExp] = _js_helper.JSSyntaxRegExp.makeNative(dart.str`${this.pattern}|()`, this[_isMultiLine], this[_isCaseSensitive], true);
    }
    get [_isMultiLine]() {
      return this[_nativeRegExp].multiline;
    }
    get [_isCaseSensitive]() {
      return !this[_nativeRegExp].ignoreCase;
    }
    static makeNative(source, multiLine, caseSensitive, global) {
      _js_helper.checkString(source);
      let m = dart.test(multiLine) ? 'm' : '';
      let i = dart.test(caseSensitive) ? '' : 'i';
      let g = dart.test(global) ? 'g' : '';
      let regexp = (function() {
        try {
          return new RegExp(source, m + i + g);
        } catch (e) {
          return e;
        }

      })();
      if (regexp instanceof RegExp) return regexp;
      let errorMessage = String(regexp);
      dart.throw(new core.FormatException(dart.str`Illegal RegExp pattern: ${source}, ${errorMessage}`));
    }
    firstMatch(string) {
      let m = this[_nativeRegExp].exec(_js_helper.checkString(string));
      if (m == null) return null;
      return new _js_helper._MatchImplementation(this, m);
    }
    hasMatch(string) {
      return this[_nativeRegExp].test(_js_helper.checkString(string));
    }
    stringMatch(string) {
      let match = this.firstMatch(string);
      if (match != null) return match.group(0);
      return null;
    }
    allMatches(string, start) {
      if (start === void 0) start = 0;
      _js_helper.checkString(string);
      _js_helper.checkInt(start);
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      return new _js_helper._AllMatchesIterable(this, string, start);
    }
    [_execGlobal](string, start) {
      let regexp = this[_nativeGlobalVersion];
      regexp.lastIndex = start;
      let match = regexp.exec(string);
      if (match == null) return null;
      return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
    }
    [_execAnchored](string, start) {
      let regexp = this[_nativeAnchoredVersion];
      regexp.lastIndex = start;
      let match = regexp.exec(string);
      if (match == null) return null;
      if (match[dartx._get](dart.notNull(match[dartx.length]) - 1) != null) return null;
      match[dartx.length] = dart.notNull(match[dartx.length]) - 1;
      return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
    }
    matchAsPrefix(string, start) {
      if (start === void 0) start = 0;
      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
      }
      return this[_execAnchored](string, start);
    }
    get isMultiLine() {
      return this[_isMultiLine];
    }
    get isCaseSensitive() {
      return this[_isCaseSensitive];
    }
  };
  _js_helper.JSSyntaxRegExp[dart.implements] = () => [core.RegExp];
  dart.setSignature(_js_helper.JSSyntaxRegExp, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSSyntaxRegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})}),
    fields: () => ({
      pattern: core.String,
      [_nativeRegExp]: dart.dynamic,
      [_nativeGlobalRegExp]: dart.dynamic,
      [_nativeAnchoredRegExp]: dart.dynamic
    }),
    getters: () => ({
      [_nativeGlobalVersion]: dart.definiteFunctionType(dart.dynamic, []),
      [_nativeAnchoredVersion]: dart.definiteFunctionType(dart.dynamic, []),
      [_isMultiLine]: dart.definiteFunctionType(core.bool, []),
      [_isCaseSensitive]: dart.definiteFunctionType(core.bool, []),
      isMultiLine: dart.definiteFunctionType(core.bool, []),
      isCaseSensitive: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      firstMatch: dart.definiteFunctionType(core.Match, [core.String]),
      hasMatch: dart.definiteFunctionType(core.bool, [core.String]),
      stringMatch: dart.definiteFunctionType(core.String, [core.String]),
      allMatches: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
      [_execGlobal]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
      [_execAnchored]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
      matchAsPrefix: dart.definiteFunctionType(core.Match, [core.String], [core.int])
    }),
    statics: () => ({makeNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool, core.bool, core.bool])}),
    names: ['makeNative']
  });
  dart.defineExtensionMembers(_js_helper.JSSyntaxRegExp, ['allMatches', 'matchAsPrefix']);
  const _match = Symbol('_match');
  _js_helper._MatchImplementation = class _MatchImplementation extends core.Object {
    new(pattern, match) {
      this.pattern = pattern;
      this[_match] = match;
      dart.assert(typeof this[_match].input == 'string');
      dart.assert(typeof this[_match].index == 'number');
    }
    get input() {
      return this[_match].input;
    }
    get start() {
      return this[_match].index;
    }
    get end() {
      return dart.notNull(this.start) + dart.notNull(this[_match][dartx._get](0)[dartx.length]);
    }
    group(index) {
      return this[_match][dartx._get](index);
    }
    _get(index) {
      return this.group(index);
    }
    get groupCount() {
      return dart.notNull(this[_match][dartx.length]) - 1;
    }
    groups(groups) {
      let out = JSArrayOfString().of([]);
      for (let i of groups) {
        out[dartx.add](this.group(i));
      }
      return out;
    }
  };
  _js_helper._MatchImplementation[dart.implements] = () => [core.Match];
  dart.setSignature(_js_helper._MatchImplementation, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._MatchImplementation, [core.Pattern, ListOfString()])}),
    fields: () => ({
      pattern: core.Pattern,
      [_match]: ListOfString()
    }),
    getters: () => ({
      input: dart.definiteFunctionType(core.String, []),
      start: dart.definiteFunctionType(core.int, []),
      end: dart.definiteFunctionType(core.int, []),
      groupCount: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      group: dart.definiteFunctionType(core.String, [core.int]),
      _get: dart.definiteFunctionType(core.String, [core.int]),
      groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
    })
  });
  const _re = Symbol('_re');
  const _string$ = Symbol('_string');
  const _start$ = Symbol('_start');
  core.Match = class Match extends core.Object {};
  _js_helper._AllMatchesIterable = class _AllMatchesIterable extends collection.IterableBase$(core.Match) {
    new(re, string, start) {
      this[_re] = re;
      this[_string$] = string;
      this[_start$] = start;
      super.new();
    }
    get iterator() {
      return new _js_helper._AllMatchesIterator(this[_re], this[_string$], this[_start$]);
    }
  };
  dart.addSimpleTypeTests(_js_helper._AllMatchesIterable);
  dart.setSignature(_js_helper._AllMatchesIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterable, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
    fields: () => ({
      [_re]: _js_helper.JSSyntaxRegExp,
      [_string$]: core.String,
      [_start$]: core.int
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
  });
  dart.defineExtensionMembers(_js_helper._AllMatchesIterable, ['iterator']);
  const _regExp = Symbol('_regExp');
  const _nextIndex = Symbol('_nextIndex');
  _js_helper._AllMatchesIterator = class _AllMatchesIterator extends core.Object {
    new(regExp, string, nextIndex) {
      this[_regExp] = regExp;
      this[_string$] = string;
      this[_nextIndex] = nextIndex;
      this[_current$0] = null;
    }
    get current() {
      return this[_current$0];
    }
    moveNext() {
      if (this[_string$] == null) return false;
      if (dart.notNull(this[_nextIndex]) <= dart.notNull(this[_string$][dartx.length])) {
        let match = this[_regExp][_execGlobal](this[_string$], this[_nextIndex]);
        if (match != null) {
          this[_current$0] = match;
          let nextIndex = match.end;
          if (match.start == nextIndex) {
            nextIndex = dart.notNull(nextIndex) + 1;
          }
          this[_nextIndex] = nextIndex;
          return true;
        }
      }
      this[_current$0] = null;
      this[_string$] = null;
      return false;
    }
  };
  _js_helper._AllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
  dart.setSignature(_js_helper._AllMatchesIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterator, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
    fields: () => ({
      [_regExp]: _js_helper.JSSyntaxRegExp,
      [_string$]: core.String,
      [_nextIndex]: core.int,
      [_current$0]: core.Match
    }),
    getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  _js_helper.firstMatchAfter = function(regExp, string, start) {
    return regExp[_execGlobal](string, start);
  };
  dart.lazyFn(_js_helper.firstMatchAfter, () => JSSyntaxRegExpAndStringAndintToMatch());
  _js_helper.stringIndexOfStringUnchecked = function(receiver, other, startIndex) {
    return receiver.indexOf(other, startIndex);
  };
  dart.fn(_js_helper.stringIndexOfStringUnchecked, dynamicAnddynamicAnddynamicToint());
  _js_helper.substring1Unchecked = function(receiver, startIndex) {
    return receiver.substring(startIndex);
  };
  dart.lazyFn(_js_helper.substring1Unchecked, () => dynamicAnddynamicToString());
  _js_helper.substring2Unchecked = function(receiver, startIndex, endIndex) {
    return receiver.substring(startIndex, endIndex);
  };
  dart.lazyFn(_js_helper.substring2Unchecked, () => dynamicAnddynamicAnddynamicToString());
  _js_helper.stringContainsStringUnchecked = function(receiver, other, startIndex) {
    return dart.notNull(_js_helper.stringIndexOfStringUnchecked(receiver, other, startIndex)) >= 0;
  };
  dart.lazyFn(_js_helper.stringContainsStringUnchecked, () => dynamicAnddynamicAnddynamicTobool());
  _js_helper.StringMatch = class StringMatch extends core.Object {
    new(start, input, pattern) {
      this.start = start;
      this.input = input;
      this.pattern = pattern;
    }
    get end() {
      return dart.notNull(this.start) + dart.notNull(this.pattern[dartx.length]);
    }
    _get(g) {
      return this.group(g);
    }
    get groupCount() {
      return 0;
    }
    group(group_) {
      if (group_ != 0) {
        dart.throw(new core.RangeError.value(group_));
      }
      return this.pattern;
    }
    groups(groups_) {
      let result = ListOfString().new();
      for (let g of groups_) {
        result[dartx.add](this.group(g));
      }
      return result;
    }
  };
  _js_helper.StringMatch[dart.implements] = () => [core.Match];
  dart.setSignature(_js_helper.StringMatch, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StringMatch, [core.int, core.String, core.String])}),
    fields: () => ({
      start: core.int,
      input: core.String,
      pattern: core.String
    }),
    getters: () => ({
      end: dart.definiteFunctionType(core.int, []),
      groupCount: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(core.String, [core.int]),
      group: dart.definiteFunctionType(core.String, [core.int]),
      groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
    })
  });
  _js_helper.allMatchesInStringUnchecked = function(pattern, string, startIndex) {
    return new _js_helper._StringAllMatchesIterable(string, pattern, startIndex);
  };
  dart.lazyFn(_js_helper.allMatchesInStringUnchecked, () => StringAndStringAndintToIterableOfMatch());
  const _input = Symbol('_input');
  const _pattern = Symbol('_pattern');
  const _index$0 = Symbol('_index');
  _js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
    new(input, pattern, index) {
      this[_input] = input;
      this[_pattern] = pattern;
      this[_index$0] = index;
      super.new();
    }
    get iterator() {
      return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index$0]);
    }
    get first() {
      let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
      if (dart.notNull(index) >= 0) {
        return new _js_helper.StringMatch(index, this[_input], this[_pattern]);
      }
      dart.throw(_internal.IterableElementError.noElement());
    }
  };
  dart.addSimpleTypeTests(_js_helper._StringAllMatchesIterable);
  dart.setSignature(_js_helper._StringAllMatchesIterable, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterable, [core.String, core.String, core.int])}),
    fields: () => ({
      [_input]: core.String,
      [_pattern]: core.String,
      [_index$0]: core.int
    }),
    getters: () => ({
      iterator: dart.definiteFunctionType(core.Iterator$(core.Match), []),
      first: dart.definiteFunctionType(core.Match, [])
    })
  });
  dart.defineExtensionMembers(_js_helper._StringAllMatchesIterable, ['iterator', 'first']);
  _js_helper._StringAllMatchesIterator = class _StringAllMatchesIterator extends core.Object {
    new(input, pattern, index) {
      this[_input] = input;
      this[_pattern] = pattern;
      this[_index$0] = index;
      this[_current$0] = null;
    }
    moveNext() {
      if (dart.notNull(this[_index$0]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
        this[_current$0] = null;
        return false;
      }
      let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
      if (dart.notNull(index) < 0) {
        this[_index$0] = dart.notNull(this[_input][dartx.length]) + 1;
        this[_current$0] = null;
        return false;
      }
      let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
      this[_current$0] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
      if (end == this[_index$0]) end++;
      this[_index$0] = end;
      return true;
    }
    get current() {
      return this[_current$0];
    }
  };
  _js_helper._StringAllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
  dart.setSignature(_js_helper._StringAllMatchesIterator, {
    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterator, [core.String, core.String, core.int])}),
    fields: () => ({
      [_input]: core.String,
      [_pattern]: core.String,
      [_index$0]: core.int,
      [_current$0]: core.Match
    }),
    getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  _js_helper.stringContainsUnchecked = function(receiver, other, startIndex) {
    if (typeof other == 'string') {
      return _js_helper.stringContainsStringUnchecked(receiver, other, startIndex);
    } else if (_js_helper.JSSyntaxRegExp.is(other)) {
      return other.hasMatch(receiver[dartx.substring](startIndex));
    } else {
      let substr = receiver[dartx.substring](startIndex);
      return core.bool._check(dart.dload(dart.dsend(other, 'allMatches', substr), 'isNotEmpty'));
    }
  };
  dart.lazyFn(_js_helper.stringContainsUnchecked, () => StringAnddynamicAndintTobool());
  _js_helper.stringReplaceJS = function(receiver, replacer, replacement) {
    replacement = replacement.replace(/\$/g, "$$$$");
    return receiver.replace(replacer, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceJS, () => dynamicAnddynamicAnddynamicToString());
  _js_helper.stringReplaceFirstRE = function(receiver, regexp, replacement, startIndex) {
    let match = regexp[_execGlobal](receiver, startIndex);
    if (match == null) return receiver;
    let start = match.start;
    let end = match.end;
    return _js_helper.stringReplaceRangeUnchecked(receiver, start, end, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceFirstRE, () => StringAndJSSyntaxRegExpAndString__ToString());
  _js_helper.quoteStringForRegExp = function(string) {
    return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
  };
  dart.lazyFn(_js_helper.quoteStringForRegExp, () => dynamicToString());
  _js_helper.stringReplaceAllUnchecked = function(receiver, pattern, replacement) {
    _js_helper.checkString(replacement);
    if (typeof pattern == 'string') {
      if (pattern == "") {
        if (receiver == "") {
          return replacement;
        } else {
          let result = new core.StringBuffer();
          let length = receiver[dartx.length];
          result.write(replacement);
          for (let i = 0; i < dart.notNull(length); i++) {
            result.write(receiver[dartx._get](i));
            result.write(replacement);
          }
          return result.toString();
        }
      } else {
        let quoted = _js_helper.quoteStringForRegExp(pattern);
        let replacer = new RegExp(quoted, 'g');
        return _js_helper.stringReplaceJS(receiver, replacer, replacement);
      }
    } else if (_js_helper.JSSyntaxRegExp.is(pattern)) {
      let re = _js_helper.regExpGetGlobalNative(pattern);
      return _js_helper.stringReplaceJS(receiver, re, replacement);
    } else {
      _js_helper.checkNull(pattern);
      dart.throw("String.replaceAll(Pattern) UNIMPLEMENTED");
    }
  };
  dart.lazyFn(_js_helper.stringReplaceAllUnchecked, () => StringAndPatternAndStringToString());
  _js_helper._matchString = function(match) {
    return match._get(0);
  };
  dart.lazyFn(_js_helper._matchString, () => MatchToString$());
  _js_helper._stringIdentity = function(string) {
    return string;
  };
  dart.lazyFn(_js_helper._stringIdentity, () => StringToString$());
  _js_helper.stringReplaceAllFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
    if (onMatch == null) onMatch = _js_helper._matchString;
    if (onNonMatch == null) onNonMatch = _js_helper._stringIdentity;
    if (typeof pattern == 'string') {
      return _js_helper.stringReplaceAllStringFuncUnchecked(receiver, pattern, onMatch, onNonMatch);
    }
    if (!core.Pattern.is(pattern)) {
      dart.throw(new core.ArgumentError.value(pattern, 'pattern', 'is not a Pattern'));
    }
    let buffer = new core.StringBuffer();
    let startIndex = 0;
    for (let match of pattern[dartx.allMatches](receiver)) {
      buffer.write(onNonMatch(receiver[dartx.substring](startIndex, match.start)));
      buffer.write(onMatch(match));
      startIndex = match.end;
    }
    buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
    return buffer.toString();
  };
  dart.lazyFn(_js_helper.stringReplaceAllFuncUnchecked, () => StringAndPatternAndFn__ToString());
  _js_helper.stringReplaceAllEmptyFuncUnchecked = function(receiver, onMatch, onNonMatch) {
    let buffer = new core.StringBuffer();
    let length = receiver[dartx.length];
    let i = 0;
    buffer.write(onNonMatch(""));
    while (i < dart.notNull(length)) {
      buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
      let code = receiver[dartx.codeUnitAt](i);
      if ((dart.notNull(code) & ~1023) == 55296 && dart.notNull(length) > i + 1) {
        code = receiver[dartx.codeUnitAt](i + 1);
        if ((dart.notNull(code) & ~1023) == 56320) {
          buffer.write(onNonMatch(receiver[dartx.substring](i, i + 2)));
          i = i + 2;
          continue;
        }
      }
      buffer.write(onNonMatch(receiver[dartx._get](i)));
      i++;
    }
    buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
    buffer.write(onNonMatch(""));
    return buffer.toString();
  };
  dart.lazyFn(_js_helper.stringReplaceAllEmptyFuncUnchecked, () => StringAndFnAndFnToString());
  _js_helper.stringReplaceAllStringFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
    let patternLength = pattern[dartx.length];
    if (patternLength == 0) {
      return _js_helper.stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
    }
    let length = receiver[dartx.length];
    let buffer = new core.StringBuffer();
    let startIndex = 0;
    while (startIndex < dart.notNull(length)) {
      let position = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
      if (position == -1) {
        break;
      }
      buffer.write(onNonMatch(receiver[dartx.substring](startIndex, position)));
      buffer.write(onMatch(new _js_helper.StringMatch(position, receiver, pattern)));
      startIndex = dart.notNull(position) + dart.notNull(patternLength);
    }
    buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
    return buffer.toString();
  };
  dart.lazyFn(_js_helper.stringReplaceAllStringFuncUnchecked, () => StringAndStringAndFn__ToString());
  _js_helper.stringReplaceFirstUnchecked = function(receiver, pattern, replacement, startIndex) {
    if (typeof pattern == 'string') {
      let index = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
      if (dart.notNull(index) < 0) return receiver;
      let end = dart.notNull(index) + dart.notNull(pattern[dartx.length]);
      return _js_helper.stringReplaceRangeUnchecked(receiver, index, end, replacement);
    }
    if (_js_helper.JSSyntaxRegExp.is(pattern)) {
      return startIndex == 0 ? _js_helper.stringReplaceJS(receiver, _js_helper.regExpGetNative(pattern), replacement) : _js_helper.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
    }
    _js_helper.checkNull(pattern);
    let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
    if (!dart.test(matches.moveNext())) return receiver;
    let match = matches.current;
    return receiver[dartx.replaceRange](match.start, match.end, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceFirstUnchecked, () => StringAndPatternAndString__ToString());
  _js_helper.stringReplaceFirstMappedUnchecked = function(receiver, pattern, replace, startIndex) {
    let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
    if (!dart.test(matches.moveNext())) return receiver;
    let match = matches.current;
    let replacement = dart.str`${replace(match)}`;
    return receiver[dartx.replaceRange](match.start, match.end, replacement);
  };
  dart.lazyFn(_js_helper.stringReplaceFirstMappedUnchecked, () => StringAndPatternAndFn__ToString$());
  _js_helper.stringJoinUnchecked = function(array, separator) {
    return array.join(separator);
  };
  dart.lazyFn(_js_helper.stringJoinUnchecked, () => dynamicAnddynamicToString());
  _js_helper.stringReplaceRangeUnchecked = function(receiver, start, end, replacement) {
    let prefix = receiver.substring(0, start);
    let suffix = receiver.substring(end);
    return dart.str`${prefix}${replacement}${suffix}`;
  };
  dart.lazyFn(_js_helper.stringReplaceRangeUnchecked, () => StringAndintAndint__ToString());
  _js_helper.getRuntimeType = function(object) {
    return dart.getReifiedType(object);
  };
  dart.fn(_js_helper.getRuntimeType, dynamicToType());
  _js_helper.getIndex = function(array, index) {
    dart.assert(_js_helper.isJsArray(array));
    return array[index];
  };
  dart.fn(_js_helper.getIndex, dynamicAndintTodynamic());
  _js_helper.getLength = function(array) {
    dart.assert(_js_helper.isJsArray(array));
    return array.length;
  };
  dart.fn(_js_helper.getLength, dynamicToint());
  _js_helper.isJsArray = function(value) {
    return _interceptors.JSArray.is(value);
  };
  dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
  _js_mirrors.getName = function(symbol) {
    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
  };
  dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
  _js_mirrors.getSymbol = function(name, library) {
    return dart.throw(new core.UnimplementedError("MirrorSystem.getSymbol unimplemented"));
  };
  dart.lazyFn(_js_mirrors.getSymbol, () => dynamicAnddynamicToSymbol());
  dart.defineLazy(_js_mirrors, {
    get currentJsMirrorSystem() {
      return dart.throw(new core.UnimplementedError("MirrorSystem.currentJsMirrorSystem unimplemented"));
    }
  });
  dart.defineLazy(_js_mirrors, {
    get _typeMirror() {
      return Symbol("_typeMirror");
    }
  });
  _js_mirrors.reflect = function(reflectee) {
    if (core.Function.is(reflectee)) {
      return new _js_mirrors.JsClosureMirror._(reflectee);
    } else {
      return new _js_mirrors.JsInstanceMirror._(reflectee);
    }
  };
  dart.lazyFn(_js_mirrors.reflect, () => dynamicToInstanceMirror());
  _js_mirrors.reflectType = function(key) {
    let unwrapped = _js_mirrors._unwrap(key);
    let property = Object.getOwnPropertyDescriptor(unwrapped, _js_mirrors._typeMirror);
    if (property != null) {
      return property.value;
    }
    let mirror = new _js_mirrors.JsClassMirror._(key);
    unwrapped[_js_mirrors._typeMirror] = mirror;
    return mirror;
  };
  dart.lazyFn(_js_mirrors.reflectType, () => TypeToTypeMirror());
  dart.defineLazy(_js_mirrors, {
    get _dart() {
      return dart;
    }
  });
  _js_mirrors._dload = function(obj, name) {
    return _js_mirrors._dart.dload(obj, name);
  };
  dart.lazyFn(_js_mirrors._dload, () => dynamicAndStringTodynamic());
  _js_mirrors._dput = function(obj, name, val) {
    _js_mirrors._dart.dput(obj, name, val);
  };
  dart.lazyFn(_js_mirrors._dput, () => dynamicAndStringAnddynamicTovoid());
  _js_mirrors._dcall = function(obj, args) {
    return _js_mirrors._dart.dcall(obj, ...args);
  };
  dart.lazyFn(_js_mirrors._dcall, () => dynamicAndListTodynamic());
  _js_mirrors._dsend = function(obj, name, args) {
    return _js_mirrors._dart.dsend(obj, name, ...args);
  };
  dart.lazyFn(_js_mirrors._dsend, () => dynamicAndStringAndListTodynamic());
  _js_mirrors._getGenericClass = function(obj) {
    return _js_mirrors._dart.getGenericClass(obj);
  };
  dart.fn(_js_mirrors._getGenericClass, dynamicTodynamic$());
  _js_mirrors._getGenericArgs = function(obj) {
    return _js_mirrors._dart.getGenericArgs(obj);
  };
  dart.fn(_js_mirrors._getGenericArgs, dynamicTodynamic$());
  _js_mirrors._defaultConstructorType = function(type) {
    return _js_mirrors._dart.definiteFunctionType(type, []);
  };
  dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
  _js_mirrors._getMixins = function(type) {
    return _js_mirrors._dart.getMixins(type, []);
  };
  dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
  _js_mirrors._Lazy$ = dart.generic(T => {
    const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
    return _Lazy;
  });
  _js_mirrors._Lazy = _Lazy();
  _js_mirrors._getESSymbol = function(symbol) {
    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
  };
  dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
  _js_mirrors._getMember = function(symbol) {
    let privateSymbol = _js_mirrors._getESSymbol(symbol);
    if (privateSymbol != null) {
      return privateSymbol;
    }
    return _js_mirrors.getName(symbol);
  };
  dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
  _js_mirrors._getNameForESSymbol = function(member) {
    dart.assert(typeof member == "symbol");
    let str = dart.toString(member);
    dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
    return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
  };
  dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
  _js_mirrors._getSymbolForESSymbol = function(member) {
    let name = _js_mirrors._getNameForESSymbol(member);
    return new _internal.Symbol.es6(name, member);
  };
  dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
  _js_mirrors._getSymbolForMember = function(member) {
    if (typeof member == 'string') {
      return core.Symbol.new(member);
    } else {
      let name = _js_mirrors._getNameForESSymbol(member);
      return new _internal.Symbol.es6(name, member);
    }
  };
  dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
  _js_mirrors._toDartMap = function(data) {
    if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
    let map = MapOfSymbol$dynamic().new();
    let publicMembers = Object.getOwnPropertyNames(data);
    for (let member of core.Iterable._check(publicMembers)) {
      let symbol = core.Symbol.new(core.String._check(member));
      map[dartx._set](symbol, data[member]);
    }
    let privateMembers = Object.getOwnPropertySymbols(data);
    for (let member of core.Iterable._check(privateMembers)) {
      let symbol = _js_mirrors._getSymbolForESSymbol(member);
      map[dartx._set](symbol, data[member]);
    }
    return map;
  };
  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getConstructors = function(obj) {
    let sig = _js_mirrors._dart.getConstructorSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getFields = function(obj) {
    let sig = _js_mirrors._dart.getFieldSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getMethods = function(obj) {
    let sig = _js_mirrors._dart.getMethodSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getGetters = function(obj) {
    let sig = _js_mirrors._dart.getGetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getSetters = function(obj) {
    let sig = _js_mirrors._dart.getSetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStaticFields = function(obj) {
    let sig = _js_mirrors._dart.getStaticFieldSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStatics = function(obj) {
    let sig = _js_mirrors._dart.getStaticSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStaticGetters = function(obj) {
    let sig = _js_mirrors._dart.getStaticGetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._getStaticSetters = function(obj) {
    let sig = _js_mirrors._dart.getStaticSetterSig(obj);
    return _js_mirrors._toDartMap(sig);
  };
  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
  _js_mirrors._unwrap = function(obj) {
    return _js_mirrors._dart.unwrapType(obj);
  };
  dart.fn(_js_mirrors._unwrap, dynamicTodynamic$());
  _js_mirrors._wrap = function(obj) {
    return _js_mirrors._dart.wrapType(obj);
  };
  dart.fn(_js_mirrors._wrap, dynamicTodynamic$());
  _js_mirrors._runtimeType = function(obj) {
    return _js_mirrors._wrap(_js_mirrors._dart.getReifiedType(obj));
  };
  dart.fn(_js_mirrors._runtimeType, dynamicTodynamic$());
  _js_mirrors._unimplemented = function(t, i) {
    dart.throw(new core.UnimplementedError(dart.str`${t}.${_js_mirrors.getName(i.memberName)} unimplemented`));
  };
  dart.fn(_js_mirrors._unimplemented, TypeAndInvocationTodynamic());
  _js_mirrors._toJsMap = function(map) {
    let obj = {};
    map[dartx.forEach](dart.fn((key, value) => {
      obj[_js_mirrors.getName(key)] = value;
    }, SymbolAnddynamicTovoid()));
    return obj;
  };
  dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
  _js_mirrors.JsMirror = class JsMirror extends core.Object {
    noSuchMethod(i) {
      _js_mirrors._unimplemented(this.runtimeType, i);
    }
  };
  _js_mirrors.JsMirror[dart.implements] = () => [mirrors.Mirror];
  _js_mirrors.JsCombinatorMirror = class JsCombinatorMirror extends _js_mirrors.JsMirror {
    get identifiers() {
      return ListOfSymbol()._check(this.noSuchMethod(new dart.InvocationImpl('identifiers', [], {isGetter: true})));
    }
    get isShow() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isShow', [], {isGetter: true})));
    }
    get isHide() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isHide', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsCombinatorMirror[dart.implements] = () => [mirrors.CombinatorMirror];
  _js_mirrors.JsDeclarationMirror = class JsDeclarationMirror extends _js_mirrors.JsMirror {
    get simpleName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('simpleName', [], {isGetter: true})));
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get metadata() {
      return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsDeclarationMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  _js_mirrors.JsIsolateMirror = class JsIsolateMirror extends _js_mirrors.JsMirror {
    get debugName() {
      return core.String._check(this.noSuchMethod(new dart.InvocationImpl('debugName', [], {isGetter: true})));
    }
    get isCurrent() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isCurrent', [], {isGetter: true})));
    }
    get rootLibrary() {
      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('rootLibrary', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
  _js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
    get isImport() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
    }
    get isExport() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
    }
    get sourceLibrary() {
      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
    }
    get targetLibrary() {
      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('targetLibrary', [], {isGetter: true})));
    }
    get prefix() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('prefix', [], {isGetter: true})));
    }
    get combinators() {
      return ListOfCombinatorMirror()._check(this.noSuchMethod(new dart.InvocationImpl('combinators', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get metadata() {
      return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
    }
  };
  _js_mirrors.JsLibraryDependencyMirror[dart.implements] = () => [mirrors.LibraryDependencyMirror];
  _js_mirrors.JsObjectMirror = class JsObjectMirror extends _js_mirrors.JsMirror {
    invoke(...args) {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('invoke', args, {isMethod: true})));
    }
    getField(...args) {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('getField', args, {isMethod: true})));
    }
    setField(...args) {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
    }
  };
  _js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
  const _getAccessor = Symbol('_getAccessor');
  _js_mirrors.JsInstanceMirror = class JsInstanceMirror extends _js_mirrors.JsObjectMirror {
    get hasReflectee() {
      return true;
    }
    get type() {
      if (this.reflectee == null) return mirrors.reflectClass(dart.wrapType(core.Null));
      return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._runtimeType(this.reflectee))));
    }
    _(reflectee) {
      this.reflectee = reflectee;
    }
    ['=='](other) {
      return _js_mirrors.JsInstanceMirror.is(other) && core.identical(this.reflectee, other.reflectee);
    }
    get hashCode() {
      return (dart.notNull(core.identityHashCode(this.reflectee)) ^ 909522486) >>> 0;
    }
    [_getAccessor](reflectee, symbol, args, namedArgs) {
      if (args === void 0) args = null;
      if (namedArgs === void 0) namedArgs = null;
      return _js_mirrors._getMember(symbol);
    }
    getField(symbol) {
      let name = this[_getAccessor](this.reflectee, symbol);
      let field = _js_mirrors._dload(this.reflectee, core.String._check(name));
      return _js_mirrors.reflect(field);
    }
    setField(symbol, value) {
      let name = this[_getAccessor](this.reflectee, symbol);
      _js_mirrors._dput(this.reflectee, core.String._check(name), value);
      return _js_mirrors.reflect(value);
    }
    invoke(symbol, args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      let name = this[_getAccessor](this.reflectee, symbol, args, namedArgs);
      if (namedArgs != null) {
        args = core.List.from(args);
        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
      }
      let result = _js_mirrors._dsend(this.reflectee, core.String._check(name), args);
      return _js_mirrors.reflect(result);
    }
    toString() {
      return dart.str`InstanceMirror on '${this.reflectee}'`;
    }
    delegate(...args) {
      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsInstanceMirror, '_');
  _js_mirrors.JsInstanceMirror[dart.implements] = () => [mirrors.InstanceMirror];
  dart.setSignature(_js_mirrors.JsInstanceMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsInstanceMirror, [dart.dynamic])}),
    fields: () => ({reflectee: dart.dynamic}),
    getters: () => ({
      hasReflectee: dart.definiteFunctionType(core.bool, []),
      type: dart.definiteFunctionType(mirrors.ClassMirror, [])
    }),
    methods: () => ({
      '==': dart.definiteFunctionType(core.bool, [core.Object]),
      [_getAccessor]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Symbol], [core.List, MapOfSymbol$dynamic()]),
      getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
      setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
      invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
    })
  });
  _js_mirrors.JsClosureMirror = class JsClosureMirror extends _js_mirrors.JsInstanceMirror {
    _(reflectee) {
      super._(reflectee);
    }
    apply(args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      if (namedArgs != null) {
        args = core.List.from(args);
        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
      }
      let result = _js_mirrors._dcall(this.reflectee, args);
      return _js_mirrors.reflect(result);
    }
    delegate(...args) {
      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
    }
    get function() {
      return mirrors.MethodMirror._check(this.noSuchMethod(new dart.InvocationImpl('function', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsClosureMirror, '_');
  _js_mirrors.JsClosureMirror[dart.implements] = () => [mirrors.ClosureMirror];
  dart.setSignature(_js_mirrors.JsClosureMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClosureMirror, [dart.dynamic])}),
    methods: () => ({apply: dart.definiteFunctionType(mirrors.InstanceMirror, [core.List], [MapOfSymbol$dynamic()])})
  });
  const _metadata$ = Symbol('_metadata');
  const _cls = Symbol('_cls');
  let const$0;
  const _declarations = Symbol('_declarations');
  const _raw = Symbol('_raw');
  const _mixin = Symbol('_mixin');
  const _typeArguments = Symbol('_typeArguments');
  let const$1;
  _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
    get metadata() {
      if (this[_metadata$] == null) {
        let unwrapped = _js_mirrors._unwrap(this[_cls]);
        let fn = Object.hasOwnProperty.call(unwrapped, dart.metadata) ? unwrapped[dart.metadata] : null;
        this[_metadata$] = fn == null ? const$0 || (const$0 = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror()))));
      }
      return this[_metadata$];
    }
    get declarations() {
      if (this[_declarations] == null) {
        this[_declarations] = MapOfSymbol$DeclarationMirror().new();
        let unwrapped = _js_mirrors._unwrap(this[_cls]);
        let constructors = _js_mirrors._getConstructors(unwrapped);
        constructors[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        if (dart.test(constructors[dartx.isEmpty])) {
          let name = 'new';
          let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
          let symbol = core.Symbol.new(name);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
        }
        let fields = _js_mirrors._getFields(unwrapped);
        fields[dartx.forEach](dart.fn((symbol, t) => {
          let metadata = [];
          if (core.List.is(t)) {
            metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
            t = dart.dindex(t, 0);
          }
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
        }, SymbolAnddynamicTovoid()));
        let methods = _js_mirrors._getMethods(unwrapped);
        methods[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let getters = _js_mirrors._getGetters(unwrapped);
        getters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let setters = _js_mirrors._getSetters(unwrapped);
        setters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let staticFields = _js_mirrors._getStaticFields(unwrapped);
        staticFields[dartx.forEach](dart.fn((symbol, t) => {
          let name = _js_mirrors.getName(symbol);
          let metadata = [];
          if (core.List.is(t)) {
            metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
            t = dart.dindex(t, 0);
          }
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
        }, SymbolAnddynamicTovoid()));
        let statics = _js_mirrors._getStatics(unwrapped);
        statics[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
        staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
        staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
          let name = _js_mirrors.getName(symbol);
          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
        }, SymbolAnddynamicTovoid()));
        this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
      }
      return this[_declarations];
    }
    _(cls) {
      this[_cls] = cls;
      this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
      this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
      this[_mixin] = null;
      this[_typeArguments] = null;
      this[_metadata$] = null;
      this[_declarations] = null;
      let typeArgs = _js_mirrors._getGenericArgs(_js_mirrors._unwrap(cls));
      if (typeArgs == null) {
        this[_typeArguments] = const$1 || (const$1 = dart.constList([], mirrors.TypeMirror));
      } else {
        this[_typeArguments] = ListOfTypeMirror().unmodifiable(core.Iterable._check(dart.dsend(typeArgs, 'map', dart.fn(t => _js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(t))), dynamicToTypeMirror()))));
      }
    }
    newInstance(constructorName, args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      let name = _js_mirrors.getName(constructorName);
      dart.assert(namedArgs == null || dart.test(namedArgs[dartx.isEmpty]));
      let instance = name == 'new' || name == '' ? new (_js_mirrors._unwrap(this[_cls]))(...args) : new (_js_mirrors._unwrap(this[_cls]))[name](...args);
      return _js_mirrors.reflect(instance);
    }
    getField(symbol) {
      let name = _js_mirrors.getName(symbol);
      return _js_mirrors.reflect(_js_mirrors._unwrap(this[_cls])[name]);
    }
    setField(symbol, value) {
      let name = _js_mirrors.getName(symbol);
      _js_mirrors._unwrap(this[_cls])[name] = value;
      return _js_mirrors.reflect(value);
    }
    invoke(symbol, args, namedArgs) {
      if (namedArgs === void 0) namedArgs = null;
      let name = _js_mirrors.getName(symbol);
      if (namedArgs != null) {
        args = core.List.from(args);
        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
      }
      let result = _js_mirrors._unwrap(this[_cls])[name](...args);
      return _js_mirrors.reflect(result);
    }
    get superinterfaces() {
      let interfaceThunk = _js_mirrors._unwrap(this[_cls])[dart.implements];
      if (interfaceThunk == null) {
        return JSArrayOfClassMirror().of([]);
      } else {
        let interfaces = interfaceThunk();
        return ListOfClassMirror()._check(interfaces[dartx.map](mirrors.TypeMirror)(dart.fn(t => _js_mirrors.reflectType(t), TypeToTypeMirror()))[dartx.toList]());
      }
    }
    get hasReflectedType() {
      return true;
    }
    get reflectedType() {
      return this[_cls];
    }
    get isOriginalDeclaration() {
      return this[_raw] == null;
    }
    get typeArguments() {
      return this[_typeArguments];
    }
    get originalDeclaration() {
      if (this[_raw] == null) {
        return this;
      }
      dart.throw(new core.UnimplementedError("ClassMirror.originalDeclaration unimplemented"));
    }
    get superclass() {
      if (dart.equals(this[_cls], dart.wrapType(core.Object))) {
        return null;
      } else {
        return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
      }
    }
    get mixin() {
      if (this[_mixin] != null) {
        return this[_mixin];
      }
      let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
      if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
        this[_mixin] = this;
        return this[_mixin];
      }
      if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
        dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
      }
      this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
      return this[_mixin];
    }
    toString() {
      return dart.str`ClassMirror on '${this[_cls]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    isSubtypeOf(...args) {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubtypeOf', args, {isMethod: true})));
    }
    isAssignableTo(...args) {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAssignableTo', args, {isMethod: true})));
    }
    get typeVariables() {
      return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
    }
    isSubclassOf(...args) {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
    }
    get isAbstract() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
    }
    get instanceMembers() {
      return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
    }
    get staticMembers() {
      return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('staticMembers', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsClassMirror, '_');
  _js_mirrors.JsClassMirror[dart.implements] = () => [mirrors.ClassMirror];
  dart.setSignature(_js_mirrors.JsClassMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClassMirror, [core.Type])}),
    fields: () => ({
      [_cls]: core.Type,
      simpleName: core.Symbol,
      [_raw]: dart.dynamic,
      [_mixin]: mirrors.ClassMirror,
      [_typeArguments]: ListOfTypeMirror(),
      [_metadata$]: ListOfInstanceMirror(),
      [_declarations]: MapOfSymbol$DeclarationMirror()
    }),
    getters: () => ({
      metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), []),
      declarations: dart.definiteFunctionType(core.Map$(core.Symbol, mirrors.DeclarationMirror), []),
      superinterfaces: dart.definiteFunctionType(core.List$(mirrors.ClassMirror), []),
      hasReflectedType: dart.definiteFunctionType(core.bool, []),
      reflectedType: dart.definiteFunctionType(core.Type, []),
      isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
      typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
      originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
      superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
      mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
    }),
    methods: () => ({
      newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
      getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
      setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
      invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
    })
  });
  const _symbol = Symbol('_symbol');
  const _name$ = Symbol('_name');
  _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
    get simpleName() {
      return this[_symbol];
    }
    _(symbol, t, annotations) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.type = _js_mirrors.reflectType(t);
      this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
      this.isStatic = false;
      this.isFinal = false;
    }
    toString() {
      return dart.str`VariableMirror on '${this[_name$]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get isConst() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
  _js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
  dart.setSignature(_js_mirrors.JsVariableMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
    fields: () => ({
      [_symbol]: core.Symbol,
      [_name$]: core.String,
      type: mirrors.TypeMirror,
      metadata: ListOfInstanceMirror(),
      isStatic: core.bool,
      isFinal: core.bool
    }),
    getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
  });
  _js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
    _(member, t, annotations) {
      super._(member, t, annotations);
    }
    toString() {
      return dart.str`ParameterMirror on '${this[_name$]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isPrivate() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get isConst() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
    }
    get isOptional() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOptional', [], {isGetter: true})));
    }
    get isNamed() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isNamed', [], {isGetter: true})));
    }
    get hasDefaultValue() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('hasDefaultValue', [], {isGetter: true})));
    }
    get defaultValue() {
      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('defaultValue', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
  _js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
  dart.setSignature(_js_mirrors.JsParameterMirror, {
    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
  });
  const _params = Symbol('_params');
  const _createParameterMirrorList = Symbol('_createParameterMirrorList');
  let const$2;
  let const$3;
  let const$4;
  _js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
    get isSetter() {
      return this[_name$][dartx.endsWith]('=');
    }
    get isPrivate() {
      return this[_name$][dartx.startsWith]('_');
    }
    get simpleName() {
      return this[_symbol];
    }
    _constructor(cls, symbol, ftype) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.isConstructor = true;
      this.isStatic = false;
      this[_params] = null;
      this[_metadata$] = null;
      this.isFinal = false;
      this[_createParameterMirrorList](ftype);
    }
    _instanceMethod(cls, symbol, ftype) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.isConstructor = false;
      this.isStatic = false;
      this[_params] = null;
      this[_metadata$] = null;
      this.isFinal = false;
      this[_createParameterMirrorList](ftype);
    }
    _staticMethod(cls, symbol, ftype) {
      this[_symbol] = symbol;
      this[_name$] = _js_mirrors.getName(symbol);
      this.isConstructor = false;
      this.isStatic = true;
      this[_params] = null;
      this[_metadata$] = null;
      this.isFinal = false;
      this[_createParameterMirrorList](ftype);
    }
    get constructorName() {
      return dart.test(this.isConstructor) ? this[_symbol] : null;
    }
    get parameters() {
      return this[_params];
    }
    get metadata() {
      return this[_metadata$];
    }
    [_createParameterMirrorList](ftype) {
      if (ftype == null) {
        this[_params] = const$2 || (const$2 = dart.constList([], mirrors.ParameterMirror));
        this[_metadata$] = const$3 || (const$3 = dart.constList([], mirrors.InstanceMirror));
        return;
      }
      if (!core.Function.is(ftype) && core.List.is(ftype)) {
        this[_metadata$] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', 1), 'map', dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror()))));
        ftype = dart.dindex(ftype, 0);
      } else {
        this[_metadata$] = const$4 || (const$4 = dart.constList([], mirrors.InstanceMirror));
      }
      if (typeof ftype == "function") {
        ftype = ftype.apply(null, JSArrayOfType().of([dart.dynamic, dart.dynamic, dart.dynamic]));
      }
      let args = core.List._check(dart.dload(ftype, 'args'));
      let opts = core.List._check(dart.dload(ftype, 'optionals'));
      let params = ListOfParameterMirror().new(dart.notNull(args[dartx.length]) + dart.notNull(opts[dartx.length]));
      for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
        let type = args[dartx._get](i);
        let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
        params[dartx._set](i, param);
      }
      for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
        let type = opts[dartx._get](i);
        let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
        params[dartx._set](i + dart.notNull(args[dartx.length]), param);
      }
      this[_params] = ListOfParameterMirror().unmodifiable(params);
    }
    toString() {
      return dart.str`MethodMirror on '${this[_name$]}'`;
    }
    get qualifiedName() {
      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
    }
    get owner() {
      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
    }
    get isTopLevel() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
    }
    get location() {
      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
    }
    get returnType() {
      return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl('returnType', [], {isGetter: true})));
    }
    get source() {
      return core.String._check(this.noSuchMethod(new dart.InvocationImpl('source', [], {isGetter: true})));
    }
    get isAbstract() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
    }
    get isSynthetic() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSynthetic', [], {isGetter: true})));
    }
    get isRegularMethod() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRegularMethod', [], {isGetter: true})));
    }
    get isOperator() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOperator', [], {isGetter: true})));
    }
    get isGetter() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGetter', [], {isGetter: true})));
    }
    get isConstConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConstConstructor', [], {isGetter: true})));
    }
    get isGenerativeConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGenerativeConstructor', [], {isGetter: true})));
    }
    get isRedirectingConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRedirectingConstructor', [], {isGetter: true})));
    }
    get isFactoryConstructor() {
      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isFactoryConstructor', [], {isGetter: true})));
    }
  };
  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_constructor');
  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_instanceMethod');
  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_staticMethod');
  _js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
  dart.setSignature(_js_mirrors.JsMethodMirror, {
    constructors: () => ({
      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
    }),
    fields: () => ({
      [_symbol]: core.Symbol,
      [_name$]: core.String,
      [_params]: ListOfParameterMirror(),
      [_metadata$]: ListOfInstanceMirror(),
      isConstructor: core.bool,
      isStatic: core.bool,
      isFinal: core.bool
    }),
    getters: () => ({
      isSetter: dart.definiteFunctionType(core.bool, []),
      isPrivate: dart.definiteFunctionType(core.bool, []),
      simpleName: dart.definiteFunctionType(core.Symbol, []),
      constructorName: dart.definiteFunctionType(core.Symbol, []),
      parameters: dart.definiteFunctionType(core.List$(mirrors.ParameterMirror), []),
      metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), [])
    }),
    methods: () => ({[_createParameterMirrorList]: dart.definiteFunctionType(dart.void, [dart.dynamic])})
  });
  _js_primitives.printString = function(string) {
    if (typeof dartPrint == "function") {
      dartPrint(string);
      return;
    }
    if (typeof console == "object" && typeof console.log != "undefined") {
      console.log(string);
      return;
    }
    if (typeof window == "object") {
      return;
    }
    if (typeof print == "function") {
      print(string);
      return;
    }
    throw "Unable to print message: " + String(string);
  };
  dart.lazyFn(_js_primitives.printString, () => StringTovoid$());
  _metadata.SupportedBrowser = class SupportedBrowser extends core.Object {
    new(browserName, minimumVersion) {
      if (minimumVersion === void 0) minimumVersion = null;
      this.browserName = browserName;
      this.minimumVersion = minimumVersion;
    }
  };
  dart.setSignature(_metadata.SupportedBrowser, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.SupportedBrowser, [core.String], [core.String])}),
    fields: () => ({
      browserName: core.String,
      minimumVersion: core.String
    }),
    sfields: () => ({
      CHROME: core.String,
      FIREFOX: core.String,
      IE: core.String,
      OPERA: core.String,
      SAFARI: core.String
    })
  });
  _metadata.SupportedBrowser.CHROME = "Chrome";
  _metadata.SupportedBrowser.FIREFOX = "Firefox";
  _metadata.SupportedBrowser.IE = "Internet Explorer";
  _metadata.SupportedBrowser.OPERA = "Opera";
  _metadata.SupportedBrowser.SAFARI = "Safari";
  _metadata.Experimental = class Experimental extends core.Object {
    new() {
    }
  };
  dart.setSignature(_metadata.Experimental, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.Experimental, [])})
  });
  _metadata.DomName = class DomName extends core.Object {
    new(name) {
      this.name = name;
    }
  };
  dart.setSignature(_metadata.DomName, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.DomName, [core.String])}),
    fields: () => ({name: core.String})
  });
  _metadata.DocsEditable = class DocsEditable extends core.Object {
    new() {
    }
  };
  dart.setSignature(_metadata.DocsEditable, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.DocsEditable, [])})
  });
  _metadata.Unstable = class Unstable extends core.Object {
    new() {
    }
  };
  dart.setSignature(_metadata.Unstable, {
    constructors: () => ({new: dart.definiteFunctionType(_metadata.Unstable, [])})
  });
  dart.defineExtensionNames([
    'lengthInBytes',
    'runtimeType',
    'asUint8List',
    'asInt8List',
    'asUint8ClampedList',
    'asUint16List',
    'asInt16List',
    'asUint32List',
    'asInt32List',
    'asUint64List',
    'asInt64List',
    'asInt32x4List',
    'asFloat32List',
    'asFloat64List',
    'asFloat32x4List',
    'asFloat64x2List',
    'asByteData'
  ]);
  _native_typed_data.NativeByteBuffer = class NativeByteBuffer extends core.Object {
    get [dartx.lengthInBytes]() {
      return this.byteLength;
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.ByteBuffer);
    }
    [dartx.asUint8List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint8List.view(this, offsetInBytes, length);
    }
    [dartx.asInt8List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeInt8List.view(this, offsetInBytes, length);
    }
    [dartx.asUint8ClampedList](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint8ClampedList.view(this, offsetInBytes, length);
    }
    [dartx.asUint16List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint16List.view(this, offsetInBytes, length);
    }
    [dartx.asInt16List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeInt16List.view(this, offsetInBytes, length);
    }
    [dartx.asUint32List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeUint32List.view(this, offsetInBytes, length);
    }
    [dartx.asInt32List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeInt32List.view(this, offsetInBytes, length);
    }
    [dartx.asUint64List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
    }
    [dartx.asInt64List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
    }
    [dartx.asInt32x4List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      let storage = _native_typed_data.NativeInt32List._check(this[dartx.asInt32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
      return new _native_typed_data.NativeInt32x4List._externalStorage(storage);
    }
    [dartx.asFloat32List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeFloat32List.view(this, offsetInBytes, length);
    }
    [dartx.asFloat64List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeFloat64List.view(this, offsetInBytes, length);
    }
    [dartx.asFloat32x4List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      let storage = _native_typed_data.NativeFloat32List._check(this[dartx.asFloat32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
      return new _native_typed_data.NativeFloat32x4List._externalStorage(storage);
    }
    [dartx.asFloat64x2List](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      let storage = _native_typed_data.NativeFloat64List._check(this[dartx.asFloat64List](offsetInBytes, length != null ? dart.notNull(length) * 2 : null));
      return new _native_typed_data.NativeFloat64x2List._externalStorage(storage);
    }
    [dartx.asByteData](offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return _native_typed_data.NativeByteData.view(this, offsetInBytes, length);
    }
  };
  _native_typed_data.NativeByteBuffer[dart.implements] = () => [typed_data.ByteBuffer];
  dart.setSignature(_native_typed_data.NativeByteBuffer, {
    getters: () => ({[dartx.lengthInBytes]: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      [dartx.asUint8List]: dart.definiteFunctionType(typed_data.Uint8List, [], [core.int, core.int]),
      [dartx.asInt8List]: dart.definiteFunctionType(typed_data.Int8List, [], [core.int, core.int]),
      [dartx.asUint8ClampedList]: dart.definiteFunctionType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
      [dartx.asUint16List]: dart.definiteFunctionType(typed_data.Uint16List, [], [core.int, core.int]),
      [dartx.asInt16List]: dart.definiteFunctionType(typed_data.Int16List, [], [core.int, core.int]),
      [dartx.asUint32List]: dart.definiteFunctionType(typed_data.Uint32List, [], [core.int, core.int]),
      [dartx.asInt32List]: dart.definiteFunctionType(typed_data.Int32List, [], [core.int, core.int]),
      [dartx.asUint64List]: dart.definiteFunctionType(typed_data.Uint64List, [], [core.int, core.int]),
      [dartx.asInt64List]: dart.definiteFunctionType(typed_data.Int64List, [], [core.int, core.int]),
      [dartx.asInt32x4List]: dart.definiteFunctionType(typed_data.Int32x4List, [], [core.int, core.int]),
      [dartx.asFloat32List]: dart.definiteFunctionType(typed_data.Float32List, [], [core.int, core.int]),
      [dartx.asFloat64List]: dart.definiteFunctionType(typed_data.Float64List, [], [core.int, core.int]),
      [dartx.asFloat32x4List]: dart.definiteFunctionType(typed_data.Float32x4List, [], [core.int, core.int]),
      [dartx.asFloat64x2List]: dart.definiteFunctionType(typed_data.Float64x2List, [], [core.int, core.int]),
      [dartx.asByteData]: dart.definiteFunctionType(typed_data.ByteData, [], [core.int, core.int])
    })
  });
  dart.registerExtension(dart.global.ArrayBuffer, _native_typed_data.NativeByteBuffer);
  const _storage = Symbol('_storage');
  typed_data.Float32x4 = class Float32x4 extends core.Object {
    static new(x, y, z, w) {
      return new _native_typed_data.NativeFloat32x4(x, y, z, w);
    }
    static splat(v) {
      return new _native_typed_data.NativeFloat32x4.splat(v);
    }
    static zero() {
      return new _native_typed_data.NativeFloat32x4.zero();
    }
    static fromInt32x4Bits(x) {
      return _native_typed_data.NativeFloat32x4.fromInt32x4Bits(x);
    }
    static fromFloat64x2(v) {
      return new _native_typed_data.NativeFloat32x4.fromFloat64x2(v);
    }
  };
  dart.setSignature(typed_data.Float32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float32x4, [core.double, core.double, core.double, core.double]),
      splat: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      zero: dart.definiteFunctionType(typed_data.Float32x4, []),
      fromInt32x4Bits: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Int32x4]),
      fromFloat64x2: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float64x2])
    }),
    sfields: () => ({
      XXXX: core.int,
      XXXY: core.int,
      XXXZ: core.int,
      XXXW: core.int,
      XXYX: core.int,
      XXYY: core.int,
      XXYZ: core.int,
      XXYW: core.int,
      XXZX: core.int,
      XXZY: core.int,
      XXZZ: core.int,
      XXZW: core.int,
      XXWX: core.int,
      XXWY: core.int,
      XXWZ: core.int,
      XXWW: core.int,
      XYXX: core.int,
      XYXY: core.int,
      XYXZ: core.int,
      XYXW: core.int,
      XYYX: core.int,
      XYYY: core.int,
      XYYZ: core.int,
      XYYW: core.int,
      XYZX: core.int,
      XYZY: core.int,
      XYZZ: core.int,
      XYZW: core.int,
      XYWX: core.int,
      XYWY: core.int,
      XYWZ: core.int,
      XYWW: core.int,
      XZXX: core.int,
      XZXY: core.int,
      XZXZ: core.int,
      XZXW: core.int,
      XZYX: core.int,
      XZYY: core.int,
      XZYZ: core.int,
      XZYW: core.int,
      XZZX: core.int,
      XZZY: core.int,
      XZZZ: core.int,
      XZZW: core.int,
      XZWX: core.int,
      XZWY: core.int,
      XZWZ: core.int,
      XZWW: core.int,
      XWXX: core.int,
      XWXY: core.int,
      XWXZ: core.int,
      XWXW: core.int,
      XWYX: core.int,
      XWYY: core.int,
      XWYZ: core.int,
      XWYW: core.int,
      XWZX: core.int,
      XWZY: core.int,
      XWZZ: core.int,
      XWZW: core.int,
      XWWX: core.int,
      XWWY: core.int,
      XWWZ: core.int,
      XWWW: core.int,
      YXXX: core.int,
      YXXY: core.int,
      YXXZ: core.int,
      YXXW: core.int,
      YXYX: core.int,
      YXYY: core.int,
      YXYZ: core.int,
      YXYW: core.int,
      YXZX: core.int,
      YXZY: core.int,
      YXZZ: core.int,
      YXZW: core.int,
      YXWX: core.int,
      YXWY: core.int,
      YXWZ: core.int,
      YXWW: core.int,
      YYXX: core.int,
      YYXY: core.int,
      YYXZ: core.int,
      YYXW: core.int,
      YYYX: core.int,
      YYYY: core.int,
      YYYZ: core.int,
      YYYW: core.int,
      YYZX: core.int,
      YYZY: core.int,
      YYZZ: core.int,
      YYZW: core.int,
      YYWX: core.int,
      YYWY: core.int,
      YYWZ: core.int,
      YYWW: core.int,
      YZXX: core.int,
      YZXY: core.int,
      YZXZ: core.int,
      YZXW: core.int,
      YZYX: core.int,
      YZYY: core.int,
      YZYZ: core.int,
      YZYW: core.int,
      YZZX: core.int,
      YZZY: core.int,
      YZZZ: core.int,
      YZZW: core.int,
      YZWX: core.int,
      YZWY: core.int,
      YZWZ: core.int,
      YZWW: core.int,
      YWXX: core.int,
      YWXY: core.int,
      YWXZ: core.int,
      YWXW: core.int,
      YWYX: core.int,
      YWYY: core.int,
      YWYZ: core.int,
      YWYW: core.int,
      YWZX: core.int,
      YWZY: core.int,
      YWZZ: core.int,
      YWZW: core.int,
      YWWX: core.int,
      YWWY: core.int,
      YWWZ: core.int,
      YWWW: core.int,
      ZXXX: core.int,
      ZXXY: core.int,
      ZXXZ: core.int,
      ZXXW: core.int,
      ZXYX: core.int,
      ZXYY: core.int,
      ZXYZ: core.int,
      ZXYW: core.int,
      ZXZX: core.int,
      ZXZY: core.int,
      ZXZZ: core.int,
      ZXZW: core.int,
      ZXWX: core.int,
      ZXWY: core.int,
      ZXWZ: core.int,
      ZXWW: core.int,
      ZYXX: core.int,
      ZYXY: core.int,
      ZYXZ: core.int,
      ZYXW: core.int,
      ZYYX: core.int,
      ZYYY: core.int,
      ZYYZ: core.int,
      ZYYW: core.int,
      ZYZX: core.int,
      ZYZY: core.int,
      ZYZZ: core.int,
      ZYZW: core.int,
      ZYWX: core.int,
      ZYWY: core.int,
      ZYWZ: core.int,
      ZYWW: core.int,
      ZZXX: core.int,
      ZZXY: core.int,
      ZZXZ: core.int,
      ZZXW: core.int,
      ZZYX: core.int,
      ZZYY: core.int,
      ZZYZ: core.int,
      ZZYW: core.int,
      ZZZX: core.int,
      ZZZY: core.int,
      ZZZZ: core.int,
      ZZZW: core.int,
      ZZWX: core.int,
      ZZWY: core.int,
      ZZWZ: core.int,
      ZZWW: core.int,
      ZWXX: core.int,
      ZWXY: core.int,
      ZWXZ: core.int,
      ZWXW: core.int,
      ZWYX: core.int,
      ZWYY: core.int,
      ZWYZ: core.int,
      ZWYW: core.int,
      ZWZX: core.int,
      ZWZY: core.int,
      ZWZZ: core.int,
      ZWZW: core.int,
      ZWWX: core.int,
      ZWWY: core.int,
      ZWWZ: core.int,
      ZWWW: core.int,
      WXXX: core.int,
      WXXY: core.int,
      WXXZ: core.int,
      WXXW: core.int,
      WXYX: core.int,
      WXYY: core.int,
      WXYZ: core.int,
      WXYW: core.int,
      WXZX: core.int,
      WXZY: core.int,
      WXZZ: core.int,
      WXZW: core.int,
      WXWX: core.int,
      WXWY: core.int,
      WXWZ: core.int,
      WXWW: core.int,
      WYXX: core.int,
      WYXY: core.int,
      WYXZ: core.int,
      WYXW: core.int,
      WYYX: core.int,
      WYYY: core.int,
      WYYZ: core.int,
      WYYW: core.int,
      WYZX: core.int,
      WYZY: core.int,
      WYZZ: core.int,
      WYZW: core.int,
      WYWX: core.int,
      WYWY: core.int,
      WYWZ: core.int,
      WYWW: core.int,
      WZXX: core.int,
      WZXY: core.int,
      WZXZ: core.int,
      WZXW: core.int,
      WZYX: core.int,
      WZYY: core.int,
      WZYZ: core.int,
      WZYW: core.int,
      WZZX: core.int,
      WZZY: core.int,
      WZZZ: core.int,
      WZZW: core.int,
      WZWX: core.int,
      WZWY: core.int,
      WZWZ: core.int,
      WZWW: core.int,
      WWXX: core.int,
      WWXY: core.int,
      WWXZ: core.int,
      WWXW: core.int,
      WWYX: core.int,
      WWYY: core.int,
      WWYZ: core.int,
      WWYW: core.int,
      WWZX: core.int,
      WWZY: core.int,
      WWZZ: core.int,
      WWZW: core.int,
      WWWX: core.int,
      WWWY: core.int,
      WWWZ: core.int,
      WWWW: core.int
    })
  });
  typed_data.Float32x4.XXXX = 0;
  typed_data.Float32x4.XXXY = 64;
  typed_data.Float32x4.XXXZ = 128;
  typed_data.Float32x4.XXXW = 192;
  typed_data.Float32x4.XXYX = 16;
  typed_data.Float32x4.XXYY = 80;
  typed_data.Float32x4.XXYZ = 144;
  typed_data.Float32x4.XXYW = 208;
  typed_data.Float32x4.XXZX = 32;
  typed_data.Float32x4.XXZY = 96;
  typed_data.Float32x4.XXZZ = 160;
  typed_data.Float32x4.XXZW = 224;
  typed_data.Float32x4.XXWX = 48;
  typed_data.Float32x4.XXWY = 112;
  typed_data.Float32x4.XXWZ = 176;
  typed_data.Float32x4.XXWW = 240;
  typed_data.Float32x4.XYXX = 4;
  typed_data.Float32x4.XYXY = 68;
  typed_data.Float32x4.XYXZ = 132;
  typed_data.Float32x4.XYXW = 196;
  typed_data.Float32x4.XYYX = 20;
  typed_data.Float32x4.XYYY = 84;
  typed_data.Float32x4.XYYZ = 148;
  typed_data.Float32x4.XYYW = 212;
  typed_data.Float32x4.XYZX = 36;
  typed_data.Float32x4.XYZY = 100;
  typed_data.Float32x4.XYZZ = 164;
  typed_data.Float32x4.XYZW = 228;
  typed_data.Float32x4.XYWX = 52;
  typed_data.Float32x4.XYWY = 116;
  typed_data.Float32x4.XYWZ = 180;
  typed_data.Float32x4.XYWW = 244;
  typed_data.Float32x4.XZXX = 8;
  typed_data.Float32x4.XZXY = 72;
  typed_data.Float32x4.XZXZ = 136;
  typed_data.Float32x4.XZXW = 200;
  typed_data.Float32x4.XZYX = 24;
  typed_data.Float32x4.XZYY = 88;
  typed_data.Float32x4.XZYZ = 152;
  typed_data.Float32x4.XZYW = 216;
  typed_data.Float32x4.XZZX = 40;
  typed_data.Float32x4.XZZY = 104;
  typed_data.Float32x4.XZZZ = 168;
  typed_data.Float32x4.XZZW = 232;
  typed_data.Float32x4.XZWX = 56;
  typed_data.Float32x4.XZWY = 120;
  typed_data.Float32x4.XZWZ = 184;
  typed_data.Float32x4.XZWW = 248;
  typed_data.Float32x4.XWXX = 12;
  typed_data.Float32x4.XWXY = 76;
  typed_data.Float32x4.XWXZ = 140;
  typed_data.Float32x4.XWXW = 204;
  typed_data.Float32x4.XWYX = 28;
  typed_data.Float32x4.XWYY = 92;
  typed_data.Float32x4.XWYZ = 156;
  typed_data.Float32x4.XWYW = 220;
  typed_data.Float32x4.XWZX = 44;
  typed_data.Float32x4.XWZY = 108;
  typed_data.Float32x4.XWZZ = 172;
  typed_data.Float32x4.XWZW = 236;
  typed_data.Float32x4.XWWX = 60;
  typed_data.Float32x4.XWWY = 124;
  typed_data.Float32x4.XWWZ = 188;
  typed_data.Float32x4.XWWW = 252;
  typed_data.Float32x4.YXXX = 1;
  typed_data.Float32x4.YXXY = 65;
  typed_data.Float32x4.YXXZ = 129;
  typed_data.Float32x4.YXXW = 193;
  typed_data.Float32x4.YXYX = 17;
  typed_data.Float32x4.YXYY = 81;
  typed_data.Float32x4.YXYZ = 145;
  typed_data.Float32x4.YXYW = 209;
  typed_data.Float32x4.YXZX = 33;
  typed_data.Float32x4.YXZY = 97;
  typed_data.Float32x4.YXZZ = 161;
  typed_data.Float32x4.YXZW = 225;
  typed_data.Float32x4.YXWX = 49;
  typed_data.Float32x4.YXWY = 113;
  typed_data.Float32x4.YXWZ = 177;
  typed_data.Float32x4.YXWW = 241;
  typed_data.Float32x4.YYXX = 5;
  typed_data.Float32x4.YYXY = 69;
  typed_data.Float32x4.YYXZ = 133;
  typed_data.Float32x4.YYXW = 197;
  typed_data.Float32x4.YYYX = 21;
  typed_data.Float32x4.YYYY = 85;
  typed_data.Float32x4.YYYZ = 149;
  typed_data.Float32x4.YYYW = 213;
  typed_data.Float32x4.YYZX = 37;
  typed_data.Float32x4.YYZY = 101;
  typed_data.Float32x4.YYZZ = 165;
  typed_data.Float32x4.YYZW = 229;
  typed_data.Float32x4.YYWX = 53;
  typed_data.Float32x4.YYWY = 117;
  typed_data.Float32x4.YYWZ = 181;
  typed_data.Float32x4.YYWW = 245;
  typed_data.Float32x4.YZXX = 9;
  typed_data.Float32x4.YZXY = 73;
  typed_data.Float32x4.YZXZ = 137;
  typed_data.Float32x4.YZXW = 201;
  typed_data.Float32x4.YZYX = 25;
  typed_data.Float32x4.YZYY = 89;
  typed_data.Float32x4.YZYZ = 153;
  typed_data.Float32x4.YZYW = 217;
  typed_data.Float32x4.YZZX = 41;
  typed_data.Float32x4.YZZY = 105;
  typed_data.Float32x4.YZZZ = 169;
  typed_data.Float32x4.YZZW = 233;
  typed_data.Float32x4.YZWX = 57;
  typed_data.Float32x4.YZWY = 121;
  typed_data.Float32x4.YZWZ = 185;
  typed_data.Float32x4.YZWW = 249;
  typed_data.Float32x4.YWXX = 13;
  typed_data.Float32x4.YWXY = 77;
  typed_data.Float32x4.YWXZ = 141;
  typed_data.Float32x4.YWXW = 205;
  typed_data.Float32x4.YWYX = 29;
  typed_data.Float32x4.YWYY = 93;
  typed_data.Float32x4.YWYZ = 157;
  typed_data.Float32x4.YWYW = 221;
  typed_data.Float32x4.YWZX = 45;
  typed_data.Float32x4.YWZY = 109;
  typed_data.Float32x4.YWZZ = 173;
  typed_data.Float32x4.YWZW = 237;
  typed_data.Float32x4.YWWX = 61;
  typed_data.Float32x4.YWWY = 125;
  typed_data.Float32x4.YWWZ = 189;
  typed_data.Float32x4.YWWW = 253;
  typed_data.Float32x4.ZXXX = 2;
  typed_data.Float32x4.ZXXY = 66;
  typed_data.Float32x4.ZXXZ = 130;
  typed_data.Float32x4.ZXXW = 194;
  typed_data.Float32x4.ZXYX = 18;
  typed_data.Float32x4.ZXYY = 82;
  typed_data.Float32x4.ZXYZ = 146;
  typed_data.Float32x4.ZXYW = 210;
  typed_data.Float32x4.ZXZX = 34;
  typed_data.Float32x4.ZXZY = 98;
  typed_data.Float32x4.ZXZZ = 162;
  typed_data.Float32x4.ZXZW = 226;
  typed_data.Float32x4.ZXWX = 50;
  typed_data.Float32x4.ZXWY = 114;
  typed_data.Float32x4.ZXWZ = 178;
  typed_data.Float32x4.ZXWW = 242;
  typed_data.Float32x4.ZYXX = 6;
  typed_data.Float32x4.ZYXY = 70;
  typed_data.Float32x4.ZYXZ = 134;
  typed_data.Float32x4.ZYXW = 198;
  typed_data.Float32x4.ZYYX = 22;
  typed_data.Float32x4.ZYYY = 86;
  typed_data.Float32x4.ZYYZ = 150;
  typed_data.Float32x4.ZYYW = 214;
  typed_data.Float32x4.ZYZX = 38;
  typed_data.Float32x4.ZYZY = 102;
  typed_data.Float32x4.ZYZZ = 166;
  typed_data.Float32x4.ZYZW = 230;
  typed_data.Float32x4.ZYWX = 54;
  typed_data.Float32x4.ZYWY = 118;
  typed_data.Float32x4.ZYWZ = 182;
  typed_data.Float32x4.ZYWW = 246;
  typed_data.Float32x4.ZZXX = 10;
  typed_data.Float32x4.ZZXY = 74;
  typed_data.Float32x4.ZZXZ = 138;
  typed_data.Float32x4.ZZXW = 202;
  typed_data.Float32x4.ZZYX = 26;
  typed_data.Float32x4.ZZYY = 90;
  typed_data.Float32x4.ZZYZ = 154;
  typed_data.Float32x4.ZZYW = 218;
  typed_data.Float32x4.ZZZX = 42;
  typed_data.Float32x4.ZZZY = 106;
  typed_data.Float32x4.ZZZZ = 170;
  typed_data.Float32x4.ZZZW = 234;
  typed_data.Float32x4.ZZWX = 58;
  typed_data.Float32x4.ZZWY = 122;
  typed_data.Float32x4.ZZWZ = 186;
  typed_data.Float32x4.ZZWW = 250;
  typed_data.Float32x4.ZWXX = 14;
  typed_data.Float32x4.ZWXY = 78;
  typed_data.Float32x4.ZWXZ = 142;
  typed_data.Float32x4.ZWXW = 206;
  typed_data.Float32x4.ZWYX = 30;
  typed_data.Float32x4.ZWYY = 94;
  typed_data.Float32x4.ZWYZ = 158;
  typed_data.Float32x4.ZWYW = 222;
  typed_data.Float32x4.ZWZX = 46;
  typed_data.Float32x4.ZWZY = 110;
  typed_data.Float32x4.ZWZZ = 174;
  typed_data.Float32x4.ZWZW = 238;
  typed_data.Float32x4.ZWWX = 62;
  typed_data.Float32x4.ZWWY = 126;
  typed_data.Float32x4.ZWWZ = 190;
  typed_data.Float32x4.ZWWW = 254;
  typed_data.Float32x4.WXXX = 3;
  typed_data.Float32x4.WXXY = 67;
  typed_data.Float32x4.WXXZ = 131;
  typed_data.Float32x4.WXXW = 195;
  typed_data.Float32x4.WXYX = 19;
  typed_data.Float32x4.WXYY = 83;
  typed_data.Float32x4.WXYZ = 147;
  typed_data.Float32x4.WXYW = 211;
  typed_data.Float32x4.WXZX = 35;
  typed_data.Float32x4.WXZY = 99;
  typed_data.Float32x4.WXZZ = 163;
  typed_data.Float32x4.WXZW = 227;
  typed_data.Float32x4.WXWX = 51;
  typed_data.Float32x4.WXWY = 115;
  typed_data.Float32x4.WXWZ = 179;
  typed_data.Float32x4.WXWW = 243;
  typed_data.Float32x4.WYXX = 7;
  typed_data.Float32x4.WYXY = 71;
  typed_data.Float32x4.WYXZ = 135;
  typed_data.Float32x4.WYXW = 199;
  typed_data.Float32x4.WYYX = 23;
  typed_data.Float32x4.WYYY = 87;
  typed_data.Float32x4.WYYZ = 151;
  typed_data.Float32x4.WYYW = 215;
  typed_data.Float32x4.WYZX = 39;
  typed_data.Float32x4.WYZY = 103;
  typed_data.Float32x4.WYZZ = 167;
  typed_data.Float32x4.WYZW = 231;
  typed_data.Float32x4.WYWX = 55;
  typed_data.Float32x4.WYWY = 119;
  typed_data.Float32x4.WYWZ = 183;
  typed_data.Float32x4.WYWW = 247;
  typed_data.Float32x4.WZXX = 11;
  typed_data.Float32x4.WZXY = 75;
  typed_data.Float32x4.WZXZ = 139;
  typed_data.Float32x4.WZXW = 203;
  typed_data.Float32x4.WZYX = 27;
  typed_data.Float32x4.WZYY = 91;
  typed_data.Float32x4.WZYZ = 155;
  typed_data.Float32x4.WZYW = 219;
  typed_data.Float32x4.WZZX = 43;
  typed_data.Float32x4.WZZY = 107;
  typed_data.Float32x4.WZZZ = 171;
  typed_data.Float32x4.WZZW = 235;
  typed_data.Float32x4.WZWX = 59;
  typed_data.Float32x4.WZWY = 123;
  typed_data.Float32x4.WZWZ = 187;
  typed_data.Float32x4.WZWW = 251;
  typed_data.Float32x4.WWXX = 15;
  typed_data.Float32x4.WWXY = 79;
  typed_data.Float32x4.WWXZ = 143;
  typed_data.Float32x4.WWXW = 207;
  typed_data.Float32x4.WWYX = 31;
  typed_data.Float32x4.WWYY = 95;
  typed_data.Float32x4.WWYZ = 159;
  typed_data.Float32x4.WWYW = 223;
  typed_data.Float32x4.WWZX = 47;
  typed_data.Float32x4.WWZY = 111;
  typed_data.Float32x4.WWZZ = 175;
  typed_data.Float32x4.WWZW = 239;
  typed_data.Float32x4.WWWX = 63;
  typed_data.Float32x4.WWWY = 127;
  typed_data.Float32x4.WWWZ = 191;
  typed_data.Float32x4.WWWW = 255;
  _native_typed_data.NativeFloat32x4List = class NativeFloat32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float32x4), _internal.FixedLengthListMixin$(typed_data.Float32x4)) {
    new(length) {
      this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(length) * 4);
    }
    _externalStorage(storage) {
      this[_storage] = storage;
    }
    _slowFromList(list) {
      this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(list[dartx.length]) * 4);
      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
        let e = list[dartx._get](i);
        this[_storage][dartx._set](i * 4 + 0, e.x);
        this[_storage][dartx._set](i * 4 + 1, e.y);
        this[_storage][dartx._set](i * 4 + 2, e.z);
        this[_storage][dartx._set](i * 4 + 3, e.w);
      }
    }
    get runtimeType() {
      return dart.wrapType(typed_data.Float32x4List);
    }
    static fromList(list) {
      if (_native_typed_data.NativeFloat32x4List.is(list)) {
        return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List.fromList(list[_storage]));
      } else {
        return new _native_typed_data.NativeFloat32x4List._slowFromList(list);
      }
    }
    get buffer() {
      return this[_storage][dartx.buffer];
    }
    get lengthInBytes() {
      return this[_storage][dartx.lengthInBytes];
    }
    get offsetInBytes() {
      return this[_storage][dartx.offsetInBytes];
    }
    get elementSizeInBytes() {
      return typed_data.Float32x4List.BYTES_PER_ELEMENT;
    }
    get length() {
      return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
      let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
      let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
      let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
      return value;
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this.length);
      return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_externalStorage');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_slowFromList');
  _native_typed_data.NativeFloat32x4List[dart.implements] = () => [typed_data.Float32x4List];
  dart.setSignature(_native_typed_data.NativeFloat32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [core.int]),
      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [_native_typed_data.NativeFloat32List]),
      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()])
    }),
    fields: () => ({[_storage]: _native_typed_data.NativeFloat32List}),
    getters: () => ({
      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      lengthInBytes: dart.definiteFunctionType(core.int, []),
      offsetInBytes: dart.definiteFunctionType(core.int, []),
      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32x4]),
      sublist: dart.definiteFunctionType(core.List$(typed_data.Float32x4), [core.int], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeFloat32x4List, [
    '_get',
    '_set',
    'sublist',
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes',
    'length'
  ]);
  typed_data.Int32x4 = class Int32x4 extends core.Object {
    static new(x, y, z, w) {
      return new _native_typed_data.NativeInt32x4(x, y, z, w);
    }
    static bool(x, y, z, w) {
      return new _native_typed_data.NativeInt32x4.bool(x, y, z, w);
    }
    static fromFloat32x4Bits(x) {
      return _native_typed_data.NativeInt32x4.fromFloat32x4Bits(x);
    }
  };
  dart.setSignature(typed_data.Int32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int32x4, [core.int, core.int, core.int, core.int]),
      bool: dart.definiteFunctionType(typed_data.Int32x4, [core.bool, core.bool, core.bool, core.bool]),
      fromFloat32x4Bits: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4])
    }),
    sfields: () => ({
      XXXX: core.int,
      XXXY: core.int,
      XXXZ: core.int,
      XXXW: core.int,
      XXYX: core.int,
      XXYY: core.int,
      XXYZ: core.int,
      XXYW: core.int,
      XXZX: core.int,
      XXZY: core.int,
      XXZZ: core.int,
      XXZW: core.int,
      XXWX: core.int,
      XXWY: core.int,
      XXWZ: core.int,
      XXWW: core.int,
      XYXX: core.int,
      XYXY: core.int,
      XYXZ: core.int,
      XYXW: core.int,
      XYYX: core.int,
      XYYY: core.int,
      XYYZ: core.int,
      XYYW: core.int,
      XYZX: core.int,
      XYZY: core.int,
      XYZZ: core.int,
      XYZW: core.int,
      XYWX: core.int,
      XYWY: core.int,
      XYWZ: core.int,
      XYWW: core.int,
      XZXX: core.int,
      XZXY: core.int,
      XZXZ: core.int,
      XZXW: core.int,
      XZYX: core.int,
      XZYY: core.int,
      XZYZ: core.int,
      XZYW: core.int,
      XZZX: core.int,
      XZZY: core.int,
      XZZZ: core.int,
      XZZW: core.int,
      XZWX: core.int,
      XZWY: core.int,
      XZWZ: core.int,
      XZWW: core.int,
      XWXX: core.int,
      XWXY: core.int,
      XWXZ: core.int,
      XWXW: core.int,
      XWYX: core.int,
      XWYY: core.int,
      XWYZ: core.int,
      XWYW: core.int,
      XWZX: core.int,
      XWZY: core.int,
      XWZZ: core.int,
      XWZW: core.int,
      XWWX: core.int,
      XWWY: core.int,
      XWWZ: core.int,
      XWWW: core.int,
      YXXX: core.int,
      YXXY: core.int,
      YXXZ: core.int,
      YXXW: core.int,
      YXYX: core.int,
      YXYY: core.int,
      YXYZ: core.int,
      YXYW: core.int,
      YXZX: core.int,
      YXZY: core.int,
      YXZZ: core.int,
      YXZW: core.int,
      YXWX: core.int,
      YXWY: core.int,
      YXWZ: core.int,
      YXWW: core.int,
      YYXX: core.int,
      YYXY: core.int,
      YYXZ: core.int,
      YYXW: core.int,
      YYYX: core.int,
      YYYY: core.int,
      YYYZ: core.int,
      YYYW: core.int,
      YYZX: core.int,
      YYZY: core.int,
      YYZZ: core.int,
      YYZW: core.int,
      YYWX: core.int,
      YYWY: core.int,
      YYWZ: core.int,
      YYWW: core.int,
      YZXX: core.int,
      YZXY: core.int,
      YZXZ: core.int,
      YZXW: core.int,
      YZYX: core.int,
      YZYY: core.int,
      YZYZ: core.int,
      YZYW: core.int,
      YZZX: core.int,
      YZZY: core.int,
      YZZZ: core.int,
      YZZW: core.int,
      YZWX: core.int,
      YZWY: core.int,
      YZWZ: core.int,
      YZWW: core.int,
      YWXX: core.int,
      YWXY: core.int,
      YWXZ: core.int,
      YWXW: core.int,
      YWYX: core.int,
      YWYY: core.int,
      YWYZ: core.int,
      YWYW: core.int,
      YWZX: core.int,
      YWZY: core.int,
      YWZZ: core.int,
      YWZW: core.int,
      YWWX: core.int,
      YWWY: core.int,
      YWWZ: core.int,
      YWWW: core.int,
      ZXXX: core.int,
      ZXXY: core.int,
      ZXXZ: core.int,
      ZXXW: core.int,
      ZXYX: core.int,
      ZXYY: core.int,
      ZXYZ: core.int,
      ZXYW: core.int,
      ZXZX: core.int,
      ZXZY: core.int,
      ZXZZ: core.int,
      ZXZW: core.int,
      ZXWX: core.int,
      ZXWY: core.int,
      ZXWZ: core.int,
      ZXWW: core.int,
      ZYXX: core.int,
      ZYXY: core.int,
      ZYXZ: core.int,
      ZYXW: core.int,
      ZYYX: core.int,
      ZYYY: core.int,
      ZYYZ: core.int,
      ZYYW: core.int,
      ZYZX: core.int,
      ZYZY: core.int,
      ZYZZ: core.int,
      ZYZW: core.int,
      ZYWX: core.int,
      ZYWY: core.int,
      ZYWZ: core.int,
      ZYWW: core.int,
      ZZXX: core.int,
      ZZXY: core.int,
      ZZXZ: core.int,
      ZZXW: core.int,
      ZZYX: core.int,
      ZZYY: core.int,
      ZZYZ: core.int,
      ZZYW: core.int,
      ZZZX: core.int,
      ZZZY: core.int,
      ZZZZ: core.int,
      ZZZW: core.int,
      ZZWX: core.int,
      ZZWY: core.int,
      ZZWZ: core.int,
      ZZWW: core.int,
      ZWXX: core.int,
      ZWXY: core.int,
      ZWXZ: core.int,
      ZWXW: core.int,
      ZWYX: core.int,
      ZWYY: core.int,
      ZWYZ: core.int,
      ZWYW: core.int,
      ZWZX: core.int,
      ZWZY: core.int,
      ZWZZ: core.int,
      ZWZW: core.int,
      ZWWX: core.int,
      ZWWY: core.int,
      ZWWZ: core.int,
      ZWWW: core.int,
      WXXX: core.int,
      WXXY: core.int,
      WXXZ: core.int,
      WXXW: core.int,
      WXYX: core.int,
      WXYY: core.int,
      WXYZ: core.int,
      WXYW: core.int,
      WXZX: core.int,
      WXZY: core.int,
      WXZZ: core.int,
      WXZW: core.int,
      WXWX: core.int,
      WXWY: core.int,
      WXWZ: core.int,
      WXWW: core.int,
      WYXX: core.int,
      WYXY: core.int,
      WYXZ: core.int,
      WYXW: core.int,
      WYYX: core.int,
      WYYY: core.int,
      WYYZ: core.int,
      WYYW: core.int,
      WYZX: core.int,
      WYZY: core.int,
      WYZZ: core.int,
      WYZW: core.int,
      WYWX: core.int,
      WYWY: core.int,
      WYWZ: core.int,
      WYWW: core.int,
      WZXX: core.int,
      WZXY: core.int,
      WZXZ: core.int,
      WZXW: core.int,
      WZYX: core.int,
      WZYY: core.int,
      WZYZ: core.int,
      WZYW: core.int,
      WZZX: core.int,
      WZZY: core.int,
      WZZZ: core.int,
      WZZW: core.int,
      WZWX: core.int,
      WZWY: core.int,
      WZWZ: core.int,
      WZWW: core.int,
      WWXX: core.int,
      WWXY: core.int,
      WWXZ: core.int,
      WWXW: core.int,
      WWYX: core.int,
      WWYY: core.int,
      WWYZ: core.int,
      WWYW: core.int,
      WWZX: core.int,
      WWZY: core.int,
      WWZZ: core.int,
      WWZW: core.int,
      WWWX: core.int,
      WWWY: core.int,
      WWWZ: core.int,
      WWWW: core.int
    })
  });
  typed_data.Int32x4.XXXX = 0;
  typed_data.Int32x4.XXXY = 64;
  typed_data.Int32x4.XXXZ = 128;
  typed_data.Int32x4.XXXW = 192;
  typed_data.Int32x4.XXYX = 16;
  typed_data.Int32x4.XXYY = 80;
  typed_data.Int32x4.XXYZ = 144;
  typed_data.Int32x4.XXYW = 208;
  typed_data.Int32x4.XXZX = 32;
  typed_data.Int32x4.XXZY = 96;
  typed_data.Int32x4.XXZZ = 160;
  typed_data.Int32x4.XXZW = 224;
  typed_data.Int32x4.XXWX = 48;
  typed_data.Int32x4.XXWY = 112;
  typed_data.Int32x4.XXWZ = 176;
  typed_data.Int32x4.XXWW = 240;
  typed_data.Int32x4.XYXX = 4;
  typed_data.Int32x4.XYXY = 68;
  typed_data.Int32x4.XYXZ = 132;
  typed_data.Int32x4.XYXW = 196;
  typed_data.Int32x4.XYYX = 20;
  typed_data.Int32x4.XYYY = 84;
  typed_data.Int32x4.XYYZ = 148;
  typed_data.Int32x4.XYYW = 212;
  typed_data.Int32x4.XYZX = 36;
  typed_data.Int32x4.XYZY = 100;
  typed_data.Int32x4.XYZZ = 164;
  typed_data.Int32x4.XYZW = 228;
  typed_data.Int32x4.XYWX = 52;
  typed_data.Int32x4.XYWY = 116;
  typed_data.Int32x4.XYWZ = 180;
  typed_data.Int32x4.XYWW = 244;
  typed_data.Int32x4.XZXX = 8;
  typed_data.Int32x4.XZXY = 72;
  typed_data.Int32x4.XZXZ = 136;
  typed_data.Int32x4.XZXW = 200;
  typed_data.Int32x4.XZYX = 24;
  typed_data.Int32x4.XZYY = 88;
  typed_data.Int32x4.XZYZ = 152;
  typed_data.Int32x4.XZYW = 216;
  typed_data.Int32x4.XZZX = 40;
  typed_data.Int32x4.XZZY = 104;
  typed_data.Int32x4.XZZZ = 168;
  typed_data.Int32x4.XZZW = 232;
  typed_data.Int32x4.XZWX = 56;
  typed_data.Int32x4.XZWY = 120;
  typed_data.Int32x4.XZWZ = 184;
  typed_data.Int32x4.XZWW = 248;
  typed_data.Int32x4.XWXX = 12;
  typed_data.Int32x4.XWXY = 76;
  typed_data.Int32x4.XWXZ = 140;
  typed_data.Int32x4.XWXW = 204;
  typed_data.Int32x4.XWYX = 28;
  typed_data.Int32x4.XWYY = 92;
  typed_data.Int32x4.XWYZ = 156;
  typed_data.Int32x4.XWYW = 220;
  typed_data.Int32x4.XWZX = 44;
  typed_data.Int32x4.XWZY = 108;
  typed_data.Int32x4.XWZZ = 172;
  typed_data.Int32x4.XWZW = 236;
  typed_data.Int32x4.XWWX = 60;
  typed_data.Int32x4.XWWY = 124;
  typed_data.Int32x4.XWWZ = 188;
  typed_data.Int32x4.XWWW = 252;
  typed_data.Int32x4.YXXX = 1;
  typed_data.Int32x4.YXXY = 65;
  typed_data.Int32x4.YXXZ = 129;
  typed_data.Int32x4.YXXW = 193;
  typed_data.Int32x4.YXYX = 17;
  typed_data.Int32x4.YXYY = 81;
  typed_data.Int32x4.YXYZ = 145;
  typed_data.Int32x4.YXYW = 209;
  typed_data.Int32x4.YXZX = 33;
  typed_data.Int32x4.YXZY = 97;
  typed_data.Int32x4.YXZZ = 161;
  typed_data.Int32x4.YXZW = 225;
  typed_data.Int32x4.YXWX = 49;
  typed_data.Int32x4.YXWY = 113;
  typed_data.Int32x4.YXWZ = 177;
  typed_data.Int32x4.YXWW = 241;
  typed_data.Int32x4.YYXX = 5;
  typed_data.Int32x4.YYXY = 69;
  typed_data.Int32x4.YYXZ = 133;
  typed_data.Int32x4.YYXW = 197;
  typed_data.Int32x4.YYYX = 21;
  typed_data.Int32x4.YYYY = 85;
  typed_data.Int32x4.YYYZ = 149;
  typed_data.Int32x4.YYYW = 213;
  typed_data.Int32x4.YYZX = 37;
  typed_data.Int32x4.YYZY = 101;
  typed_data.Int32x4.YYZZ = 165;
  typed_data.Int32x4.YYZW = 229;
  typed_data.Int32x4.YYWX = 53;
  typed_data.Int32x4.YYWY = 117;
  typed_data.Int32x4.YYWZ = 181;
  typed_data.Int32x4.YYWW = 245;
  typed_data.Int32x4.YZXX = 9;
  typed_data.Int32x4.YZXY = 73;
  typed_data.Int32x4.YZXZ = 137;
  typed_data.Int32x4.YZXW = 201;
  typed_data.Int32x4.YZYX = 25;
  typed_data.Int32x4.YZYY = 89;
  typed_data.Int32x4.YZYZ = 153;
  typed_data.Int32x4.YZYW = 217;
  typed_data.Int32x4.YZZX = 41;
  typed_data.Int32x4.YZZY = 105;
  typed_data.Int32x4.YZZZ = 169;
  typed_data.Int32x4.YZZW = 233;
  typed_data.Int32x4.YZWX = 57;
  typed_data.Int32x4.YZWY = 121;
  typed_data.Int32x4.YZWZ = 185;
  typed_data.Int32x4.YZWW = 249;
  typed_data.Int32x4.YWXX = 13;
  typed_data.Int32x4.YWXY = 77;
  typed_data.Int32x4.YWXZ = 141;
  typed_data.Int32x4.YWXW = 205;
  typed_data.Int32x4.YWYX = 29;
  typed_data.Int32x4.YWYY = 93;
  typed_data.Int32x4.YWYZ = 157;
  typed_data.Int32x4.YWYW = 221;
  typed_data.Int32x4.YWZX = 45;
  typed_data.Int32x4.YWZY = 109;
  typed_data.Int32x4.YWZZ = 173;
  typed_data.Int32x4.YWZW = 237;
  typed_data.Int32x4.YWWX = 61;
  typed_data.Int32x4.YWWY = 125;
  typed_data.Int32x4.YWWZ = 189;
  typed_data.Int32x4.YWWW = 253;
  typed_data.Int32x4.ZXXX = 2;
  typed_data.Int32x4.ZXXY = 66;
  typed_data.Int32x4.ZXXZ = 130;
  typed_data.Int32x4.ZXXW = 194;
  typed_data.Int32x4.ZXYX = 18;
  typed_data.Int32x4.ZXYY = 82;
  typed_data.Int32x4.ZXYZ = 146;
  typed_data.Int32x4.ZXYW = 210;
  typed_data.Int32x4.ZXZX = 34;
  typed_data.Int32x4.ZXZY = 98;
  typed_data.Int32x4.ZXZZ = 162;
  typed_data.Int32x4.ZXZW = 226;
  typed_data.Int32x4.ZXWX = 50;
  typed_data.Int32x4.ZXWY = 114;
  typed_data.Int32x4.ZXWZ = 178;
  typed_data.Int32x4.ZXWW = 242;
  typed_data.Int32x4.ZYXX = 6;
  typed_data.Int32x4.ZYXY = 70;
  typed_data.Int32x4.ZYXZ = 134;
  typed_data.Int32x4.ZYXW = 198;
  typed_data.Int32x4.ZYYX = 22;
  typed_data.Int32x4.ZYYY = 86;
  typed_data.Int32x4.ZYYZ = 150;
  typed_data.Int32x4.ZYYW = 214;
  typed_data.Int32x4.ZYZX = 38;
  typed_data.Int32x4.ZYZY = 102;
  typed_data.Int32x4.ZYZZ = 166;
  typed_data.Int32x4.ZYZW = 230;
  typed_data.Int32x4.ZYWX = 54;
  typed_data.Int32x4.ZYWY = 118;
  typed_data.Int32x4.ZYWZ = 182;
  typed_data.Int32x4.ZYWW = 246;
  typed_data.Int32x4.ZZXX = 10;
  typed_data.Int32x4.ZZXY = 74;
  typed_data.Int32x4.ZZXZ = 138;
  typed_data.Int32x4.ZZXW = 202;
  typed_data.Int32x4.ZZYX = 26;
  typed_data.Int32x4.ZZYY = 90;
  typed_data.Int32x4.ZZYZ = 154;
  typed_data.Int32x4.ZZYW = 218;
  typed_data.Int32x4.ZZZX = 42;
  typed_data.Int32x4.ZZZY = 106;
  typed_data.Int32x4.ZZZZ = 170;
  typed_data.Int32x4.ZZZW = 234;
  typed_data.Int32x4.ZZWX = 58;
  typed_data.Int32x4.ZZWY = 122;
  typed_data.Int32x4.ZZWZ = 186;
  typed_data.Int32x4.ZZWW = 250;
  typed_data.Int32x4.ZWXX = 14;
  typed_data.Int32x4.ZWXY = 78;
  typed_data.Int32x4.ZWXZ = 142;
  typed_data.Int32x4.ZWXW = 206;
  typed_data.Int32x4.ZWYX = 30;
  typed_data.Int32x4.ZWYY = 94;
  typed_data.Int32x4.ZWYZ = 158;
  typed_data.Int32x4.ZWYW = 222;
  typed_data.Int32x4.ZWZX = 46;
  typed_data.Int32x4.ZWZY = 110;
  typed_data.Int32x4.ZWZZ = 174;
  typed_data.Int32x4.ZWZW = 238;
  typed_data.Int32x4.ZWWX = 62;
  typed_data.Int32x4.ZWWY = 126;
  typed_data.Int32x4.ZWWZ = 190;
  typed_data.Int32x4.ZWWW = 254;
  typed_data.Int32x4.WXXX = 3;
  typed_data.Int32x4.WXXY = 67;
  typed_data.Int32x4.WXXZ = 131;
  typed_data.Int32x4.WXXW = 195;
  typed_data.Int32x4.WXYX = 19;
  typed_data.Int32x4.WXYY = 83;
  typed_data.Int32x4.WXYZ = 147;
  typed_data.Int32x4.WXYW = 211;
  typed_data.Int32x4.WXZX = 35;
  typed_data.Int32x4.WXZY = 99;
  typed_data.Int32x4.WXZZ = 163;
  typed_data.Int32x4.WXZW = 227;
  typed_data.Int32x4.WXWX = 51;
  typed_data.Int32x4.WXWY = 115;
  typed_data.Int32x4.WXWZ = 179;
  typed_data.Int32x4.WXWW = 243;
  typed_data.Int32x4.WYXX = 7;
  typed_data.Int32x4.WYXY = 71;
  typed_data.Int32x4.WYXZ = 135;
  typed_data.Int32x4.WYXW = 199;
  typed_data.Int32x4.WYYX = 23;
  typed_data.Int32x4.WYYY = 87;
  typed_data.Int32x4.WYYZ = 151;
  typed_data.Int32x4.WYYW = 215;
  typed_data.Int32x4.WYZX = 39;
  typed_data.Int32x4.WYZY = 103;
  typed_data.Int32x4.WYZZ = 167;
  typed_data.Int32x4.WYZW = 231;
  typed_data.Int32x4.WYWX = 55;
  typed_data.Int32x4.WYWY = 119;
  typed_data.Int32x4.WYWZ = 183;
  typed_data.Int32x4.WYWW = 247;
  typed_data.Int32x4.WZXX = 11;
  typed_data.Int32x4.WZXY = 75;
  typed_data.Int32x4.WZXZ = 139;
  typed_data.Int32x4.WZXW = 203;
  typed_data.Int32x4.WZYX = 27;
  typed_data.Int32x4.WZYY = 91;
  typed_data.Int32x4.WZYZ = 155;
  typed_data.Int32x4.WZYW = 219;
  typed_data.Int32x4.WZZX = 43;
  typed_data.Int32x4.WZZY = 107;
  typed_data.Int32x4.WZZZ = 171;
  typed_data.Int32x4.WZZW = 235;
  typed_data.Int32x4.WZWX = 59;
  typed_data.Int32x4.WZWY = 123;
  typed_data.Int32x4.WZWZ = 187;
  typed_data.Int32x4.WZWW = 251;
  typed_data.Int32x4.WWXX = 15;
  typed_data.Int32x4.WWXY = 79;
  typed_data.Int32x4.WWXZ = 143;
  typed_data.Int32x4.WWXW = 207;
  typed_data.Int32x4.WWYX = 31;
  typed_data.Int32x4.WWYY = 95;
  typed_data.Int32x4.WWYZ = 159;
  typed_data.Int32x4.WWYW = 223;
  typed_data.Int32x4.WWZX = 47;
  typed_data.Int32x4.WWZY = 111;
  typed_data.Int32x4.WWZZ = 175;
  typed_data.Int32x4.WWZW = 239;
  typed_data.Int32x4.WWWX = 63;
  typed_data.Int32x4.WWWY = 127;
  typed_data.Int32x4.WWWZ = 191;
  typed_data.Int32x4.WWWW = 255;
  _native_typed_data.NativeInt32x4List = class NativeInt32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Int32x4), _internal.FixedLengthListMixin$(typed_data.Int32x4)) {
    new(length) {
      this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(length) * 4);
    }
    _externalStorage(storage) {
      this[_storage] = storage;
    }
    _slowFromList(list) {
      this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(list[dartx.length]) * 4);
      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
        let e = list[dartx._get](i);
        this[_storage][dartx._set](i * 4 + 0, e.x);
        this[_storage][dartx._set](i * 4 + 1, e.y);
        this[_storage][dartx._set](i * 4 + 2, e.z);
        this[_storage][dartx._set](i * 4 + 3, e.w);
      }
    }
    get runtimeType() {
      return dart.wrapType(typed_data.Int32x4List);
    }
    static fromList(list) {
      if (_native_typed_data.NativeInt32x4List.is(list)) {
        return new _native_typed_data.NativeInt32x4List._externalStorage(_native_typed_data.NativeInt32List.fromList(list[_storage]));
      } else {
        return new _native_typed_data.NativeInt32x4List._slowFromList(list);
      }
    }
    get buffer() {
      return this[_storage][dartx.buffer];
    }
    get lengthInBytes() {
      return this[_storage][dartx.lengthInBytes];
    }
    get offsetInBytes() {
      return this[_storage][dartx.offsetInBytes];
    }
    get elementSizeInBytes() {
      return typed_data.Int32x4List.BYTES_PER_ELEMENT;
    }
    get length() {
      return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
      let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
      let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
      let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
      this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
      return value;
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this.length);
      return new _native_typed_data.NativeInt32x4List._externalStorage(typed_data.Int32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_externalStorage');
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_slowFromList');
  _native_typed_data.NativeInt32x4List[dart.implements] = () => [typed_data.Int32x4List];
  dart.setSignature(_native_typed_data.NativeInt32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [core.int]),
      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [typed_data.Int32List]),
      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()])
    }),
    fields: () => ({[_storage]: typed_data.Int32List}),
    getters: () => ({
      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      lengthInBytes: dart.definiteFunctionType(core.int, []),
      offsetInBytes: dart.definiteFunctionType(core.int, []),
      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Int32x4]),
      sublist: dart.definiteFunctionType(core.List$(typed_data.Int32x4), [core.int], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeInt32x4List, [
    '_get',
    '_set',
    'sublist',
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes',
    'length'
  ]);
  typed_data.Float64x2 = class Float64x2 extends core.Object {
    static new(x, y) {
      return new _native_typed_data.NativeFloat64x2(x, y);
    }
    static splat(v) {
      return new _native_typed_data.NativeFloat64x2.splat(v);
    }
    static zero() {
      return new _native_typed_data.NativeFloat64x2.zero();
    }
    static fromFloat32x4(v) {
      return new _native_typed_data.NativeFloat64x2.fromFloat32x4(v);
    }
  };
  dart.setSignature(typed_data.Float64x2, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float64x2, [core.double, core.double]),
      splat: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      zero: dart.definiteFunctionType(typed_data.Float64x2, []),
      fromFloat32x4: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float32x4])
    })
  });
  _native_typed_data.NativeFloat64x2List = class NativeFloat64x2List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float64x2), _internal.FixedLengthListMixin$(typed_data.Float64x2)) {
    new(length) {
      this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(length) * 2);
    }
    _externalStorage(storage) {
      this[_storage] = storage;
    }
    _slowFromList(list) {
      this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(list[dartx.length]) * 2);
      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
        let e = list[dartx._get](i);
        this[_storage][dartx._set](i * 2 + 0, e.x);
        this[_storage][dartx._set](i * 2 + 1, e.y);
      }
    }
    static fromList(list) {
      if (_native_typed_data.NativeFloat64x2List.is(list)) {
        return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List.fromList(list[_storage]));
      } else {
        return new _native_typed_data.NativeFloat64x2List._slowFromList(list);
      }
    }
    get runtimeType() {
      return dart.wrapType(typed_data.Float64x2List);
    }
    get buffer() {
      return this[_storage][dartx.buffer];
    }
    get lengthInBytes() {
      return this[_storage][dartx.lengthInBytes];
    }
    get offsetInBytes() {
      return this[_storage][dartx.offsetInBytes];
    }
    get elementSizeInBytes() {
      return typed_data.Float64x2List.BYTES_PER_ELEMENT;
    }
    get length() {
      return (dart.notNull(this[_storage][dartx.length]) / 2)[dartx.truncate]();
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      let _x = this[_storage][dartx._get](dart.notNull(index) * 2 + 0);
      let _y = this[_storage][dartx._get](dart.notNull(index) * 2 + 1);
      return typed_data.Float64x2.new(_x, _y);
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this.length);
      this[_storage][dartx._set](dart.notNull(index) * 2 + 0, value.x);
      this[_storage][dartx._set](dart.notNull(index) * 2 + 1, value.y);
      return value;
    }
    sublist(start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this.length);
      return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List._check(this[_storage][dartx.sublist](dart.notNull(start) * 2, dart.notNull(end) * 2)));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_externalStorage');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_slowFromList');
  _native_typed_data.NativeFloat64x2List[dart.implements] = () => [typed_data.Float64x2List];
  dart.setSignature(_native_typed_data.NativeFloat64x2List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [core.int]),
      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [_native_typed_data.NativeFloat64List]),
      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()])
    }),
    fields: () => ({[_storage]: _native_typed_data.NativeFloat64List}),
    getters: () => ({
      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      lengthInBytes: dart.definiteFunctionType(core.int, []),
      offsetInBytes: dart.definiteFunctionType(core.int, []),
      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
      length: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(typed_data.Float64x2, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float64x2]),
      sublist: dart.definiteFunctionType(core.List$(typed_data.Float64x2), [core.int], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeFloat64x2List, [
    '_get',
    '_set',
    'sublist',
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes',
    'length'
  ]);
  const _invalidPosition = Symbol('_invalidPosition');
  const _checkPosition = Symbol('_checkPosition');
  dart.defineExtensionNames([
    'buffer',
    'lengthInBytes',
    'offsetInBytes',
    'elementSizeInBytes'
  ]);
  _native_typed_data.NativeTypedData = class NativeTypedData extends core.Object {
    get [dartx.buffer]() {
      return this.buffer;
    }
    get [dartx.lengthInBytes]() {
      return this.byteLength;
    }
    get [dartx.offsetInBytes]() {
      return this.byteOffset;
    }
    get [dartx.elementSizeInBytes]() {
      return this.BYTES_PER_ELEMENT;
    }
    [_invalidPosition](position, length, name) {
      if (!(typeof position == 'number')) {
        dart.throw(new core.ArgumentError.value(position, name, 'Invalid list position'));
      } else {
        dart.throw(new core.RangeError.range(position, 0, length, name));
      }
    }
    [_checkPosition](position, length, name) {
      if (position >>> 0 !== position || position > dart.notNull(length)) {
        this[_invalidPosition](position, length, name);
      }
    }
  };
  _native_typed_data.NativeTypedData[dart.implements] = () => [typed_data.TypedData];
  dart.setSignature(_native_typed_data.NativeTypedData, {
    getters: () => ({
      [dartx.buffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      [dartx.lengthInBytes]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetInBytes]: dart.definiteFunctionType(core.int, []),
      [dartx.elementSizeInBytes]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [_invalidPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
      [_checkPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String])
    })
  });
  dart.registerExtension(dart.global.ArrayBufferView, _native_typed_data.NativeTypedData);
  _native_typed_data._checkLength = function(length) {
    if (!(typeof length == 'number')) dart.throw(new core.ArgumentError(dart.str`Invalid length ${length}`));
    return core.int._check(length);
  };
  dart.fn(_native_typed_data._checkLength, dynamicToint());
  _native_typed_data._checkViewArguments = function(buffer, offsetInBytes, length) {
    if (!_native_typed_data.NativeByteBuffer.is(buffer)) {
      dart.throw(new core.ArgumentError('Invalid view buffer'));
    }
    if (!(typeof offsetInBytes == 'number')) {
      dart.throw(new core.ArgumentError(dart.str`Invalid view offsetInBytes ${offsetInBytes}`));
    }
    if (length != null && !(typeof length == 'number')) {
      dart.throw(new core.ArgumentError(dart.str`Invalid view length ${length}`));
    }
  };
  dart.fn(_native_typed_data._checkViewArguments, dynamicAnddynamicAnddynamicTovoid());
  _native_typed_data._ensureNativeList = function(list) {
    if (_interceptors.JSIndexable.is(list)) return list;
    let result = core.List.new(list[dartx.length]);
    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
      result[dartx._set](i, list[dartx._get](i));
    }
    return result;
  };
  dart.lazyFn(_native_typed_data._ensureNativeList, () => ListToList());
  const _getFloat32 = Symbol('_getFloat32');
  const _getFloat64 = Symbol('_getFloat64');
  const _getInt16 = Symbol('_getInt16');
  const _getInt32 = Symbol('_getInt32');
  const _getUint16 = Symbol('_getUint16');
  const _getUint32 = Symbol('_getUint32');
  const _setFloat32 = Symbol('_setFloat32');
  const _setFloat64 = Symbol('_setFloat64');
  const _setInt16 = Symbol('_setInt16');
  const _setInt32 = Symbol('_setInt32');
  const _setUint16 = Symbol('_setUint16');
  const _setUint32 = Symbol('_setUint32');
  dart.defineExtensionNames([
    'runtimeType',
    'elementSizeInBytes',
    'getFloat32',
    'getFloat64',
    'getInt16',
    'getInt32',
    'getInt64',
    'getInt8',
    'getUint16',
    'getUint32',
    'getUint64',
    'getUint8',
    'setFloat32',
    'setFloat64',
    'setInt16',
    'setInt32',
    'setInt64',
    'setInt8',
    'setUint16',
    'setUint32',
    'setUint64',
    'setUint8'
  ]);
  _native_typed_data.NativeByteData = class NativeByteData extends _native_typed_data.NativeTypedData {
    static new(length) {
      return _native_typed_data.NativeByteData._create1(_native_typed_data._checkLength(length));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeByteData._create2(buffer, offsetInBytes) : _native_typed_data.NativeByteData._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.ByteData);
    }
    get [dartx.elementSizeInBytes]() {
      return 1;
    }
    [dartx.getFloat32](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getFloat32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getFloat32](...args) {
      return this.getFloat32.apply(this, args);
    }
    [dartx.getFloat64](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getFloat64](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getFloat64](...args) {
      return this.getFloat64.apply(this, args);
    }
    [dartx.getInt16](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getInt16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getInt16](...args) {
      return this.getInt16.apply(this, args);
    }
    [dartx.getInt32](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getInt32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getInt32](...args) {
      return this.getInt32.apply(this, args);
    }
    [dartx.getInt64](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
    }
    [dartx.getInt8](...args) {
      return this.getInt8.apply(this, args);
    }
    [dartx.getUint16](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getUint16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getUint16](...args) {
      return this.getUint16.apply(this, args);
    }
    [dartx.getUint32](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_getUint32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_getUint32](...args) {
      return this.getUint32.apply(this, args);
    }
    [dartx.getUint64](byteOffset, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
    }
    [dartx.getUint8](...args) {
      return this.getUint8.apply(this, args);
    }
    [dartx.setFloat32](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setFloat32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setFloat32](...args) {
      return this.setFloat32.apply(this, args);
    }
    [dartx.setFloat64](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setFloat64](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setFloat64](...args) {
      return this.setFloat64.apply(this, args);
    }
    [dartx.setInt16](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setInt16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setInt16](...args) {
      return this.setInt16.apply(this, args);
    }
    [dartx.setInt32](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setInt32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setInt32](...args) {
      return this.setInt32.apply(this, args);
    }
    [dartx.setInt64](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
    }
    [dartx.setInt8](...args) {
      return this.setInt8.apply(this, args);
    }
    [dartx.setUint16](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setUint16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setUint16](...args) {
      return this.setUint16.apply(this, args);
    }
    [dartx.setUint32](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      return this[_setUint32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
    }
    [_setUint32](...args) {
      return this.setUint32.apply(this, args);
    }
    [dartx.setUint64](byteOffset, value, endian) {
      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
      dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
    }
    [dartx.setUint8](...args) {
      return this.setUint8.apply(this, args);
    }
    static _create1(arg) {
      return new DataView(new ArrayBuffer(arg));
    }
    static _create2(arg1, arg2) {
      return new DataView(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new DataView(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeByteData[dart.implements] = () => [typed_data.ByteData];
  dart.setSignature(_native_typed_data.NativeByteData, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeByteData, [core.int]),
      view: dart.definiteFunctionType(_native_typed_data.NativeByteData, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx.getFloat32]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
      [_getFloat32]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
      [dartx.getFloat64]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
      [_getFloat64]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
      [dartx.getInt16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getInt16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getInt32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getInt32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getInt64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [dartx.getInt8]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.getUint16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getUint16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getUint32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [_getUint32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
      [dartx.getUint64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
      [dartx.getUint8]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
      [_setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
      [dartx.setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
      [_setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
      [dartx.setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setInt64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [dartx.setInt8]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [_setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
      [dartx.setUint64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
      [dartx.setUint8]: dart.definiteFunctionType(dart.void, [core.int, core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.DataView, _native_typed_data.NativeByteData);
  const _setRangeFast = Symbol('_setRangeFast');
  _native_typed_data.NativeTypedArray = class NativeTypedArray extends _native_typed_data.NativeTypedData {
    [_setRangeFast](start, end, source, skipCount) {
      let targetLength = this[dartx.length];
      this[_checkPosition](start, targetLength, "start");
      this[_checkPosition](end, targetLength, "end");
      if (dart.notNull(start) > dart.notNull(end)) dart.throw(new core.RangeError.range(start, 0, end));
      let count = dart.notNull(end) - dart.notNull(start);
      if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
      let sourceLength = source[dartx.length];
      if (dart.notNull(sourceLength) - dart.notNull(skipCount) < count) {
        dart.throw(new core.StateError('Not enough elements'));
      }
      if (skipCount != 0 || sourceLength != count) {
        source = source.subarray(skipCount, dart.notNull(skipCount) + count);
      }
      this.set(source, start);
    }
  };
  _native_typed_data.NativeTypedArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior];
  dart.setSignature(_native_typed_data.NativeTypedArray, {
    methods: () => ({[_setRangeFast]: dart.definiteFunctionType(dart.void, [core.int, core.int, _native_typed_data.NativeTypedArray, core.int])})
  });
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'setRange'
  ]);
  _native_typed_data.NativeTypedArrayOfDouble = class NativeTypedArrayOfDouble extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.double), _internal.FixedLengthListMixin$(core.double)) {
    get length() {
      return this.length;
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      this[index] = value;
      return value;
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      if (_native_typed_data.NativeTypedArrayOfDouble.is(iterable)) {
        this[_setRangeFast](start, end, iterable, skipCount);
        return;
      }
      super[dartx.setRange](start, end, iterable, skipCount);
    }
  };
  dart.setSignature(_native_typed_data.NativeTypedArrayOfDouble, {
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      _get: dart.definiteFunctionType(core.double, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, core.num]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfdouble()], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfDouble, ['_get', '_set', 'setRange', 'length']);
  dart.defineExtensionNames([
    'length',
    '_set',
    'setRange'
  ]);
  _native_typed_data.NativeTypedArrayOfInt = class NativeTypedArrayOfInt extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.int), _internal.FixedLengthListMixin$(core.int)) {
    get length() {
      return this.length;
    }
    set length(value) {
      super.length = value;
    }
    _set(index, value) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      this[index] = value;
      return value;
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      if (_native_typed_data.NativeTypedArrayOfInt.is(iterable)) {
        this[_setRangeFast](start, end, iterable, skipCount);
        return;
      }
      super[dartx.setRange](start, end, iterable, skipCount);
    }
  };
  _native_typed_data.NativeTypedArrayOfInt[dart.implements] = () => [ListOfint()];
  dart.setSignature(_native_typed_data.NativeTypedArrayOfInt, {
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      _set: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfint()], [core.int])
    })
  });
  dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfInt, ['_set', 'setRange', 'length']);
  dart.defineExtensionNames([
    'runtimeType',
    'sublist'
  ]);
  _native_typed_data.NativeFloat32List = class NativeFloat32List extends _native_typed_data.NativeTypedArrayOfDouble {
    static new(length) {
      return _native_typed_data.NativeFloat32List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat32List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeFloat32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat32List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Float32List);
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeFloat32List._create1(source);
    }
    static _create1(arg) {
      return new Float32Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Float32Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Float32Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeFloat32List[dart.implements] = () => [typed_data.Float32List];
  dart.setSignature(_native_typed_data.NativeFloat32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [ListOfdouble()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({[dartx.sublist]: dart.definiteFunctionType(core.List$(core.double), [core.int], [core.int])}),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Float32Array, _native_typed_data.NativeFloat32List);
  dart.defineExtensionNames([
    'runtimeType',
    'sublist'
  ]);
  _native_typed_data.NativeFloat64List = class NativeFloat64List extends _native_typed_data.NativeTypedArrayOfDouble {
    static new(length) {
      return _native_typed_data.NativeFloat64List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat64List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeFloat64List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat64List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Float64List);
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeFloat64List._create1(source);
    }
    static _create1(arg) {
      return new Float64Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Float64Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Float64Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeFloat64List[dart.implements] = () => [typed_data.Float64List];
  dart.setSignature(_native_typed_data.NativeFloat64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [ListOfdouble()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({[dartx.sublist]: dart.definiteFunctionType(core.List$(core.double), [core.int], [core.int])}),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Float64Array, _native_typed_data.NativeFloat64List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeInt16List = class NativeInt16List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeInt16List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt16List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeInt16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt16List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Int16List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeInt16List._create1(source);
    }
    static _create1(arg) {
      return new Int16Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Int16Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Int16Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeInt16List[dart.implements] = () => [typed_data.Int16List];
  dart.setSignature(_native_typed_data.NativeInt16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [_native_typed_data.NativeByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Int16Array, _native_typed_data.NativeInt16List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeInt32List = class NativeInt32List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeInt32List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt32List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeInt32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt32List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Int32List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeInt32List._create1(source);
    }
    static _create1(arg) {
      return new Int32Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Int32Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Int32Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeInt32List[dart.implements] = () => [typed_data.Int32List];
  dart.setSignature(_native_typed_data.NativeInt32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Int32Array, _native_typed_data.NativeInt32List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeInt8List = class NativeInt8List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeInt8List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt8List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return _native_typed_data.NativeInt8List._check(length == null ? _native_typed_data.NativeInt8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt8List._create3(buffer, offsetInBytes, length));
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Int8List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeInt8List._create1(source);
    }
    static _create1(arg) {
      return new Int8Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Int8Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Int8Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeInt8List[dart.implements] = () => [typed_data.Int8List];
  dart.setSignature(_native_typed_data.NativeInt8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(typed_data.Int8List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Int8Array, _native_typed_data.NativeInt8List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint16List = class NativeUint16List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint16List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(list) {
      return _native_typed_data.NativeUint16List._create1(_native_typed_data._ensureNativeList(list));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint16List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint16List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint16List._create1(source);
    }
    static _create1(arg) {
      return new Uint16Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint16Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint16Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint16List[dart.implements] = () => [typed_data.Uint16List];
  dart.setSignature(_native_typed_data.NativeUint16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint16Array, _native_typed_data.NativeUint16List);
  dart.defineExtensionNames([
    'runtimeType',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint32List = class NativeUint32List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint32List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint32List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint32List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint32List);
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint32List._create1(source);
    }
    static _create1(arg) {
      return new Uint32Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint32Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint32Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint32List[dart.implements] = () => [typed_data.Uint32List];
  dart.setSignature(_native_typed_data.NativeUint32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint32Array, _native_typed_data.NativeUint32List);
  dart.defineExtensionNames([
    'runtimeType',
    'length',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint8ClampedList = class NativeUint8ClampedList extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint8ClampedList._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8ClampedList._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint8ClampedList);
    }
    get [dartx.length]() {
      return this.length;
    }
    set [dartx.length](value) {
      super[dartx.length] = value;
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint8ClampedList._create1(source);
    }
    static _create1(arg) {
      return new Uint8ClampedArray(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint8ClampedArray(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint8ClampedArray(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint8ClampedList[dart.implements] = () => [typed_data.Uint8ClampedList];
  dart.setSignature(_native_typed_data.NativeUint8ClampedList, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint8ClampedArray, _native_typed_data.NativeUint8ClampedList);
  dart.registerExtension(dart.global.CanvasPixelArray, _native_typed_data.NativeUint8ClampedList);
  dart.defineExtensionNames([
    'runtimeType',
    'length',
    '_get',
    'sublist'
  ]);
  _native_typed_data.NativeUint8List = class NativeUint8List extends _native_typed_data.NativeTypedArrayOfInt {
    static new(length) {
      return _native_typed_data.NativeUint8List._create1(_native_typed_data._checkLength(length));
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8List._create1(_native_typed_data._ensureNativeList(elements));
    }
    static view(buffer, offsetInBytes, length) {
      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
      return length == null ? _native_typed_data.NativeUint8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8List._create3(buffer, offsetInBytes, length);
    }
    get [dartx.runtimeType]() {
      return dart.wrapType(typed_data.Uint8List);
    }
    get [dartx.length]() {
      return this.length;
    }
    set [dartx.length](value) {
      super[dartx.length] = value;
    }
    [dartx._get](index) {
      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
      return this[index];
    }
    [dartx.sublist](start, end) {
      if (end === void 0) end = null;
      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
      let source = this.subarray(start, end);
      return _native_typed_data.NativeUint8List._create1(source);
    }
    static _create1(arg) {
      return new Uint8Array(arg);
    }
    static _create2(arg1, arg2) {
      return new Uint8Array(arg1, arg2);
    }
    static _create3(arg1, arg2, arg3) {
      return new Uint8Array(arg1, arg2, arg3);
    }
  };
  _native_typed_data.NativeUint8List[dart.implements] = () => [typed_data.Uint8List];
  dart.setSignature(_native_typed_data.NativeUint8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [core.int]),
      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [ListOfint()]),
      view: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [typed_data.ByteBuffer, core.int, core.int])
    }),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.sublist]: dart.definiteFunctionType(core.List$(core.int), [core.int], [core.int])
    }),
    statics: () => ({
      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic]),
      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic]),
      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create1', '_create2', '_create3']
  });
  dart.registerExtension(dart.global.Uint8Array, _native_typed_data.NativeUint8List);
  _native_typed_data.NativeFloat32x4 = class NativeFloat32x4 extends core.Object {
    static _truncate(x) {
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, core.num._check(x));
      return _native_typed_data.NativeFloat32x4._list[dartx._get](0);
    }
    new(x, y, z, w) {
      this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
      this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
      this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
      this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
      if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
      if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
      if (!(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
      if (!(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
    }
    splat(v) {
      NativeFloat32x4.prototype.new.call(this, v, v, v, v);
    }
    zero() {
      NativeFloat32x4.prototype._truncated.call(this, 0.0, 0.0, 0.0, 0.0);
    }
    static fromInt32x4Bits(i) {
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](0, i.x);
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](1, i.y);
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](2, i.z);
      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](3, i.w);
      return new _native_typed_data.NativeFloat32x4._truncated(_native_typed_data.NativeFloat32x4._list[dartx._get](0), _native_typed_data.NativeFloat32x4._list[dartx._get](1), _native_typed_data.NativeFloat32x4._list[dartx._get](2), _native_typed_data.NativeFloat32x4._list[dartx._get](3));
    }
    fromFloat64x2(v) {
      NativeFloat32x4.prototype._truncated.call(this, core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.x)), core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.y)), 0.0, 0.0);
    }
    _doubles(x, y, z, w) {
      this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
      this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
      this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
      this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
    }
    _truncated(x, y, z, w) {
      this.x = x;
      this.y = y;
      this.z = z;
      this.w = w;
    }
    toString() {
      return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
    }
    ['+'](other) {
      let _x = dart.notNull(this.x) + dart.notNull(other.x);
      let _y = dart.notNull(this.y) + dart.notNull(other.y);
      let _z = dart.notNull(this.z) + dart.notNull(other.z);
      let _w = dart.notNull(this.w) + dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    _negate() {
      return new _native_typed_data.NativeFloat32x4._truncated(-dart.notNull(this.x), -dart.notNull(this.y), -dart.notNull(this.z), -dart.notNull(this.w));
    }
    ['-'](other) {
      let _x = dart.notNull(this.x) - dart.notNull(other.x);
      let _y = dart.notNull(this.y) - dart.notNull(other.y);
      let _z = dart.notNull(this.z) - dart.notNull(other.z);
      let _w = dart.notNull(this.w) - dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    ['*'](other) {
      let _x = dart.notNull(this.x) * dart.notNull(other.x);
      let _y = dart.notNull(this.y) * dart.notNull(other.y);
      let _z = dart.notNull(this.z) * dart.notNull(other.z);
      let _w = dart.notNull(this.w) * dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    ['/'](other) {
      let _x = dart.notNull(this.x) / dart.notNull(other.x);
      let _y = dart.notNull(this.y) / dart.notNull(other.y);
      let _z = dart.notNull(this.z) / dart.notNull(other.z);
      let _w = dart.notNull(this.w) / dart.notNull(other.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    lessThan(other) {
      let _cx = dart.notNull(this.x) < dart.notNull(other.x);
      let _cy = dart.notNull(this.y) < dart.notNull(other.y);
      let _cz = dart.notNull(this.z) < dart.notNull(other.z);
      let _cw = dart.notNull(this.w) < dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    lessThanOrEqual(other) {
      let _cx = dart.notNull(this.x) <= dart.notNull(other.x);
      let _cy = dart.notNull(this.y) <= dart.notNull(other.y);
      let _cz = dart.notNull(this.z) <= dart.notNull(other.z);
      let _cw = dart.notNull(this.w) <= dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    greaterThan(other) {
      let _cx = dart.notNull(this.x) > dart.notNull(other.x);
      let _cy = dart.notNull(this.y) > dart.notNull(other.y);
      let _cz = dart.notNull(this.z) > dart.notNull(other.z);
      let _cw = dart.notNull(this.w) > dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    greaterThanOrEqual(other) {
      let _cx = dart.notNull(this.x) >= dart.notNull(other.x);
      let _cy = dart.notNull(this.y) >= dart.notNull(other.y);
      let _cz = dart.notNull(this.z) >= dart.notNull(other.z);
      let _cw = dart.notNull(this.w) >= dart.notNull(other.w);
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    equal(other) {
      let _cx = this.x == other.x;
      let _cy = this.y == other.y;
      let _cz = this.z == other.z;
      let _cw = this.w == other.w;
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    notEqual(other) {
      let _cx = this.x != other.x;
      let _cy = this.y != other.y;
      let _cz = this.z != other.z;
      let _cw = this.w != other.w;
      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
    }
    scale(s) {
      let _x = dart.notNull(s) * dart.notNull(this.x);
      let _y = dart.notNull(s) * dart.notNull(this.y);
      let _z = dart.notNull(s) * dart.notNull(this.z);
      let _w = dart.notNull(s) * dart.notNull(this.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    abs() {
      let _x = this.x[dartx.abs]();
      let _y = this.y[dartx.abs]();
      let _z = this.z[dartx.abs]();
      let _w = this.w[dartx.abs]();
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    clamp(lowerLimit, upperLimit) {
      let _lx = lowerLimit.x;
      let _ly = lowerLimit.y;
      let _lz = lowerLimit.z;
      let _lw = lowerLimit.w;
      let _ux = upperLimit.x;
      let _uy = upperLimit.y;
      let _uz = upperLimit.z;
      let _uw = upperLimit.w;
      let _x = this.x;
      let _y = this.y;
      let _z = this.z;
      let _w = this.w;
      _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
      _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
      _z = dart.notNull(_z) > dart.notNull(_uz) ? _uz : _z;
      _w = dart.notNull(_w) > dart.notNull(_uw) ? _uw : _w;
      _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
      _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
      _z = dart.notNull(_z) < dart.notNull(_lz) ? _lz : _z;
      _w = dart.notNull(_w) < dart.notNull(_lw) ? _lw : _w;
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    get signMask() {
      let view = _native_typed_data.NativeFloat32x4._uint32view;
      let mx = null, my = null, mz = null, mw = null;
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
      mx = (dart.notNull(view[dartx._get](0)) & 2147483648) >>> 31;
      my = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 30;
      mz = (dart.notNull(view[dartx._get](2)) & 2147483648) >>> 29;
      mw = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 28;
      return core.int._check(dart.dsend(dart.dsend(dart.dsend(mx, '|', my), '|', mz), '|', mw));
    }
    shuffle(mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    shuffleMix(other, mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      _native_typed_data.NativeFloat32x4._list[dartx._set](0, other.x);
      _native_typed_data.NativeFloat32x4._list[dartx._set](1, other.y);
      _native_typed_data.NativeFloat32x4._list[dartx._set](2, other.z);
      _native_typed_data.NativeFloat32x4._list[dartx._set](3, other.w);
      let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    withX(newX) {
      return new _native_typed_data.NativeFloat32x4._truncated(core.double._check(_native_typed_data.NativeFloat32x4._truncate(newX)), this.y, this.z, this.w);
    }
    withY(newY) {
      return new _native_typed_data.NativeFloat32x4._truncated(this.x, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newY)), this.z, this.w);
    }
    withZ(newZ) {
      return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newZ)), this.w);
    }
    withW(newW) {
      return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, this.z, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newW)));
    }
    min(other) {
      let _x = dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x;
      let _y = dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y;
      let _z = dart.notNull(this.z) < dart.notNull(other.z) ? this.z : other.z;
      let _w = dart.notNull(this.w) < dart.notNull(other.w) ? this.w : other.w;
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    max(other) {
      let _x = dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x;
      let _y = dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y;
      let _z = dart.notNull(this.z) > dart.notNull(other.z) ? this.z : other.z;
      let _w = dart.notNull(this.w) > dart.notNull(other.w) ? this.w : other.w;
      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
    }
    sqrt() {
      let _x = math.sqrt(this.x);
      let _y = math.sqrt(this.y);
      let _z = math.sqrt(this.z);
      let _w = math.sqrt(this.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    reciprocal() {
      let _x = 1.0 / dart.notNull(this.x);
      let _y = 1.0 / dart.notNull(this.y);
      let _z = 1.0 / dart.notNull(this.z);
      let _w = 1.0 / dart.notNull(this.w);
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
    reciprocalSqrt() {
      let _x = math.sqrt(1.0 / dart.notNull(this.x));
      let _y = math.sqrt(1.0 / dart.notNull(this.y));
      let _z = math.sqrt(1.0 / dart.notNull(this.z));
      let _w = math.sqrt(1.0 / dart.notNull(this.w));
      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'splat');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'zero');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'fromFloat64x2');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_doubles');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_truncated');
  _native_typed_data.NativeFloat32x4[dart.implements] = () => [typed_data.Float32x4];
  dart.setSignature(_native_typed_data.NativeFloat32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
      splat: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double]),
      zero: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, []),
      fromInt32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Int32x4]),
      fromFloat64x2: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Float64x2]),
      _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
      _truncated: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double])
    }),
    fields: () => ({
      x: core.double,
      y: core.double,
      z: core.double,
      w: core.double
    }),
    getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      '+': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      _negate: dart.definiteFunctionType(typed_data.Float32x4, []),
      '-': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      '*': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      '/': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      lessThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      lessThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      greaterThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      greaterThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      equal: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      notEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
      scale: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      abs: dart.definiteFunctionType(typed_data.Float32x4, []),
      clamp: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4]),
      shuffle: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
      shuffleMix: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, core.int]),
      withX: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      withY: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      withZ: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      withW: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
      min: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      max: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
      sqrt: dart.definiteFunctionType(typed_data.Float32x4, []),
      reciprocal: dart.definiteFunctionType(typed_data.Float32x4, []),
      reciprocalSqrt: dart.definiteFunctionType(typed_data.Float32x4, [])
    }),
    sfields: () => ({
      _list: _native_typed_data.NativeFloat32List,
      _uint32view: typed_data.Uint32List
    }),
    statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_truncate']
  });
  dart.defineLazy(_native_typed_data.NativeFloat32x4, {
    get _list() {
      return _native_typed_data.NativeFloat32List.new(4);
    },
    get _uint32view() {
      return _native_typed_data.NativeFloat32x4._list[dartx.buffer][dartx.asUint32List]();
    }
  });
  _native_typed_data.NativeInt32x4 = class NativeInt32x4 extends core.Object {
    static _truncate(x) {
      _native_typed_data.NativeInt32x4._list[dartx._set](0, core.int._check(x));
      return _native_typed_data.NativeInt32x4._list[dartx._get](0);
    }
    new(x, y, z, w) {
      this.x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
      this.y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
      this.z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
      this.w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
      if (x != this.x && !(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
      if (y != this.y && !(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
      if (z != this.z && !(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
      if (w != this.w && !(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
    }
    bool(x, y, z, w) {
      this.x = dart.test(x) ? -1 : 0;
      this.y = dart.test(y) ? -1 : 0;
      this.z = dart.test(z) ? -1 : 0;
      this.w = dart.test(w) ? -1 : 0;
    }
    static fromFloat32x4Bits(f) {
      let floatList = _native_typed_data.NativeFloat32x4._list;
      floatList[dartx._set](0, f.x);
      floatList[dartx._set](1, f.y);
      floatList[dartx._set](2, f.z);
      floatList[dartx._set](3, f.w);
      let view = _native_typed_data.NativeInt32List._check(floatList[dartx.buffer][dartx.asInt32List]());
      return new _native_typed_data.NativeInt32x4._truncated(view[dartx._get](0), view[dartx._get](1), view[dartx._get](2), view[dartx._get](3));
    }
    _truncated(x, y, z, w) {
      this.x = x;
      this.y = y;
      this.z = z;
      this.w = w;
    }
    toString() {
      return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
    }
    ['|'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x | other.x, this.y | other.y, this.z | other.z, this.w | other.w);
    }
    ['&'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x & other.x, this.y & other.y, this.z & other.z, this.w & other.w);
    }
    ['^'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x ^ other.x, this.y ^ other.y, this.z ^ other.z, this.w ^ other.w);
    }
    ['+'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x + other.x | 0, this.y + other.y | 0, this.z + other.z | 0, this.w + other.w | 0);
    }
    ['-'](other) {
      return new _native_typed_data.NativeInt32x4._truncated(this.x - other.x | 0, this.y - other.y | 0, this.z - other.z | 0, this.w - other.w | 0);
    }
    _negate() {
      return new _native_typed_data.NativeInt32x4._truncated(-this.x | 0, -this.y | 0, -this.z | 0, -this.w | 0);
    }
    get signMask() {
      let mx = (dart.notNull(this.x) & 2147483648) >>> 31;
      let my = (dart.notNull(this.y) & 2147483648) >>> 31;
      let mz = (dart.notNull(this.z) & 2147483648) >>> 31;
      let mw = (dart.notNull(this.w) & 2147483648) >>> 31;
      return (mx | my << 1 | mz << 2 | mw << 3) >>> 0;
    }
    shuffle(mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
    }
    shuffleMix(other, mask) {
      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
      }
      _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
      _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
      _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
      _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
      let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
      let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
      _native_typed_data.NativeInt32x4._list[dartx._set](0, other.x);
      _native_typed_data.NativeInt32x4._list[dartx._set](1, other.y);
      _native_typed_data.NativeInt32x4._list[dartx._set](2, other.z);
      _native_typed_data.NativeInt32x4._list[dartx._set](3, other.w);
      let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
      let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
    }
    withX(x) {
      let _x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
      return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
    }
    withY(y) {
      let _y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
      return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
    }
    withZ(z) {
      let _z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
    }
    withW(w) {
      let _w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
    }
    get flagX() {
      return this.x != 0;
    }
    get flagY() {
      return this.y != 0;
    }
    get flagZ() {
      return this.z != 0;
    }
    get flagW() {
      return this.w != 0;
    }
    withFlagX(flagX) {
      let _x = dart.test(flagX) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
    }
    withFlagY(flagY) {
      let _y = dart.test(flagY) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
    }
    withFlagZ(flagZ) {
      let _z = dart.test(flagZ) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
    }
    withFlagW(flagW) {
      let _w = dart.test(flagW) ? -1 : 0;
      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
    }
    select(trueValue, falseValue) {
      let floatList = _native_typed_data.NativeFloat32x4._list;
      let intView = _native_typed_data.NativeFloat32x4._uint32view;
      floatList[dartx._set](0, trueValue.x);
      floatList[dartx._set](1, trueValue.y);
      floatList[dartx._set](2, trueValue.z);
      floatList[dartx._set](3, trueValue.w);
      let stx = intView[dartx._get](0);
      let sty = intView[dartx._get](1);
      let stz = intView[dartx._get](2);
      let stw = intView[dartx._get](3);
      floatList[dartx._set](0, falseValue.x);
      floatList[dartx._set](1, falseValue.y);
      floatList[dartx._set](2, falseValue.z);
      floatList[dartx._set](3, falseValue.w);
      let sfx = intView[dartx._get](0);
      let sfy = intView[dartx._get](1);
      let sfz = intView[dartx._get](2);
      let sfw = intView[dartx._get](3);
      let _x = (dart.notNull(this.x) & dart.notNull(stx) | ~dart.notNull(this.x) & dart.notNull(sfx)) >>> 0;
      let _y = (dart.notNull(this.y) & dart.notNull(sty) | ~dart.notNull(this.y) & dart.notNull(sfy)) >>> 0;
      let _z = (dart.notNull(this.z) & dart.notNull(stz) | ~dart.notNull(this.z) & dart.notNull(sfz)) >>> 0;
      let _w = (dart.notNull(this.w) & dart.notNull(stw) | ~dart.notNull(this.w) & dart.notNull(sfw)) >>> 0;
      intView[dartx._set](0, _x);
      intView[dartx._set](1, _y);
      intView[dartx._set](2, _z);
      intView[dartx._set](3, _w);
      return new _native_typed_data.NativeFloat32x4._truncated(floatList[dartx._get](0), floatList[dartx._get](1), floatList[dartx._get](2), floatList[dartx._get](3));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, 'bool');
  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, '_truncated');
  _native_typed_data.NativeInt32x4[dart.implements] = () => [typed_data.Int32x4];
  dart.setSignature(_native_typed_data.NativeInt32x4, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int]),
      bool: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.bool, core.bool, core.bool, core.bool]),
      fromFloat32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [typed_data.Float32x4]),
      _truncated: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int])
    }),
    fields: () => ({
      x: core.int,
      y: core.int,
      z: core.int,
      w: core.int
    }),
    getters: () => ({
      signMask: dart.definiteFunctionType(core.int, []),
      flagX: dart.definiteFunctionType(core.bool, []),
      flagY: dart.definiteFunctionType(core.bool, []),
      flagZ: dart.definiteFunctionType(core.bool, []),
      flagW: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      '|': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '&': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '^': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '+': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      '-': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
      _negate: dart.definiteFunctionType(typed_data.Int32x4, []),
      shuffle: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      shuffleMix: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4, core.int]),
      withX: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withY: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withZ: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withW: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
      withFlagX: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      withFlagY: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      withFlagZ: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      withFlagW: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
      select: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4])
    }),
    sfields: () => ({_list: _native_typed_data.NativeInt32List}),
    statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_truncate']
  });
  dart.defineLazy(_native_typed_data.NativeInt32x4, {
    get _list() {
      return _native_typed_data.NativeInt32List.new(4);
    }
  });
  _native_typed_data.NativeFloat64x2 = class NativeFloat64x2 extends core.Object {
    new(x, y) {
      this.x = x;
      this.y = y;
      if (!(typeof this.x == 'number')) dart.throw(new core.ArgumentError(this.x));
      if (!(typeof this.y == 'number')) dart.throw(new core.ArgumentError(this.y));
    }
    splat(v) {
      NativeFloat64x2.prototype.new.call(this, v, v);
    }
    zero() {
      NativeFloat64x2.prototype.splat.call(this, 0.0);
    }
    fromFloat32x4(v) {
      NativeFloat64x2.prototype.new.call(this, v.x, v.y);
    }
    _doubles(x, y) {
      this.x = x;
      this.y = y;
    }
    toString() {
      return dart.str`[${this.x}, ${this.y}]`;
    }
    ['+'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
    }
    _negate() {
      return new _native_typed_data.NativeFloat64x2._doubles(-dart.notNull(this.x), -dart.notNull(this.y));
    }
    ['-'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
    }
    ['*'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(other.x), dart.notNull(this.y) * dart.notNull(other.y));
    }
    ['/'](other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) / dart.notNull(other.x), dart.notNull(this.y) / dart.notNull(other.y));
    }
    scale(s) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(s), dart.notNull(this.y) * dart.notNull(s));
    }
    abs() {
      return new _native_typed_data.NativeFloat64x2._doubles(this.x[dartx.abs](), this.y[dartx.abs]());
    }
    clamp(lowerLimit, upperLimit) {
      let _lx = lowerLimit.x;
      let _ly = lowerLimit.y;
      let _ux = upperLimit.x;
      let _uy = upperLimit.y;
      let _x = this.x;
      let _y = this.y;
      _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
      _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
      _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
      _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
      return new _native_typed_data.NativeFloat64x2._doubles(_x, _y);
    }
    get signMask() {
      let view = _native_typed_data.NativeFloat64x2._uint32View;
      _native_typed_data.NativeFloat64x2._list[dartx._set](0, this.x);
      _native_typed_data.NativeFloat64x2._list[dartx._set](1, this.y);
      let mx = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 31;
      let my = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 31;
      return (mx | my << 1) >>> 0;
    }
    withX(x) {
      if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
      return new _native_typed_data.NativeFloat64x2._doubles(x, this.y);
    }
    withY(y) {
      if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
      return new _native_typed_data.NativeFloat64x2._doubles(this.x, y);
    }
    min(other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y);
    }
    max(other) {
      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y);
    }
    sqrt() {
      return new _native_typed_data.NativeFloat64x2._doubles(math.sqrt(this.x), math.sqrt(this.y));
    }
  };
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'splat');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'zero');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'fromFloat32x4');
  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, '_doubles');
  _native_typed_data.NativeFloat64x2[dart.implements] = () => [typed_data.Float64x2];
  dart.setSignature(_native_typed_data.NativeFloat64x2, {
    constructors: () => ({
      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double]),
      splat: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double]),
      zero: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, []),
      fromFloat32x4: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [typed_data.Float32x4]),
      _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double])
    }),
    fields: () => ({
      x: core.double,
      y: core.double
    }),
    getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      '+': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      _negate: dart.definiteFunctionType(typed_data.Float64x2, []),
      '-': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      '*': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      '/': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      scale: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      abs: dart.definiteFunctionType(typed_data.Float64x2, []),
      clamp: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2, typed_data.Float64x2]),
      withX: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      withY: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
      min: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      max: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
      sqrt: dart.definiteFunctionType(typed_data.Float64x2, [])
    }),
    sfields: () => ({
      _list: _native_typed_data.NativeFloat64List,
      _uint32View: _native_typed_data.NativeUint32List
    })
  });
  dart.defineLazy(_native_typed_data.NativeFloat64x2, {
    get _list() {
      return _native_typed_data.NativeFloat64List.new(2);
    },
    set _list(_) {},
    get _uint32View() {
      return _native_typed_data.NativeUint32List._check(_native_typed_data.NativeFloat64x2._list[dartx.buffer][dartx.asUint32List]());
    },
    set _uint32View(_) {}
  });
  _native_typed_data._isInvalidArrayIndex = function(index) {
    return index >>> 0 !== index;
  };
  dart.lazyFn(_native_typed_data._isInvalidArrayIndex, () => intTobool());
  _native_typed_data._checkValidIndex = function(index, list, length) {
    if (dart.test(_native_typed_data._isInvalidArrayIndex(index)) || index >= dart.notNull(length)) {
      dart.throw(_js_helper.diagnoseIndexError(list, index));
    }
  };
  dart.lazyFn(_native_typed_data._checkValidIndex, () => intAndListAndintTovoid());
  _native_typed_data._checkValidRange = function(start, end, length) {
    if (dart.test(_native_typed_data._isInvalidArrayIndex(start)) || (end == null ? dart.notNull(start) > dart.notNull(length) : dart.test(_native_typed_data._isInvalidArrayIndex(end)) || dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length))) {
      dart.throw(_js_helper.diagnoseRangeError(start, end, length));
    }
    if (end == null) return length;
    return end;
  };
  dart.fn(_native_typed_data._checkValidRange, intAndintAndintToint());
  async._invokeErrorHandler = function(errorHandler, error, stackTrace) {
    if (async.ZoneBinaryCallback.is(errorHandler)) {
      return dart.dcall(errorHandler, error, stackTrace);
    } else {
      let unaryErrorHandler = async.ZoneUnaryCallback._check(errorHandler);
      return dart.dcall(unaryErrorHandler, error);
    }
  };
  dart.lazyFn(async._invokeErrorHandler, () => FunctionAndObjectAndStackTraceTodynamic());
  async._registerErrorHandler = function(R) {
    return (errorHandler, zone) => {
      if (async.ZoneBinaryCallback.is(errorHandler)) {
        return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
      } else {
        return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
      }
    };
  };
  dart.lazyFn(async._registerErrorHandler, () => FunctionAndZoneToFunction());
  async.AsyncError = class AsyncError extends core.Object {
    new(error, stackTrace) {
      this.error = error;
      this.stackTrace = stackTrace;
    }
    toString() {
      return dart.str`${this.error}`;
    }
  };
  async.AsyncError[dart.implements] = () => [core.Error];
  dart.setSignature(async.AsyncError, {
    constructors: () => ({new: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace])}),
    fields: () => ({
      error: core.Object,
      stackTrace: core.StackTrace
    })
  });
  async._UncaughtAsyncError = class _UncaughtAsyncError extends async.AsyncError {
    new(error, stackTrace) {
      super.new(error, async._UncaughtAsyncError._getBestStackTrace(error, stackTrace));
    }
    static _getBestStackTrace(error, stackTrace) {
      if (stackTrace != null) return stackTrace;
      if (core.Error.is(error)) {
        return error.stackTrace;
      }
      return null;
    }
    toString() {
      let result = dart.str`Uncaught Error: ${this.error}`;
      if (this.stackTrace != null) {
        result = result + dart.str`\nStack Trace:\n${this.stackTrace}`;
      }
      return result;
    }
  };
  dart.setSignature(async._UncaughtAsyncError, {
    constructors: () => ({new: dart.definiteFunctionType(async._UncaughtAsyncError, [dart.dynamic, core.StackTrace])}),
    statics: () => ({_getBestStackTrace: dart.definiteFunctionType(core.StackTrace, [dart.dynamic, core.StackTrace])}),
    names: ['_getBestStackTrace']
  });
  const _controller$ = Symbol('_controller');
  const _subscribe = Symbol('_subscribe');
  const _createSubscription = Symbol('_createSubscription');
  const _onListen = Symbol('_onListen');
  async._StreamImpl$ = dart.generic(T => {
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _StreamImpl extends async.Stream$(T) {
      new() {
        super.new();
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        let subscription = this[_createSubscription](onData, onError, onDone, cancelOnError);
        this[_onListen](subscription);
        return subscription;
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
      }
      [_onListen](subscription) {}
    }
    dart.setSignature(_StreamImpl, {
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_onListen]: dart.definiteFunctionType(dart.void, [async.StreamSubscription])
      })
    });
    return _StreamImpl;
  });
  async._StreamImpl = _StreamImpl();
  async._ControllerStream$ = dart.generic(T => {
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    class _ControllerStream extends async._StreamImpl$(T) {
      new(controller) {
        this[_controller$] = controller;
        super.new();
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
      }
      get hashCode() {
        return (dart.notNull(dart.hashCode(this[_controller$])) ^ 892482866) >>> 0;
      }
      ['=='](other) {
        if (core.identical(this, other)) return true;
        if (!async._ControllerStream.is(other)) return false;
        let otherStream = async._ControllerStream._check(other);
        return core.identical(otherStream[_controller$], this[_controller$]);
      }
    }
    dart.setSignature(_ControllerStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._ControllerStream$(T), [_StreamControllerLifecycleOfT()])}),
      fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        '==': dart.definiteFunctionType(core.bool, [core.Object])
      })
    });
    return _ControllerStream;
  });
  async._ControllerStream = _ControllerStream();
  async._BroadcastStream$ = dart.generic(T => {
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    class _BroadcastStream extends async._ControllerStream$(T) {
      new(controller) {
        super.new(controller);
      }
      get isBroadcast() {
        return true;
      }
    }
    dart.setSignature(_BroadcastStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStream$(T), [_StreamControllerLifecycleOfT()])})
    });
    return _BroadcastStream;
  });
  async._BroadcastStream = _BroadcastStream();
  const _eventState = Symbol('_eventState');
  const _next$ = Symbol('_next');
  const _previous$ = Symbol('_previous');
  const _expectsEvent = Symbol('_expectsEvent');
  const _toggleEventId = Symbol('_toggleEventId');
  const _isFiring = Symbol('_isFiring');
  const _setRemoveAfterFiring = Symbol('_setRemoveAfterFiring');
  const _removeAfterFiring = Symbol('_removeAfterFiring');
  const _onPause = Symbol('_onPause');
  const _onResume = Symbol('_onResume');
  const _recordCancel = Symbol('_recordCancel');
  const _onCancel = Symbol('_onCancel');
  const _recordPause = Symbol('_recordPause');
  const _recordResume = Symbol('_recordResume');
  const _zone = Symbol('_zone');
  const _state = Symbol('_state');
  const _onData = Symbol('_onData');
  const _onError = Symbol('_onError');
  const _onDone = Symbol('_onDone');
  const _cancelFuture = Symbol('_cancelFuture');
  const _pending = Symbol('_pending');
  const _setPendingEvents = Symbol('_setPendingEvents');
  const _isCanceled = Symbol('_isCanceled');
  const _isPaused = Symbol('_isPaused');
  const _isInputPaused = Symbol('_isInputPaused');
  const _inCallback = Symbol('_inCallback');
  const _guardCallback = Symbol('_guardCallback');
  const _decrementPauseCount = Symbol('_decrementPauseCount');
  const _hasPending = Symbol('_hasPending');
  const _mayResumeInput = Symbol('_mayResumeInput');
  const _cancel = Symbol('_cancel');
  const _isClosed$ = Symbol('_isClosed');
  const _waitsForCancel = Symbol('_waitsForCancel');
  const _canFire = Symbol('_canFire');
  const _cancelOnError = Symbol('_cancelOnError');
  const _incrementPauseCount = Symbol('_incrementPauseCount');
  const _sendData = Symbol('_sendData');
  const _addPending = Symbol('_addPending');
  const _sendError = Symbol('_sendError');
  const _sendDone = Symbol('_sendDone');
  let const$5;
  const _close$ = Symbol('_close');
  const _checkState = Symbol('_checkState');
  async._BufferingStreamSubscription$ = dart.generic(T => {
    let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BufferingStreamSubscription extends core.Object {
      new(onData, onError, onDone, cancelOnError) {
        this[_zone] = async.Zone.current;
        this[_state] = dart.test(cancelOnError) ? async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR : 0;
        this[_onData] = null;
        this[_onError] = null;
        this[_onDone] = null;
        this[_cancelFuture] = null;
        this[_pending] = null;
        this.onData(onData);
        this.onError(onError);
        this.onDone(onDone);
      }
      [_setPendingEvents](pendingEvents) {
        _PendingEventsOfT()._check(pendingEvents);
        dart.assert(this[_pending] == null);
        if (pendingEvents == null) return;
        this[_pending] = pendingEvents;
        if (!dart.test(pendingEvents.isEmpty)) {
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
          this[_pending].schedule(this);
        }
      }
      onData(handleData) {
        if (handleData == null) handleData = async._nullDataHandler;
        this[_onData] = this[_zone].registerUnaryCallback(dart.dynamic, T)(handleData);
      }
      onError(handleError) {
        if (handleError == null) handleError = async._nullErrorHandler;
        this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
      }
      onDone(handleDone) {
        if (handleDone == null) handleDone = async._nullDoneHandler;
        this[_onDone] = this[_zone].registerCallback(dart.dynamic)(handleDone);
      }
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        if (dart.test(this[_isCanceled])) return;
        let wasPaused = this[_isPaused];
        let wasInputPaused = this[_isInputPaused];
        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
        if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
        if (!dart.test(wasPaused) && this[_pending] != null) this[_pending].cancelSchedule();
        if (!dart.test(wasInputPaused) && !dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onPause));
      }
      resume() {
        if (dart.test(this[_isCanceled])) return;
        if (dart.test(this[_isPaused])) {
          this[_decrementPauseCount]();
          if (!dart.test(this[_isPaused])) {
            if (dart.test(this[_hasPending]) && !dart.test(this[_pending].isEmpty)) {
              this[_pending].schedule(this);
            } else {
              dart.assert(this[_mayResumeInput]);
              this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
              if (!dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onResume));
            }
          }
        }
      }
      cancel() {
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
        if (dart.test(this[_isCanceled])) return this[_cancelFuture];
        this[_cancel]();
        return this[_cancelFuture];
      }
      asFuture(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          let result = new (async._Future$(E))();
          this[_onDone] = dart.fn(() => {
            result[_complete](futureValue);
          }, VoidTovoid$());
          this[_onError] = dart.fn((error, stackTrace) => {
            this.cancel();
            result[_completeError](error, core.StackTrace._check(stackTrace));
          }, dynamicAnddynamicTodynamic$());
          return result;
        };
      }
      get [_isInputPaused]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_INPUT_PAUSED) != 0;
      }
      get [_isClosed$]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CLOSED) != 0;
      }
      get [_isCanceled]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCELED) != 0;
      }
      get [_waitsForCancel]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) != 0;
      }
      get [_inCallback]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_IN_CALLBACK) != 0;
      }
      get [_hasPending]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_HAS_PENDING) != 0;
      }
      get [_isPaused]() {
        return dart.notNull(this[_state]) >= async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
      }
      get [_canFire]() {
        return dart.notNull(this[_state]) < async._BufferingStreamSubscription._STATE_IN_CALLBACK;
      }
      get [_mayResumeInput]() {
        return !dart.test(this[_isPaused]) && (this[_pending] == null || dart.test(this[_pending].isEmpty));
      }
      get [_cancelOnError]() {
        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR) != 0;
      }
      get isPaused() {
        return this[_isPaused];
      }
      [_cancel]() {
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED) >>> 0;
        if (dart.test(this[_hasPending])) {
          this[_pending].cancelSchedule();
        }
        if (!dart.test(this[_inCallback])) this[_pending] = null;
        this[_cancelFuture] = this[_onCancel]();
      }
      [_incrementPauseCount]() {
        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
      }
      [_decrementPauseCount]() {
        dart.assert(this[_isPaused]);
        this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
      }
      [_add$](data) {
        T._check(data);
        dart.assert(!dart.test(this[_isClosed$]));
        if (dart.test(this[_isCanceled])) return;
        if (dart.test(this[_canFire])) {
          this[_sendData](data);
        } else {
          this[_addPending](new (_DelayedDataOfT())(data));
        }
      }
      [_addError](error, stackTrace) {
        if (dart.test(this[_isCanceled])) return;
        if (dart.test(this[_canFire])) {
          this[_sendError](error, stackTrace);
        } else {
          this[_addPending](new async._DelayedError(error, stackTrace));
        }
      }
      [_close$]() {
        dart.assert(!dart.test(this[_isClosed$]));
        if (dart.test(this[_isCanceled])) return;
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CLOSED) >>> 0;
        if (dart.test(this[_canFire])) {
          this[_sendDone]();
        } else {
          this[_addPending](const$5 || (const$5 = dart.const(new async._DelayedDone())));
        }
      }
      [_onPause]() {
        dart.assert(this[_isInputPaused]);
      }
      [_onResume]() {
        dart.assert(!dart.test(this[_isInputPaused]));
      }
      [_onCancel]() {
        dart.assert(this[_isCanceled]);
        return null;
      }
      [_addPending](event) {
        let pending = _StreamImplEventsOfT()._check(this[_pending]);
        if (this[_pending] == null) {
          pending = this[_pending] = new (_StreamImplEventsOfT())();
        }
        pending.add(event);
        if (!dart.test(this[_hasPending])) {
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
          if (!dart.test(this[_isPaused])) {
            this[_pending].schedule(this);
          }
        }
      }
      [_sendData](data) {
        T._check(data);
        dart.assert(!dart.test(this[_isCanceled]));
        dart.assert(!dart.test(this[_isPaused]));
        dart.assert(!dart.test(this[_inCallback]));
        let wasInputPaused = this[_isInputPaused];
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        this[_zone].runUnaryGuarded(dart.dynamic, T)(this[_onData], data);
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        this[_checkState](wasInputPaused);
      }
      [_sendError](error, stackTrace) {
        dart.assert(!dart.test(this[_isCanceled]));
        dart.assert(!dart.test(this[_isPaused]));
        dart.assert(!dart.test(this[_inCallback]));
        let wasInputPaused = this[_isInputPaused];
        const sendError = (function() {
          if (dart.test(this[_isCanceled]) && !dart.test(this[_waitsForCancel])) return;
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          if (ZoneBinaryCallbackOfdynamic$Object$StackTrace().is(this[_onError])) {
            let errorCallback = ZoneBinaryCallbackOfdynamic$Object$StackTrace().as(this[_onError]);
            this[_zone].runBinaryGuarded(dart.dynamic, core.Object, core.StackTrace)(errorCallback, error, stackTrace);
          } else {
            this[_zone].runUnaryGuarded(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(this[_onError]), error);
          }
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        }).bind(this);
        dart.fn(sendError, VoidTovoid$());
        if (dart.test(this[_cancelOnError])) {
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
          this[_cancel]();
          if (async.Future.is(this[_cancelFuture])) {
            this[_cancelFuture].whenComplete(sendError);
          } else {
            sendError();
          }
        } else {
          sendError();
          this[_checkState](wasInputPaused);
        }
      }
      [_sendDone]() {
        dart.assert(!dart.test(this[_isCanceled]));
        dart.assert(!dart.test(this[_isPaused]));
        dart.assert(!dart.test(this[_inCallback]));
        const sendDone = (function() {
          if (!dart.test(this[_waitsForCancel])) return;
          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED | async._BufferingStreamSubscription._STATE_CLOSED | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          this[_zone].runGuarded(dart.dynamic)(this[_onDone]);
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        }).bind(this);
        dart.fn(sendDone, VoidTovoid$());
        this[_cancel]();
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
        if (async.Future.is(this[_cancelFuture])) {
          this[_cancelFuture].whenComplete(sendDone);
        } else {
          sendDone();
        }
      }
      [_guardCallback](callback) {
        dart.assert(!dart.test(this[_inCallback]));
        let wasInputPaused = this[_isInputPaused];
        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        dart.dcall(callback);
        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
        this[_checkState](wasInputPaused);
      }
      [_checkState](wasInputPaused) {
        dart.assert(!dart.test(this[_inCallback]));
        if (dart.test(this[_hasPending]) && dart.test(this[_pending].isEmpty)) {
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
          if (dart.test(this[_isInputPaused]) && dart.test(this[_mayResumeInput])) {
            this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
          }
        }
        while (true) {
          if (dart.test(this[_isCanceled])) {
            this[_pending] = null;
            return;
          }
          let isInputPaused = this[_isInputPaused];
          if (wasInputPaused == isInputPaused) break;
          this[_state] = (dart.notNull(this[_state]) ^ async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          if (dart.test(isInputPaused)) {
            this[_onPause]();
          } else {
            this[_onResume]();
          }
          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
          wasInputPaused = isInputPaused;
        }
        if (dart.test(this[_hasPending]) && !dart.test(this[_isPaused])) {
          this[_pending].schedule(this);
        }
      }
    }
    dart.addTypeTests(_BufferingStreamSubscription);
    _BufferingStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT(), _EventSinkOfT(), _EventDispatchOfT()];
    dart.setSignature(_BufferingStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._BufferingStreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_onData]: TTovoid(),
        [_onError]: core.Function,
        [_onDone]: async._DoneHandler,
        [_zone]: async.Zone,
        [_state]: core.int,
        [_cancelFuture]: async.Future,
        [_pending]: _PendingEventsOfT()
      }),
      getters: () => ({
        [_isInputPaused]: dart.definiteFunctionType(core.bool, []),
        [_isClosed$]: dart.definiteFunctionType(core.bool, []),
        [_isCanceled]: dart.definiteFunctionType(core.bool, []),
        [_waitsForCancel]: dart.definiteFunctionType(core.bool, []),
        [_inCallback]: dart.definiteFunctionType(core.bool, []),
        [_hasPending]: dart.definiteFunctionType(core.bool, []),
        [_isPaused]: dart.definiteFunctionType(core.bool, []),
        [_canFire]: dart.definiteFunctionType(core.bool, []),
        [_mayResumeInput]: dart.definiteFunctionType(core.bool, []),
        [_cancelOnError]: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        [_setPendingEvents]: dart.definiteFunctionType(dart.void, [_PendingEventsOfT()]),
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
        [_cancel]: dart.definiteFunctionType(dart.void, []),
        [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
        [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_close$]: dart.definiteFunctionType(dart.void, []),
        [_onPause]: dart.definiteFunctionType(dart.void, []),
        [_onResume]: dart.definiteFunctionType(dart.void, []),
        [_onCancel]: dart.definiteFunctionType(async.Future, []),
        [_addPending]: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, []),
        [_guardCallback]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
      }),
      sfields: () => ({
        _STATE_CANCEL_ON_ERROR: core.int,
        _STATE_CLOSED: core.int,
        _STATE_INPUT_PAUSED: core.int,
        _STATE_CANCELED: core.int,
        _STATE_WAIT_FOR_CANCEL: core.int,
        _STATE_IN_CALLBACK: core.int,
        _STATE_HAS_PENDING: core.int,
        _STATE_PAUSE_COUNT: core.int,
        _STATE_PAUSE_COUNT_SHIFT: core.int
      })
    });
    return _BufferingStreamSubscription;
  });
  async._BufferingStreamSubscription = _BufferingStreamSubscription();
  async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR = 1;
  async._BufferingStreamSubscription._STATE_CLOSED = 2;
  async._BufferingStreamSubscription._STATE_INPUT_PAUSED = 4;
  async._BufferingStreamSubscription._STATE_CANCELED = 8;
  async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL = 16;
  async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
  async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
  async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
  async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
  async._ControllerSubscription$ = dart.generic(T => {
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
      new(controller, onData, onError, onDone, cancelOnError) {
        this[_controller$] = controller;
        super.new(onData, onError, onDone, cancelOnError);
      }
      [_onCancel]() {
        return this[_controller$][_recordCancel](this);
      }
      [_onPause]() {
        this[_controller$][_recordPause](this);
      }
      [_onResume]() {
        this[_controller$][_recordResume](this);
      }
    }
    dart.setSignature(_ControllerSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._ControllerSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()})
    });
    return _ControllerSubscription;
  });
  async._ControllerSubscription = _ControllerSubscription();
  async._BroadcastSubscription$ = dart.generic(T => {
    let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BroadcastSubscription extends async._ControllerSubscription$(T) {
      new(controller, onData, onError, onDone, cancelOnError) {
        this[_eventState] = 0;
        this[_next$] = null;
        this[_previous$] = null;
        super.new(controller, onData, onError, onDone, cancelOnError);
        this[_next$] = this[_previous$] = this;
      }
      [_expectsEvent](eventId) {
        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_EVENT_ID) == eventId;
      }
      [_toggleEventId]() {
        this[_eventState] = (dart.notNull(this[_eventState]) ^ async._BroadcastSubscription._STATE_EVENT_ID) >>> 0;
      }
      get [_isFiring]() {
        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_FIRING) != 0;
      }
      [_setRemoveAfterFiring]() {
        dart.assert(this[_isFiring]);
        this[_eventState] = (dart.notNull(this[_eventState]) | async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) >>> 0;
      }
      get [_removeAfterFiring]() {
        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) != 0;
      }
      [_onPause]() {}
      [_onResume]() {}
    }
    dart.setSignature(_BroadcastSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_eventState]: core.int,
        [_next$]: _BroadcastSubscriptionOfT(),
        [_previous$]: _BroadcastSubscriptionOfT()
      }),
      getters: () => ({
        [_isFiring]: dart.definiteFunctionType(core.bool, []),
        [_removeAfterFiring]: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        [_expectsEvent]: dart.definiteFunctionType(core.bool, [core.int]),
        [_toggleEventId]: dart.definiteFunctionType(dart.void, []),
        [_setRemoveAfterFiring]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_EVENT_ID: core.int,
        _STATE_FIRING: core.int,
        _STATE_REMOVE_AFTER_FIRING: core.int
      })
    });
    return _BroadcastSubscription;
  });
  async._BroadcastSubscription = _BroadcastSubscription();
  async._BroadcastSubscription._STATE_EVENT_ID = 1;
  async._BroadcastSubscription._STATE_FIRING = 2;
  async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING = 4;
  const _firstSubscription = Symbol('_firstSubscription');
  const _lastSubscription = Symbol('_lastSubscription');
  const _addStreamState = Symbol('_addStreamState');
  const _doneFuture = Symbol('_doneFuture');
  const _isEmpty = Symbol('_isEmpty');
  const _hasOneListener = Symbol('_hasOneListener');
  const _isAddingStream = Symbol('_isAddingStream');
  const _mayAddEvent = Symbol('_mayAddEvent');
  const _ensureDoneFuture = Symbol('_ensureDoneFuture');
  const _addListener = Symbol('_addListener');
  const _removeListener = Symbol('_removeListener');
  const _callOnCancel = Symbol('_callOnCancel');
  const _addEventError = Symbol('_addEventError');
  const _forEachListener = Symbol('_forEachListener');
  const _mayComplete = Symbol('_mayComplete');
  const _asyncComplete = Symbol('_asyncComplete');
  async._BroadcastStreamController$ = dart.generic(T => {
    let _BroadcastStreamOfT = () => (_BroadcastStreamOfT = dart.constFn(async._BroadcastStream$(T)))();
    let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
    let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let _AddStreamStateOfT = () => (_AddStreamStateOfT = dart.constFn(async._AddStreamState$(T)))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
    class _BroadcastStreamController extends core.Object {
      new(onListen, onCancel) {
        this.onListen = onListen;
        this.onCancel = onCancel;
        this[_state] = async._BroadcastStreamController._STATE_INITIAL;
        this[_firstSubscription] = null;
        this[_lastSubscription] = null;
        this[_addStreamState] = null;
        this[_doneFuture] = null;
      }
      get onPause() {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      set onPause(onPauseHandler) {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      get onResume() {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      set onResume(onResumeHandler) {
        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
      }
      get stream() {
        return new (_BroadcastStreamOfT())(this);
      }
      get sink() {
        return new (_StreamSinkWrapperOfT())(this);
      }
      get isClosed() {
        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_CLOSED) != 0;
      }
      get isPaused() {
        return false;
      }
      get hasListener() {
        return !dart.test(this[_isEmpty]);
      }
      get [_hasOneListener]() {
        dart.assert(!dart.test(this[_isEmpty]));
        return core.identical(this[_firstSubscription], this[_lastSubscription]);
      }
      get [_isFiring]() {
        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_FIRING) != 0;
      }
      get [_isAddingStream]() {
        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_ADDSTREAM) != 0;
      }
      get [_mayAddEvent]() {
        return dart.notNull(this[_state]) < async._BroadcastStreamController._STATE_CLOSED;
      }
      [_ensureDoneFuture]() {
        if (this[_doneFuture] != null) return this[_doneFuture];
        return this[_doneFuture] = new async._Future();
      }
      get [_isEmpty]() {
        return this[_firstSubscription] == null;
      }
      [_addListener](subscription) {
        _BroadcastSubscriptionOfT()._check(subscription);
        dart.assert(core.identical(subscription[_next$], subscription));
        subscription[_eventState] = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
        let oldLast = this[_lastSubscription];
        this[_lastSubscription] = subscription;
        subscription[_next$] = null;
        subscription[_previous$] = oldLast;
        if (oldLast == null) {
          this[_firstSubscription] = subscription;
        } else {
          oldLast[_next$] = subscription;
        }
      }
      [_removeListener](subscription) {
        _BroadcastSubscriptionOfT()._check(subscription);
        dart.assert(core.identical(subscription[_controller$], this));
        dart.assert(!core.identical(subscription[_next$], subscription));
        let previous = subscription[_previous$];
        let next = subscription[_next$];
        if (previous == null) {
          this[_firstSubscription] = next;
        } else {
          previous[_next$] = next;
        }
        if (next == null) {
          this[_lastSubscription] = previous;
        } else {
          next[_previous$] = previous;
        }
        subscription[_next$] = subscription[_previous$] = subscription;
      }
      [_subscribe](onData, onError, onDone, cancelOnError) {
        if (dart.test(this.isClosed)) {
          if (onDone == null) onDone = async._nullDoneHandler;
          return new (_DoneStreamSubscriptionOfT())(onDone);
        }
        let subscription = new (_BroadcastSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
        this[_addListener](_BroadcastSubscriptionOfT()._check(subscription));
        if (core.identical(this[_firstSubscription], this[_lastSubscription])) {
          async._runGuarded(this.onListen);
        }
        return subscription;
      }
      [_recordCancel](sub) {
        StreamSubscriptionOfT()._check(sub);
        let subscription = _BroadcastSubscriptionOfT()._check(sub);
        if (core.identical(subscription[_next$], subscription)) return null;
        if (dart.test(subscription[_isFiring])) {
          subscription[_setRemoveAfterFiring]();
        } else {
          this[_removeListener](subscription);
          if (!dart.test(this[_isFiring]) && dart.test(this[_isEmpty])) {
            this[_callOnCancel]();
          }
        }
        return null;
      }
      [_recordPause](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_recordResume](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_addEventError]() {
        if (dart.test(this.isClosed)) {
          return new core.StateError("Cannot add new events after calling close");
        }
        dart.assert(this[_isAddingStream]);
        return new core.StateError("Cannot add new events while doing an addStream");
      }
      add(data) {
        T._check(data);
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_sendData](data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        error = async._nonNullError(error);
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
        this[_sendError](error, stackTrace);
      }
      close() {
        if (dart.test(this.isClosed)) {
          dart.assert(this[_doneFuture] != null);
          return this[_doneFuture];
        }
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
        let doneFuture = this[_ensureDoneFuture]();
        this[_sendDone]();
        return doneFuture;
      }
      get done() {
        return this[_ensureDoneFuture]();
      }
      addStream(stream, opts) {
        StreamOfT()._check(stream);
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
        this[_addStreamState] = new (_AddStreamStateOfT())(this, stream, cancelOnError);
        return this[_addStreamState].addStreamFuture;
      }
      [_add$](data) {
        T._check(data);
        this[_sendData](data);
      }
      [_addError](error, stackTrace) {
        this[_sendError](error, stackTrace);
      }
      [_close$]() {
        dart.assert(this[_isAddingStream]);
        let addState = this[_addStreamState];
        this[_addStreamState] = null;
        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
        addState.complete();
      }
      [_forEachListener](action) {
        if (dart.test(this[_isFiring])) {
          dart.throw(new core.StateError("Cannot fire new event. Controller is already firing an event"));
        }
        if (dart.test(this[_isEmpty])) return;
        let id = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
        this[_state] = (dart.notNull(this[_state]) ^ (async._BroadcastStreamController._STATE_EVENT_ID | async._BroadcastStreamController._STATE_FIRING)) >>> 0;
        let subscription = this[_firstSubscription];
        while (subscription != null) {
          if (dart.test(subscription[_expectsEvent](id))) {
            subscription[_eventState] = (dart.notNull(subscription[_eventState]) | async._BroadcastSubscription._STATE_FIRING) >>> 0;
            action(subscription);
            subscription[_toggleEventId]();
            let next = subscription[_next$];
            if (dart.test(subscription[_removeAfterFiring])) {
              this[_removeListener](subscription);
            }
            subscription[_eventState] = (dart.notNull(subscription[_eventState]) & ~async._BroadcastSubscription._STATE_FIRING) >>> 0;
            subscription = next;
          } else {
            subscription = subscription[_next$];
          }
        }
        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
        if (dart.test(this[_isEmpty])) {
          this[_callOnCancel]();
        }
      }
      [_callOnCancel]() {
        dart.assert(this[_isEmpty]);
        if (dart.test(this.isClosed) && dart.test(this[_doneFuture][_mayComplete])) {
          this[_doneFuture][_asyncComplete](null);
        }
        async._runGuarded(this.onCancel);
      }
    }
    dart.addTypeTests(_BroadcastStreamController);
    _BroadcastStreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
    dart.setSignature(_BroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStreamController$(T), [async.ControllerCallback, async.ControllerCancelCallback])}),
      fields: () => ({
        onListen: async.ControllerCallback,
        onCancel: async.ControllerCancelCallback,
        [_state]: core.int,
        [_firstSubscription]: _BroadcastSubscriptionOfT(),
        [_lastSubscription]: _BroadcastSubscriptionOfT(),
        [_addStreamState]: _AddStreamStateOfT(),
        [_doneFuture]: async._Future
      }),
      getters: () => ({
        onPause: dart.definiteFunctionType(async.ControllerCallback, []),
        onResume: dart.definiteFunctionType(async.ControllerCallback, []),
        stream: dart.definiteFunctionType(async.Stream$(T), []),
        sink: dart.definiteFunctionType(async.StreamSink$(T), []),
        isClosed: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, []),
        hasListener: dart.definiteFunctionType(core.bool, []),
        [_hasOneListener]: dart.definiteFunctionType(core.bool, []),
        [_isFiring]: dart.definiteFunctionType(core.bool, []),
        [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
        [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
        [_isEmpty]: dart.definiteFunctionType(core.bool, []),
        done: dart.definiteFunctionType(async.Future, [])
      }),
      setters: () => ({
        onPause: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        onResume: dart.definiteFunctionType(dart.void, [VoidTovoid()])
      }),
      methods: () => ({
        [_ensureDoneFuture]: dart.definiteFunctionType(async._Future, []),
        [_addListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
        [_removeListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
        [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_addEventError]: dart.definiteFunctionType(core.Error, []),
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(async.Future, []),
        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_close$]: dart.definiteFunctionType(dart.void, []),
        [_forEachListener]: dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfTTovoid()]),
        [_callOnCancel]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_INITIAL: core.int,
        _STATE_EVENT_ID: core.int,
        _STATE_FIRING: core.int,
        _STATE_CLOSED: core.int,
        _STATE_ADDSTREAM: core.int
      })
    });
    return _BroadcastStreamController;
  });
  async._BroadcastStreamController = _BroadcastStreamController();
  async._BroadcastStreamController._STATE_INITIAL = 0;
  async._BroadcastStreamController._STATE_EVENT_ID = 1;
  async._BroadcastStreamController._STATE_FIRING = 2;
  async._BroadcastStreamController._STATE_CLOSED = 4;
  async._BroadcastStreamController._STATE_ADDSTREAM = 8;
  async._SyncBroadcastStreamController$ = dart.generic(T => {
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
    class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
      new(onListen, onCancel) {
        super.new(onListen, onCancel);
      }
      get [_mayAddEvent]() {
        return dart.test(super[_mayAddEvent]) && !dart.test(this[_isFiring]);
      }
      [_addEventError]() {
        if (dart.test(this[_isFiring])) {
          return new core.StateError("Cannot fire new event. Controller is already firing an event");
        }
        return super[_addEventError]();
      }
      [_sendData](data) {
        T._check(data);
        if (dart.test(this[_isEmpty])) return;
        if (dart.test(this[_hasOneListener])) {
          this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_FIRING) >>> 0;
          let subscription = this[_firstSubscription];
          subscription[_add$](data);
          this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
          if (dart.test(this[_isEmpty])) {
            this[_callOnCancel]();
          }
          return;
        }
        this[_forEachListener](dart.fn(subscription => {
          subscription[_add$](data);
        }, _BufferingStreamSubscriptionOfTTovoid()));
      }
      [_sendError](error, stackTrace) {
        if (dart.test(this[_isEmpty])) return;
        this[_forEachListener](dart.fn(subscription => {
          subscription[_addError](error, stackTrace);
        }, _BufferingStreamSubscriptionOfTTovoid()));
      }
      [_sendDone]() {
        if (!dart.test(this[_isEmpty])) {
          this[_forEachListener](dart.fn(subscription => {
            subscription[_close$]();
          }, _BufferingStreamSubscriptionOfTTovoid()));
        } else {
          dart.assert(this[_doneFuture] != null);
          dart.assert(this[_doneFuture][_mayComplete]);
          this[_doneFuture][_asyncComplete](null);
        }
      }
    }
    _SyncBroadcastStreamController[dart.implements] = () => [SynchronousStreamControllerOfT()];
    dart.setSignature(_SyncBroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._SyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SyncBroadcastStreamController;
  });
  async._SyncBroadcastStreamController = _SyncBroadcastStreamController();
  let const$6;
  async._AsyncBroadcastStreamController$ = dart.generic(T => {
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    class _AsyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
      new(onListen, onCancel) {
        super.new(onListen, onCancel);
      }
      [_sendData](data) {
        T._check(data);
        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
          subscription[_addPending](new (_DelayedDataOfT())(data));
        }
      }
      [_sendError](error, stackTrace) {
        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
          subscription[_addPending](new async._DelayedError(error, stackTrace));
        }
      }
      [_sendDone]() {
        if (!dart.test(this[_isEmpty])) {
          for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
            subscription[_addPending](const$6 || (const$6 = dart.const(new async._DelayedDone())));
          }
        } else {
          dart.assert(this[_doneFuture] != null);
          dart.assert(this[_doneFuture][_mayComplete]);
          this[_doneFuture][_asyncComplete](null);
        }
      }
    }
    dart.setSignature(_AsyncBroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._AsyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _AsyncBroadcastStreamController;
  });
  async._AsyncBroadcastStreamController = _AsyncBroadcastStreamController();
  const _addPendingEvent = Symbol('_addPendingEvent');
  let const$7;
  async._AsBroadcastStreamController$ = dart.generic(T => {
    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _AsBroadcastStreamController extends async._SyncBroadcastStreamController$(T) {
      new(onListen, onCancel) {
        this[_pending] = null;
        super.new(onListen, onCancel);
      }
      get [_hasPending]() {
        return this[_pending] != null && !dart.test(this[_pending].isEmpty);
      }
      [_addPendingEvent](event) {
        if (this[_pending] == null) {
          this[_pending] = new (_StreamImplEventsOfT())();
        }
        this[_pending].add(event);
      }
      add(data) {
        T._check(data);
        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
          this[_addPendingEvent](new (_DelayedDataOfT())(data));
          return;
        }
        super.add(data);
        while (dart.test(this[_hasPending])) {
          this[_pending].handleNext(this);
        }
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
          this[_addPendingEvent](new async._DelayedError(error, stackTrace));
          return;
        }
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
        this[_sendError](error, stackTrace);
        while (dart.test(this[_hasPending])) {
          this[_pending].handleNext(this);
        }
      }
      close() {
        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
          this[_addPendingEvent](const$7 || (const$7 = dart.const(new async._DelayedDone())));
          this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
          return super.done;
        }
        let result = super.close();
        dart.assert(!dart.test(this[_hasPending]));
        return result;
      }
      [_callOnCancel]() {
        if (dart.test(this[_hasPending])) {
          this[_pending].clear();
          this[_pending] = null;
        }
        super[_callOnCancel]();
      }
    }
    _AsBroadcastStreamController[dart.implements] = () => [_EventDispatchOfT()];
    dart.setSignature(_AsBroadcastStreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
      fields: () => ({[_pending]: _StreamImplEventsOfT()}),
      getters: () => ({[_hasPending]: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        [_addPendingEvent]: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
        add: dart.definiteFunctionType(dart.void, [T])
      })
    });
    return _AsBroadcastStreamController;
  });
  async._AsBroadcastStreamController = _AsBroadcastStreamController();
  const _pauseCount = Symbol('_pauseCount');
  const _resume = Symbol('_resume');
  async._DoneSubscription$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _DoneSubscription extends core.Object {
      new() {
        this[_pauseCount] = 0;
      }
      onData(handleData) {}
      onError(handleError) {}
      onDone(handleDone) {}
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        if (resumeSignal != null) resumeSignal.then(dart.dynamic)(dart.bind(this, _resume));
        this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
      }
      resume() {
        this[_resume](null);
      }
      [_resume](_) {
        if (dart.notNull(this[_pauseCount]) > 0) {
          this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
        }
      }
      cancel() {
        return new async._Future.immediate(null);
      }
      get isPaused() {
        return dart.notNull(this[_pauseCount]) > 0;
      }
      asFuture(E) {
        return value => {
          if (value === void 0) value = null;
          return new (async._Future$(E))();
        };
      }
    }
    dart.addTypeTests(_DoneSubscription);
    _DoneSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
    dart.setSignature(_DoneSubscription, {
      fields: () => ({[_pauseCount]: core.int}),
      getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        [_resume]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
      })
    });
    return _DoneSubscription;
  });
  async._DoneSubscription = _DoneSubscription();
  async.DeferredLibrary = class DeferredLibrary extends core.Object {
    new(libraryName, opts) {
      let uri = opts && 'uri' in opts ? opts.uri : null;
      this.libraryName = libraryName;
      this.uri = uri;
    }
    load() {
      dart.throw('DeferredLibrary not supported. ' + 'please use the `import "lib.dart" deferred as lib` syntax.');
    }
  };
  dart.setSignature(async.DeferredLibrary, {
    constructors: () => ({new: dart.definiteFunctionType(async.DeferredLibrary, [core.String], {uri: core.String})}),
    fields: () => ({
      libraryName: core.String,
      uri: core.String
    }),
    methods: () => ({load: dart.definiteFunctionType(async.Future$(core.Null), [])})
  });
  const _s = Symbol('_s');
  async.DeferredLoadException = class DeferredLoadException extends core.Object {
    new(s) {
      this[_s] = s;
    }
    toString() {
      return dart.str`DeferredLoadException: '${this[_s]}'`;
    }
  };
  async.DeferredLoadException[dart.implements] = () => [core.Exception];
  dart.setSignature(async.DeferredLoadException, {
    constructors: () => ({new: dart.definiteFunctionType(async.DeferredLoadException, [core.String])}),
    fields: () => ({[_s]: core.String})
  });
  const _completeWithValue = Symbol('_completeWithValue');
  let const$8;
  async.Future$ = dart.flattenFutures(dart.generic(T => {
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
    class Future extends core.Object {
      static new(computation) {
        let result = new (_FutureOfT())();
        async.Timer.run(dart.fn(() => {
          try {
            result[_complete](computation());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(result, e, s);
          }

        }, VoidTovoid$()));
        return result;
      }
      static microtask(computation) {
        let result = new (_FutureOfT())();
        async.scheduleMicrotask(dart.fn(() => {
          try {
            result[_complete](computation());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(result, e, s);
          }

        }, VoidTovoid$()));
        return result;
      }
      static sync(computation) {
        try {
          let result = computation();
          return FutureOfT().value(result);
        } catch (error) {
          let stackTrace = dart.stackTrace(error);
          return FutureOfT().error(error, stackTrace);
        }

      }
      static value(value) {
        if (value === void 0) value = null;
        return new (_FutureOfT()).immediate(value);
      }
      static error(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        error = async._nonNullError(error);
        if (!core.identical(async.Zone.current, async._ROOT_ZONE)) {
          let replacement = async.Zone.current.errorCallback(error, stackTrace);
          if (replacement != null) {
            error = async._nonNullError(replacement.error);
            stackTrace = replacement.stackTrace;
          }
        }
        return new (_FutureOfT()).immediateError(error, stackTrace);
      }
      static delayed(duration, computation) {
        if (computation === void 0) computation = null;
        let result = new (_FutureOfT())();
        async.Timer.new(duration, dart.fn(() => {
          try {
            result[_complete](computation == null ? null : computation());
          } catch (e) {
            let s = dart.stackTrace(e);
            async._completeWithErrorCallback(result, e, s);
          }

        }, VoidTovoid$()));
        return result;
      }
      static wait(T) {
        return (futures, opts) => {
          let eagerError = opts && 'eagerError' in opts ? opts.eagerError : false;
          let cleanUp = opts && 'cleanUp' in opts ? opts.cleanUp : null;
          let result = new (async._Future$(core.List$(T)))();
          let values = null;
          let remaining = 0;
          let error = null;
          let stackTrace = null;
          function handleError(theError, theStackTrace) {
            remaining--;
            if (values != null) {
              if (cleanUp != null) {
                for (let value of values) {
                  if (value != null) {
                    async.Future.sync(dart.fn(() => {
                      cleanUp(value);
                    }, VoidTodynamic$()));
                  }
                }
              }
              values = null;
              if (remaining == 0 || dart.test(eagerError)) {
                result[_completeError](theError, core.StackTrace._check(theStackTrace));
              } else {
                error = theError;
                stackTrace = core.StackTrace._check(theStackTrace);
              }
            } else if (remaining == 0 && !dart.test(eagerError)) {
              result[_completeError](error, stackTrace);
            }
          }
          dart.fn(handleError, dynamicAnddynamicTovoid$());
          for (let future of futures) {
            let pos = remaining++;
            future.then(dart.dynamic)(dart.fn(value => {
              remaining--;
              if (values != null) {
                values[dartx._set](pos, value);
                if (remaining == 0) {
                  result[_completeWithValue](values);
                }
              } else {
                if (cleanUp != null && value != null) {
                  async.Future.sync(dart.fn(() => {
                    cleanUp(value);
                  }, VoidTodynamic$()));
                }
                if (remaining == 0 && !dart.test(eagerError)) {
                  result[_completeError](error, stackTrace);
                }
              }
            }, dart.definiteFunctionType(dart.dynamic, [T])), {onError: handleError});
          }
          if (remaining == 0) {
            return async.Future$(core.List$(T)).value(const$8 || (const$8 = dart.constList([], dart.dynamic)));
          }
          values = core.List$(T).new(remaining);
          return result;
        };
      }
      static any(T) {
        return futures => {
          let completer = async.Completer$(T).sync();
          let onValue = dart.fn(value => {
            if (!dart.test(completer.isCompleted)) completer.complete(value);
          }, dart.definiteFunctionType(dart.dynamic, [T]));
          let onError = dart.fn((error, stack) => {
            if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
          }, dynamicAnddynamicTodynamic$());
          for (let future of futures) {
            future.then(dart.dynamic)(onValue, {onError: onError});
          }
          return completer.future;
        };
      }
      static forEach(input, f) {
        let iterator = input[dartx.iterator];
        return async.Future.doWhile(dart.fn(() => {
          if (!dart.test(iterator.moveNext())) return false;
          return async.Future.sync(dart.fn(() => dart.dcall(f, iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
        }, VoidToObject$()));
      }
      static doWhile(f) {
        let doneSignal = new async._Future();
        let nextIteration = null;
        nextIteration = async.Zone.current.bindUnaryCallback(dart.dynamic, core.bool)(dart.fn(keepGoing => {
          if (dart.test(keepGoing)) {
            async.Future.sync(f).then(dart.dynamic)(dynamicTodynamic()._check(nextIteration), {onError: dart.bind(doneSignal, _completeError)});
          } else {
            doneSignal[_complete](null);
          }
        }, boolTodynamic()), {runGuarded: true});
        dart.dcall(nextIteration, true);
        return doneSignal;
      }
    }
    dart.addTypeTests(Future);
    dart.setSignature(Future, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        microtask: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        sync: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        value: dart.definiteFunctionType(async.Future$(T), [], [dart.dynamic]),
        error: dart.definiteFunctionType(async.Future$(T), [core.Object], [core.StackTrace]),
        delayed: dart.definiteFunctionType(async.Future$(T), [core.Duration], [VoidTodynamic()])
      }),
      sfields: () => ({_nullFuture: async._Future}),
      statics: () => ({
        wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
        any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
        forEach: dart.definiteFunctionType(async.Future, [core.Iterable, dynamicTodynamic()]),
        doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
      }),
      names: ['wait', 'any', 'forEach', 'doWhile']
    });
    return Future;
  }));
  async.Future = Future();
  dart.defineLazy(async.Future, {
    get _nullFuture() {
      return async._Future._check(async.Future.value(null));
    }
  });
  async.TimeoutException = class TimeoutException extends core.Object {
    new(message, duration) {
      if (duration === void 0) duration = null;
      this.message = message;
      this.duration = duration;
    }
    toString() {
      let result = "TimeoutException";
      if (this.duration != null) result = dart.str`TimeoutException after ${this.duration}`;
      if (this.message != null) result = dart.str`${result}: ${this.message}`;
      return result;
    }
  };
  async.TimeoutException[dart.implements] = () => [core.Exception];
  dart.setSignature(async.TimeoutException, {
    constructors: () => ({new: dart.definiteFunctionType(async.TimeoutException, [core.String], [core.Duration])}),
    fields: () => ({
      message: core.String,
      duration: core.Duration
    })
  });
  async.Completer$ = dart.generic(T => {
    let _AsyncCompleterOfT = () => (_AsyncCompleterOfT = dart.constFn(async._AsyncCompleter$(T)))();
    let _SyncCompleterOfT = () => (_SyncCompleterOfT = dart.constFn(async._SyncCompleter$(T)))();
    class Completer extends core.Object {
      static new() {
        return new (_AsyncCompleterOfT())();
      }
      static sync() {
        return new (_SyncCompleterOfT())();
      }
    }
    dart.addTypeTests(Completer);
    dart.setSignature(Completer, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.Completer$(T), []),
        sync: dart.definiteFunctionType(async.Completer$(T), [])
      })
    });
    return Completer;
  });
  async.Completer = Completer();
  async._completeWithErrorCallback = function(result, error, stackTrace) {
    let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
    if (replacement != null) {
      error = async._nonNullError(replacement.error);
      stackTrace = replacement.stackTrace;
    }
    result[_completeError](error, core.StackTrace._check(stackTrace));
  };
  dart.lazyFn(async._completeWithErrorCallback, () => _FutureAnddynamicAnddynamicTovoid());
  async._nonNullError = function(error) {
    return error != null ? error : new core.NullThrownError();
  };
  dart.fn(async._nonNullError, ObjectToObject());
  async._FutureOnValue$ = dart.generic((S, T) => {
    const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
    return _FutureOnValue;
  });
  async._FutureOnValue = _FutureOnValue();
  async._FutureErrorTest = dart.typedef('_FutureErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
  async._FutureAction = dart.typedef('_FutureAction', () => dart.functionType(dart.dynamic, []));
  async._Completer$ = dart.generic(T => {
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let CompleterOfT = () => (CompleterOfT = dart.constFn(async.Completer$(T)))();
    class _Completer extends core.Object {
      new() {
        this.future = new (_FutureOfT())();
      }
      completeError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        error = async._nonNullError(error);
        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
        this[_completeError](error, stackTrace);
      }
      get isCompleted() {
        return !dart.test(this.future[_mayComplete]);
      }
    }
    dart.addTypeTests(_Completer);
    _Completer[dart.implements] = () => [CompleterOfT()];
    dart.setSignature(_Completer, {
      fields: () => ({future: _FutureOfT()}),
      getters: () => ({isCompleted: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({completeError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
    });
    return _Completer;
  });
  async._Completer = _Completer();
  const _asyncCompleteError = Symbol('_asyncCompleteError');
  async._AsyncCompleter$ = dart.generic(T => {
    class _AsyncCompleter extends async._Completer$(T) {
      new() {
        super.new();
      }
      complete(value) {
        if (value === void 0) value = null;
        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
        this.future[_asyncComplete](value);
      }
      [_completeError](error, stackTrace) {
        this.future[_asyncCompleteError](error, stackTrace);
      }
    }
    dart.setSignature(_AsyncCompleter, {
      methods: () => ({
        complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
        [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
      })
    });
    return _AsyncCompleter;
  });
  async._AsyncCompleter = _AsyncCompleter();
  async._SyncCompleter$ = dart.generic(T => {
    class _SyncCompleter extends async._Completer$(T) {
      new() {
        super.new();
      }
      complete(value) {
        if (value === void 0) value = null;
        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
        this.future[_complete](value);
      }
      [_completeError](error, stackTrace) {
        this.future[_completeError](error, stackTrace);
      }
    }
    dart.setSignature(_SyncCompleter, {
      methods: () => ({
        complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
        [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
      })
    });
    return _SyncCompleter;
  });
  async._SyncCompleter = _SyncCompleter();
  const _nextListener = Symbol('_nextListener');
  const _onValue = Symbol('_onValue');
  const _errorTest = Symbol('_errorTest');
  const _whenCompleteAction = Symbol('_whenCompleteAction');
  async._FutureListener$ = dart.generic((S, T) => {
    let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    class _FutureListener extends core.Object {
      then(result, onValue, errorCallback) {
        this.result = result;
        this.callback = onValue;
        this.errorCallback = errorCallback;
        this.state = errorCallback == null ? async._FutureListener.STATE_THEN : async._FutureListener.STATE_THEN_ONERROR;
        this[_nextListener] = null;
      }
      catchError(result, errorCallback, test) {
        this.result = result;
        this.errorCallback = errorCallback;
        this.callback = test;
        this.state = test == null ? async._FutureListener.STATE_CATCHERROR : async._FutureListener.STATE_CATCHERROR_TEST;
        this[_nextListener] = null;
      }
      whenComplete(result, onComplete) {
        this.result = result;
        this.callback = onComplete;
        this.errorCallback = null;
        this.state = async._FutureListener.STATE_WHENCOMPLETE;
        this[_nextListener] = null;
      }
      get [_zone]() {
        return this.result[_zone];
      }
      get handlesValue() {
        return (dart.notNull(this.state) & async._FutureListener.MASK_VALUE) != 0;
      }
      get handlesError() {
        return (dart.notNull(this.state) & async._FutureListener.MASK_ERROR) != 0;
      }
      get hasErrorTest() {
        return this.state == async._FutureListener.STATE_CATCHERROR_TEST;
      }
      get handlesComplete() {
        return this.state == async._FutureListener.STATE_WHENCOMPLETE;
      }
      get [_onValue]() {
        dart.assert(this.handlesValue);
        return _FutureOnValueOfS$T().as(this.callback);
      }
      get [_onError]() {
        return this.errorCallback;
      }
      get [_errorTest]() {
        dart.assert(this.hasErrorTest);
        return async._FutureErrorTest.as(this.callback);
      }
      get [_whenCompleteAction]() {
        dart.assert(this.handlesComplete);
        return async._FutureAction.as(this.callback);
      }
      get hasErrorCallback() {
        dart.assert(this.handlesError);
        return this[_onError] != null;
      }
      handleValue(sourceResult) {
        S._check(sourceResult);
        return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
      }
      matchesErrorTest(asyncError) {
        if (!dart.test(this.hasErrorTest)) return true;
        let test = this[_errorTest];
        return this[_zone].runUnary(core.bool, dart.dynamic)(this[_errorTest], asyncError.error);
      }
      handleError(asyncError) {
        dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
        if (async.ZoneBinaryCallback.is(this.errorCallback)) {
          let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
          return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
        } else {
          return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
        }
      }
      handleWhenComplete() {
        dart.assert(!dart.test(this.handlesError));
        return this[_zone].run(dart.dynamic)(this[_whenCompleteAction]);
      }
    }
    dart.addTypeTests(_FutureListener);
    dart.defineNamedConstructor(_FutureListener, 'then');
    dart.defineNamedConstructor(_FutureListener, 'catchError');
    dart.defineNamedConstructor(_FutureListener, 'whenComplete');
    dart.setSignature(_FutureListener, {
      constructors: () => ({
        then: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), _FutureOnValueOfS$T(), core.Function]),
        catchError: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), core.Function, async._FutureErrorTest]),
        whenComplete: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), async._FutureAction])
      }),
      fields: () => ({
        [_nextListener]: async._FutureListener,
        result: _FutureOfT(),
        state: core.int,
        callback: core.Function,
        errorCallback: core.Function
      }),
      getters: () => ({
        [_zone]: dart.definiteFunctionType(async.Zone, []),
        handlesValue: dart.definiteFunctionType(core.bool, []),
        handlesError: dart.definiteFunctionType(core.bool, []),
        hasErrorTest: dart.definiteFunctionType(core.bool, []),
        handlesComplete: dart.definiteFunctionType(core.bool, []),
        [_onValue]: dart.definiteFunctionType(async._FutureOnValue$(S, T), []),
        [_onError]: dart.definiteFunctionType(core.Function, []),
        [_errorTest]: dart.definiteFunctionType(async._FutureErrorTest, []),
        [_whenCompleteAction]: dart.definiteFunctionType(async._FutureAction, []),
        hasErrorCallback: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
        matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
        handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
        handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
      }),
      sfields: () => ({
        MASK_VALUE: core.int,
        MASK_ERROR: core.int,
        MASK_TEST_ERROR: core.int,
        MASK_WHENCOMPLETE: core.int,
        STATE_CHAIN: core.int,
        STATE_THEN: core.int,
        STATE_THEN_ONERROR: core.int,
        STATE_CATCHERROR: core.int,
        STATE_CATCHERROR_TEST: core.int,
        STATE_WHENCOMPLETE: core.int
      })
    });
    return _FutureListener;
  });
  async._FutureListener = _FutureListener();
  async._FutureListener.MASK_VALUE = 1;
  async._FutureListener.MASK_ERROR = 2;
  async._FutureListener.MASK_TEST_ERROR = 4;
  async._FutureListener.MASK_WHENCOMPLETE = 8;
  async._FutureListener.STATE_CHAIN = 0;
  async._FutureListener.STATE_THEN_ONERROR = 3;
  async._FutureListener.STATE_CATCHERROR_TEST = 6;
  dart.defineLazy(async._FutureListener, {
    get STATE_THEN() {
      return async._FutureListener.MASK_VALUE;
    },
    get STATE_CATCHERROR() {
      return async._FutureListener.MASK_ERROR;
    },
    get STATE_WHENCOMPLETE() {
      return async._FutureListener.MASK_WHENCOMPLETE;
    }
  });
  const _resultOrListeners = Symbol('_resultOrListeners');
  const _isPendingComplete = Symbol('_isPendingComplete');
  const _mayAddListener = Symbol('_mayAddListener');
  const _isChained = Symbol('_isChained');
  const _isComplete = Symbol('_isComplete');
  const _hasError = Symbol('_hasError');
  const _setChained = Symbol('_setChained');
  const _thenNoZoneRegistration = Symbol('_thenNoZoneRegistration');
  const _setPendingComplete = Symbol('_setPendingComplete');
  const _error = Symbol('_error');
  const _chainSource = Symbol('_chainSource');
  const _setValue = Symbol('_setValue');
  const _setErrorObject = Symbol('_setErrorObject');
  const _setError = Symbol('_setError');
  const _cloneResult = Symbol('_cloneResult');
  const _prependListeners = Symbol('_prependListeners');
  const _reverseListeners = Symbol('_reverseListeners');
  const _removeListeners = Symbol('_removeListeners');
  async._Future$ = dart.flattenFutures(dart.generic(T => {
    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
    let _FutureListenerOfT$T = () => (_FutureListenerOfT$T = dart.constFn(async._FutureListener$(T, T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
    let TTodynamic$ = () => (TTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [T])))();
    class _Future extends core.Object {
      new() {
        this[_zone] = async.Zone.current;
        this[_state] = async._Future._INCOMPLETE;
        this[_resultOrListeners] = null;
      }
      immediate(value) {
        this[_zone] = async.Zone.current;
        this[_state] = async._Future._INCOMPLETE;
        this[_resultOrListeners] = null;
        this[_asyncComplete](value);
      }
      immediateError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_zone] = async.Zone.current;
        this[_state] = async._Future._INCOMPLETE;
        this[_resultOrListeners] = null;
        this[_asyncCompleteError](error, stackTrace);
      }
      get [_mayComplete]() {
        return this[_state] == async._Future._INCOMPLETE;
      }
      get [_isPendingComplete]() {
        return this[_state] == async._Future._PENDING_COMPLETE;
      }
      get [_mayAddListener]() {
        return dart.notNull(this[_state]) <= async._Future._PENDING_COMPLETE;
      }
      get [_isChained]() {
        return this[_state] == async._Future._CHAINED;
      }
      get [_isComplete]() {
        return dart.notNull(this[_state]) >= async._Future._VALUE;
      }
      get [_hasError]() {
        return this[_state] == async._Future._ERROR;
      }
      [_setChained](source) {
        dart.assert(this[_mayAddListener]);
        this[_state] = async._Future._CHAINED;
        this[_resultOrListeners] = source;
      }
      then(E) {
        return (f, opts) => {
          let onError = opts && 'onError' in opts ? opts.onError : null;
          let currentZone = async.Zone.current;
          let registered = null;
          if (!core.identical(currentZone, async._ROOT_ZONE)) {
            f = currentZone.registerUnaryCallback(dart.dynamic, T)(f);
            if (onError != null) {
              onError = async._registerErrorHandler(T)(onError, currentZone);
            }
          }
          return this[_thenNoZoneRegistration](E)(f, onError);
        };
      }
      [_thenNoZoneRegistration](E) {
        return (f, onError) => {
          let result = new (async._Future$(E))();
          this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
          return result;
        };
      }
      catchError(onError, opts) {
        let test = opts && 'test' in opts ? opts.test : null;
        let result = new (_FutureOfT())();
        if (!core.identical(result[_zone], async._ROOT_ZONE)) {
          onError = async._registerErrorHandler(T)(onError, result[_zone]);
          if (test != null) test = result[_zone].registerUnaryCallback(core.bool, dart.dynamic)(test);
        }
        this[_addListener](new (_FutureListenerOfT$T()).catchError(result, onError, test));
        return result;
      }
      whenComplete(action) {
        let result = new (_FutureOfT())();
        if (!core.identical(result[_zone], async._ROOT_ZONE)) {
          action = result[_zone].registerCallback(dart.dynamic)(action);
        }
        this[_addListener](new (_FutureListenerOfT$T()).whenComplete(result, action));
        return result;
      }
      asStream() {
        return StreamOfT().fromFuture(this);
      }
      [_setPendingComplete]() {
        dart.assert(this[_mayComplete]);
        this[_state] = async._Future._PENDING_COMPLETE;
      }
      get [_error]() {
        dart.assert(this[_hasError]);
        return async.AsyncError._check(this[_resultOrListeners]);
      }
      get [_chainSource]() {
        dart.assert(this[_isChained]);
        return async._Future._check(this[_resultOrListeners]);
      }
      [_setValue](value) {
        T._check(value);
        dart.assert(!dart.test(this[_isComplete]));
        this[_state] = async._Future._VALUE;
        this[_resultOrListeners] = value;
      }
      [_setErrorObject](error) {
        dart.assert(!dart.test(this[_isComplete]));
        this[_state] = async._Future._ERROR;
        this[_resultOrListeners] = error;
      }
      [_setError](error, stackTrace) {
        this[_setErrorObject](new async.AsyncError(error, stackTrace));
      }
      [_cloneResult](source) {
        dart.assert(!dart.test(this[_isComplete]));
        dart.assert(source[_isComplete]);
        this[_state] = source[_state];
        this[_resultOrListeners] = source[_resultOrListeners];
      }
      [_addListener](listener) {
        dart.assert(listener[_nextListener] == null);
        if (dart.test(this[_mayAddListener])) {
          listener[_nextListener] = async._FutureListener._check(this[_resultOrListeners]);
          this[_resultOrListeners] = listener;
        } else {
          if (dart.test(this[_isChained])) {
            let source = this[_chainSource];
            if (!dart.test(source[_isComplete])) {
              source[_addListener](listener);
              return;
            }
            this[_cloneResult](source);
          }
          dart.assert(this[_isComplete]);
          this[_zone].scheduleMicrotask(dart.fn(() => {
            async._Future._propagateToListeners(this, listener);
          }, VoidTovoid$()));
        }
      }
      [_prependListeners](listeners) {
        if (listeners == null) return;
        if (dart.test(this[_mayAddListener])) {
          let existingListeners = async._FutureListener._check(this[_resultOrListeners]);
          this[_resultOrListeners] = listeners;
          if (existingListeners != null) {
            let cursor = listeners;
            while (cursor[_nextListener] != null) {
              cursor = cursor[_nextListener];
            }
            cursor[_nextListener] = existingListeners;
          }
        } else {
          if (dart.test(this[_isChained])) {
            let source = this[_chainSource];
            if (!dart.test(source[_isComplete])) {
              source[_prependListeners](listeners);
              return;
            }
            this[_cloneResult](source);
          }
          dart.assert(this[_isComplete]);
          listeners = this[_reverseListeners](listeners);
          this[_zone].scheduleMicrotask(dart.fn(() => {
            async._Future._propagateToListeners(this, listeners);
          }, VoidTovoid$()));
        }
      }
      [_removeListeners]() {
        dart.assert(!dart.test(this[_isComplete]));
        let current = async._FutureListener._check(this[_resultOrListeners]);
        this[_resultOrListeners] = null;
        return this[_reverseListeners](current);
      }
      [_reverseListeners](listeners) {
        let prev = null;
        let current = listeners;
        while (current != null) {
          let next = current[_nextListener];
          current[_nextListener] = prev;
          prev = current;
          current = next;
        }
        return prev;
      }
      static _chainForeignFuture(source, target) {
        dart.assert(!dart.test(target[_isComplete]));
        dart.assert(!async._Future.is(source));
        target[_setPendingComplete]();
        try {
          source.then(dart.dynamic)(dart.fn(value => {
            dart.assert(target[_isPendingComplete]);
            target[_completeWithValue](value);
          }, dynamicTodynamic$()), {onError: dart.fn((error, stackTrace) => {
              if (stackTrace === void 0) stackTrace = null;
              dart.assert(target[_isPendingComplete]);
              target[_completeError](error, core.StackTrace._check(stackTrace));
            }, dynamic__Todynamic())});
        } catch (e) {
          let s = dart.stackTrace(e);
          async.scheduleMicrotask(dart.fn(() => {
            target[_completeError](e, s);
          }, VoidTovoid$()));
        }

      }
      static _chainCoreFuture(source, target) {
        dart.assert(target[_mayAddListener]);
        while (dart.test(source[_isChained])) {
          source = source[_chainSource];
        }
        if (dart.test(source[_isComplete])) {
          let listeners = target[_removeListeners]();
          target[_cloneResult](source);
          async._Future._propagateToListeners(target, listeners);
        } else {
          let listeners = async._FutureListener._check(target[_resultOrListeners]);
          target[_setChained](source);
          source[_prependListeners](listeners);
        }
      }
      [_complete](value) {
        dart.assert(!dart.test(this[_isComplete]));
        if (async.Future.is(value)) {
          if (async._Future.is(value)) {
            async._Future._chainCoreFuture(value, this);
          } else {
            async._Future._chainForeignFuture(value, this);
          }
        } else {
          let listeners = this[_removeListeners]();
          this[_setValue](T.as(value));
          async._Future._propagateToListeners(this, listeners);
        }
      }
      [_completeWithValue](value) {
        T._check(value);
        dart.assert(!dart.test(this[_isComplete]));
        dart.assert(!async.Future.is(value));
        let listeners = this[_removeListeners]();
        this[_setValue](value);
        async._Future._propagateToListeners(this, listeners);
      }
      [_completeError](error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        dart.assert(!dart.test(this[_isComplete]));
        let listeners = this[_removeListeners]();
        this[_setError](error, stackTrace);
        async._Future._propagateToListeners(this, listeners);
      }
      [_asyncComplete](value) {
        dart.assert(!dart.test(this[_isComplete]));
        if (async.Future.is(value)) {
          let typedFuture = FutureOfT().as(value);
          if (async._Future.is(typedFuture)) {
            let coreFuture = _FutureOfT()._check(typedFuture);
            if (dart.test(coreFuture[_hasError])) {
              this[_setPendingComplete]();
              this[_zone].scheduleMicrotask(dart.fn(() => {
                async._Future._chainCoreFuture(coreFuture, this);
              }, VoidTovoid$()));
            } else {
              async._Future._chainCoreFuture(coreFuture, this);
            }
          } else {
            async._Future._chainForeignFuture(typedFuture, this);
          }
          return;
        }
        let typedValue = T.as(value);
        this[_setPendingComplete]();
        this[_zone].scheduleMicrotask(dart.fn(() => {
          this[_completeWithValue](typedValue);
        }, VoidTovoid$()));
      }
      [_asyncCompleteError](error, stackTrace) {
        dart.assert(!dart.test(this[_isComplete]));
        this[_setPendingComplete]();
        this[_zone].scheduleMicrotask(dart.fn(() => {
          this[_completeError](error, stackTrace);
        }, VoidTovoid$()));
      }
      static _propagateToListeners(source, listeners) {
        while (true) {
          dart.assert(source[_isComplete]);
          let hasError = source[_hasError];
          if (listeners == null) {
            if (dart.test(hasError)) {
              let asyncError = source[_error];
              source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
            }
            return;
          }
          while (listeners[_nextListener] != null) {
            let listener = listeners;
            listeners = listener[_nextListener];
            listener[_nextListener] = null;
            async._Future._propagateToListeners(source, listener);
          }
          let listener = listeners;
          let sourceResult = source[_resultOrListeners];
          let listenerHasError = hasError;
          let listenerValueOrError = sourceResult;
          if (dart.test(hasError) || dart.test(listener.handlesValue) || dart.test(listener.handlesComplete)) {
            let zone = listener[_zone];
            if (dart.test(hasError) && !dart.test(source[_zone].inSameErrorZone(zone))) {
              let asyncError = source[_error];
              source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
              return;
            }
            let oldZone = null;
            if (!core.identical(async.Zone.current, zone)) {
              oldZone = async.Zone._enter(zone);
            }
            function handleWhenCompleteCallback() {
              dart.assert(!dart.test(listener.handlesValue));
              dart.assert(!dart.test(listener.handlesError));
              let completeResult = null;
              try {
                completeResult = listener.handleWhenComplete();
              } catch (e) {
                let s = dart.stackTrace(e);
                if (dart.test(hasError) && core.identical(source[_error].error, e)) {
                  listenerValueOrError = source[_error];
                } else {
                  listenerValueOrError = new async.AsyncError(e, s);
                }
                listenerHasError = true;
                return;
              }

              if (async.Future.is(completeResult)) {
                if (async._Future.is(completeResult) && dart.test(completeResult[_isComplete])) {
                  if (dart.test(completeResult[_hasError])) {
                    listenerValueOrError = completeResult[_error];
                    listenerHasError = true;
                  }
                  return;
                }
                let originalSource = source;
                listenerValueOrError = completeResult.then(dart.dynamic)(dart.fn(_ => originalSource, dynamicTo_Future()));
                listenerHasError = false;
              }
            }
            dart.fn(handleWhenCompleteCallback, VoidTovoid$());
            function handleValueCallback() {
              try {
                listenerValueOrError = listener.handleValue(sourceResult);
              } catch (e) {
                let s = dart.stackTrace(e);
                listenerValueOrError = new async.AsyncError(e, s);
                listenerHasError = true;
              }

            }
            dart.fn(handleValueCallback, VoidTovoid$());
            function handleError() {
              try {
                let asyncError = source[_error];
                if (dart.test(listener.matchesErrorTest(asyncError)) && dart.test(listener.hasErrorCallback)) {
                  listenerValueOrError = listener.handleError(asyncError);
                  listenerHasError = false;
                }
              } catch (e) {
                let s = dart.stackTrace(e);
                if (core.identical(source[_error].error, e)) {
                  listenerValueOrError = source[_error];
                } else {
                  listenerValueOrError = new async.AsyncError(e, s);
                }
                listenerHasError = true;
              }

            }
            dart.fn(handleError, VoidTovoid$());
            if (dart.test(listener.handlesComplete)) {
              handleWhenCompleteCallback();
            } else if (!dart.test(hasError)) {
              if (dart.test(listener.handlesValue)) {
                handleValueCallback();
              }
            } else {
              if (dart.test(listener.handlesError)) {
                handleError();
              }
            }
            if (oldZone != null) async.Zone._leave(oldZone);
            if (async.Future.is(listenerValueOrError)) {
              let chainSource = async.Future._check(listenerValueOrError);
              let result = listener.result;
              if (async._Future.is(chainSource)) {
                if (dart.test(chainSource[_isComplete])) {
                  listeners = result[_removeListeners]();
                  result[_cloneResult](chainSource);
                  source = chainSource;
                  continue;
                } else {
                  async._Future._chainCoreFuture(chainSource, result);
                }
              } else {
                async._Future._chainForeignFuture(chainSource, result);
              }
              return;
            }
          }
          let result = listener.result;
          listeners = result[_removeListeners]();
          if (!dart.test(listenerHasError)) {
            result[_setValue](listenerValueOrError);
          } else {
            let asyncError = async.AsyncError._check(listenerValueOrError);
            result[_setErrorObject](asyncError);
          }
          source = result;
        }
      }
      timeout(timeLimit, opts) {
        let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
        if (dart.test(this[_isComplete])) return new (_FutureOfT()).immediate(this);
        let result = new (_FutureOfT())();
        let timer = null;
        if (onTimeout == null) {
          timer = async.Timer.new(timeLimit, dart.fn(() => {
            result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
          }, VoidTovoid$()));
        } else {
          let zone = async.Zone.current;
          onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
          timer = async.Timer.new(timeLimit, dart.fn(() => {
            try {
              result[_complete](zone.run(dart.dynamic)(onTimeout));
            } catch (e) {
              let s = dart.stackTrace(e);
              result[_completeError](e, s);
            }

          }, VoidTovoid$()));
        }
        this.then(dart.dynamic)(dart.fn(v => {
          if (dart.test(timer.isActive)) {
            timer.cancel();
            result[_completeWithValue](v);
          }
        }, TTodynamic$()), {onError: dart.fn((e, s) => {
            if (dart.test(timer.isActive)) {
              timer.cancel();
              result[_completeError](e, core.StackTrace._check(s));
            }
          }, dynamicAnddynamicTodynamic$())});
        return result;
      }
    }
    dart.addTypeTests(_Future);
    dart.defineNamedConstructor(_Future, 'immediate');
    dart.defineNamedConstructor(_Future, 'immediateError');
    _Future[dart.implements] = () => [FutureOfT()];
    dart.setSignature(_Future, {
      constructors: () => ({
        new: dart.definiteFunctionType(async._Future$(T), []),
        immediate: dart.definiteFunctionType(async._Future$(T), [dart.dynamic]),
        immediateError: dart.definiteFunctionType(async._Future$(T), [dart.dynamic], [core.StackTrace])
      }),
      fields: () => ({
        [_state]: core.int,
        [_zone]: async.Zone,
        [_resultOrListeners]: dart.dynamic
      }),
      getters: () => ({
        [_mayComplete]: dart.definiteFunctionType(core.bool, []),
        [_isPendingComplete]: dart.definiteFunctionType(core.bool, []),
        [_mayAddListener]: dart.definiteFunctionType(core.bool, []),
        [_isChained]: dart.definiteFunctionType(core.bool, []),
        [_isComplete]: dart.definiteFunctionType(core.bool, []),
        [_hasError]: dart.definiteFunctionType(core.bool, []),
        [_error]: dart.definiteFunctionType(async.AsyncError, []),
        [_chainSource]: dart.definiteFunctionType(async._Future, [])
      }),
      methods: () => ({
        [_setChained]: dart.definiteFunctionType(dart.void, [async._Future]),
        then: dart.definiteFunctionType(E => [async.Future$(E), [TTodynamic()], {onError: core.Function}]),
        [_thenNoZoneRegistration]: dart.definiteFunctionType(E => [async.Future$(E), [TTodynamic(), core.Function]]),
        catchError: dart.definiteFunctionType(async.Future$(T), [core.Function], {test: dynamicTobool()}),
        whenComplete: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
        asStream: dart.definiteFunctionType(async.Stream$(T), []),
        [_setPendingComplete]: dart.definiteFunctionType(dart.void, []),
        [_setValue]: dart.definiteFunctionType(dart.void, [T]),
        [_setErrorObject]: dart.definiteFunctionType(dart.void, [async.AsyncError]),
        [_setError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_cloneResult]: dart.definiteFunctionType(dart.void, [async._Future]),
        [_addListener]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
        [_prependListeners]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
        [_removeListeners]: dart.definiteFunctionType(async._FutureListener, []),
        [_reverseListeners]: dart.definiteFunctionType(async._FutureListener, [async._FutureListener]),
        [_complete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        [_completeWithValue]: dart.definiteFunctionType(dart.void, [T]),
        [_completeError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
        [_asyncComplete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
        [_asyncCompleteError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
        timeout: dart.definiteFunctionType(async.Future$(T), [core.Duration], {onTimeout: VoidTodynamic()})
      }),
      sfields: () => ({
        _INCOMPLETE: core.int,
        _PENDING_COMPLETE: core.int,
        _CHAINED: core.int,
        _VALUE: core.int,
        _ERROR: core.int
      }),
      statics: () => ({
        _chainForeignFuture: dart.definiteFunctionType(dart.void, [async.Future, async._Future]),
        _chainCoreFuture: dart.definiteFunctionType(dart.void, [async._Future, async._Future]),
        _propagateToListeners: dart.definiteFunctionType(dart.void, [async._Future, async._FutureListener])
      }),
      names: ['_chainForeignFuture', '_chainCoreFuture', '_propagateToListeners']
    });
    return _Future;
  }));
  async._Future = _Future();
  async._Future._INCOMPLETE = 0;
  async._Future._PENDING_COMPLETE = 1;
  async._Future._CHAINED = 2;
  async._Future._VALUE = 4;
  async._Future._ERROR = 8;
  async._AsyncCallback = dart.typedef('_AsyncCallback', () => dart.functionType(dart.void, []));
  async._AsyncCallbackEntry = class _AsyncCallbackEntry extends core.Object {
    new(callback) {
      this.callback = callback;
      this.next = null;
    }
  };
  dart.setSignature(async._AsyncCallbackEntry, {
    constructors: () => ({new: dart.definiteFunctionType(async._AsyncCallbackEntry, [async._AsyncCallback])}),
    fields: () => ({
      callback: async._AsyncCallback,
      next: async._AsyncCallbackEntry
    })
  });
  async._nextCallback = null;
  async._lastCallback = null;
  async._lastPriorityCallback = null;
  async._isInCallbackLoop = false;
  async._microtaskLoop = function() {
    while (async._nextCallback != null) {
      async._lastPriorityCallback = null;
      let entry = async._nextCallback;
      async._nextCallback = entry.next;
      if (async._nextCallback == null) async._lastCallback = null;
      entry.callback();
    }
  };
  dart.fn(async._microtaskLoop, VoidTovoid$());
  async._startMicrotaskLoop = function() {
    async._isInCallbackLoop = true;
    try {
      async._microtaskLoop();
    } finally {
      async._lastPriorityCallback = null;
      async._isInCallbackLoop = false;
      if (async._nextCallback != null) {
        async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
      }
    }
  };
  dart.fn(async._startMicrotaskLoop, VoidTovoid$());
  async._scheduleAsyncCallback = function(callback) {
    let newEntry = new async._AsyncCallbackEntry(callback);
    if (async._nextCallback == null) {
      async._nextCallback = async._lastCallback = newEntry;
      if (!dart.test(async._isInCallbackLoop)) {
        async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
      }
    } else {
      async._lastCallback.next = newEntry;
      async._lastCallback = newEntry;
    }
  };
  dart.fn(async._scheduleAsyncCallback, _AsyncCallbackTovoid());
  async._schedulePriorityAsyncCallback = function(callback) {
    if (async._nextCallback == null) {
      async._scheduleAsyncCallback(callback);
      async._lastPriorityCallback = async._lastCallback;
      return;
    }
    let entry = new async._AsyncCallbackEntry(callback);
    if (async._lastPriorityCallback == null) {
      entry.next = async._nextCallback;
      async._nextCallback = async._lastPriorityCallback = entry;
    } else {
      entry.next = async._lastPriorityCallback.next;
      async._lastPriorityCallback.next = entry;
      async._lastPriorityCallback = entry;
      if (entry.next == null) {
        async._lastCallback = entry;
      }
    }
  };
  dart.fn(async._schedulePriorityAsyncCallback, _AsyncCallbackTovoid());
  const _scheduleMicrotask = Symbol('_scheduleMicrotask');
  async.scheduleMicrotask = function(callback) {
    let currentZone = async._Zone._check(async.Zone.current);
    if (core.identical(async._ROOT_ZONE, currentZone)) {
      async._rootScheduleMicrotask(null, null, async._ROOT_ZONE, callback);
      return;
    }
    let implementation = currentZone[_scheduleMicrotask];
    if (core.identical(async._ROOT_ZONE, implementation.zone) && dart.test(async._ROOT_ZONE.inSameErrorZone(currentZone))) {
      async._rootScheduleMicrotask(null, null, currentZone, currentZone.registerCallback(dart.dynamic)(callback));
      return;
    }
    async.Zone.current.scheduleMicrotask(async.Zone.current.bindCallback(dart.dynamic)(callback, {runGuarded: true}));
  };
  dart.fn(async.scheduleMicrotask, _AsyncCallbackTovoid());
  async._AsyncRun = class _AsyncRun extends core.Object {
    static _scheduleImmediate(callback) {
      dart.dcall(async._AsyncRun._scheduleImmediateClosure, callback);
    }
    static _initializeScheduleImmediate() {
      if (self.scheduleImmediate != null) {
        return async._AsyncRun._scheduleImmediateJsOverride;
      }
      if (self.MutationObserver != null && self.document != null) {
        let div = self.document.createElement("div");
        let span = self.document.createElement("span");
        let storedCallback = null;
        function internalCallback(_) {
          _isolate_helper.leaveJsAsync();
          let f = storedCallback;
          storedCallback = null;
          dart.dcall(f);
        }
        dart.fn(internalCallback, dynamicTodynamic$());
        ;
        let observer = new self.MutationObserver(internalCallback);
        observer.observe(div, {childList: true});
        return dart.fn(callback => {
          dart.assert(storedCallback == null);
          _isolate_helper.enterJsAsync();
          storedCallback = callback;
          div.firstChild ? div.removeChild(span) : div.appendChild(span);
        }, FnTodynamic());
      } else if (self.setImmediate != null) {
        return async._AsyncRun._scheduleImmediateWithSetImmediate;
      }
      return async._AsyncRun._scheduleImmediateWithTimer;
    }
    static _scheduleImmediateJsOverride(callback) {
      function internalCallback() {
        _isolate_helper.leaveJsAsync();
        callback();
      }
      dart.fn(internalCallback, VoidTodynamic$());
      ;
      _isolate_helper.enterJsAsync();
      self.scheduleImmediate(internalCallback);
    }
    static _scheduleImmediateWithSetImmediate(callback) {
      function internalCallback() {
        _isolate_helper.leaveJsAsync();
        callback();
      }
      dart.fn(internalCallback, VoidTodynamic$());
      ;
      _isolate_helper.enterJsAsync();
      self.setImmediate(internalCallback);
    }
    static _scheduleImmediateWithTimer(callback) {
      async.Timer._createTimer(core.Duration.ZERO, callback);
    }
  };
  dart.setSignature(async._AsyncRun, {
    sfields: () => ({_scheduleImmediateClosure: core.Function}),
    statics: () => ({
      _scheduleImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _initializeScheduleImmediate: dart.definiteFunctionType(core.Function, []),
      _scheduleImmediateJsOverride: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _scheduleImmediateWithSetImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _scheduleImmediateWithTimer: dart.definiteFunctionType(dart.void, [VoidTovoid()])
    }),
    names: ['_scheduleImmediate', '_initializeScheduleImmediate', '_scheduleImmediateJsOverride', '_scheduleImmediateWithSetImmediate', '_scheduleImmediateWithTimer']
  });
  dart.defineLazy(async._AsyncRun, {
    get _scheduleImmediateClosure() {
      return async._AsyncRun._initializeScheduleImmediate();
    }
  });
  async._TimerCallback = dart.typedef('_TimerCallback', () => dart.functionType(dart.void, []));
  async.StreamSubscription$ = dart.generic(T => {
    class StreamSubscription extends core.Object {}
    dart.addTypeTests(StreamSubscription);
    return StreamSubscription;
  });
  async.StreamSubscription = StreamSubscription();
  async.EventSink$ = dart.generic(T => {
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    class EventSink extends core.Object {}
    dart.addTypeTests(EventSink);
    EventSink[dart.implements] = () => [SinkOfT()];
    return EventSink;
  });
  async.EventSink = EventSink();
  const _stream = Symbol('_stream');
  async.StreamView$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class StreamView extends async.Stream$(T) {
      new(stream) {
        this[_stream] = stream;
        super._internal();
      }
      get isBroadcast() {
        return this[_stream].isBroadcast;
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this[_stream].asBroadcastStream({onListen: onListen, onCancel: onCancel});
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
      }
    }
    dart.setSignature(StreamView, {
      constructors: () => ({new: dart.definiteFunctionType(async.StreamView$(T), [StreamOfT()])}),
      fields: () => ({[_stream]: StreamOfT()}),
      methods: () => ({
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})
      })
    });
    return StreamView;
  });
  async.StreamView = StreamView();
  async.StreamConsumer$ = dart.generic(S => {
    class StreamConsumer extends core.Object {}
    dart.addTypeTests(StreamConsumer);
    return StreamConsumer;
  });
  async.StreamConsumer = StreamConsumer();
  async.StreamSink$ = dart.generic(S => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let StreamConsumerOfS = () => (StreamConsumerOfS = dart.constFn(async.StreamConsumer$(S)))();
    class StreamSink extends core.Object {}
    dart.addTypeTests(StreamSink);
    StreamSink[dart.implements] = () => [EventSinkOfS(), StreamConsumerOfS()];
    return StreamSink;
  });
  async.StreamSink = StreamSink();
  async.StreamTransformer$ = dart.generic((S, T) => {
    let _StreamSubscriptionTransformerOfS$T = () => (_StreamSubscriptionTransformerOfS$T = dart.constFn(async._StreamSubscriptionTransformer$(S, T)))();
    let _StreamHandlerTransformerOfS$T = () => (_StreamHandlerTransformerOfS$T = dart.constFn(async._StreamHandlerTransformer$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let StreamOfSAndboolToStreamSubscriptionOfT = () => (StreamOfSAndboolToStreamSubscriptionOfT = dart.constFn(dart.functionType(StreamSubscriptionOfT(), [StreamOfS(), core.bool])))();
    let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
    class StreamTransformer extends core.Object {
      static new(transformer) {
        return new (_StreamSubscriptionTransformerOfS$T())(transformer);
      }
      static fromHandlers(opts) {
        return new (_StreamHandlerTransformerOfS$T())(opts);
      }
    }
    dart.addTypeTests(StreamTransformer);
    dart.setSignature(StreamTransformer, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.StreamTransformer$(S, T), [StreamOfSAndboolToStreamSubscriptionOfT()]),
        fromHandlers: dart.definiteFunctionType(async.StreamTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})
      })
    });
    return StreamTransformer;
  });
  async.StreamTransformer = StreamTransformer();
  async.StreamIterator$ = dart.generic(T => {
    let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class StreamIterator extends core.Object {
      static new(stream) {
        return new (_StreamIteratorImplOfT())(stream);
      }
    }
    dart.addTypeTests(StreamIterator);
    dart.setSignature(StreamIterator, {
      constructors: () => ({new: dart.definiteFunctionType(async.StreamIterator$(T), [StreamOfT()])})
    });
    return StreamIterator;
  });
  async.StreamIterator = StreamIterator();
  async._ControllerEventSinkWrapper$ = dart.generic(T => {
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _ControllerEventSinkWrapper extends core.Object {
      new(sink) {
        this[_sink] = sink;
      }
      add(data) {
        T._check(data);
        this[_sink].add(data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_sink].addError(error, stackTrace);
      }
      close() {
        this[_sink].close();
      }
    }
    dart.addTypeTests(_ControllerEventSinkWrapper);
    _ControllerEventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
    dart.setSignature(_ControllerEventSinkWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._ControllerEventSinkWrapper$(T), [async.EventSink])}),
      fields: () => ({[_sink]: async.EventSink}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _ControllerEventSinkWrapper;
  });
  async._ControllerEventSinkWrapper = _ControllerEventSinkWrapper();
  async.ControllerCallback = dart.typedef('ControllerCallback', () => dart.functionType(dart.void, []));
  async.ControllerCancelCallback = dart.typedef('ControllerCancelCallback', () => dart.functionType(dart.dynamic, []));
  async.StreamController$ = dart.generic(T => {
    let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
    let _AsyncStreamControllerOfT = () => (_AsyncStreamControllerOfT = dart.constFn(async._AsyncStreamController$(T)))();
    let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
    let _AsyncBroadcastStreamControllerOfT = () => (_AsyncBroadcastStreamControllerOfT = dart.constFn(async._AsyncBroadcastStreamController$(T)))();
    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
    class StreamController extends core.Object {
      static new(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onPause = opts && 'onPause' in opts ? opts.onPause : null;
        let onResume = opts && 'onResume' in opts ? opts.onResume : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        let sync = opts && 'sync' in opts ? opts.sync : false;
        return dart.test(sync) ? new (_SyncStreamControllerOfT())(onListen, onPause, onResume, onCancel) : new (_AsyncStreamControllerOfT())(onListen, onPause, onResume, onCancel);
      }
      static broadcast(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        let sync = opts && 'sync' in opts ? opts.sync : false;
        return dart.test(sync) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_AsyncBroadcastStreamControllerOfT())(onListen, onCancel);
      }
    }
    dart.addTypeTests(StreamController);
    StreamController[dart.implements] = () => [StreamSinkOfT()];
    dart.setSignature(StreamController, {
      constructors: () => ({
        new: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onPause: VoidTovoid(), onResume: VoidTovoid(), onCancel: VoidTodynamic(), sync: core.bool}),
        broadcast: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onCancel: VoidTovoid(), sync: core.bool})
      })
    });
    return StreamController;
  });
  async.StreamController = StreamController();
  async.SynchronousStreamController$ = dart.generic(T => {
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    class SynchronousStreamController extends core.Object {}
    dart.addTypeTests(SynchronousStreamController);
    SynchronousStreamController[dart.implements] = () => [StreamControllerOfT()];
    return SynchronousStreamController;
  });
  async.SynchronousStreamController = SynchronousStreamController();
  async._StreamControllerLifecycle$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    class _StreamControllerLifecycle extends core.Object {
      [_recordPause](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_recordResume](subscription) {
        StreamSubscriptionOfT()._check(subscription);
      }
      [_recordCancel](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        return null;
      }
    }
    dart.addTypeTests(_StreamControllerLifecycle);
    dart.setSignature(_StreamControllerLifecycle, {
      methods: () => ({
        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()])
      })
    });
    return _StreamControllerLifecycle;
  });
  async._StreamControllerLifecycle = _StreamControllerLifecycle();
  const _varData = Symbol('_varData');
  const _isInitialState = Symbol('_isInitialState');
  const _subscription = Symbol('_subscription');
  const _pendingEvents = Symbol('_pendingEvents');
  const _ensurePendingEvents = Symbol('_ensurePendingEvents');
  const _badEventState = Symbol('_badEventState');
  let const$9;
  async._StreamController$ = dart.generic(T => {
    let _ControllerStreamOfT = () => (_ControllerStreamOfT = dart.constFn(async._ControllerStream$(T)))();
    let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
    let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
    let _StreamControllerAddStreamStateOfT = () => (_StreamControllerAddStreamStateOfT = dart.constFn(async._StreamControllerAddStreamState$(T)))();
    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
    let _ControllerSubscriptionOfT = () => (_ControllerSubscriptionOfT = dart.constFn(async._ControllerSubscription$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _StreamController extends core.Object {
      new(onListen, onPause, onResume, onCancel) {
        this.onListen = onListen;
        this.onPause = onPause;
        this.onResume = onResume;
        this.onCancel = onCancel;
        this[_varData] = null;
        this[_state] = async._StreamController._STATE_INITIAL;
        this[_doneFuture] = null;
      }
      get stream() {
        return new (_ControllerStreamOfT())(this);
      }
      get sink() {
        return new (_StreamSinkWrapperOfT())(this);
      }
      get [_isCanceled]() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_CANCELED) != 0;
      }
      get hasListener() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIBED) != 0;
      }
      get [_isInitialState]() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIPTION_MASK) == async._StreamController._STATE_INITIAL;
      }
      get isClosed() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_CLOSED) != 0;
      }
      get isPaused() {
        return dart.test(this.hasListener) ? this[_subscription][_isInputPaused] : !dart.test(this[_isCanceled]);
      }
      get [_isAddingStream]() {
        return (dart.notNull(this[_state]) & async._StreamController._STATE_ADDSTREAM) != 0;
      }
      get [_mayAddEvent]() {
        return dart.notNull(this[_state]) < async._StreamController._STATE_CLOSED;
      }
      get [_pendingEvents]() {
        dart.assert(this[_isInitialState]);
        if (!dart.test(this[_isAddingStream])) {
          return _PendingEventsOfT().as(this[_varData]);
        }
        let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        return _PendingEventsOfT().as(state.varData);
      }
      [_ensurePendingEvents]() {
        dart.assert(this[_isInitialState]);
        if (!dart.test(this[_isAddingStream])) {
          if (this[_varData] == null) this[_varData] = new (_StreamImplEventsOfT())();
          return _StreamImplEventsOfT().as(this[_varData]);
        }
        let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        if (state.varData == null) state.varData = new (_StreamImplEventsOfT())();
        return _StreamImplEventsOfT().as(state.varData);
      }
      get [_subscription]() {
        dart.assert(this.hasListener);
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          return _ControllerSubscriptionOfT().as(addState.varData);
        }
        return _ControllerSubscriptionOfT().as(this[_varData]);
      }
      [_badEventState]() {
        if (dart.test(this.isClosed)) {
          return new core.StateError("Cannot add event after closing");
        }
        dart.assert(this[_isAddingStream]);
        return new core.StateError("Cannot add event while adding a stream");
      }
      addStream(source, opts) {
        StreamOfT()._check(source);
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        if (dart.test(this[_isCanceled])) return new async._Future.immediate(null);
        let addState = new (_StreamControllerAddStreamStateOfT())(this, this[_varData], source, cancelOnError);
        this[_varData] = addState;
        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_ADDSTREAM) >>> 0;
        return addState.addStreamFuture;
      }
      get done() {
        return this[_ensureDoneFuture]();
      }
      [_ensureDoneFuture]() {
        if (this[_doneFuture] == null) {
          this[_doneFuture] = dart.test(this[_isCanceled]) ? async.Future._nullFuture : new async._Future();
        }
        return this[_doneFuture];
      }
      add(value) {
        T._check(value);
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        this[_add$](value);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        error = async._nonNullError(error);
        let replacement = async.Zone.current.errorCallback(error, stackTrace);
        if (replacement != null) {
          error = async._nonNullError(replacement.error);
          stackTrace = replacement.stackTrace;
        }
        this[_addError](error, stackTrace);
      }
      close() {
        if (dart.test(this.isClosed)) {
          return this[_ensureDoneFuture]();
        }
        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
        this[_closeUnchecked]();
        return this[_ensureDoneFuture]();
      }
      [_closeUnchecked]() {
        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_CLOSED) >>> 0;
        if (dart.test(this.hasListener)) {
          this[_sendDone]();
        } else if (dart.test(this[_isInitialState])) {
          this[_ensurePendingEvents]().add(const$9 || (const$9 = dart.const(new async._DelayedDone())));
        }
      }
      [_add$](value) {
        T._check(value);
        if (dart.test(this.hasListener)) {
          this[_sendData](value);
        } else if (dart.test(this[_isInitialState])) {
          this[_ensurePendingEvents]().add(new (_DelayedDataOfT())(value));
        }
      }
      [_addError](error, stackTrace) {
        if (dart.test(this.hasListener)) {
          this[_sendError](error, stackTrace);
        } else if (dart.test(this[_isInitialState])) {
          this[_ensurePendingEvents]().add(new async._DelayedError(error, stackTrace));
        }
      }
      [_close$]() {
        dart.assert(this[_isAddingStream]);
        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
        this[_varData] = addState.varData;
        this[_state] = (dart.notNull(this[_state]) & ~async._StreamController._STATE_ADDSTREAM) >>> 0;
        addState.complete();
      }
      [_subscribe](onData, onError, onDone, cancelOnError) {
        if (!dart.test(this[_isInitialState])) {
          dart.throw(new core.StateError("Stream has already been listened to."));
        }
        let subscription = new (_ControllerSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
        let pendingEvents = this[_pendingEvents];
        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_SUBSCRIBED) >>> 0;
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          addState.varData = subscription;
          addState.resume();
        } else {
          this[_varData] = subscription;
        }
        subscription[_setPendingEvents](pendingEvents);
        subscription[_guardCallback](dart.fn(() => {
          async._runGuarded(this.onListen);
        }, VoidTodynamic$()));
        return subscription;
      }
      [_recordCancel](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        let result = null;
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          result = addState.cancel();
        }
        this[_varData] = null;
        this[_state] = (dart.notNull(this[_state]) & ~(async._StreamController._STATE_SUBSCRIBED | async._StreamController._STATE_ADDSTREAM) | async._StreamController._STATE_CANCELED) >>> 0;
        if (this.onCancel != null) {
          if (result == null) {
            try {
              result = async.Future._check(this.onCancel());
            } catch (e) {
              let s = dart.stackTrace(e);
              result = new async._Future();
              result[_asyncCompleteError](e, s);
            }

          } else {
            result = result.whenComplete(this.onCancel);
          }
        }
        const complete = (function() {
          if (this[_doneFuture] != null && dart.test(this[_doneFuture][_mayComplete])) {
            this[_doneFuture][_asyncComplete](null);
          }
        }).bind(this);
        dart.fn(complete, VoidTovoid$());
        if (result != null) {
          result = result.whenComplete(complete);
        } else {
          complete();
        }
        return result;
      }
      [_recordPause](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          addState.pause();
        }
        async._runGuarded(this.onPause);
      }
      [_recordResume](subscription) {
        StreamSubscriptionOfT()._check(subscription);
        if (dart.test(this[_isAddingStream])) {
          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
          addState.resume();
        }
        async._runGuarded(this.onResume);
      }
    }
    dart.addTypeTests(_StreamController);
    _StreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
    dart.setSignature(_StreamController, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamController$(T), [async.ControllerCallback, async.ControllerCallback, async.ControllerCallback, async.ControllerCancelCallback])}),
      fields: () => ({
        [_varData]: dart.dynamic,
        [_state]: core.int,
        [_doneFuture]: async._Future,
        onListen: async.ControllerCallback,
        onPause: async.ControllerCallback,
        onResume: async.ControllerCallback,
        onCancel: async.ControllerCancelCallback
      }),
      getters: () => ({
        stream: dart.definiteFunctionType(async.Stream$(T), []),
        sink: dart.definiteFunctionType(async.StreamSink$(T), []),
        [_isCanceled]: dart.definiteFunctionType(core.bool, []),
        hasListener: dart.definiteFunctionType(core.bool, []),
        [_isInitialState]: dart.definiteFunctionType(core.bool, []),
        isClosed: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, []),
        [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
        [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
        [_pendingEvents]: dart.definiteFunctionType(async._PendingEvents$(T), []),
        [_subscription]: dart.definiteFunctionType(async._ControllerSubscription$(T), []),
        done: dart.definiteFunctionType(async.Future, [])
      }),
      methods: () => ({
        [_ensurePendingEvents]: dart.definiteFunctionType(async._StreamImplEvents$(T), []),
        [_badEventState]: dart.definiteFunctionType(core.Error, []),
        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
        [_ensureDoneFuture]: dart.definiteFunctionType(async.Future, []),
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(async.Future, []),
        [_closeUnchecked]: dart.definiteFunctionType(dart.void, []),
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_close$]: dart.definiteFunctionType(dart.void, []),
        [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()])
      }),
      sfields: () => ({
        _STATE_INITIAL: core.int,
        _STATE_SUBSCRIBED: core.int,
        _STATE_CANCELED: core.int,
        _STATE_SUBSCRIPTION_MASK: core.int,
        _STATE_CLOSED: core.int,
        _STATE_ADDSTREAM: core.int
      })
    });
    return _StreamController;
  });
  async._StreamController = _StreamController();
  async._StreamController._STATE_INITIAL = 0;
  async._StreamController._STATE_SUBSCRIBED = 1;
  async._StreamController._STATE_CANCELED = 2;
  async._StreamController._STATE_SUBSCRIPTION_MASK = 3;
  async._StreamController._STATE_CLOSED = 4;
  async._StreamController._STATE_ADDSTREAM = 8;
  async._SyncStreamControllerDispatch$ = dart.generic(T => {
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
    class _SyncStreamControllerDispatch extends core.Object {
      [_sendData](data) {
        T._check(data);
        this[_subscription][_add$](data);
      }
      [_sendError](error, stackTrace) {
        this[_subscription][_addError](error, stackTrace);
      }
      [_sendDone]() {
        this[_subscription][_close$]();
      }
    }
    dart.addTypeTests(_SyncStreamControllerDispatch);
    _SyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT(), SynchronousStreamControllerOfT()];
    dart.setSignature(_SyncStreamControllerDispatch, {
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SyncStreamControllerDispatch;
  });
  async._SyncStreamControllerDispatch = _SyncStreamControllerDispatch();
  let const$10;
  async._AsyncStreamControllerDispatch$ = dart.generic(T => {
    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    class _AsyncStreamControllerDispatch extends core.Object {
      [_sendData](data) {
        T._check(data);
        this[_subscription][_addPending](new (_DelayedDataOfT())(data));
      }
      [_sendError](error, stackTrace) {
        this[_subscription][_addPending](new async._DelayedError(error, stackTrace));
      }
      [_sendDone]() {
        this[_subscription][_addPending](const$10 || (const$10 = dart.const(new async._DelayedDone())));
      }
    }
    dart.addTypeTests(_AsyncStreamControllerDispatch);
    _AsyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT()];
    dart.setSignature(_AsyncStreamControllerDispatch, {
      methods: () => ({
        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _AsyncStreamControllerDispatch;
  });
  async._AsyncStreamControllerDispatch = _AsyncStreamControllerDispatch();
  async._AsyncStreamController$ = dart.generic(T => {
    class _AsyncStreamController extends dart.mixin(async._StreamController$(T), async._AsyncStreamControllerDispatch$(T)) {
      new(onListen, onPause, onResume, onCancel) {
        super.new(onListen, onPause, onResume, onCancel);
      }
    }
    return _AsyncStreamController;
  });
  async._AsyncStreamController = _AsyncStreamController();
  async._SyncStreamController$ = dart.generic(T => {
    class _SyncStreamController extends dart.mixin(async._StreamController$(T), async._SyncStreamControllerDispatch$(T)) {
      new(onListen, onPause, onResume, onCancel) {
        super.new(onListen, onPause, onResume, onCancel);
      }
    }
    return _SyncStreamController;
  });
  async._SyncStreamController = _SyncStreamController();
  async._NotificationHandler = dart.typedef('_NotificationHandler', () => dart.functionType(dart.dynamic, []));
  async._runGuarded = function(notificationHandler) {
    if (notificationHandler == null) return null;
    try {
      let result = notificationHandler();
      if (async.Future.is(result)) return result;
      return null;
    } catch (e) {
      let s = dart.stackTrace(e);
      async.Zone.current.handleUncaughtError(dart.dynamic)(e, s);
    }

  };
  dart.fn(async._runGuarded, _NotificationHandlerToFuture());
  const _target = Symbol('_target');
  async._StreamSinkWrapper$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
    class _StreamSinkWrapper extends core.Object {
      new(target) {
        this[_target] = target;
      }
      add(data) {
        T._check(data);
        this[_target].add(data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_target].addError(error, stackTrace);
      }
      close() {
        return this[_target].close();
      }
      addStream(source, opts) {
        StreamOfT()._check(source);
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
        return this[_target].addStream(source, {cancelOnError: cancelOnError});
      }
      get done() {
        return this[_target].done;
      }
    }
    dart.addTypeTests(_StreamSinkWrapper);
    _StreamSinkWrapper[dart.implements] = () => [StreamSinkOfT()];
    dart.setSignature(_StreamSinkWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkWrapper$(T), [async.StreamController])}),
      fields: () => ({[_target]: async.StreamController}),
      getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(async.Future, []),
        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool})
      })
    });
    return _StreamSinkWrapper;
  });
  async._StreamSinkWrapper = _StreamSinkWrapper();
  async._AddStreamState$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    class _AddStreamState extends core.Object {
      new(controller, source, cancelOnError) {
        this.addStreamFuture = new async._Future();
        this.addSubscription = source.listen(dart.bind(controller, _add$), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close$), cancelOnError: cancelOnError});
      }
      static makeErrorHandler(controller) {
        return dart.fn((e, s) => {
          controller[_addError](e, s);
          controller[_close$]();
        }, dynamicAndStackTraceTodynamic());
      }
      pause() {
        this.addSubscription.pause();
      }
      resume() {
        this.addSubscription.resume();
      }
      cancel() {
        let cancel = this.addSubscription.cancel();
        if (cancel == null) {
          this.addStreamFuture[_asyncComplete](null);
          return null;
        }
        return cancel.whenComplete(dart.fn(() => {
          this.addStreamFuture[_asyncComplete](null);
        }, VoidTodynamic$()));
      }
      complete() {
        this.addStreamFuture[_asyncComplete](null);
      }
    }
    dart.addTypeTests(_AddStreamState);
    dart.setSignature(_AddStreamState, {
      constructors: () => ({new: dart.definiteFunctionType(async._AddStreamState$(T), [_EventSinkOfT(), async.Stream, core.bool])}),
      fields: () => ({
        addStreamFuture: async._Future,
        addSubscription: async.StreamSubscription
      }),
      methods: () => ({
        pause: dart.definiteFunctionType(dart.void, []),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        complete: dart.definiteFunctionType(dart.void, [])
      }),
      statics: () => ({makeErrorHandler: dart.definiteFunctionType(dart.dynamic, [async._EventSink])}),
      names: ['makeErrorHandler']
    });
    return _AddStreamState;
  });
  async._AddStreamState = _AddStreamState();
  async._StreamControllerAddStreamState$ = dart.generic(T => {
    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
    class _StreamControllerAddStreamState extends async._AddStreamState$(T) {
      new(controller, varData, source, cancelOnError) {
        this.varData = varData;
        super.new(controller, source, cancelOnError);
        if (dart.test(controller.isPaused)) {
          this.addSubscription.pause();
        }
      }
    }
    dart.setSignature(_StreamControllerAddStreamState, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamControllerAddStreamState$(T), [_StreamControllerOfT(), dart.dynamic, async.Stream, core.bool])}),
      fields: () => ({varData: dart.dynamic})
    });
    return _StreamControllerAddStreamState;
  });
  async._StreamControllerAddStreamState = _StreamControllerAddStreamState();
  async._EventSink$ = dart.generic(T => {
    class _EventSink extends core.Object {}
    dart.addTypeTests(_EventSink);
    return _EventSink;
  });
  async._EventSink = _EventSink();
  async._EventDispatch$ = dart.generic(T => {
    class _EventDispatch extends core.Object {}
    dart.addTypeTests(_EventDispatch);
    return _EventDispatch;
  });
  async._EventDispatch = _EventDispatch();
  async._EventGenerator$ = dart.generic(T => {
    const _EventGenerator = dart.typedef('_EventGenerator', () => dart.functionType(async._PendingEvents$(T), []));
    return _EventGenerator;
  });
  async._EventGenerator = _EventGenerator();
  const _isUsed = Symbol('_isUsed');
  async._GeneratedStreamImpl$ = dart.generic(T => {
    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _EventGeneratorOfT = () => (_EventGeneratorOfT = dart.constFn(async._EventGenerator$(T)))();
    class _GeneratedStreamImpl extends async._StreamImpl$(T) {
      new(pending) {
        this[_pending] = pending;
        this[_isUsed] = false;
        super.new();
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        if (dart.test(this[_isUsed])) dart.throw(new core.StateError("Stream has already been listened to."));
        this[_isUsed] = true;
        let _ = new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
        _[_setPendingEvents](this[_pending]());
        return _;
      }
    }
    dart.setSignature(_GeneratedStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(async._GeneratedStreamImpl$(T), [_EventGeneratorOfT()])}),
      fields: () => ({
        [_pending]: _EventGeneratorOfT(),
        [_isUsed]: core.bool
      }),
      methods: () => ({[_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool])})
    });
    return _GeneratedStreamImpl;
  });
  async._GeneratedStreamImpl = _GeneratedStreamImpl();
  const _iterator$ = Symbol('_iterator');
  const _eventScheduled = Symbol('_eventScheduled');
  async._PendingEvents$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _PendingEvents extends core.Object {
      new() {
        this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
      }
      get isScheduled() {
        return this[_state] == async._PendingEvents._STATE_SCHEDULED;
      }
      get [_eventScheduled]() {
        return dart.notNull(this[_state]) >= async._PendingEvents._STATE_SCHEDULED;
      }
      schedule(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        if (dart.test(this.isScheduled)) return;
        dart.assert(!dart.test(this.isEmpty));
        if (dart.test(this[_eventScheduled])) {
          dart.assert(this[_state] == async._PendingEvents._STATE_CANCELED);
          this[_state] = async._PendingEvents._STATE_SCHEDULED;
          return;
        }
        async.scheduleMicrotask(dart.fn(() => {
          let oldState = this[_state];
          this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
          if (oldState == async._PendingEvents._STATE_CANCELED) return;
          this.handleNext(dispatch);
        }, VoidTovoid$()));
        this[_state] = async._PendingEvents._STATE_SCHEDULED;
      }
      cancelSchedule() {
        if (dart.test(this.isScheduled)) this[_state] = async._PendingEvents._STATE_CANCELED;
      }
    }
    dart.addTypeTests(_PendingEvents);
    dart.setSignature(_PendingEvents, {
      fields: () => ({[_state]: core.int}),
      getters: () => ({
        isScheduled: dart.definiteFunctionType(core.bool, []),
        [_eventScheduled]: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        schedule: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
        cancelSchedule: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_UNSCHEDULED: core.int,
        _STATE_SCHEDULED: core.int,
        _STATE_CANCELED: core.int
      })
    });
    return _PendingEvents;
  });
  async._PendingEvents = _PendingEvents();
  async._PendingEvents._STATE_UNSCHEDULED = 0;
  async._PendingEvents._STATE_SCHEDULED = 1;
  async._PendingEvents._STATE_CANCELED = 3;
  async._IterablePendingEvents$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class _IterablePendingEvents extends async._PendingEvents$(T) {
      new(data) {
        this[_iterator$] = data[dartx.iterator];
        super.new();
      }
      get isEmpty() {
        return this[_iterator$] == null;
      }
      handleNext(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        if (this[_iterator$] == null) {
          dart.throw(new core.StateError("No events pending."));
        }
        let isDone = null;
        try {
          isDone = !dart.test(this[_iterator$].moveNext());
        } catch (e) {
          let s = dart.stackTrace(e);
          this[_iterator$] = null;
          dispatch[_sendError](e, s);
          return;
        }

        if (!dart.test(isDone)) {
          dispatch[_sendData](this[_iterator$].current);
        } else {
          this[_iterator$] = null;
          dispatch[_sendDone]();
        }
      }
      clear() {
        if (dart.test(this.isScheduled)) this.cancelSchedule();
        this[_iterator$] = null;
      }
    }
    dart.setSignature(_IterablePendingEvents, {
      constructors: () => ({new: dart.definiteFunctionType(async._IterablePendingEvents$(T), [IterableOfT()])}),
      fields: () => ({[_iterator$]: IteratorOfT()}),
      getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
        clear: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _IterablePendingEvents;
  });
  async._IterablePendingEvents = _IterablePendingEvents();
  async._DataHandler$ = dart.generic(T => {
    const _DataHandler = dart.typedef('_DataHandler', () => dart.functionType(dart.void, [T]));
    return _DataHandler;
  });
  async._DataHandler = _DataHandler();
  async._DoneHandler = dart.typedef('_DoneHandler', () => dart.functionType(dart.void, []));
  async._nullDataHandler = function(value) {
  };
  dart.fn(async._nullDataHandler, dynamicTovoid$());
  async._nullErrorHandler = function(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    async.Zone.current.handleUncaughtError(dart.dynamic)(error, stackTrace);
  };
  dart.lazyFn(async._nullErrorHandler, () => dynamic__Tovoid());
  async._nullDoneHandler = function() {
  };
  dart.fn(async._nullDoneHandler, VoidTovoid$());
  async._DelayedEvent$ = dart.generic(T => {
    class _DelayedEvent extends core.Object {
      new() {
        this.next = null;
      }
    }
    dart.addTypeTests(_DelayedEvent);
    dart.setSignature(_DelayedEvent, {
      fields: () => ({next: async._DelayedEvent})
    });
    return _DelayedEvent;
  });
  async._DelayedEvent = _DelayedEvent();
  async._DelayedData$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _DelayedData extends async._DelayedEvent$(T) {
      new(value) {
        this.value = value;
        super.new();
      }
      perform(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        dispatch[_sendData](this.value);
      }
    }
    dart.setSignature(_DelayedData, {
      constructors: () => ({new: dart.definiteFunctionType(async._DelayedData$(T), [T])}),
      fields: () => ({value: T}),
      methods: () => ({perform: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()])})
    });
    return _DelayedData;
  });
  async._DelayedData = _DelayedData();
  async._DelayedError = class _DelayedError extends async._DelayedEvent {
    new(error, stackTrace) {
      this.error = error;
      this.stackTrace = stackTrace;
      super.new();
    }
    perform(dispatch) {
      dispatch[_sendError](this.error, this.stackTrace);
    }
  };
  dart.addSimpleTypeTests(async._DelayedError);
  dart.setSignature(async._DelayedError, {
    constructors: () => ({new: dart.definiteFunctionType(async._DelayedError, [dart.dynamic, core.StackTrace])}),
    fields: () => ({
      error: dart.dynamic,
      stackTrace: core.StackTrace
    }),
    methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
  });
  async._DelayedDone = class _DelayedDone extends core.Object {
    new() {
    }
    perform(dispatch) {
      dispatch[_sendDone]();
    }
    get next() {
      return null;
    }
    set next(_) {
      dart.throw(new core.StateError("No events after a done."));
    }
  };
  async._DelayedDone[dart.implements] = () => [async._DelayedEvent];
  dart.setSignature(async._DelayedDone, {
    constructors: () => ({new: dart.definiteFunctionType(async._DelayedDone, [])}),
    getters: () => ({next: dart.definiteFunctionType(async._DelayedEvent, [])}),
    setters: () => ({next: dart.definiteFunctionType(dart.void, [async._DelayedEvent])}),
    methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
  });
  async._StreamImplEvents$ = dart.generic(T => {
    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
    class _StreamImplEvents extends async._PendingEvents$(T) {
      new() {
        this.firstPendingEvent = null;
        this.lastPendingEvent = null;
        super.new();
      }
      get isEmpty() {
        return this.lastPendingEvent == null;
      }
      add(event) {
        if (this.lastPendingEvent == null) {
          this.firstPendingEvent = this.lastPendingEvent = event;
        } else {
          this.lastPendingEvent = this.lastPendingEvent.next = event;
        }
      }
      handleNext(dispatch) {
        _EventDispatchOfT()._check(dispatch);
        dart.assert(!dart.test(this.isScheduled));
        let event = this.firstPendingEvent;
        this.firstPendingEvent = event.next;
        if (this.firstPendingEvent == null) {
          this.lastPendingEvent = null;
        }
        event.perform(dispatch);
      }
      clear() {
        if (dart.test(this.isScheduled)) this.cancelSchedule();
        this.firstPendingEvent = this.lastPendingEvent = null;
      }
    }
    dart.setSignature(_StreamImplEvents, {
      fields: () => ({
        firstPendingEvent: async._DelayedEvent,
        lastPendingEvent: async._DelayedEvent
      }),
      getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
        handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
        clear: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _StreamImplEvents;
  });
  async._StreamImplEvents = _StreamImplEvents();
  const _unlink = Symbol('_unlink');
  const _insertBefore = Symbol('_insertBefore');
  async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
    new() {
      this[_next$] = null;
      this[_previous$] = null;
    }
    [_unlink]() {
      this[_previous$][_next$] = this[_next$];
      this[_next$][_previous$] = this[_previous$];
      this[_next$] = this[_previous$] = this;
    }
    [_insertBefore](newNext) {
      let newPrevious = newNext[_previous$];
      newPrevious[_next$] = this;
      newNext[_previous$] = this[_previous$];
      this[_previous$][_next$] = newNext;
      this[_previous$] = newPrevious;
    }
  };
  dart.setSignature(async._BroadcastLinkedList, {
    fields: () => ({
      [_next$]: async._BroadcastLinkedList,
      [_previous$]: async._BroadcastLinkedList
    }),
    methods: () => ({
      [_unlink]: dart.definiteFunctionType(dart.void, []),
      [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
    })
  });
  async._BroadcastCallback$ = dart.generic(T => {
    const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
    return _BroadcastCallback;
  });
  async._BroadcastCallback = _BroadcastCallback();
  const _schedule = Symbol('_schedule');
  const _isSent = Symbol('_isSent');
  const _isScheduled = Symbol('_isScheduled');
  async._DoneStreamSubscription$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _DoneStreamSubscription extends core.Object {
      new(onDone) {
        this[_onDone] = onDone;
        this[_zone] = async.Zone.current;
        this[_state] = 0;
        this[_schedule]();
      }
      get [_isSent]() {
        return (dart.notNull(this[_state]) & async._DoneStreamSubscription._DONE_SENT) != 0;
      }
      get [_isScheduled]() {
        return (dart.notNull(this[_state]) & async._DoneStreamSubscription._SCHEDULED) != 0;
      }
      get isPaused() {
        return dart.notNull(this[_state]) >= async._DoneStreamSubscription._PAUSED;
      }
      [_schedule]() {
        if (dart.test(this[_isScheduled])) return;
        this[_zone].scheduleMicrotask(dart.bind(this, _sendDone));
        this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._SCHEDULED) >>> 0;
      }
      onData(handleData) {}
      onError(handleError) {}
      onDone(handleDone) {
        this[_onDone] = handleDone;
      }
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        this[_state] = dart.notNull(this[_state]) + async._DoneStreamSubscription._PAUSED;
        if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
      resume() {
        if (dart.test(this.isPaused)) {
          this[_state] = dart.notNull(this[_state]) - async._DoneStreamSubscription._PAUSED;
          if (!dart.test(this.isPaused) && !dart.test(this[_isSent])) {
            this[_schedule]();
          }
        }
      }
      cancel() {
        return null;
      }
      asFuture(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          let result = new (async._Future$(E))();
          this[_onDone] = dart.fn(() => {
            result[_completeWithValue](null);
          }, VoidTovoid$());
          return result;
        };
      }
      [_sendDone]() {
        this[_state] = (dart.notNull(this[_state]) & ~async._DoneStreamSubscription._SCHEDULED) >>> 0;
        if (dart.test(this.isPaused)) return;
        this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._DONE_SENT) >>> 0;
        if (this[_onDone] != null) this[_zone].runGuarded(dart.dynamic)(this[_onDone]);
      }
    }
    dart.addTypeTests(_DoneStreamSubscription);
    _DoneStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
    dart.setSignature(_DoneStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._DoneStreamSubscription$(T), [async._DoneHandler])}),
      fields: () => ({
        [_zone]: async.Zone,
        [_state]: core.int,
        [_onDone]: async._DoneHandler
      }),
      getters: () => ({
        [_isSent]: dart.definiteFunctionType(core.bool, []),
        [_isScheduled]: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        [_schedule]: dart.definiteFunctionType(dart.void, []),
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
        [_sendDone]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _DONE_SENT: core.int,
        _SCHEDULED: core.int,
        _PAUSED: core.int
      })
    });
    return _DoneStreamSubscription;
  });
  async._DoneStreamSubscription = _DoneStreamSubscription();
  async._DoneStreamSubscription._DONE_SENT = 1;
  async._DoneStreamSubscription._SCHEDULED = 2;
  async._DoneStreamSubscription._PAUSED = 4;
  const _source$ = Symbol('_source');
  const _onListenHandler = Symbol('_onListenHandler');
  const _onCancelHandler = Symbol('_onCancelHandler');
  const _cancelSubscription = Symbol('_cancelSubscription');
  const _pauseSubscription = Symbol('_pauseSubscription');
  const _resumeSubscription = Symbol('_resumeSubscription');
  const _isSubscriptionPaused = Symbol('_isSubscriptionPaused');
  async._AsBroadcastStream$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let _AsBroadcastStreamControllerOfT = () => (_AsBroadcastStreamControllerOfT = dart.constFn(async._AsBroadcastStreamController$(T)))();
    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
    let _BroadcastSubscriptionWrapperOfT = () => (_BroadcastSubscriptionWrapperOfT = dart.constFn(async._BroadcastSubscriptionWrapper$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let _BroadcastCallbackOfT = () => (_BroadcastCallbackOfT = dart.constFn(async._BroadcastCallback$(T)))();
    class _AsBroadcastStream extends async.Stream$(T) {
      new(source, onListenHandler, onCancelHandler) {
        this[_source$] = source;
        this[_onListenHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onListenHandler);
        this[_onCancelHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onCancelHandler);
        this[_zone] = async.Zone.current;
        this[_controller$] = null;
        this[_subscription] = null;
        super.new();
        this[_controller$] = new (_AsBroadcastStreamControllerOfT())(dart.bind(this, _onListen), dart.bind(this, _onCancel));
      }
      get isBroadcast() {
        return true;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        if (this[_controller$] == null || dart.test(this[_controller$].isClosed)) {
          return new (_DoneStreamSubscriptionOfT())(onDone);
        }
        if (this[_subscription] == null) {
          this[_subscription] = this[_source$].listen(dart.bind(this[_controller$], 'add'), {onError: dart.bind(this[_controller$], 'addError'), onDone: dart.bind(this[_controller$], 'close')});
        }
        cancelOnError = core.identical(true, cancelOnError);
        return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
      }
      [_onCancel]() {
        let shutdown = this[_controller$] == null || dart.test(this[_controller$].isClosed);
        if (this[_onCancelHandler] != null) {
          this[_zone].runUnary(dart.dynamic, _BroadcastSubscriptionWrapperOfT())(this[_onCancelHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
        }
        if (shutdown) {
          if (this[_subscription] != null) {
            this[_subscription].cancel();
            this[_subscription] = null;
          }
        }
      }
      [_onListen]() {
        if (this[_onListenHandler] != null) {
          this[_zone].runUnary(dart.dynamic, _BroadcastSubscriptionWrapperOfT())(this[_onListenHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
        }
      }
      [_cancelSubscription]() {
        if (this[_subscription] == null) return;
        let subscription = this[_subscription];
        this[_subscription] = null;
        this[_controller$] = null;
        subscription.cancel();
      }
      [_pauseSubscription](resumeSignal) {
        if (this[_subscription] == null) return;
        this[_subscription].pause(resumeSignal);
      }
      [_resumeSubscription]() {
        if (this[_subscription] == null) return;
        this[_subscription].resume();
      }
      get [_isSubscriptionPaused]() {
        if (this[_subscription] == null) return false;
        return this[_subscription].isPaused;
      }
    }
    dart.setSignature(_AsBroadcastStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStream$(T), [StreamOfT(), _BroadcastCallbackOfT(), _BroadcastCallbackOfT()])}),
      fields: () => ({
        [_source$]: StreamOfT(),
        [_onListenHandler]: _BroadcastCallbackOfT(),
        [_onCancelHandler]: _BroadcastCallbackOfT(),
        [_zone]: async.Zone,
        [_controller$]: _AsBroadcastStreamControllerOfT(),
        [_subscription]: StreamSubscriptionOfT()
      }),
      getters: () => ({[_isSubscriptionPaused]: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        [_onCancel]: dart.definiteFunctionType(dart.void, []),
        [_onListen]: dart.definiteFunctionType(dart.void, []),
        [_cancelSubscription]: dart.definiteFunctionType(dart.void, []),
        [_pauseSubscription]: dart.definiteFunctionType(dart.void, [async.Future]),
        [_resumeSubscription]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _AsBroadcastStream;
  });
  async._AsBroadcastStream = _AsBroadcastStream();
  async._BroadcastSubscriptionWrapper$ = dart.generic(T => {
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BroadcastSubscriptionWrapper extends core.Object {
      new(stream) {
        this[_stream] = stream;
      }
      onData(handleData) {
        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
      }
      onError(handleError) {
        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
      }
      onDone(handleDone) {
        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
      }
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        this[_stream][_pauseSubscription](resumeSignal);
      }
      resume() {
        this[_stream][_resumeSubscription]();
      }
      cancel() {
        this[_stream][_cancelSubscription]();
        return null;
      }
      get isPaused() {
        return this[_stream][_isSubscriptionPaused];
      }
      asFuture(E) {
        return futureValue => {
          if (futureValue === void 0) futureValue = null;
          dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
        };
      }
    }
    dart.addTypeTests(_BroadcastSubscriptionWrapper);
    _BroadcastSubscriptionWrapper[dart.implements] = () => [StreamSubscriptionOfT()];
    dart.setSignature(_BroadcastSubscriptionWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscriptionWrapper$(T), [async._AsBroadcastStream])}),
      fields: () => ({[_stream]: async._AsBroadcastStream}),
      getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
      })
    });
    return _BroadcastSubscriptionWrapper;
  });
  async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
  const _current$1 = Symbol('_current');
  const _futureOrPrefetch = Symbol('_futureOrPrefetch');
  const _clear = Symbol('_clear');
  async._StreamIteratorImpl$ = dart.generic(T => {
    let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _StreamIteratorImpl extends core.Object {
      new(stream) {
        this[_subscription] = null;
        this[_current$1] = null;
        this[_futureOrPrefetch] = null;
        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
        this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
      }
      get current() {
        return this[_current$1];
      }
      moveNext() {
        if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
          return new (_FutureOfbool()).immediate(false);
        }
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          dart.throw(new core.StateError("Already waiting for next."));
        }
        if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
          this[_state] = async._StreamIteratorImpl._STATE_MOVING;
          this[_current$1] = null;
          let result = new (_FutureOfbool())();
          this[_futureOrPrefetch] = result;
          return result;
        } else {
          dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
          switch (this[_state]) {
            case async._StreamIteratorImpl._STATE_EXTRA_DATA:
            {
              this[_state] = async._StreamIteratorImpl._STATE_FOUND;
              this[_current$1] = T.as(this[_futureOrPrefetch]);
              this[_futureOrPrefetch] = null;
              this[_subscription].resume();
              return new (_FutureOfbool()).immediate(true);
            }
            case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
            {
              let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
              this[_clear]();
              return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
            }
            case async._StreamIteratorImpl._STATE_EXTRA_DONE:
            {
              this[_clear]();
              return new (_FutureOfbool()).immediate(false);
            }
          }
        }
      }
      [_clear]() {
        this[_subscription] = null;
        this[_futureOrPrefetch] = null;
        this[_current$1] = null;
        this[_state] = async._StreamIteratorImpl._STATE_DONE;
      }
      cancel() {
        let subscription = this[_subscription];
        if (subscription == null) return null;
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_clear]();
          hasNext[_complete](false);
        } else {
          this[_clear]();
        }
        return subscription.cancel();
      }
      [_onData](data) {
        T._check(data);
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          this[_current$1] = data;
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_futureOrPrefetch] = null;
          this[_state] = async._StreamIteratorImpl._STATE_FOUND;
          hasNext[_complete](true);
          return;
        }
        this[_subscription].pause();
        dart.assert(this[_futureOrPrefetch] == null);
        this[_futureOrPrefetch] = data;
        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
      }
      [_onError](error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_clear]();
          hasNext[_completeError](error, stackTrace);
          return;
        }
        this[_subscription].pause();
        dart.assert(this[_futureOrPrefetch] == null);
        this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
      }
      [_onDone]() {
        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
          this[_clear]();
          hasNext[_complete](false);
          return;
        }
        this[_subscription].pause();
        this[_futureOrPrefetch] = null;
        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
      }
    }
    dart.addTypeTests(_StreamIteratorImpl);
    _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
    dart.setSignature(_StreamIteratorImpl, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamIteratorImpl$(T), [StreamOfT()])}),
      fields: () => ({
        [_subscription]: async.StreamSubscription,
        [_current$1]: T,
        [_futureOrPrefetch]: dart.dynamic,
        [_state]: core.int
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({
        moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
        [_clear]: dart.definiteFunctionType(dart.void, []),
        cancel: dart.definiteFunctionType(async.Future, []),
        [_onData]: dart.definiteFunctionType(dart.void, [T]),
        [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        [_onDone]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _STATE_FOUND: core.int,
        _STATE_DONE: core.int,
        _STATE_MOVING: core.int,
        _STATE_EXTRA_DATA: core.int,
        _STATE_EXTRA_ERROR: core.int,
        _STATE_EXTRA_DONE: core.int
      })
    });
    return _StreamIteratorImpl;
  });
  async._StreamIteratorImpl = _StreamIteratorImpl();
  async._StreamIteratorImpl._STATE_FOUND = 0;
  async._StreamIteratorImpl._STATE_DONE = 1;
  async._StreamIteratorImpl._STATE_MOVING = 2;
  async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
  async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
  async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
  async._EmptyStream$ = dart.generic(T => {
    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _EmptyStream extends async.Stream$(T) {
      new() {
        super._internal();
      }
      get isBroadcast() {
        return true;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return new (_DoneStreamSubscriptionOfT())(onDone);
      }
    }
    dart.setSignature(_EmptyStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._EmptyStream$(T), [])}),
      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
    });
    return _EmptyStream;
  });
  async._EmptyStream = _EmptyStream();
  async._runUserCode = function(userCode, onSuccess, onError) {
    try {
      dart.dcall(onSuccess, userCode());
    } catch (e) {
      let s = dart.stackTrace(e);
      let replacement = async.Zone.current.errorCallback(e, s);
      if (replacement == null) {
        dart.dcall(onError, e, s);
      } else {
        let error = async._nonNullError(replacement.error);
        let stackTrace = replacement.stackTrace;
        dart.dcall(onError, error, stackTrace);
      }
    }

  };
  dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
  async._cancelAndError = function(subscription, future, error, stackTrace) {
    let cancelFuture = subscription.cancel();
    if (async.Future.is(cancelFuture)) {
      cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
    } else {
      future[_completeError](error, stackTrace);
    }
  };
  dart.lazyFn(async._cancelAndError, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
  async._cancelAndErrorWithReplacement = function(subscription, future, error, stackTrace) {
    let replacement = async.Zone.current.errorCallback(error, stackTrace);
    if (replacement != null) {
      error = async._nonNullError(replacement.error);
      stackTrace = replacement.stackTrace;
    }
    async._cancelAndError(subscription, future, error, stackTrace);
  };
  dart.lazyFn(async._cancelAndErrorWithReplacement, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
  async._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [dart.dynamic, core.StackTrace]));
  async._cancelAndErrorClosure = function(subscription, future) {
    return dart.fn((error, stackTrace) => {
      async._cancelAndError(subscription, future, error, stackTrace);
    }, dynamicAndStackTraceTovoid());
  };
  dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
  async._cancelAndValue = function(subscription, future, value) {
    let cancelFuture = subscription.cancel();
    if (async.Future.is(cancelFuture)) {
      cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
    } else {
      future[_complete](value);
    }
  };
  dart.fn(async._cancelAndValue, StreamSubscriptionAnd_FutureAnddynamicTovoid());
  const _handleData = Symbol('_handleData');
  const _handleError = Symbol('_handleError');
  const _handleDone = Symbol('_handleDone');
  async._ForwardingStream$ = dart.generic((S, T) => {
    let _ForwardingStreamSubscriptionOfS$T = () => (_ForwardingStreamSubscriptionOfS$T = dart.constFn(async._ForwardingStreamSubscription$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _ForwardingStream extends async.Stream$(T) {
      new(source) {
        this[_source$] = source;
        super.new();
      }
      get isBroadcast() {
        return this[_source$].isBroadcast;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        return this[_createSubscription](onData, onError, onDone, cancelOnError);
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_ForwardingStreamSubscriptionOfS$T())(this, onData, onError, onDone, cancelOnError);
      }
      [_handleData](data, sink) {
        S._check(data);
        _EventSinkOfT()._check(sink);
        sink[_add$](T.as(data));
      }
      [_handleError](error, stackTrace, sink) {
        _EventSinkOfT()._check(sink);
        sink[_addError](error, stackTrace);
      }
      [_handleDone](sink) {
        _EventSinkOfT()._check(sink);
        sink[_close$]();
      }
    }
    dart.setSignature(_ForwardingStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStream$(S, T), [StreamOfS()])}),
      fields: () => ({[_source$]: StreamOfS()}),
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()]),
        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, _EventSinkOfT()]),
        [_handleDone]: dart.definiteFunctionType(dart.void, [_EventSinkOfT()])
      })
    });
    return _ForwardingStream;
  });
  async._ForwardingStream = _ForwardingStream();
  async._ForwardingStreamSubscription$ = dart.generic((S, T) => {
    let _ForwardingStreamOfS$T = () => (_ForwardingStreamOfS$T = dart.constFn(async._ForwardingStream$(S, T)))();
    let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _ForwardingStreamSubscription extends async._BufferingStreamSubscription$(T) {
      new(stream, onData, onError, onDone, cancelOnError) {
        this[_stream] = stream;
        this[_subscription] = null;
        super.new(onData, onError, onDone, cancelOnError);
        this[_subscription] = this[_stream][_source$].listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
      }
      [_add$](data) {
        T._check(data);
        if (dart.test(this[_isClosed$])) return;
        super[_add$](data);
      }
      [_addError](error, stackTrace) {
        if (dart.test(this[_isClosed$])) return;
        super[_addError](error, stackTrace);
      }
      [_onPause]() {
        if (this[_subscription] == null) return;
        this[_subscription].pause();
      }
      [_onResume]() {
        if (this[_subscription] == null) return;
        this[_subscription].resume();
      }
      [_onCancel]() {
        if (this[_subscription] != null) {
          let subscription = this[_subscription];
          this[_subscription] = null;
          return subscription.cancel();
        }
        return null;
      }
      [_handleData](data) {
        S._check(data);
        this[_stream][_handleData](data, this);
      }
      [_handleError](error, stackTrace) {
        this[_stream][_handleError](error, stackTrace, this);
      }
      [_handleDone]() {
        this[_stream][_handleDone](this);
      }
    }
    dart.setSignature(_ForwardingStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStreamSubscription$(S, T), [_ForwardingStreamOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_stream]: _ForwardingStreamOfS$T(),
        [_subscription]: StreamSubscriptionOfS()
      }),
      methods: () => ({
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_handleData]: dart.definiteFunctionType(dart.void, [S]),
        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
        [_handleDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _ForwardingStreamSubscription;
  });
  async._ForwardingStreamSubscription = _ForwardingStreamSubscription();
  async._Predicate$ = dart.generic(T => {
    const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
    return _Predicate;
  });
  async._Predicate = _Predicate();
  async._addErrorWithReplacement = function(sink, error, stackTrace) {
    let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
    if (replacement != null) {
      error = async._nonNullError(replacement.error);
      stackTrace = replacement.stackTrace;
    }
    sink[_addError](error, core.StackTrace._check(stackTrace));
  };
  dart.fn(async._addErrorWithReplacement, _EventSinkAnddynamicAnddynamicTovoid());
  const _test = Symbol('_test');
  async._WhereStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _WhereStream extends async._ForwardingStream$(T, T) {
      new(source, test) {
        this[_test] = test;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let satisfies = null;
        try {
          satisfies = this[_test](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          return;
        }

        if (dart.test(satisfies)) {
          sink[_add$](inputEvent);
        }
      }
    }
    dart.setSignature(_WhereStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._WhereStream$(T), [StreamOfT(), _PredicateOfT()])}),
      fields: () => ({[_test]: _PredicateOfT()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])})
    });
    return _WhereStream;
  });
  async._WhereStream = _WhereStream();
  async._Transformation$ = dart.generic((S, T) => {
    const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
    return _Transformation;
  });
  async._Transformation = _Transformation$();
  const _transform = Symbol('_transform');
  async._MapStream$ = dart.generic((S, T) => {
    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(async._Transformation$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    class _MapStream extends async._ForwardingStream$(S, T) {
      new(source, transform) {
        this[_transform] = transform;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        S._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let outputEvent = null;
        try {
          outputEvent = this[_transform](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          return;
        }

        sink[_add$](outputEvent);
      }
    }
    dart.setSignature(_MapStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._MapStream$(S, T), [StreamOfS(), _TransformationOfS$T()])}),
      fields: () => ({[_transform]: _TransformationOfS$T()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()])})
    });
    return _MapStream;
  });
  async._MapStream = _MapStream();
  const _expand = Symbol('_expand');
  async._ExpandStream$ = dart.generic((S, T) => {
    let _TransformationOfS$IterableOfT = () => (_TransformationOfS$IterableOfT = dart.constFn(async._Transformation$(S, IterableOfT())))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
    class _ExpandStream extends async._ForwardingStream$(S, T) {
      new(source, expand) {
        this[_expand] = expand;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        S._check(inputEvent);
        _EventSinkOfT()._check(sink);
        try {
          for (let value of this[_expand](inputEvent)) {
            sink[_add$](value);
          }
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
        }

      }
    }
    dart.setSignature(_ExpandStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._ExpandStream$(S, T), [StreamOfS(), _TransformationOfS$IterableOfT()])}),
      fields: () => ({[_expand]: _TransformationOfS$IterableOfT()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()])})
    });
    return _ExpandStream;
  });
  async._ExpandStream = _ExpandStream();
  async._ErrorTest = dart.typedef('_ErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
  async._HandleErrorStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _HandleErrorStream extends async._ForwardingStream$(T, T) {
      new(source, onError, test) {
        this[_transform] = onError;
        this[_test] = test;
        super.new(source);
      }
      [_handleError](error, stackTrace, sink) {
        _EventSinkOfT()._check(sink);
        let matches = true;
        if (this[_test] != null) {
          try {
            matches = dart.dcall(this[_test], error);
          } catch (e) {
            let s = dart.stackTrace(e);
            async._addErrorWithReplacement(sink, e, s);
            return;
          }

        }
        if (dart.test(matches)) {
          try {
            async._invokeErrorHandler(this[_transform], error, stackTrace);
          } catch (e) {
            let s = dart.stackTrace(e);
            if (core.identical(e, error)) {
              sink[_addError](error, stackTrace);
            } else {
              async._addErrorWithReplacement(sink, e, s);
            }
            return;
          }

        } else {
          sink[_addError](error, stackTrace);
        }
      }
    }
    dart.setSignature(_HandleErrorStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._HandleErrorStream$(T), [StreamOfT(), core.Function, dynamicTobool()])}),
      fields: () => ({
        [_transform]: core.Function,
        [_test]: async._ErrorTest
      }),
      methods: () => ({[_handleError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace, _EventSinkOfT()])})
    });
    return _HandleErrorStream;
  });
  async._HandleErrorStream = _HandleErrorStream();
  const _count = Symbol('_count');
  async._TakeStream$ = dart.generic(T => {
    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _TakeStream extends async._ForwardingStream$(T, T) {
      new(source, count) {
        this[_count] = count;
        super.new(source);
        if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let subscription = _StateStreamSubscriptionOfT()._check(sink);
        let count = subscription[_count];
        if (dart.notNull(count) > 0) {
          sink[_add$](inputEvent);
          count = dart.notNull(count) - 1;
          subscription[_count] = count;
          if (count == 0) {
            sink[_close$]();
          }
        }
      }
    }
    dart.setSignature(_TakeStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._TakeStream$(T), [StreamOfT(), core.int])}),
      fields: () => ({[_count]: core.int}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])
      })
    });
    return _TakeStream;
  });
  async._TakeStream = _TakeStream();
  const _sharedState = Symbol('_sharedState');
  const _flag = Symbol('_flag');
  async._StateStreamSubscription$ = dart.generic(T => {
    let _ForwardingStreamOfT$T = () => (_ForwardingStreamOfT$T = dart.constFn(async._ForwardingStream$(T, T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _StateStreamSubscription extends async._ForwardingStreamSubscription$(T, T) {
      new(stream, onData, onError, onDone, cancelOnError, sharedState) {
        this[_sharedState] = sharedState;
        super.new(stream, onData, onError, onDone, cancelOnError);
      }
      get [_flag]() {
        return core.bool._check(this[_sharedState]);
      }
      set [_flag](flag) {
        this[_sharedState] = flag;
      }
      get [_count]() {
        return core.int._check(this[_sharedState]);
      }
      set [_count](count) {
        this[_sharedState] = count;
      }
    }
    dart.setSignature(_StateStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._StateStreamSubscription$(T), [_ForwardingStreamOfT$T(), TTovoid(), core.Function, VoidTovoid(), core.bool, dart.dynamic])}),
      fields: () => ({[_sharedState]: dart.dynamic}),
      getters: () => ({
        [_flag]: dart.definiteFunctionType(core.bool, []),
        [_count]: dart.definiteFunctionType(core.int, [])
      }),
      setters: () => ({
        [_flag]: dart.definiteFunctionType(dart.void, [core.bool]),
        [_count]: dart.definiteFunctionType(dart.void, [core.int])
      })
    });
    return _StateStreamSubscription;
  });
  async._StateStreamSubscription = _StateStreamSubscription();
  async._TakeWhileStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _TakeWhileStream extends async._ForwardingStream$(T, T) {
      new(source, test) {
        this[_test] = test;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let satisfies = null;
        try {
          satisfies = this[_test](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          sink[_close$]();
          return;
        }

        if (dart.test(satisfies)) {
          sink[_add$](inputEvent);
        } else {
          sink[_close$]();
        }
      }
    }
    dart.setSignature(_TakeWhileStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._TakeWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
      fields: () => ({[_test]: _PredicateOfT()}),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])})
    });
    return _TakeWhileStream;
  });
  async._TakeWhileStream = _TakeWhileStream();
  async._SkipStream$ = dart.generic(T => {
    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _SkipStream extends async._ForwardingStream$(T, T) {
      new(source, count) {
        this[_count] = count;
        super.new(source);
        if (!(typeof count == 'number') || dart.notNull(count) < 0) dart.throw(new core.ArgumentError(count));
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let subscription = _StateStreamSubscriptionOfT()._check(sink);
        let count = subscription[_count];
        if (dart.notNull(count) > 0) {
          subscription[_count] = dart.notNull(count) - 1;
          return;
        }
        sink[_add$](inputEvent);
      }
    }
    dart.setSignature(_SkipStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._SkipStream$(T), [StreamOfT(), core.int])}),
      fields: () => ({[_count]: core.int}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])
      })
    });
    return _SkipStream;
  });
  async._SkipStream = _SkipStream();
  async._SkipWhileStream$ = dart.generic(T => {
    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _SkipWhileStream extends async._ForwardingStream$(T, T) {
      new(source, test) {
        this[_test] = test;
        super.new(source);
      }
      [_createSubscription](onData, onError, onDone, cancelOnError) {
        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, false);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        let subscription = _StateStreamSubscriptionOfT()._check(sink);
        let hasFailed = subscription[_flag];
        if (dart.test(hasFailed)) {
          sink[_add$](inputEvent);
          return;
        }
        let satisfies = null;
        try {
          satisfies = this[_test](inputEvent);
        } catch (e) {
          let s = dart.stackTrace(e);
          async._addErrorWithReplacement(sink, e, s);
          subscription[_flag] = true;
          return;
        }

        if (!dart.test(satisfies)) {
          subscription[_flag] = true;
          sink[_add$](inputEvent);
        }
      }
    }
    dart.setSignature(_SkipWhileStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._SkipWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
      fields: () => ({[_test]: _PredicateOfT()}),
      methods: () => ({
        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
        [_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])
      })
    });
    return _SkipWhileStream;
  });
  async._SkipWhileStream = _SkipWhileStream();
  async._Equality$ = dart.generic(T => {
    const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [T, T]));
    return _Equality;
  });
  async._Equality = _Equality();
  const _equals = Symbol('_equals');
  async._DistinctStream$ = dart.generic(T => {
    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
    let _EqualityOfT = () => (_EqualityOfT = dart.constFn(async._Equality$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class _DistinctStream extends async._ForwardingStream$(T, T) {
      new(source, equals) {
        this[_previous$] = async._DistinctStream._SENTINEL;
        this[_equals] = equals;
        super.new(source);
      }
      [_handleData](inputEvent, sink) {
        T._check(inputEvent);
        _EventSinkOfT()._check(sink);
        if (core.identical(this[_previous$], async._DistinctStream._SENTINEL)) {
          this[_previous$] = inputEvent;
          return sink[_add$](inputEvent);
        } else {
          let isEqual = null;
          try {
            if (this[_equals] == null) {
              isEqual = dart.equals(this[_previous$], inputEvent);
            } else {
              isEqual = this[_equals](T.as(this[_previous$]), inputEvent);
            }
          } catch (e) {
            let s = dart.stackTrace(e);
            async._addErrorWithReplacement(sink, e, s);
            return null;
          }

          if (!dart.test(isEqual)) {
            sink[_add$](inputEvent);
            this[_previous$] = inputEvent;
          }
        }
      }
    }
    dart.setSignature(_DistinctStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._DistinctStream$(T), [StreamOfT(), _EqualityOfT()])}),
      fields: () => ({
        [_equals]: _EqualityOfT(),
        [_previous$]: core.Object
      }),
      methods: () => ({[_handleData]: dart.definiteFunctionType(dart.void, [T, _EventSinkOfT()])}),
      sfields: () => ({_SENTINEL: core.Object})
    });
    return _DistinctStream;
  });
  async._DistinctStream = _DistinctStream();
  dart.defineLazy(async._DistinctStream, {
    get _SENTINEL() {
      return new core.Object();
    },
    set _SENTINEL(_) {}
  });
  async._EventSinkWrapper$ = dart.generic(T => {
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _EventSinkWrapper extends core.Object {
      new(sink) {
        this[_sink] = sink;
      }
      add(data) {
        T._check(data);
        this[_sink][_add$](data);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_sink][_addError](error, stackTrace);
      }
      close() {
        this[_sink][_close$]();
      }
    }
    dart.addTypeTests(_EventSinkWrapper);
    _EventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
    dart.setSignature(_EventSinkWrapper, {
      constructors: () => ({new: dart.definiteFunctionType(async._EventSinkWrapper$(T), [async._EventSink])}),
      fields: () => ({[_sink]: async._EventSink}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _EventSinkWrapper;
  });
  async._EventSinkWrapper = _EventSinkWrapper();
  const _transformerSink = Symbol('_transformerSink');
  const _isSubscribed = Symbol('_isSubscribed');
  async._SinkTransformerStreamSubscription$ = dart.generic((S, T) => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
    let _EventSinkWrapperOfT = () => (_EventSinkWrapperOfT = dart.constFn(async._EventSinkWrapper$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _SinkTransformerStreamSubscription extends async._BufferingStreamSubscription$(T) {
      new(source, mapper, onData, onError, onDone, cancelOnError) {
        this[_transformerSink] = null;
        this[_subscription] = null;
        super.new(onData, onError, onDone, cancelOnError);
        let eventSink = new (_EventSinkWrapperOfT())(this);
        this[_transformerSink] = mapper(eventSink);
        this[_subscription] = source.listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
      }
      get [_isSubscribed]() {
        return this[_subscription] != null;
      }
      [_add$](data) {
        T._check(data);
        if (dart.test(this[_isClosed$])) {
          dart.throw(new core.StateError("Stream is already closed"));
        }
        super[_add$](data);
      }
      [_addError](error, stackTrace) {
        if (dart.test(this[_isClosed$])) {
          dart.throw(new core.StateError("Stream is already closed"));
        }
        super[_addError](error, stackTrace);
      }
      [_close$]() {
        if (dart.test(this[_isClosed$])) {
          dart.throw(new core.StateError("Stream is already closed"));
        }
        super[_close$]();
      }
      [_onPause]() {
        if (dart.test(this[_isSubscribed])) this[_subscription].pause();
      }
      [_onResume]() {
        if (dart.test(this[_isSubscribed])) this[_subscription].resume();
      }
      [_onCancel]() {
        if (dart.test(this[_isSubscribed])) {
          let subscription = this[_subscription];
          this[_subscription] = null;
          subscription.cancel();
        }
        return null;
      }
      [_handleData](data) {
        S._check(data);
        try {
          this[_transformerSink].add(data);
        } catch (e) {
          let s = dart.stackTrace(e);
          this[_addError](e, s);
        }

      }
      [_handleError](error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        try {
          this[_transformerSink].addError(error, core.StackTrace._check(stackTrace));
        } catch (e) {
          let s = dart.stackTrace(e);
          if (core.identical(e, error)) {
            this[_addError](error, core.StackTrace._check(stackTrace));
          } else {
            this[_addError](e, s);
          }
        }

      }
      [_handleDone]() {
        try {
          this[_subscription] = null;
          this[_transformerSink].close();
        } catch (e) {
          let s = dart.stackTrace(e);
          this[_addError](e, s);
        }

      }
    }
    dart.setSignature(_SinkTransformerStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(async._SinkTransformerStreamSubscription$(S, T), [StreamOfS(), _SinkMapperOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
      fields: () => ({
        [_transformerSink]: EventSinkOfS(),
        [_subscription]: StreamSubscriptionOfS()
      }),
      getters: () => ({[_isSubscribed]: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        [_add$]: dart.definiteFunctionType(dart.void, [T]),
        [_handleData]: dart.definiteFunctionType(dart.void, [S]),
        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic]),
        [_handleDone]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SinkTransformerStreamSubscription;
  });
  async._SinkTransformerStreamSubscription = _SinkTransformerStreamSubscription();
  async._SinkMapper$ = dart.generic((S, T) => {
    const _SinkMapper = dart.typedef('_SinkMapper', () => dart.functionType(async.EventSink$(S), [async.EventSink$(T)]));
    return _SinkMapper;
  });
  async._SinkMapper = _SinkMapper();
  const _sinkMapper = Symbol('_sinkMapper');
  async._StreamSinkTransformer$ = dart.generic((S, T) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _BoundSinkStreamOfS$T = () => (_BoundSinkStreamOfS$T = dart.constFn(async._BoundSinkStream$(S, T)))();
    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
    class _StreamSinkTransformer extends core.Object {
      new(sinkMapper) {
        this[_sinkMapper] = sinkMapper;
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return new (_BoundSinkStreamOfS$T())(stream, this[_sinkMapper]);
      }
    }
    dart.addTypeTests(_StreamSinkTransformer);
    _StreamSinkTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
    dart.setSignature(_StreamSinkTransformer, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkTransformer$(S, T), [_SinkMapperOfS$T()])}),
      fields: () => ({[_sinkMapper]: _SinkMapperOfS$T()}),
      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
    });
    return _StreamSinkTransformer;
  });
  async._StreamSinkTransformer = _StreamSinkTransformer();
  async._BoundSinkStream$ = dart.generic((S, T) => {
    let _SinkTransformerStreamSubscriptionOfS$T = () => (_SinkTransformerStreamSubscriptionOfS$T = dart.constFn(async._SinkTransformerStreamSubscription$(S, T)))();
    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BoundSinkStream extends async.Stream$(T) {
      get isBroadcast() {
        return this[_stream].isBroadcast;
      }
      new(stream, sinkMapper) {
        this[_stream] = stream;
        this[_sinkMapper] = sinkMapper;
        super.new();
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        let subscription = new (_SinkTransformerStreamSubscriptionOfS$T())(this[_stream], this[_sinkMapper], onData, onError, onDone, cancelOnError);
        return subscription;
      }
    }
    dart.setSignature(_BoundSinkStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._BoundSinkStream$(S, T), [StreamOfS(), _SinkMapperOfS$T()])}),
      fields: () => ({
        [_sinkMapper]: _SinkMapperOfS$T(),
        [_stream]: StreamOfS()
      }),
      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
    });
    return _BoundSinkStream;
  });
  async._BoundSinkStream = _BoundSinkStream();
  async._TransformDataHandler$ = dart.generic((S, T) => {
    const _TransformDataHandler = dart.typedef('_TransformDataHandler', () => dart.functionType(dart.void, [S, async.EventSink$(T)]));
    return _TransformDataHandler;
  });
  async._TransformDataHandler = _TransformDataHandler();
  async._TransformErrorHandler$ = dart.generic(T => {
    const _TransformErrorHandler = dart.typedef('_TransformErrorHandler', () => dart.functionType(dart.void, [core.Object, core.StackTrace, async.EventSink$(T)]));
    return _TransformErrorHandler;
  });
  async._TransformErrorHandler = _TransformErrorHandler();
  async._TransformDoneHandler$ = dart.generic(T => {
    const _TransformDoneHandler = dart.typedef('_TransformDoneHandler', () => dart.functionType(dart.void, [async.EventSink$(T)]));
    return _TransformDoneHandler;
  });
  async._TransformDoneHandler = _TransformDoneHandler();
  async._HandlerEventSink$ = dart.generic((S, T) => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let _TransformDataHandlerOfS$T = () => (_TransformDataHandlerOfS$T = dart.constFn(async._TransformDataHandler$(S, T)))();
    let _TransformErrorHandlerOfT = () => (_TransformErrorHandlerOfT = dart.constFn(async._TransformErrorHandler$(T)))();
    let _TransformDoneHandlerOfT = () => (_TransformDoneHandlerOfT = dart.constFn(async._TransformDoneHandler$(T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _HandlerEventSink extends core.Object {
      new(handleData, handleError, handleDone, sink) {
        this[_handleData] = handleData;
        this[_handleError] = handleError;
        this[_handleDone] = handleDone;
        this[_sink] = sink;
      }
      add(data) {
        S._check(data);
        this[_handleData](data, this[_sink]);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_handleError](error, stackTrace, this[_sink]);
      }
      close() {
        this[_handleDone](this[_sink]);
      }
    }
    dart.addTypeTests(_HandlerEventSink);
    _HandlerEventSink[dart.implements] = () => [EventSinkOfS()];
    dart.setSignature(_HandlerEventSink, {
      constructors: () => ({new: dart.definiteFunctionType(async._HandlerEventSink$(S, T), [_TransformDataHandlerOfS$T(), _TransformErrorHandlerOfT(), _TransformDoneHandlerOfT(), EventSinkOfT()])}),
      fields: () => ({
        [_handleData]: _TransformDataHandlerOfS$T(),
        [_handleError]: _TransformErrorHandlerOfT(),
        [_handleDone]: _TransformDoneHandlerOfT(),
        [_sink]: EventSinkOfT()
      }),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [S]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _HandlerEventSink;
  });
  async._HandlerEventSink = _HandlerEventSink();
  async._StreamHandlerTransformer$ = dart.generic((S, T) => {
    let _HandlerEventSinkOfS$T = () => (_HandlerEventSinkOfS$T = dart.constFn(async._HandlerEventSink$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
    let EventSinkOfTTo_HandlerEventSinkOfS$T = () => (EventSinkOfTTo_HandlerEventSinkOfS$T = dart.constFn(dart.definiteFunctionType(_HandlerEventSinkOfS$T(), [EventSinkOfT()])))();
    class _StreamHandlerTransformer extends async._StreamSinkTransformer$(S, T) {
      new(opts) {
        let handleData = opts && 'handleData' in opts ? opts.handleData : null;
        let handleError = opts && 'handleError' in opts ? opts.handleError : null;
        let handleDone = opts && 'handleDone' in opts ? opts.handleDone : null;
        super.new(dart.fn(outputSink => {
          if (handleData == null) handleData = async._StreamHandlerTransformer._defaultHandleData;
          if (handleError == null) handleError = async._StreamHandlerTransformer._defaultHandleError;
          if (handleDone == null) handleDone = async._StreamHandlerTransformer._defaultHandleDone;
          return new (_HandlerEventSinkOfS$T())(handleData, handleError, handleDone, outputSink);
        }, EventSinkOfTTo_HandlerEventSinkOfS$T()));
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return super.bind(stream);
      }
      static _defaultHandleData(data, sink) {
        sink.add(data);
      }
      static _defaultHandleError(error, stackTrace, sink) {
        sink.addError(error, stackTrace);
      }
      static _defaultHandleDone(sink) {
        sink.close();
      }
    }
    dart.setSignature(_StreamHandlerTransformer, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamHandlerTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})}),
      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])}),
      statics: () => ({
        _defaultHandleData: dart.definiteFunctionType(dart.void, [dart.dynamic, async.EventSink]),
        _defaultHandleError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, async.EventSink]),
        _defaultHandleDone: dart.definiteFunctionType(dart.void, [async.EventSink])
      }),
      names: ['_defaultHandleData', '_defaultHandleError', '_defaultHandleDone']
    });
    return _StreamHandlerTransformer;
  });
  async._StreamHandlerTransformer = _StreamHandlerTransformer();
  async._SubscriptionTransformer$ = dart.generic((S, T) => {
    const _SubscriptionTransformer = dart.typedef('_SubscriptionTransformer', () => dart.functionType(async.StreamSubscription$(T), [async.Stream$(S), core.bool]));
    return _SubscriptionTransformer;
  });
  async._SubscriptionTransformer = _SubscriptionTransformer();
  const _transformer = Symbol('_transformer');
  async._StreamSubscriptionTransformer$ = dart.generic((S, T) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _BoundSubscriptionStreamOfS$T = () => (_BoundSubscriptionStreamOfS$T = dart.constFn(async._BoundSubscriptionStream$(S, T)))();
    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
    let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
    class _StreamSubscriptionTransformer extends core.Object {
      new(transformer) {
        this[_transformer] = transformer;
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return new (_BoundSubscriptionStreamOfS$T())(stream, this[_transformer]);
      }
    }
    dart.addTypeTests(_StreamSubscriptionTransformer);
    _StreamSubscriptionTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
    dart.setSignature(_StreamSubscriptionTransformer, {
      constructors: () => ({new: dart.definiteFunctionType(async._StreamSubscriptionTransformer$(S, T), [_SubscriptionTransformerOfS$T()])}),
      fields: () => ({[_transformer]: _SubscriptionTransformerOfS$T()}),
      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
    });
    return _StreamSubscriptionTransformer;
  });
  async._StreamSubscriptionTransformer = _StreamSubscriptionTransformer();
  async._BoundSubscriptionStream$ = dart.generic((S, T) => {
    let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _BoundSubscriptionStream extends async.Stream$(T) {
      new(stream, transformer) {
        this[_stream] = stream;
        this[_transformer] = transformer;
        super.new();
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        cancelOnError = core.identical(true, cancelOnError);
        let result = this[_transformer](this[_stream], cancelOnError);
        result.onData(onData);
        result.onError(onError);
        result.onDone(onDone);
        return result;
      }
    }
    dart.setSignature(_BoundSubscriptionStream, {
      constructors: () => ({new: dart.definiteFunctionType(async._BoundSubscriptionStream$(S, T), [StreamOfS(), _SubscriptionTransformerOfS$T()])}),
      fields: () => ({
        [_transformer]: _SubscriptionTransformerOfS$T(),
        [_stream]: StreamOfS()
      }),
      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
    });
    return _BoundSubscriptionStream;
  });
  async._BoundSubscriptionStream = _BoundSubscriptionStream();
  async.Timer = class Timer extends core.Object {
    static new(duration, callback) {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
        return async.Zone.current.createTimer(duration, callback);
      }
      return async.Zone.current.createTimer(duration, async.Zone.current.bindCallback(dart.dynamic)(callback, {runGuarded: true}));
    }
    static periodic(duration, callback) {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
        return async.Zone.current.createPeriodicTimer(duration, callback);
      }
      let boundCallback = async.Zone.current.bindUnaryCallback(dart.dynamic, async.Timer)(callback, {runGuarded: true});
      return async.Zone.current.createPeriodicTimer(duration, boundCallback);
    }
    static run(callback) {
      async.Timer.new(core.Duration.ZERO, callback);
    }
    static _createTimer(duration, callback) {
      let milliseconds = duration.inMilliseconds;
      if (dart.notNull(milliseconds) < 0) milliseconds = 0;
      return new _isolate_helper.TimerImpl(milliseconds, callback);
    }
    static _createPeriodicTimer(duration, callback) {
      let milliseconds = duration.inMilliseconds;
      if (dart.notNull(milliseconds) < 0) milliseconds = 0;
      return new _isolate_helper.TimerImpl.periodic(milliseconds, callback);
    }
  };
  dart.setSignature(async.Timer, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      periodic: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
    }),
    statics: () => ({
      run: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      _createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      _createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
    }),
    names: ['run', '_createTimer', '_createPeriodicTimer']
  });
  async.ZoneCallback$ = dart.generic(R => {
    const ZoneCallback = dart.typedef('ZoneCallback', () => dart.functionType(R, []));
    return ZoneCallback;
  });
  async.ZoneCallback = ZoneCallback();
  async.ZoneUnaryCallback$ = dart.generic((R, T) => {
    const ZoneUnaryCallback = dart.typedef('ZoneUnaryCallback', () => dart.functionType(R, [T]));
    return ZoneUnaryCallback;
  });
  async.ZoneUnaryCallback = ZoneUnaryCallback();
  async.ZoneBinaryCallback$ = dart.generic((R, T1, T2) => {
    const ZoneBinaryCallback = dart.typedef('ZoneBinaryCallback', () => dart.functionType(R, [T1, T2]));
    return ZoneBinaryCallback;
  });
  async.ZoneBinaryCallback = ZoneBinaryCallback();
  async.HandleUncaughtErrorHandler$ = dart.generic(R => {
    const HandleUncaughtErrorHandler = dart.typedef('HandleUncaughtErrorHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]));
    return HandleUncaughtErrorHandler;
  });
  async.HandleUncaughtErrorHandler = HandleUncaughtErrorHandler();
  async.RunHandler$ = dart.generic(R => {
    const RunHandler = dart.typedef('RunHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
    return RunHandler;
  });
  async.RunHandler = RunHandler();
  async.RunUnaryHandler$ = dart.generic((R, T) => {
    const RunUnaryHandler = dart.typedef('RunUnaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]));
    return RunUnaryHandler;
  });
  async.RunUnaryHandler = RunUnaryHandler();
  async.RunBinaryHandler$ = dart.generic((R, T1, T2) => {
    const RunBinaryHandler = dart.typedef('RunBinaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]));
    return RunBinaryHandler;
  });
  async.RunBinaryHandler = RunBinaryHandler();
  async.RegisterCallbackHandler$ = dart.generic(R => {
    const RegisterCallbackHandler = dart.typedef('RegisterCallbackHandler', () => dart.functionType(async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
    return RegisterCallbackHandler;
  });
  async.RegisterCallbackHandler = RegisterCallbackHandler();
  async.RegisterUnaryCallbackHandler$ = dart.generic((R, T) => {
    const RegisterUnaryCallbackHandler = dart.typedef('RegisterUnaryCallbackHandler', () => dart.functionType(async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]));
    return RegisterUnaryCallbackHandler;
  });
  async.RegisterUnaryCallbackHandler = RegisterUnaryCallbackHandler();
  async.RegisterBinaryCallbackHandler$ = dart.generic((R, T1, T2) => {
    const RegisterBinaryCallbackHandler = dart.typedef('RegisterBinaryCallbackHandler', () => dart.functionType(async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]));
    return RegisterBinaryCallbackHandler;
  });
  async.RegisterBinaryCallbackHandler = RegisterBinaryCallbackHandler();
  async.ErrorCallbackHandler = dart.typedef('ErrorCallbackHandler', () => dart.functionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace]));
  async.ScheduleMicrotaskHandler = dart.typedef('ScheduleMicrotaskHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTovoid()]));
  async.CreateTimerHandler = dart.typedef('CreateTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()]));
  async.CreatePeriodicTimerHandler = dart.typedef('CreatePeriodicTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()]));
  async.PrintHandler = dart.typedef('PrintHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String]));
  async.ForkHandler = dart.typedef('ForkHandler', () => dart.functionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map]));
  async._ZoneFunction$ = dart.generic(T => {
    class _ZoneFunction extends core.Object {
      new(zone, func) {
        this.zone = zone;
        this.function = func;
      }
    }
    dart.addTypeTests(_ZoneFunction);
    dart.setSignature(_ZoneFunction, {
      constructors: () => ({new: dart.definiteFunctionType(async._ZoneFunction$(T), [async._Zone, T])}),
      fields: () => ({
        zone: async._Zone,
        function: T
      })
    });
    return _ZoneFunction;
  });
  async._ZoneFunction = _ZoneFunction();
  async.ZoneSpecification = class ZoneSpecification extends core.Object {
    static new(opts) {
      return new async._ZoneSpecification(opts);
    }
    static from(other, opts) {
      let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
      let run = opts && 'run' in opts ? opts.run : null;
      let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
      let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
      let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
      let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
      let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
      let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
      let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
      let print = opts && 'print' in opts ? opts.print : null;
      let fork = opts && 'fork' in opts ? opts.fork : null;
      return async.ZoneSpecification.new({handleUncaughtError: (handleUncaughtError != null ? handleUncaughtError : other.handleUncaughtError), run: (run != null ? run : other.run), runUnary: (runUnary != null ? runUnary : other.runUnary), runBinary: (runBinary != null ? runBinary : other.runBinary), registerCallback: (registerCallback != null ? registerCallback : other.registerCallback), registerUnaryCallback: (registerUnaryCallback != null ? registerUnaryCallback : other.registerUnaryCallback), registerBinaryCallback: (registerBinaryCallback != null ? registerBinaryCallback : other.registerBinaryCallback), errorCallback: (errorCallback != null ? errorCallback : other.errorCallback), scheduleMicrotask: (scheduleMicrotask != null ? scheduleMicrotask : other.scheduleMicrotask), createTimer: (createTimer != null ? createTimer : other.createTimer), createPeriodicTimer: (createPeriodicTimer != null ? createPeriodicTimer : other.createPeriodicTimer), print: (print != null ? print : other.print), fork: (fork != null ? fork : other.fork)});
    }
  };
  dart.setSignature(async.ZoneSpecification, {
    constructors: () => ({
      new: dart.definiteFunctionType(async.ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler}),
      from: dart.definiteFunctionType(async.ZoneSpecification, [async.ZoneSpecification], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})
    })
  });
  async._ZoneSpecification = class _ZoneSpecification extends core.Object {
    new(opts) {
      let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
      let run = opts && 'run' in opts ? opts.run : null;
      let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
      let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
      let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
      let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
      let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
      let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
      let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
      let print = opts && 'print' in opts ? opts.print : null;
      let fork = opts && 'fork' in opts ? opts.fork : null;
      this.handleUncaughtError = handleUncaughtError;
      this.run = run;
      this.runUnary = runUnary;
      this.runBinary = runBinary;
      this.registerCallback = registerCallback;
      this.registerUnaryCallback = registerUnaryCallback;
      this.registerBinaryCallback = registerBinaryCallback;
      this.errorCallback = errorCallback;
      this.scheduleMicrotask = scheduleMicrotask;
      this.createTimer = createTimer;
      this.createPeriodicTimer = createPeriodicTimer;
      this.print = print;
      this.fork = fork;
    }
  };
  async._ZoneSpecification[dart.implements] = () => [async.ZoneSpecification];
  dart.setSignature(async._ZoneSpecification, {
    constructors: () => ({new: dart.definiteFunctionType(async._ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})}),
    fields: () => ({
      handleUncaughtError: async.HandleUncaughtErrorHandler,
      run: async.RunHandler,
      runUnary: async.RunUnaryHandler,
      runBinary: async.RunBinaryHandler,
      registerCallback: async.RegisterCallbackHandler,
      registerUnaryCallback: async.RegisterUnaryCallbackHandler,
      registerBinaryCallback: async.RegisterBinaryCallbackHandler,
      errorCallback: async.ErrorCallbackHandler,
      scheduleMicrotask: async.ScheduleMicrotaskHandler,
      createTimer: async.CreateTimerHandler,
      createPeriodicTimer: async.CreatePeriodicTimerHandler,
      print: async.PrintHandler,
      fork: async.ForkHandler
    })
  });
  async.ZoneDelegate = class ZoneDelegate extends core.Object {};
  async.Zone = class Zone extends core.Object {
    _() {
    }
    static get current() {
      return async.Zone._current;
    }
    static _enter(zone) {
      dart.assert(zone != null);
      dart.assert(!core.identical(zone, async.Zone._current));
      let previous = async.Zone._current;
      async.Zone._current = zone;
      return previous;
    }
    static _leave(previous) {
      dart.assert(previous != null);
      async.Zone._current = previous;
    }
  };
  dart.defineNamedConstructor(async.Zone, '_');
  dart.setSignature(async.Zone, {
    constructors: () => ({_: dart.definiteFunctionType(async.Zone, [])}),
    sfields: () => ({
      ROOT: async.Zone,
      _current: async.Zone
    }),
    sgetters: () => ({current: dart.definiteFunctionType(async.Zone, [])}),
    statics: () => ({
      _enter: dart.definiteFunctionType(async.Zone, [async.Zone]),
      _leave: dart.definiteFunctionType(dart.void, [async.Zone])
    }),
    names: ['_enter', '_leave']
  });
  dart.defineLazy(async.Zone, {
    get ROOT() {
      return async._ROOT_ZONE;
    },
    get _current() {
      return async._ROOT_ZONE;
    },
    set _current(_) {}
  });
  const _delegate = Symbol('_delegate');
  async._parentDelegate = function(zone) {
    if (zone.parent == null) return null;
    return zone.parent[_delegate];
  };
  dart.lazyFn(async._parentDelegate, () => _ZoneToZoneDelegate());
  const _delegationTarget = Symbol('_delegationTarget');
  const _handleUncaughtError = Symbol('_handleUncaughtError');
  const _run = Symbol('_run');
  const _runUnary = Symbol('_runUnary');
  const _runBinary = Symbol('_runBinary');
  const _registerCallback = Symbol('_registerCallback');
  const _registerUnaryCallback = Symbol('_registerUnaryCallback');
  const _registerBinaryCallback = Symbol('_registerBinaryCallback');
  const _errorCallback = Symbol('_errorCallback');
  const _createTimer = Symbol('_createTimer');
  const _createPeriodicTimer = Symbol('_createPeriodicTimer');
  const _print = Symbol('_print');
  const _fork = Symbol('_fork');
  async._ZoneDelegate = class _ZoneDelegate extends core.Object {
    new(delegationTarget) {
      this[_delegationTarget] = delegationTarget;
    }
    handleUncaughtError(R) {
      return (zone, error, stackTrace) => {
        let implementation = this[_delegationTarget][_handleUncaughtError];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, error, stackTrace));
      };
    }
    run(R) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_run];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    runUnary(R, T) {
      return (zone, f, arg) => {
        let implementation = this[_delegationTarget][_runUnary];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg));
      };
    }
    runBinary(R, T1, T2) {
      return (zone, f, arg1, arg2) => {
        let implementation = this[_delegationTarget][_runBinary];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg1, arg2));
      };
    }
    registerCallback(R) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_registerCallback];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return async.ZoneCallback$(R).as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    registerUnaryCallback(R, T) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_registerUnaryCallback];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return async.ZoneUnaryCallback$(R, T).as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    registerBinaryCallback(R, T1, T2) {
      return (zone, f) => {
        let implementation = this[_delegationTarget][_registerBinaryCallback];
        let implZone = implementation.zone;
        let handler = implementation.function;
        return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implZone, async._parentDelegate(implZone), zone, f));
      };
    }
    errorCallback(zone, error, stackTrace) {
      let implementation = this[_delegationTarget][_errorCallback];
      let implZone = implementation.zone;
      if (core.identical(implZone, async._ROOT_ZONE)) return null;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, error, stackTrace);
    }
    scheduleMicrotask(zone, f) {
      let implementation = this[_delegationTarget][_scheduleMicrotask];
      let implZone = implementation.zone;
      let handler = implementation.function;
      handler(implZone, async._parentDelegate(implZone), zone, f);
    }
    createTimer(zone, duration, f) {
      let implementation = this[_delegationTarget][_createTimer];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, duration, f);
    }
    createPeriodicTimer(zone, period, f) {
      let implementation = this[_delegationTarget][_createPeriodicTimer];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, period, f);
    }
    print(zone, line) {
      let implementation = this[_delegationTarget][_print];
      let implZone = implementation.zone;
      let handler = implementation.function;
      handler(implZone, async._parentDelegate(implZone), zone, line);
    }
    fork(zone, specification, zoneValues) {
      let implementation = this[_delegationTarget][_fork];
      let implZone = implementation.zone;
      let handler = implementation.function;
      return handler(implZone, async._parentDelegate(implZone), zone, specification, zoneValues);
    }
  };
  async._ZoneDelegate[dart.implements] = () => [async.ZoneDelegate];
  dart.setSignature(async._ZoneDelegate, {
    constructors: () => ({new: dart.definiteFunctionType(async._ZoneDelegate, [async._Zone])}),
    fields: () => ({[_delegationTarget]: async._Zone}),
    methods: () => ({
      handleUncaughtError: dart.definiteFunctionType(R => [R, [async.Zone, dart.dynamic, core.StackTrace]]),
      run: dart.definiteFunctionType(R => [R, [async.Zone, dart.functionType(R, [])]]),
      runUnary: dart.definiteFunctionType((R, T) => [R, [async.Zone, dart.functionType(R, [T]), T]]),
      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, dart.functionType(R, [T1, T2]), T1, T2]]),
      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, dart.functionType(R, [])]]),
      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, dart.functionType(R, [T])]]),
      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, dart.functionType(R, [T1, T2])]]),
      errorCallback: dart.definiteFunctionType(async.AsyncError, [async.Zone, core.Object, core.StackTrace]),
      scheduleMicrotask: dart.definiteFunctionType(dart.void, [async.Zone, VoidTodynamic()]),
      createTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, VoidTovoid()]),
      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, TimerTovoid()]),
      print: dart.definiteFunctionType(dart.void, [async.Zone, core.String]),
      fork: dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneSpecification, core.Map])
    })
  });
  const _map$ = Symbol('_map');
  async._Zone = class _Zone extends core.Object {
    new() {
    }
    inSameErrorZone(otherZone) {
      return core.identical(this, otherZone) || core.identical(this.errorZone, otherZone.errorZone);
    }
  };
  async._Zone[dart.implements] = () => [async.Zone];
  dart.setSignature(async._Zone, {
    constructors: () => ({new: dart.definiteFunctionType(async._Zone, [])}),
    methods: () => ({inSameErrorZone: dart.definiteFunctionType(core.bool, [async.Zone])})
  });
  const _delegateCache = Symbol('_delegateCache');
  async._CustomZone = class _CustomZone extends async._Zone {
    get [_delegate]() {
      if (this[_delegateCache] != null) return this[_delegateCache];
      this[_delegateCache] = new async._ZoneDelegate(this);
      return this[_delegateCache];
    }
    new(parent, specification, map) {
      this.parent = parent;
      this[_map$] = map;
      this[_run] = null;
      this[_runUnary] = null;
      this[_runBinary] = null;
      this[_registerCallback] = null;
      this[_registerUnaryCallback] = null;
      this[_registerBinaryCallback] = null;
      this[_errorCallback] = null;
      this[_scheduleMicrotask] = null;
      this[_createTimer] = null;
      this[_createPeriodicTimer] = null;
      this[_print] = null;
      this[_fork] = null;
      this[_handleUncaughtError] = null;
      this[_delegateCache] = null;
      super.new();
      this[_run] = specification.run != null ? new (_ZoneFunctionOfRunHandler())(this, specification.run) : this.parent[_run];
      this[_runUnary] = specification.runUnary != null ? new (_ZoneFunctionOfRunUnaryHandler())(this, specification.runUnary) : this.parent[_runUnary];
      this[_runBinary] = specification.runBinary != null ? new (_ZoneFunctionOfRunBinaryHandler())(this, specification.runBinary) : this.parent[_runBinary];
      this[_registerCallback] = specification.registerCallback != null ? new (_ZoneFunctionOfRegisterCallbackHandler())(this, specification.registerCallback) : this.parent[_registerCallback];
      this[_registerUnaryCallback] = specification.registerUnaryCallback != null ? new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(this, specification.registerUnaryCallback) : this.parent[_registerUnaryCallback];
      this[_registerBinaryCallback] = specification.registerBinaryCallback != null ? new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(this, specification.registerBinaryCallback) : this.parent[_registerBinaryCallback];
      this[_errorCallback] = specification.errorCallback != null ? new (_ZoneFunctionOfErrorCallbackHandler())(this, specification.errorCallback) : this.parent[_errorCallback];
      this[_scheduleMicrotask] = specification.scheduleMicrotask != null ? new (_ZoneFunctionOfScheduleMicrotaskHandler())(this, specification.scheduleMicrotask) : this.parent[_scheduleMicrotask];
      this[_createTimer] = specification.createTimer != null ? new (_ZoneFunctionOfCreateTimerHandler())(this, specification.createTimer) : this.parent[_createTimer];
      this[_createPeriodicTimer] = specification.createPeriodicTimer != null ? new (_ZoneFunctionOfCreatePeriodicTimerHandler())(this, specification.createPeriodicTimer) : this.parent[_createPeriodicTimer];
      this[_print] = specification.print != null ? new (_ZoneFunctionOfPrintHandler())(this, specification.print) : this.parent[_print];
      this[_fork] = specification.fork != null ? new (_ZoneFunctionOfForkHandler())(this, specification.fork) : this.parent[_fork];
      this[_handleUncaughtError] = specification.handleUncaughtError != null ? new (_ZoneFunctionOfHandleUncaughtErrorHandler())(this, specification.handleUncaughtError) : this.parent[_handleUncaughtError];
    }
    get errorZone() {
      return this[_handleUncaughtError].zone;
    }
    runGuarded(R) {
      return f => {
        try {
          return this.run(R)(f);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runUnaryGuarded(R, T) {
      return (f, arg) => {
        try {
          return this.runUnary(R, T)(f, arg);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runBinaryGuarded(R, T1, T2) {
      return (f, arg1, arg2) => {
        try {
          return this.runBinary(R, T1, T2)(f, arg1, arg2);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    bindCallback(R) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        let registered = this.registerCallback(R)(f);
        if (dart.test(runGuarded)) {
          return dart.fn(() => this.runGuarded(R)(registered), dart.definiteFunctionType(R, []));
        } else {
          return dart.fn(() => this.run(R)(registered), dart.definiteFunctionType(R, []));
        }
      };
    }
    bindUnaryCallback(R, T) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        let registered = this.registerUnaryCallback(R, T)(f);
        if (dart.test(runGuarded)) {
          return dart.fn(arg => this.runUnaryGuarded(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
        } else {
          return dart.fn(arg => this.runUnary(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
        }
      };
    }
    bindBinaryCallback(R, T1, T2) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        let registered = this.registerBinaryCallback(R, T1, T2)(f);
        if (dart.test(runGuarded)) {
          return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        } else {
          return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        }
      };
    }
    _get(key) {
      let result = this[_map$][dartx._get](key);
      if (result != null || dart.test(this[_map$][dartx.containsKey](key))) return result;
      if (this.parent != null) {
        let value = this.parent._get(key);
        if (value != null) {
          this[_map$][dartx._set](key, value);
        }
        return value;
      }
      dart.assert(dart.equals(this, async._ROOT_ZONE));
      return null;
    }
    handleUncaughtError(R) {
      return (error, stackTrace) => {
        let implementation = this[_handleUncaughtError];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, error, stackTrace));
      };
    }
    fork(opts) {
      let specification = opts && 'specification' in opts ? opts.specification : null;
      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
      let implementation = this[_fork];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, specification, zoneValues);
    }
    run(R) {
      return f => {
        let implementation = this[_run];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(handler(implementation.zone, parentDelegate, this, f));
      };
    }
    runUnary(R, T) {
      return (f, arg) => {
        let implementation = this[_runUnary];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg));
      };
    }
    runBinary(R, T1, T2) {
      return (f, arg1, arg2) => {
        let implementation = this[_runBinary];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg1, arg2));
      };
    }
    registerCallback(R) {
      return callback => {
        let implementation = this[_registerCallback];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return async.ZoneCallback$(R).as(handler(implementation.zone, parentDelegate, this, callback));
      };
    }
    registerUnaryCallback(R, T) {
      return callback => {
        let implementation = this[_registerUnaryCallback];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return async.ZoneUnaryCallback$(R, T).as(handler(implementation.zone, parentDelegate, this, callback));
      };
    }
    registerBinaryCallback(R, T1, T2) {
      return callback => {
        let implementation = this[_registerBinaryCallback];
        dart.assert(implementation != null);
        let parentDelegate = async._parentDelegate(implementation.zone);
        let handler = implementation.function;
        return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implementation.zone, parentDelegate, this, callback));
      };
    }
    errorCallback(error, stackTrace) {
      let implementation = this[_errorCallback];
      dart.assert(implementation != null);
      let implementationZone = implementation.zone;
      if (core.identical(implementationZone, async._ROOT_ZONE)) return null;
      let parentDelegate = async._parentDelegate(async._Zone._check(implementationZone));
      let handler = implementation.function;
      return handler(implementationZone, parentDelegate, this, error, stackTrace);
    }
    scheduleMicrotask(f) {
      let implementation = this[_scheduleMicrotask];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, f);
    }
    createTimer(duration, f) {
      let implementation = this[_createTimer];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, duration, f);
    }
    createPeriodicTimer(duration, f) {
      let implementation = this[_createPeriodicTimer];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, duration, f);
    }
    print(line) {
      let implementation = this[_print];
      dart.assert(implementation != null);
      let parentDelegate = async._parentDelegate(implementation.zone);
      let handler = implementation.function;
      return handler(implementation.zone, parentDelegate, this, line);
    }
  };
  dart.setSignature(async._CustomZone, {
    constructors: () => ({new: dart.definiteFunctionType(async._CustomZone, [async._Zone, async.ZoneSpecification, core.Map])}),
    fields: () => ({
      [_run]: _ZoneFunctionOfRunHandler(),
      [_runUnary]: _ZoneFunctionOfRunUnaryHandler(),
      [_runBinary]: _ZoneFunctionOfRunBinaryHandler(),
      [_registerCallback]: _ZoneFunctionOfRegisterCallbackHandler(),
      [_registerUnaryCallback]: _ZoneFunctionOfRegisterUnaryCallbackHandler(),
      [_registerBinaryCallback]: _ZoneFunctionOfRegisterBinaryCallbackHandler(),
      [_errorCallback]: _ZoneFunctionOfErrorCallbackHandler(),
      [_scheduleMicrotask]: _ZoneFunctionOfScheduleMicrotaskHandler(),
      [_createTimer]: _ZoneFunctionOfCreateTimerHandler(),
      [_createPeriodicTimer]: _ZoneFunctionOfCreatePeriodicTimerHandler(),
      [_print]: _ZoneFunctionOfPrintHandler(),
      [_fork]: _ZoneFunctionOfForkHandler(),
      [_handleUncaughtError]: _ZoneFunctionOfHandleUncaughtErrorHandler(),
      [_delegateCache]: async.ZoneDelegate,
      parent: async._Zone,
      [_map$]: core.Map
    }),
    getters: () => ({
      [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
      errorZone: dart.definiteFunctionType(async.Zone, [])
    }),
    methods: () => ({
      runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
      bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
      bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
      fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
      run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
      errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
      scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
      print: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  async._rootHandleUncaughtError = function(R) {
    return (self, parent, zone, error, stackTrace) => {
      async._schedulePriorityAsyncCallback(dart.fn(() => {
        if (error == null) error = new core.NullThrownError();
        if (stackTrace == null) dart.throw(error);
        async._rethrow(error, stackTrace);
      }, VoidTovoid$()));
    };
  };
  dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
  async._rethrow = function(error, stackTrace) {
    error.stack = dart.toString(stackTrace);
    throw error;
  };
  dart.lazyFn(async._rethrow, () => ObjectAndStackTraceTovoid());
  async._rootRun = function(R) {
    return (self, parent, zone, f) => {
      if (dart.equals(async.Zone._current, zone)) return f();
      let old = async.Zone._enter(zone);
      try {
        return f();
      } finally {
        async.Zone._leave(old);
      }
    };
  };
  dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR$());
  async._rootRunUnary = function(R, T) {
    return (self, parent, zone, f, arg) => {
      if (dart.equals(async.Zone._current, zone)) return f(arg);
      let old = async.Zone._enter(zone);
      try {
        return f(arg);
      } finally {
        async.Zone._leave(old);
      }
    };
  };
  dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR$0());
  async._rootRunBinary = function(R, T1, T2) {
    return (self, parent, zone, f, arg1, arg2) => {
      if (dart.equals(async.Zone._current, zone)) return f(arg1, arg2);
      let old = async.Zone._enter(zone);
      try {
        return f(arg1, arg2);
      } finally {
        async.Zone._leave(old);
      }
    };
  };
  dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR$1());
  async._rootRegisterCallback = function(R) {
    return (self, parent, zone, f) => {
      return f;
    };
  };
  dart.fn(async._rootRegisterCallback, ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR());
  async._rootRegisterUnaryCallback = function(R, T) {
    return (self, parent, zone, f) => {
      return f;
    };
  };
  dart.fn(async._rootRegisterUnaryCallback, ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T());
  async._rootRegisterBinaryCallback = function(R, T1, T2) {
    return (self, parent, zone, f) => {
      return f;
    };
  };
  dart.fn(async._rootRegisterBinaryCallback, ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2());
  async._rootErrorCallback = function(self, parent, zone, error, stackTrace) {
    return null;
  };
  dart.lazyFn(async._rootErrorCallback, () => ZoneAndZoneDelegateAndZone__ToAsyncError());
  async._rootScheduleMicrotask = function(self, parent, zone, f) {
    if (!core.identical(async._ROOT_ZONE, zone)) {
      let hasErrorHandler = !dart.test(async._ROOT_ZONE.inSameErrorZone(zone));
      f = zone.bindCallback(dart.dynamic)(f, {runGuarded: hasErrorHandler});
      zone = async._ROOT_ZONE;
    }
    async._scheduleAsyncCallback(f);
  };
  dart.fn(async._rootScheduleMicrotask, ZoneAndZoneDelegateAndZone__Tovoid());
  async._rootCreateTimer = function(self, parent, zone, duration, callback) {
    if (!core.identical(async._ROOT_ZONE, zone)) {
      callback = zone.bindCallback(dart.dynamic)(callback);
    }
    return async.Timer._createTimer(duration, callback);
  };
  dart.lazyFn(async._rootCreateTimer, () => ZoneAndZoneDelegateAndZone__ToTimer());
  async._rootCreatePeriodicTimer = function(self, parent, zone, duration, callback) {
    if (!core.identical(async._ROOT_ZONE, zone)) {
      callback = zone.bindUnaryCallback(dart.dynamic, async.Timer)(callback);
    }
    return async.Timer._createPeriodicTimer(duration, callback);
  };
  dart.lazyFn(async._rootCreatePeriodicTimer, () => ZoneAndZoneDelegateAndZone__ToTimer$());
  async._rootPrint = function(self, parent, zone, line) {
    _internal.printToConsole(line);
  };
  dart.lazyFn(async._rootPrint, () => ZoneAndZoneDelegateAndZone__Tovoid$());
  async._printToZone = function(line) {
    async.Zone.current.print(line);
  };
  dart.lazyFn(async._printToZone, () => StringTovoid$());
  let const$11;
  async._rootFork = function(self, parent, zone, specification, zoneValues) {
    _internal.printToZone = async._printToZone;
    if (specification == null) {
      specification = const$11 || (const$11 = dart.const(async.ZoneSpecification.new()));
    } else if (!async._ZoneSpecification.is(specification)) {
      dart.throw(new core.ArgumentError("ZoneSpecifications must be instantiated" + " with the provided constructor."));
    }
    let valueMap = null;
    if (zoneValues == null) {
      if (async._Zone.is(zone)) {
        valueMap = zone[_map$];
      } else {
        valueMap = collection.HashMap.new();
      }
    } else {
      valueMap = collection.HashMap.from(zoneValues);
    }
    return new async._CustomZone(async._Zone._check(zone), specification, valueMap);
  };
  dart.lazyFn(async._rootFork, () => ZoneAndZoneDelegateAndZone__ToZone());
  let const$12;
  let const$13;
  let const$14;
  let const$15;
  let const$16;
  let const$17;
  let const$18;
  let const$19;
  let const$20;
  let const$21;
  let const$22;
  let const$23;
  let const$24;
  async._RootZone = class _RootZone extends async._Zone {
    new() {
      super.new();
    }
    get [_run]() {
      return const$12 || (const$12 = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
    }
    get [_runUnary]() {
      return const$13 || (const$13 = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
    }
    get [_runBinary]() {
      return const$14 || (const$14 = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
    }
    get [_registerCallback]() {
      return const$15 || (const$15 = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
    }
    get [_registerUnaryCallback]() {
      return const$16 || (const$16 = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
    }
    get [_registerBinaryCallback]() {
      return const$17 || (const$17 = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
    }
    get [_errorCallback]() {
      return const$18 || (const$18 = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
    }
    get [_scheduleMicrotask]() {
      return const$19 || (const$19 = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
    }
    get [_createTimer]() {
      return const$20 || (const$20 = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
    }
    get [_createPeriodicTimer]() {
      return const$21 || (const$21 = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
    }
    get [_print]() {
      return const$22 || (const$22 = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
    }
    get [_fork]() {
      return const$23 || (const$23 = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
    }
    get [_handleUncaughtError]() {
      return const$24 || (const$24 = dart.const(new (_ZoneFunctionOfHandleUncaughtErrorHandler())(async._ROOT_ZONE, dart.gbind(async._rootHandleUncaughtError, dart.dynamic))));
    }
    get parent() {
      return null;
    }
    get [_map$]() {
      return async._RootZone._rootMap;
    }
    get [_delegate]() {
      if (async._RootZone._rootDelegate != null) return async._RootZone._rootDelegate;
      return async._RootZone._rootDelegate = new async._ZoneDelegate(this);
    }
    get errorZone() {
      return this;
    }
    runGuarded(R) {
      return f => {
        try {
          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
            return f();
          }
          return async._rootRun(R)(null, null, this, f);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runUnaryGuarded(R, T) {
      return (f, arg) => {
        try {
          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
            return f(arg);
          }
          return async._rootRunUnary(R, T)(null, null, this, f, arg);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    runBinaryGuarded(R, T1, T2) {
      return (f, arg1, arg2) => {
        try {
          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
            return f(arg1, arg2);
          }
          return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
        } catch (e) {
          let s = dart.stackTrace(e);
          return this.handleUncaughtError(R)(e, s);
        }

      };
    }
    bindCallback(R) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        if (dart.test(runGuarded)) {
          return dart.fn(() => this.runGuarded(R)(f), dart.definiteFunctionType(R, []));
        } else {
          return dart.fn(() => this.run(R)(f), dart.definiteFunctionType(R, []));
        }
      };
    }
    bindUnaryCallback(R, T) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        if (dart.test(runGuarded)) {
          return dart.fn(arg => this.runUnaryGuarded(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
        } else {
          return dart.fn(arg => this.runUnary(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
        }
      };
    }
    bindBinaryCallback(R, T1, T2) {
      return (f, opts) => {
        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
        if (dart.test(runGuarded)) {
          return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        } else {
          return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
        }
      };
    }
    _get(key) {
      return null;
    }
    handleUncaughtError(R) {
      return (error, stackTrace) => {
        return async._rootHandleUncaughtError(R)(null, null, this, error, stackTrace);
      };
    }
    fork(opts) {
      let specification = opts && 'specification' in opts ? opts.specification : null;
      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
      return async._rootFork(null, null, this, specification, zoneValues);
    }
    run(R) {
      return f => {
        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f();
        return async._rootRun(R)(null, null, this, f);
      };
    }
    runUnary(R, T) {
      return (f, arg) => {
        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg);
        return async._rootRunUnary(R, T)(null, null, this, f, arg);
      };
    }
    runBinary(R, T1, T2) {
      return (f, arg1, arg2) => {
        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg1, arg2);
        return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
      };
    }
    registerCallback(R) {
      return f => {
        return f;
      };
    }
    registerUnaryCallback(R, T) {
      return f => {
        return f;
      };
    }
    registerBinaryCallback(R, T1, T2) {
      return f => {
        return f;
      };
    }
    errorCallback(error, stackTrace) {
      return null;
    }
    scheduleMicrotask(f) {
      async._rootScheduleMicrotask(null, null, this, f);
    }
    createTimer(duration, f) {
      return async.Timer._createTimer(duration, f);
    }
    createPeriodicTimer(duration, f) {
      return async.Timer._createPeriodicTimer(duration, f);
    }
    print(line) {
      _internal.printToConsole(line);
    }
  };
  dart.setSignature(async._RootZone, {
    constructors: () => ({new: dart.definiteFunctionType(async._RootZone, [])}),
    getters: () => ({
      [_run]: dart.definiteFunctionType(async._ZoneFunction$(async.RunHandler), []),
      [_runUnary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunUnaryHandler), []),
      [_runBinary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunBinaryHandler), []),
      [_registerCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterCallbackHandler), []),
      [_registerUnaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterUnaryCallbackHandler), []),
      [_registerBinaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterBinaryCallbackHandler), []),
      [_errorCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.ErrorCallbackHandler), []),
      [_scheduleMicrotask]: dart.definiteFunctionType(async._ZoneFunction$(async.ScheduleMicrotaskHandler), []),
      [_createTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreateTimerHandler), []),
      [_createPeriodicTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreatePeriodicTimerHandler), []),
      [_print]: dart.definiteFunctionType(async._ZoneFunction$(async.PrintHandler), []),
      [_fork]: dart.definiteFunctionType(async._ZoneFunction$(async.ForkHandler), []),
      [_handleUncaughtError]: dart.definiteFunctionType(async._ZoneFunction$(async.HandleUncaughtErrorHandler), []),
      parent: dart.definiteFunctionType(async._Zone, []),
      [_map$]: dart.definiteFunctionType(core.Map, []),
      [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
      errorZone: dart.definiteFunctionType(async.Zone, [])
    }),
    methods: () => ({
      runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
      bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
      bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
      fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
      run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
      runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
      errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
      scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
      createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
      print: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sfields: () => ({
      _rootMap: core.Map,
      _rootDelegate: async.ZoneDelegate
    })
  });
  async._RootZone._rootDelegate = null;
  dart.defineLazy(async._RootZone, {
    get _rootMap() {
      return collection.HashMap.new();
    },
    set _rootMap(_) {}
  });
  async._ROOT_ZONE = dart.const(new async._RootZone());
  async.runZoned = function(R) {
    return (body, opts) => {
      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
      let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
      let onError = opts && 'onError' in opts ? opts.onError : null;
      let errorHandler = null;
      if (onError != null) {
        errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
          try {
            if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
              return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
            }
            return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
          } catch (e) {
            let s = dart.stackTrace(e);
            if (core.identical(e, error)) {
              return parent.handleUncaughtError(dart.dynamic)(zone, error, stackTrace);
            } else {
              return parent.handleUncaughtError(dart.dynamic)(zone, e, s);
            }
          }

        }, ZoneAndZoneDelegateAndZone__Todynamic());
      }
      if (zoneSpecification == null) {
        zoneSpecification = async.ZoneSpecification.new({handleUncaughtError: errorHandler});
      } else if (errorHandler != null) {
        zoneSpecification = async.ZoneSpecification.from(zoneSpecification, {handleUncaughtError: errorHandler});
      }
      let zone = async.Zone.current.fork({specification: zoneSpecification, zoneValues: zoneValues});
      if (onError != null) {
        return zone.runGuarded(R)(body);
      } else {
        return zone.run(R)(body);
      }
    };
  };
  dart.lazyFn(async.runZoned, () => Fn__ToR());
  collection._USE_ES6_MAPS = true;
  const _length$1 = Symbol('_length');
  const _strings$ = Symbol('_strings');
  const _nums$ = Symbol('_nums');
  const _rest$ = Symbol('_rest');
  const _keys = Symbol('_keys');
  const _containsKey = Symbol('_containsKey');
  const _getBucket$ = Symbol('_getBucket');
  const _findBucketIndex = Symbol('_findBucketIndex');
  const _computeKeys = Symbol('_computeKeys');
  const _get = Symbol('_get');
  const _addHashTableEntry$ = Symbol('_addHashTableEntry');
  const _set = Symbol('_set');
  const _computeHashCode = Symbol('_computeHashCode');
  const _removeHashTableEntry$ = Symbol('_removeHashTableEntry');
  const _remove = Symbol('_remove');
  collection._HashMap$ = dart.generic((K, V) => {
    let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
    let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
    let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    class _HashMap extends core.Object {
      new() {
        this[_length$1] = 0;
        this[_strings$] = null;
        this[_nums$] = null;
        this[_rest$] = null;
        this[_keys] = null;
      }
      get length() {
        return this[_length$1];
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      get keys() {
        return new (_HashMapKeyIterableOfK())(this);
      }
      get values() {
        return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
      }
      containsKey(key) {
        if (dart.test(collection._HashMap._isStringKey(key))) {
          let strings = this[_strings$];
          return strings == null ? false : collection._HashMap._hasTableEntry(strings, key);
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          let nums = this[_nums$];
          return nums == null ? false : collection._HashMap._hasTableEntry(nums, key);
        } else {
          return this[_containsKey](key);
        }
      }
      [_containsKey](key) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, key);
        return dart.notNull(this[_findBucketIndex](bucket, key)) >= 0;
      }
      containsValue(value) {
        return this[_computeKeys]()[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      _get(key) {
        if (dart.test(collection._HashMap._isStringKey(key))) {
          let strings = this[_strings$];
          return V._check(strings == null ? null : collection._HashMap._getTableEntry(strings, key));
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          let nums = this[_nums$];
          return V._check(nums == null ? null : collection._HashMap._getTableEntry(nums, key));
        } else {
          return this[_get](key);
        }
      }
      [_get](key) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, key);
        let index = this[_findBucketIndex](bucket, key);
        return V._check(dart.notNull(index) < 0 ? null : bucket[dart.notNull(index) + 1]);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        if (dart.test(collection._HashMap._isStringKey(key))) {
          let strings = this[_strings$];
          if (strings == null) this[_strings$] = strings = collection._HashMap._newHashTable();
          this[_addHashTableEntry$](strings, key, value);
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          let nums = this[_nums$];
          if (nums == null) this[_nums$] = nums = collection._HashMap._newHashTable();
          this[_addHashTableEntry$](nums, key, value);
        } else {
          this[_set](key, value);
        }
        return value;
      }
      [_set](key, value) {
        K._check(key);
        V._check(value);
        let rest = this[_rest$];
        if (rest == null) this[_rest$] = rest = collection._HashMap._newHashTable();
        let hash = this[_computeHashCode](key);
        let bucket = rest[hash];
        if (bucket == null) {
          collection._HashMap._setTableEntry(rest, hash, [key, value]);
          this[_length$1] = dart.notNull(this[_length$1]) + 1;
          this[_keys] = null;
        } else {
          let index = this[_findBucketIndex](bucket, key);
          if (dart.notNull(index) >= 0) {
            bucket[dart.notNull(index) + 1] = value;
          } else {
            bucket.push(key, value);
            this[_length$1] = dart.notNull(this[_length$1]) + 1;
            this[_keys] = null;
          }
        }
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) return this._get(key);
        let value = ifAbsent();
        this._set(key, value);
        return value;
      }
      remove(key) {
        if (dart.test(collection._HashMap._isStringKey(key))) {
          return this[_removeHashTableEntry$](this[_strings$], key);
        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
          return this[_removeHashTableEntry$](this[_nums$], key);
        } else {
          return this[_remove](key);
        }
      }
      [_remove](key) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, key);
        let index = this[_findBucketIndex](bucket, key);
        if (dart.notNull(index) < 0) return null;
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_keys] = null;
        return bucket.splice(index, 2)[1];
      }
      clear() {
        if (dart.notNull(this[_length$1]) > 0) {
          this[_strings$] = this[_nums$] = this[_rest$] = this[_keys] = null;
          this[_length$1] = 0;
        }
      }
      forEach(action) {
        let keys = this[_computeKeys]();
        for (let i = 0, length = keys[dartx.length]; i < dart.notNull(length); i++) {
          let key = keys[i];
          action(K._check(key), this._get(key));
          if (keys !== this[_keys]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      [_computeKeys]() {
        if (this[_keys] != null) return this[_keys];
        let result = ListOfK().new(this[_length$1]);
        let index = 0;
        let strings = this[_strings$];
        if (strings != null) {
          let names = Object.getOwnPropertyNames(strings);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let key = names[i];
            result[index] = key;
            index++;
          }
        }
        let nums = this[_nums$];
        if (nums != null) {
          let names = Object.getOwnPropertyNames(nums);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let key = +names[i];
            result[index] = key;
            index++;
          }
        }
        let rest = this[_rest$];
        if (rest != null) {
          let names = Object.getOwnPropertyNames(rest);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let key = names[i];
            let bucket = rest[key];
            let length = bucket.length;
            for (let i = 0; i < length; i = i + 2) {
              let key = bucket[i];
              result[index] = key;
              index++;
            }
          }
        }
        dart.assert(index == this[_length$1]);
        return this[_keys] = result;
      }
      [_addHashTableEntry$](table, key, value) {
        K._check(key);
        V._check(value);
        if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
          this[_length$1] = dart.notNull(this[_length$1]) + 1;
          this[_keys] = null;
        }
        collection._HashMap._setTableEntry(table, key, value);
      }
      [_removeHashTableEntry$](table, key) {
        if (table != null && dart.test(collection._HashMap._hasTableEntry(table, key))) {
          let value = V._check(collection._HashMap._getTableEntry(table, key));
          collection._HashMap._deleteTableEntry(table, key);
          this[_length$1] = dart.notNull(this[_length$1]) - 1;
          this[_keys] = null;
          return value;
        } else {
          return null;
        }
      }
      static _isStringKey(key) {
        return typeof key == 'string' && key != '__proto__';
      }
      static _isNumericKey(key) {
        return typeof key == 'number' && (key & 0x3ffffff) === key;
      }
      [_computeHashCode](key) {
        return dart.hashCode(key) & 0x3ffffff;
      }
      static _hasTableEntry(table, key) {
        let entry = table[key];
        return entry != null;
      }
      static _getTableEntry(table, key) {
        let entry = table[key];
        return entry === table ? null : entry;
      }
      static _setTableEntry(table, key, value) {
        if (value == null) {
          table[key] = table;
        } else {
          table[key] = value;
        }
      }
      static _deleteTableEntry(table, key) {
        delete table[key];
      }
      [_getBucket$](table, key) {
        let hash = this[_computeHashCode](key);
        return table[hash];
      }
      [_findBucketIndex](bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i = i + 2) {
          if (dart.equals(bucket[i], key)) return i;
        }
        return -1;
      }
      static _newHashTable() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        collection._HashMap._setTableEntry(table, temporaryKey, table);
        collection._HashMap._deleteTableEntry(table, temporaryKey);
        return table;
      }
    }
    dart.addTypeTests(_HashMap);
    _HashMap[dart.implements] = () => [HashMapOfK$V()];
    dart.setSignature(_HashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashMap$(K, V), [])}),
      fields: () => ({
        [_length$1]: core.int,
        [_strings$]: dart.dynamic,
        [_nums$]: dart.dynamic,
        [_rest$]: dart.dynamic,
        [_keys]: ListOfK()
      }),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        [_containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        [_get]: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        [_set]: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        [_remove]: dart.definiteFunctionType(V, [core.Object]),
        clear: dart.definiteFunctionType(dart.void, []),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        [_computeKeys]: dart.definiteFunctionType(core.List$(K), []),
        [_addHashTableEntry$]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
        [_removeHashTableEntry$]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getBucket$]: dart.definiteFunctionType(core.List, [dart.dynamic, dart.dynamic]),
        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, core.Object])
      }),
      statics: () => ({
        _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
        _getTableEntry: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
      }),
      names: ['_isStringKey', '_isNumericKey', '_hasTableEntry', '_getTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
    });
    dart.defineExtensionMembers(_HashMap, [
      'containsKey',
      'containsValue',
      'addAll',
      '_get',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'forEach',
      'length',
      'isEmpty',
      'isNotEmpty',
      'keys',
      'values'
    ]);
    return _HashMap;
  });
  collection._HashMap = _HashMap();
  collection._IdentityHashMap$ = dart.generic((K, V) => {
    class _IdentityHashMap extends collection._HashMap$(K, V) {
      new() {
        super.new();
      }
      [_computeHashCode](key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i = i + 2) {
          if (core.identical(bucket[i], key)) return i;
        }
        return -1;
      }
    }
    return _IdentityHashMap;
  });
  collection._IdentityHashMap = _IdentityHashMap();
  const _equals$ = Symbol('_equals');
  const _hashCode = Symbol('_hashCode');
  const _validKey = Symbol('_validKey');
  collection._CustomHashMap$ = dart.generic((K, V) => {
    let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
    let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
    class _CustomHashMap extends collection._HashMap$(K, V) {
      new(equals, hashCode, validKey) {
        this[_equals$] = equals;
        this[_hashCode] = hashCode;
        this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
        super.new();
      }
      _get(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super[_get](key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        super[_set](key, value);
        return value;
      }
      containsKey(key) {
        if (!dart.test(this[_validKey](key))) return false;
        return super[_containsKey](key);
      }
      remove(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super[_remove](key);
      }
      [_computeHashCode](key) {
        return this[_hashCode](K._check(key)) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i = i + 2) {
          if (dart.test(this[_equals$](bucket[i], K._check(key)))) return i;
        }
        return -1;
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    dart.setSignature(_CustomHashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
      fields: () => ({
        [_equals$]: _EqualityOfK(),
        [_hashCode]: _HasherOfK(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        remove: dart.definiteFunctionType(V, [core.Object])
      })
    });
    dart.defineExtensionMembers(_CustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
    return _CustomHashMap;
  });
  collection._CustomHashMap = _CustomHashMap();
  const _map$0 = Symbol('_map');
  collection._HashMapKeyIterable$ = dart.generic(E => {
    let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
    class _HashMapKeyIterable extends core.Iterable$(E) {
      new(map) {
        this[_map$0] = map;
        super.new();
      }
      get length() {
        return this[_map$0][_length$1];
      }
      get isEmpty() {
        return this[_map$0][_length$1] == 0;
      }
      get iterator() {
        return new (_HashMapKeyIteratorOfE())(this[_map$0], this[_map$0][_computeKeys]());
      }
      contains(element) {
        return this[_map$0].containsKey(element);
      }
      forEach(f) {
        let keys = this[_map$0][_computeKeys]();
        for (let i = 0, length = keys.length; i < length; i++) {
          f(keys[i]);
          if (keys !== this[_map$0][_keys]) {
            dart.throw(new core.ConcurrentModificationError(this[_map$0]));
          }
        }
      }
    }
    _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_HashMapKeyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
      fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({forEach: dart.definiteFunctionType(dart.void, [ETovoid()])})
    });
    dart.defineExtensionMembers(_HashMapKeyIterable, [
      'contains',
      'forEach',
      'length',
      'isEmpty',
      'iterator'
    ]);
    return _HashMapKeyIterable;
  });
  collection._HashMapKeyIterable = _HashMapKeyIterable();
  const _offset = Symbol('_offset');
  const _current$2 = Symbol('_current');
  collection._HashMapKeyIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    class _HashMapKeyIterator extends core.Object {
      new(map, keys) {
        this[_map$0] = map;
        this[_keys] = keys;
        this[_offset] = 0;
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        let keys = this[_keys];
        let offset = this[_offset];
        if (keys !== this[_map$0][_keys]) {
          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
        } else if (dart.notNull(offset) >= keys.length) {
          this[_current$2] = null;
          return false;
        } else {
          this[_current$2] = keys[offset];
          this[_offset] = dart.notNull(offset) + 1;
          return true;
        }
      }
    }
    dart.addTypeTests(_HashMapKeyIterator);
    _HashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_HashMapKeyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterator$(E), [_HashMapOfE$dynamic(), ListOfE()])}),
      fields: () => ({
        [_map$0]: _HashMapOfE$dynamic(),
        [_keys]: ListOfE(),
        [_offset]: core.int,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _HashMapKeyIterator;
  });
  collection._HashMapKeyIterator = _HashMapKeyIterator();
  collection._LinkedIdentityHashMap$ = dart.generic((K, V) => {
    let _Es6LinkedIdentityHashMapOfK$V = () => (_Es6LinkedIdentityHashMapOfK$V = dart.constFn(collection._Es6LinkedIdentityHashMap$(K, V)))();
    let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
    class _LinkedIdentityHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
      static get _supportsEs6Maps() {
        return true;
      }
      static es6() {
        return collection._USE_ES6_MAPS && dart.test(collection._LinkedIdentityHashMap._supportsEs6Maps) ? new (_Es6LinkedIdentityHashMapOfK$V())() : new (_LinkedIdentityHashMapOfK$V())();
      }
      new() {
        super.new();
      }
      internalComputeHashCode(key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      internalFindBucketIndex(bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (core.identical(cell.hashMapCellKey, key)) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_LinkedIdentityHashMap, {
      constructors: () => ({
        es6: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), []),
        new: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), [])
      }),
      sgetters: () => ({_supportsEs6Maps: dart.definiteFunctionType(core.bool, [])})
    });
    return _LinkedIdentityHashMap;
  });
  collection._LinkedIdentityHashMap = _LinkedIdentityHashMap();
  const _modifications$ = Symbol('_modifications');
  const _modified$ = Symbol('_modified');
  collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
    let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
    let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
    class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
      new() {
        this[_map$0] = new Map();
        this[_modifications$] = 0;
        super.new();
      }
      get length() {
        return this[_map$0].size;
      }
      get isEmpty() {
        return this.length == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      get keys() {
        return new (_Es6MapIterableOfK())(this, true);
      }
      get values() {
        return new (_Es6MapIterableOfV())(this, false);
      }
      containsKey(key) {
        return this[_map$0].has(key);
      }
      containsValue(value) {
        return this.values[dartx.any](dart.fn(each => dart.equals(each, value), VTobool()));
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      _get(key) {
        return this[_map$0].get(key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        this[_map$0].set(key, value);
        this[_modified$]();
        return value;
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) return this._get(key);
        let value = ifAbsent();
        this._set(key, value);
        return value;
      }
      remove(key) {
        let value = this._get(key);
        this[_map$0].delete(key);
        this[_modified$]();
        return value;
      }
      clear() {
        this[_map$0].clear();
        this[_modified$]();
      }
      forEach(action) {
        let jsEntries = this[_map$0].entries();
        let modifications = this[_modifications$];
        while (true) {
          let next = jsEntries.next();
          let done = next.done;
          if (done) break;
          let entry = next.value;
          let key = entry[0];
          let value = entry[1];
          action(K._check(key), V._check(value));
          if (modifications != this[_modifications$]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
        }
      }
      [_modified$]() {
        this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    _Es6LinkedIdentityHashMap[dart.implements] = () => [InternalMapOfK$V()];
    dart.setSignature(_Es6LinkedIdentityHashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._Es6LinkedIdentityHashMap$(K, V), [])}),
      fields: () => ({
        [_map$0]: dart.dynamic,
        [_modifications$]: core.int
      }),
      getters: () => ({
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        [_modified$]: dart.definiteFunctionType(dart.void, [])
      })
    });
    dart.defineExtensionMembers(_Es6LinkedIdentityHashMap, [
      'containsKey',
      'containsValue',
      'addAll',
      '_get',
      '_set',
      'putIfAbsent',
      'remove',
      'clear',
      'forEach',
      'length',
      'isEmpty',
      'isNotEmpty',
      'keys',
      'values'
    ]);
    return _Es6LinkedIdentityHashMap;
  });
  collection._Es6LinkedIdentityHashMap = _Es6LinkedIdentityHashMap();
  const _isKeys = Symbol('_isKeys');
  collection._Es6MapIterable$ = dart.generic(E => {
    let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class _Es6MapIterable extends core.Iterable$(E) {
      new(map, isKeys) {
        this[_map$0] = map;
        this[_isKeys] = isKeys;
        super.new();
      }
      get length() {
        return core.int._check(dart.dload(this[_map$0], 'length'));
      }
      get isEmpty() {
        return core.bool._check(dart.dload(this[_map$0], 'isEmpty'));
      }
      get iterator() {
        return new (_Es6MapIteratorOfE())(this[_map$0], core.int._check(dart.dload(this[_map$0], _modifications$)), this[_isKeys]);
      }
      contains(element) {
        return core.bool._check(dart.dsend(this[_map$0], 'containsKey', element));
      }
      forEach(f) {
        let jsIterator = null;
        if (dart.test(this[_isKeys])) {
          jsIterator = dart.dload(this[_map$0], _map$0).keys();
        } else {
          jsIterator = dart.dload(this[_map$0], _map$0).values();
        }
        let modifications = core.int._check(dart.dload(this[_map$0], _modifications$));
        while (true) {
          let next = jsIterator.next();
          let done = next.done;
          if (done) break;
          let value = next.value;
          f(E._check(value));
          if (!dart.equals(modifications, dart.dload(this[_map$0], _modifications$))) {
            dart.throw(new core.ConcurrentModificationError(this[_map$0]));
          }
        }
      }
    }
    _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_Es6MapIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
      fields: () => ({
        [_map$0]: dart.dynamic,
        [_isKeys]: core.bool
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({forEach: dart.definiteFunctionType(dart.void, [ETovoid()])})
    });
    dart.defineExtensionMembers(_Es6MapIterable, [
      'contains',
      'forEach',
      'length',
      'isEmpty',
      'iterator'
    ]);
    return _Es6MapIterable;
  });
  collection._Es6MapIterable = _Es6MapIterable();
  const _jsIterator$ = Symbol('_jsIterator');
  const _next$0 = Symbol('_next');
  const _done = Symbol('_done');
  collection._Es6MapIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class _Es6MapIterator extends core.Object {
      new(map, modifications, isKeys) {
        this[_map$0] = map;
        this[_modifications$] = modifications;
        this[_isKeys] = isKeys;
        this[_jsIterator$] = null;
        this[_next$0] = null;
        this[_current$2] = null;
        this[_done] = null;
        if (dart.test(this[_isKeys])) {
          this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
        } else {
          this[_jsIterator$] = dart.dload(this[_map$0], _map$0).values();
        }
        this[_done] = false;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
        }
        if (dart.test(this[_done])) return false;
        this[_next$0] = this[_jsIterator$].next();
        let done = this[_next$0].done;
        if (done) {
          this[_current$2] = null;
          this[_done] = true;
          return false;
        } else {
          this[_current$2] = this[_next$0].value;
          return true;
        }
      }
    }
    dart.addTypeTests(_Es6MapIterator);
    _Es6MapIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_Es6MapIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterator$(E), [dart.dynamic, core.int, core.bool])}),
      fields: () => ({
        [_map$0]: dart.dynamic,
        [_modifications$]: core.int,
        [_isKeys]: core.bool,
        [_jsIterator$]: dart.dynamic,
        [_next$0]: dart.dynamic,
        [_current$2]: E,
        [_done]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _Es6MapIterator;
  });
  collection._Es6MapIterator = _Es6MapIterator();
  collection._LinkedCustomHashMap$ = dart.generic((K, V) => {
    let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
    let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
    class _LinkedCustomHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
      new(equals, hashCode, validKey) {
        this[_equals$] = equals;
        this[_hashCode] = hashCode;
        this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
        super.new();
      }
      _get(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super.internalGet(key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        super.internalSet(key, value);
        return value;
      }
      containsKey(key) {
        if (!dart.test(this[_validKey](key))) return false;
        return super.internalContainsKey(key);
      }
      remove(key) {
        if (!dart.test(this[_validKey](key))) return null;
        return super.internalRemove(key);
      }
      internalComputeHashCode(key) {
        return this[_hashCode](K._check(key)) & 0x3ffffff;
      }
      internalFindBucketIndex(bucket, key) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.test(this[_equals$](cell.hashMapCellKey, K._check(key)))) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_LinkedCustomHashMap, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
      fields: () => ({
        [_equals$]: _EqualityOfK(),
        [_hashCode]: _HasherOfK(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        remove: dart.definiteFunctionType(V, [core.Object])
      })
    });
    dart.defineExtensionMembers(_LinkedCustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
    return _LinkedCustomHashMap;
  });
  collection._LinkedCustomHashMap = _LinkedCustomHashMap();
  const _elements = Symbol('_elements');
  const _newSet = Symbol('_newSet');
  const _computeElements = Symbol('_computeElements');
  const _contains = Symbol('_contains');
  const _lookup = Symbol('_lookup');
  const _add$0 = Symbol('_add');
  collection.SetMixin$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class SetMixin extends core.Object {
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
      get isEmpty() {
        return this.length == 0;
      }
      get isNotEmpty() {
        return this.length != 0;
      }
      clear() {
        this.removeAll(this.toList());
      }
      addAll(elements) {
        IterableOfE()._check(elements);
        for (let element of elements)
          this.add(element);
      }
      removeAll(elements) {
        for (let element of elements)
          this.remove(element);
      }
      retainAll(elements) {
        let toRemove = this.toSet();
        for (let o of elements) {
          toRemove.remove(o);
        }
        this.removeAll(toRemove);
      }
      removeWhere(test) {
        let toRemove = [];
        for (let element of this) {
          if (dart.test(test(element))) toRemove[dartx.add](element);
        }
        this.removeAll(toRemove);
      }
      retainWhere(test) {
        let toRemove = [];
        for (let element of this) {
          if (!dart.test(test(element))) toRemove[dartx.add](element);
        }
        this.removeAll(toRemove);
      }
      containsAll(other) {
        for (let o of other) {
          if (!dart.test(this.contains(o))) return false;
        }
        return true;
      }
      union(other) {
        SetOfE()._check(other);
        let _ = this.toSet();
        _.addAll(other);
        return _;
      }
      intersection(other) {
        let result = this.toSet();
        for (let element of this) {
          if (!dart.test(other.contains(element))) result.remove(element);
        }
        return result;
      }
      difference(other) {
        let result = this.toSet();
        for (let element of this) {
          if (dart.test(other.contains(element))) result.remove(element);
        }
        return result;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = dart.test(growable) ? (() => {
          let _ = ListOfE().new();
          _[dartx.length] = this.length;
          return _;
        })() : ListOfE().new(this.length);
        let i = 0;
        for (let element of this)
          result[dartx._set](i++, element);
        return result;
      }
      map(T) {
        return f => {
          return new (_internal.EfficientLengthMappedIterable$(E, T))(this, f);
        };
      }
      get single() {
        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
        let it = this.iterator;
        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
        let result = it.current;
        return result;
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '{', '}');
      }
      where(f) {
        return new (WhereIterableOfE())(this, f);
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      forEach(f) {
        for (let element of this)
          f(element);
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let value = iterator.current;
        while (dart.test(iterator.moveNext())) {
          value = combine(value, iterator.current);
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          for (let element of this)
            value = combine(value, element);
          return value;
        };
      }
      every(f) {
        for (let element of this) {
          if (!dart.test(f(element))) return false;
        }
        return true;
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) return "";
        let buffer = new core.StringBuffer();
        if (separator == null || separator == "") {
          do {
            buffer.write(dart.str`${iterator.current}`);
          } while (dart.test(iterator.moveNext()));
        } else {
          buffer.write(dart.str`${iterator.current}`);
          while (dart.test(iterator.moveNext())) {
            buffer.write(separator);
            buffer.write(dart.str`${iterator.current}`);
          }
        }
        return buffer.toString();
      }
      any(test) {
        for (let element of this) {
          if (dart.test(test(element))) return true;
        }
        return false;
      }
      take(n) {
        return TakeIterableOfE().new(this, n);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      skip(n) {
        return SkipIterableOfE().new(this, n);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      get first() {
        let it = this.iterator;
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        return it.current;
      }
      get last() {
        let it = this.iterator;
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = null;
        do {
          result = it.current;
        } while (dart.test(it.moveNext()));
        return result;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        for (let element of this) {
          if (dart.test(test(element))) return element;
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            if (foundMatching) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
        core.RangeError.checkNotNegative(index, "index");
        let elementIndex = 0;
        for (let element of this) {
          if (index == elementIndex) return element;
          elementIndex++;
        }
        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
      }
    }
    dart.addTypeTests(SetMixin);
    SetMixin[dart.implements] = () => [SetOfE()];
    dart.setSignature(SetMixin, {
      getters: () => ({
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        single: dart.definiteFunctionType(E, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        clear: dart.definiteFunctionType(dart.void, []),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
        retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
        union: dart.definiteFunctionType(core.Set$(E), [SetOfE()]),
        intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        elementAt: dart.definiteFunctionType(E, [core.int])
      })
    });
    dart.defineExtensionMembers(SetMixin, [
      'toList',
      'map',
      'toString',
      'where',
      'expand',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'isEmpty',
      'isNotEmpty',
      'single',
      'first',
      'last'
    ]);
    return SetMixin;
  });
  collection.SetMixin = SetMixin();
  collection.SetBase$ = dart.generic(E => {
    class SetBase extends collection.SetMixin$(E) {
      static setToString(set) {
        return collection.IterableBase.iterableToFullString(set, '{', '}');
      }
    }
    dart.setSignature(SetBase, {
      statics: () => ({setToString: dart.definiteFunctionType(core.String, [core.Set])}),
      names: ['setToString']
    });
    return SetBase;
  });
  collection.SetBase = SetBase();
  collection._HashSetBase$ = dart.generic(E => {
    class _HashSetBase extends collection.SetBase$(E) {
      difference(other) {
        let result = this[_newSet]();
        for (let element of this) {
          if (!dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      intersection(other) {
        let result = this[_newSet]();
        for (let element of this) {
          if (dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      toSet() {
        return (() => {
          let _ = this[_newSet]();
          _.addAll(this);
          return _;
        })();
      }
    }
    dart.setSignature(_HashSetBase, {
      methods: () => ({
        difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(_HashSetBase, ['toSet']);
    return _HashSetBase;
  });
  collection._HashSetBase = _HashSetBase();
  collection._HashSet$ = dart.generic(E => {
    let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
    let _HashSetIteratorOfE = () => (_HashSetIteratorOfE = dart.constFn(collection._HashSetIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
    class _HashSet extends collection._HashSetBase$(E) {
      new() {
        this[_length$1] = 0;
        this[_strings$] = null;
        this[_nums$] = null;
        this[_rest$] = null;
        this[_elements] = null;
      }
      [_newSet]() {
        return new (_HashSetOfE())();
      }
      get iterator() {
        return new (_HashSetIteratorOfE())(this, this[_computeElements]());
      }
      get length() {
        return this[_length$1];
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      contains(object) {
        if (dart.test(collection._HashSet._isStringElement(object))) {
          let strings = this[_strings$];
          return strings == null ? false : collection._HashSet._hasTableEntry(strings, object);
        } else if (dart.test(collection._HashSet._isNumericElement(object))) {
          let nums = this[_nums$];
          return nums == null ? false : collection._HashSet._hasTableEntry(nums, object);
        } else {
          return this[_contains](object);
        }
      }
      [_contains](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
      }
      lookup(object) {
        if (dart.test(collection._HashSet._isStringElement(object)) || dart.test(collection._HashSet._isNumericElement(object))) {
          return E._check(dart.test(this.contains(object)) ? object : null);
        }
        return this[_lookup](object);
      }
      [_lookup](object) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return null;
        return bucket[dartx._get](index);
      }
      add(element) {
        E._check(element);
        if (dart.test(collection._HashSet._isStringElement(element))) {
          let strings = this[_strings$];
          if (strings == null) this[_strings$] = strings = collection._HashSet._newHashTable();
          return this[_addHashTableEntry$](strings, element);
        } else if (dart.test(collection._HashSet._isNumericElement(element))) {
          let nums = this[_nums$];
          if (nums == null) this[_nums$] = nums = collection._HashSet._newHashTable();
          return this[_addHashTableEntry$](nums, element);
        } else {
          return this[_add$0](element);
        }
      }
      [_add$0](element) {
        E._check(element);
        let rest = this[_rest$];
        if (rest == null) this[_rest$] = rest = collection._HashSet._newHashTable();
        let hash = this[_computeHashCode](element);
        let bucket = rest[hash];
        if (bucket == null) {
          collection._HashSet._setTableEntry(rest, hash, [element]);
        } else {
          let index = this[_findBucketIndex](bucket, element);
          if (dart.notNull(index) >= 0) return false;
          bucket.push(element);
        }
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_elements] = null;
        return true;
      }
      addAll(objects) {
        IterableOfE()._check(objects);
        for (let each of objects) {
          this.add(each);
        }
      }
      remove(object) {
        if (dart.test(collection._HashSet._isStringElement(object))) {
          return this[_removeHashTableEntry$](this[_strings$], object);
        } else if (dart.test(collection._HashSet._isNumericElement(object))) {
          return this[_removeHashTableEntry$](this[_nums$], object);
        } else {
          return this[_remove](object);
        }
      }
      [_remove](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return false;
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_elements] = null;
        bucket.splice(index, 1);
        return true;
      }
      clear() {
        if (dart.notNull(this[_length$1]) > 0) {
          this[_strings$] = this[_nums$] = this[_rest$] = this[_elements] = null;
          this[_length$1] = 0;
        }
      }
      [_computeElements]() {
        if (this[_elements] != null) return this[_elements];
        let result = ListOfE().new(this[_length$1]);
        let index = 0;
        let strings = this[_strings$];
        if (strings != null) {
          let names = Object.getOwnPropertyNames(strings);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let element = names[i];
            result[index] = element;
            index++;
          }
        }
        let nums = this[_nums$];
        if (nums != null) {
          let names = Object.getOwnPropertyNames(nums);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let element = +names[i];
            result[index] = element;
            index++;
          }
        }
        let rest = this[_rest$];
        if (rest != null) {
          let names = Object.getOwnPropertyNames(rest);
          let entries = names.length;
          for (let i = 0; i < entries; i++) {
            let entry = names[i];
            let bucket = rest[entry];
            let length = bucket.length;
            for (let i = 0; i < length; i++) {
              result[index] = bucket[i];
              index++;
            }
          }
        }
        dart.assert(index == this[_length$1]);
        return this[_elements] = result;
      }
      [_addHashTableEntry$](table, element) {
        E._check(element);
        if (dart.test(collection._HashSet._hasTableEntry(table, element))) return false;
        collection._HashSet._setTableEntry(table, element, 0);
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_elements] = null;
        return true;
      }
      [_removeHashTableEntry$](table, element) {
        if (table != null && dart.test(collection._HashSet._hasTableEntry(table, element))) {
          collection._HashSet._deleteTableEntry(table, element);
          this[_length$1] = dart.notNull(this[_length$1]) - 1;
          this[_elements] = null;
          return true;
        } else {
          return false;
        }
      }
      static _isStringElement(element) {
        return typeof element == 'string' && element != '__proto__';
      }
      static _isNumericElement(element) {
        return typeof element == 'number' && (element & 0x3ffffff) === element;
      }
      [_computeHashCode](element) {
        return dart.hashCode(element) & 0x3ffffff;
      }
      static _hasTableEntry(table, key) {
        let entry = table[key];
        return entry != null;
      }
      static _setTableEntry(table, key, value) {
        dart.assert(value != null);
        table[key] = value;
      }
      static _deleteTableEntry(table, key) {
        delete table[key];
      }
      [_getBucket$](table, element) {
        let hash = this[_computeHashCode](element);
        return table[hash];
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          if (dart.equals(bucket[i], element)) return i;
        }
        return -1;
      }
      static _newHashTable() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        collection._HashSet._setTableEntry(table, temporaryKey, table);
        collection._HashSet._deleteTableEntry(table, temporaryKey);
        return table;
      }
    }
    _HashSet[dart.implements] = () => [HashSetOfE()];
    dart.setSignature(_HashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashSet$(E), [])}),
      fields: () => ({
        [_length$1]: core.int,
        [_strings$]: dart.dynamic,
        [_nums$]: dart.dynamic,
        [_rest$]: dart.dynamic,
        [_elements]: ListOfE()
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        length: dart.definiteFunctionType(core.int, [])
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
        lookup: dart.definiteFunctionType(E, [core.Object]),
        [_lookup]: dart.definiteFunctionType(E, [core.Object]),
        add: dart.definiteFunctionType(core.bool, [E]),
        [_add$0]: dart.definiteFunctionType(core.bool, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
        [_computeElements]: dart.definiteFunctionType(core.List$(E), []),
        [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
        [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getBucket$]: dart.definiteFunctionType(core.List$(E), [dart.dynamic, dart.dynamic]),
        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
      }),
      statics: () => ({
        _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
      }),
      names: ['_isStringElement', '_isNumericElement', '_hasTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
    });
    dart.defineExtensionMembers(_HashSet, [
      'contains',
      'iterator',
      'length',
      'isEmpty',
      'isNotEmpty'
    ]);
    return _HashSet;
  });
  collection._HashSet = _HashSet();
  collection._IdentityHashSet$ = dart.generic(E => {
    let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
    class _IdentityHashSet extends collection._HashSet$(E) {
      new() {
        super.new();
      }
      [_newSet]() {
        return new (_IdentityHashSetOfE())();
      }
      [_computeHashCode](key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          if (core.identical(bucket[i], element)) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_IdentityHashSet, {
      methods: () => ({[_newSet]: dart.definiteFunctionType(core.Set$(E), [])})
    });
    return _IdentityHashSet;
  });
  collection._IdentityHashSet = _IdentityHashSet();
  const _equality = Symbol('_equality');
  const _hasher = Symbol('_hasher');
  collection._CustomHashSet$ = dart.generic(E => {
    let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
    let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
    let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
    class _CustomHashSet extends collection._HashSet$(E) {
      new(equality, hasher, validKey) {
        this[_equality] = equality;
        this[_hasher] = hasher;
        this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
        super.new();
      }
      [_newSet]() {
        return new (_CustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          if (dart.test(this[_equality](bucket[i], E._check(element)))) return i;
        }
        return -1;
      }
      [_computeHashCode](element) {
        return this[_hasher](E._check(element)) & 0x3ffffff;
      }
      add(object) {
        E._check(object);
        return super[_add$0](object);
      }
      contains(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_contains](object);
      }
      lookup(object) {
        if (!dart.test(this[_validKey](object))) return null;
        return super[_lookup](object);
      }
      remove(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_remove](object);
      }
    }
    dart.setSignature(_CustomHashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
      fields: () => ({
        [_equality]: _EqualityOfE(),
        [_hasher]: _HasherOfE(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        add: dart.definiteFunctionType(core.bool, [E]),
        lookup: dart.definiteFunctionType(E, [core.Object])
      })
    });
    dart.defineExtensionMembers(_CustomHashSet, ['contains']);
    return _CustomHashSet;
  });
  collection._CustomHashSet = _CustomHashSet();
  collection._HashSetIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    class _HashSetIterator extends core.Object {
      new(set, elements) {
        this[_set] = set;
        this[_elements] = elements;
        this[_offset] = 0;
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        let elements = this[_elements];
        let offset = this[_offset];
        if (elements !== dart.dload(this[_set], _elements)) {
          dart.throw(new core.ConcurrentModificationError(this[_set]));
        } else if (dart.notNull(offset) >= elements.length) {
          this[_current$2] = null;
          return false;
        } else {
          this[_current$2] = elements[offset];
          this[_offset] = dart.notNull(offset) + 1;
          return true;
        }
      }
    }
    dart.addTypeTests(_HashSetIterator);
    _HashSetIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_HashSetIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._HashSetIterator$(E), [dart.dynamic, ListOfE()])}),
      fields: () => ({
        [_set]: dart.dynamic,
        [_elements]: ListOfE(),
        [_offset]: core.int,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _HashSetIterator;
  });
  collection._HashSetIterator = _HashSetIterator();
  const _first$ = Symbol('_first');
  const _last$ = Symbol('_last');
  const _unsupported = Symbol('_unsupported');
  const _getTableEntry = Symbol('_getTableEntry');
  const _element = Symbol('_element');
  const _newLinkedCell$ = Symbol('_newLinkedCell');
  const _unlinkCell$ = Symbol('_unlinkCell');
  const _filterWhere = Symbol('_filterWhere');
  const _previous$0 = Symbol('_previous');
  collection._LinkedHashSet$ = dart.generic(E => {
    let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
    let _LinkedHashSetIteratorOfE = () => (_LinkedHashSetIteratorOfE = dart.constFn(collection._LinkedHashSetIterator$(E)))();
    let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class _LinkedHashSet extends collection._HashSetBase$(E) {
      new() {
        this[_length$1] = 0;
        this[_strings$] = null;
        this[_nums$] = null;
        this[_rest$] = null;
        this[_first$] = null;
        this[_last$] = null;
        this[_modifications$] = 0;
      }
      [_newSet]() {
        return new (_LinkedHashSetOfE())();
      }
      [_unsupported](operation) {
        dart.throw(dart.str`LinkedHashSet: unsupported ${operation}`);
      }
      get iterator() {
        return new (_LinkedHashSetIteratorOfE())(this, this[_modifications$]);
      }
      get length() {
        return this[_length$1];
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      contains(object) {
        if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
          let strings = this[_strings$];
          if (strings == null) return false;
          let cell = this[_getTableEntry](strings, object);
          return cell != null;
        } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
          let nums = this[_nums$];
          if (nums == null) return false;
          let cell = this[_getTableEntry](nums, object);
          return cell != null;
        } else {
          return this[_contains](object);
        }
      }
      [_contains](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
      }
      lookup(object) {
        if (dart.test(collection._LinkedHashSet._isStringElement(object)) || dart.test(collection._LinkedHashSet._isNumericElement(object))) {
          return E._check(dart.test(this.contains(object)) ? object : null);
        } else {
          return this[_lookup](object);
        }
      }
      [_lookup](object) {
        let rest = this[_rest$];
        if (rest == null) return null;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return null;
        return bucket[dartx._get](index)[_element];
      }
      forEach(action) {
        let cell = this[_first$];
        let modifications = this[_modifications$];
        while (cell != null) {
          action(cell[_element]);
          if (modifications != this[_modifications$]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          cell = cell[_next$0];
        }
      }
      get first() {
        if (this[_first$] == null) dart.throw(new core.StateError("No elements"));
        return this[_first$][_element];
      }
      get last() {
        if (this[_last$] == null) dart.throw(new core.StateError("No elements"));
        return this[_last$][_element];
      }
      add(element) {
        E._check(element);
        if (dart.test(collection._LinkedHashSet._isStringElement(element))) {
          let strings = this[_strings$];
          if (strings == null) this[_strings$] = strings = collection._LinkedHashSet._newHashTable();
          return this[_addHashTableEntry$](strings, element);
        } else if (dart.test(collection._LinkedHashSet._isNumericElement(element))) {
          let nums = this[_nums$];
          if (nums == null) this[_nums$] = nums = collection._LinkedHashSet._newHashTable();
          return this[_addHashTableEntry$](nums, element);
        } else {
          return this[_add$0](element);
        }
      }
      [_add$0](element) {
        E._check(element);
        let rest = this[_rest$];
        if (rest == null) this[_rest$] = rest = collection._LinkedHashSet._newHashTable();
        let hash = this[_computeHashCode](element);
        let bucket = rest[hash];
        if (bucket == null) {
          let cell = this[_newLinkedCell$](element);
          collection._LinkedHashSet._setTableEntry(rest, hash, [cell]);
        } else {
          let index = this[_findBucketIndex](bucket, element);
          if (dart.notNull(index) >= 0) return false;
          let cell = this[_newLinkedCell$](element);
          bucket.push(cell);
        }
        return true;
      }
      remove(object) {
        if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
          return this[_removeHashTableEntry$](this[_strings$], object);
        } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
          return this[_removeHashTableEntry$](this[_nums$], object);
        } else {
          return this[_remove](object);
        }
      }
      [_remove](object) {
        let rest = this[_rest$];
        if (rest == null) return false;
        let bucket = this[_getBucket$](rest, object);
        let index = this[_findBucketIndex](bucket, object);
        if (dart.notNull(index) < 0) return false;
        let cell = bucket.splice(index, 1)[0];
        this[_unlinkCell$](cell);
        return true;
      }
      removeWhere(test) {
        this[_filterWhere](test, true);
      }
      retainWhere(test) {
        this[_filterWhere](test, false);
      }
      [_filterWhere](test, removeMatching) {
        let cell = this[_first$];
        while (cell != null) {
          let element = cell[_element];
          let next = cell[_next$0];
          let modifications = this[_modifications$];
          let shouldRemove = removeMatching == test(element);
          if (modifications != this[_modifications$]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          if (shouldRemove) this.remove(element);
          cell = next;
        }
      }
      clear() {
        if (dart.notNull(this[_length$1]) > 0) {
          this[_strings$] = this[_nums$] = this[_rest$] = this[_first$] = this[_last$] = null;
          this[_length$1] = 0;
          this[_modified$]();
        }
      }
      [_addHashTableEntry$](table, element) {
        E._check(element);
        let cell = this[_getTableEntry](table, element);
        if (cell != null) return false;
        collection._LinkedHashSet._setTableEntry(table, element, this[_newLinkedCell$](element));
        return true;
      }
      [_removeHashTableEntry$](table, element) {
        if (table == null) return false;
        let cell = this[_getTableEntry](table, element);
        if (cell == null) return false;
        this[_unlinkCell$](cell);
        collection._LinkedHashSet._deleteTableEntry(table, element);
        return true;
      }
      [_modified$]() {
        this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
      }
      [_newLinkedCell$](element) {
        E._check(element);
        let cell = new (_LinkedHashSetCellOfE())(element);
        if (this[_first$] == null) {
          this[_first$] = this[_last$] = cell;
        } else {
          let last = this[_last$];
          cell[_previous$0] = last;
          this[_last$] = last[_next$0] = cell;
        }
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
        this[_modified$]();
        return cell;
      }
      [_unlinkCell$](cell) {
        _LinkedHashSetCellOfE()._check(cell);
        let previous = cell[_previous$0];
        let next = cell[_next$0];
        if (previous == null) {
          dart.assert(dart.equals(cell, this[_first$]));
          this[_first$] = next;
        } else {
          previous[_next$0] = next;
        }
        if (next == null) {
          dart.assert(dart.equals(cell, this[_last$]));
          this[_last$] = previous;
        } else {
          next[_previous$0] = previous;
        }
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        this[_modified$]();
      }
      static _isStringElement(element) {
        return typeof element == 'string' && element != '__proto__';
      }
      static _isNumericElement(element) {
        return typeof element == 'number' && (element & 0x3ffffff) === element;
      }
      [_computeHashCode](element) {
        return dart.hashCode(element) & 0x3ffffff;
      }
      [_getTableEntry](table, key) {
        return table[key];
      }
      static _setTableEntry(table, key, value) {
        dart.assert(value != null);
        table[key] = value;
      }
      static _deleteTableEntry(table, key) {
        delete table[key];
      }
      [_getBucket$](table, element) {
        let hash = this[_computeHashCode](element);
        return table[hash];
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.equals(cell[_element], element)) return i;
        }
        return -1;
      }
      static _newHashTable() {
        let table = Object.create(null);
        let temporaryKey = '<non-identifier-key>';
        collection._LinkedHashSet._setTableEntry(table, temporaryKey, table);
        collection._LinkedHashSet._deleteTableEntry(table, temporaryKey);
        return table;
      }
    }
    _LinkedHashSet[dart.implements] = () => [LinkedHashSetOfE()];
    dart.setSignature(_LinkedHashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSet$(E), [])}),
      fields: () => ({
        [_length$1]: core.int,
        [_strings$]: dart.dynamic,
        [_nums$]: dart.dynamic,
        [_rest$]: dart.dynamic,
        [_first$]: _LinkedHashSetCellOfE(),
        [_last$]: _LinkedHashSetCellOfE(),
        [_modifications$]: core.int
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        length: dart.definiteFunctionType(core.int, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        [_unsupported]: dart.definiteFunctionType(dart.void, [core.String]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
        lookup: dart.definiteFunctionType(E, [core.Object]),
        [_lookup]: dart.definiteFunctionType(E, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        add: dart.definiteFunctionType(core.bool, [E]),
        [_add$0]: dart.definiteFunctionType(core.bool, [E]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
        [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
        [_modified$]: dart.definiteFunctionType(dart.void, []),
        [_newLinkedCell$]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E]),
        [_unlinkCell$]: dart.definiteFunctionType(dart.void, [_LinkedHashSetCellOfE()]),
        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
        [_getTableEntry]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [dart.dynamic, dart.dynamic]),
        [_getBucket$]: dart.definiteFunctionType(core.List$(collection._LinkedHashSetCell$(E)), [dart.dynamic, dart.dynamic]),
        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
      }),
      statics: () => ({
        _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
      }),
      names: ['_isStringElement', '_isNumericElement', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
    });
    dart.defineExtensionMembers(_LinkedHashSet, [
      'contains',
      'forEach',
      'iterator',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last'
    ]);
    return _LinkedHashSet;
  });
  collection._LinkedHashSet = _LinkedHashSet();
  collection._LinkedIdentityHashSet$ = dart.generic(E => {
    let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
    class _LinkedIdentityHashSet extends collection._LinkedHashSet$(E) {
      new() {
        super.new();
      }
      [_newSet]() {
        return new (_LinkedIdentityHashSetOfE())();
      }
      [_computeHashCode](key) {
        return core.identityHashCode(key) & 0x3ffffff;
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (core.identical(cell[_element], element)) return i;
        }
        return -1;
      }
    }
    dart.setSignature(_LinkedIdentityHashSet, {
      methods: () => ({[_newSet]: dart.definiteFunctionType(core.Set$(E), [])})
    });
    return _LinkedIdentityHashSet;
  });
  collection._LinkedIdentityHashSet = _LinkedIdentityHashSet();
  collection._LinkedCustomHashSet$ = dart.generic(E => {
    let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
    let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
    let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
    class _LinkedCustomHashSet extends collection._LinkedHashSet$(E) {
      new(equality, hasher, validKey) {
        this[_equality] = equality;
        this[_hasher] = hasher;
        this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
        super.new();
      }
      [_newSet]() {
        return new (_LinkedCustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
      }
      [_findBucketIndex](bucket, element) {
        if (bucket == null) return -1;
        let length = bucket.length;
        for (let i = 0; i < length; i++) {
          let cell = bucket[i];
          if (dart.test(this[_equality](cell[_element], E._check(element)))) return i;
        }
        return -1;
      }
      [_computeHashCode](element) {
        return this[_hasher](E._check(element)) & 0x3ffffff;
      }
      add(element) {
        E._check(element);
        return super[_add$0](element);
      }
      contains(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_contains](object);
      }
      lookup(object) {
        if (!dart.test(this[_validKey](object))) return null;
        return super[_lookup](object);
      }
      remove(object) {
        if (!dart.test(this[_validKey](object))) return false;
        return super[_remove](object);
      }
      containsAll(elements) {
        for (let element of elements) {
          if (!dart.test(this[_validKey](element)) || !dart.test(this.contains(element))) return false;
        }
        return true;
      }
      removeAll(elements) {
        for (let element of elements) {
          if (dart.test(this[_validKey](element))) {
            super[_remove](element);
          }
        }
      }
    }
    dart.setSignature(_LinkedCustomHashSet, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
      fields: () => ({
        [_equality]: _EqualityOfE(),
        [_hasher]: _HasherOfE(),
        [_validKey]: _PredicateOfObject()
      }),
      methods: () => ({
        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
        add: dart.definiteFunctionType(core.bool, [E]),
        lookup: dart.definiteFunctionType(E, [core.Object])
      })
    });
    dart.defineExtensionMembers(_LinkedCustomHashSet, ['contains']);
    return _LinkedCustomHashSet;
  });
  collection._LinkedCustomHashSet = _LinkedCustomHashSet();
  collection._LinkedHashSetCell$ = dart.generic(E => {
    let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
    class _LinkedHashSetCell extends core.Object {
      new(element) {
        this[_element] = element;
        this[_next$0] = null;
        this[_previous$0] = null;
      }
    }
    dart.addTypeTests(_LinkedHashSetCell);
    dart.setSignature(_LinkedHashSetCell, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
      fields: () => ({
        [_element]: E,
        [_next$0]: _LinkedHashSetCellOfE(),
        [_previous$0]: _LinkedHashSetCellOfE()
      })
    });
    return _LinkedHashSetCell;
  });
  collection._LinkedHashSetCell = _LinkedHashSetCell();
  const _cell$ = Symbol('_cell');
  collection._LinkedHashSetIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class _LinkedHashSetIterator extends core.Object {
      new(set, modifications) {
        this[_set] = set;
        this[_modifications$] = modifications;
        this[_cell$] = null;
        this[_current$2] = null;
        this[_cell$] = collection._LinkedHashSetCell._check(dart.dload(this[_set], _first$));
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        if (!dart.equals(this[_modifications$], dart.dload(this[_set], _modifications$))) {
          dart.throw(new core.ConcurrentModificationError(this[_set]));
        } else if (this[_cell$] == null) {
          this[_current$2] = null;
          return false;
        } else {
          this[_current$2] = E._check(this[_cell$][_element]);
          this[_cell$] = this[_cell$][_next$0];
          return true;
        }
      }
    }
    dart.addTypeTests(_LinkedHashSetIterator);
    _LinkedHashSetIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_LinkedHashSetIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetIterator$(E), [dart.dynamic, core.int])}),
      fields: () => ({
        [_set]: dart.dynamic,
        [_modifications$]: core.int,
        [_cell$]: collection._LinkedHashSetCell,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _LinkedHashSetIterator;
  });
  collection._LinkedHashSetIterator = _LinkedHashSetIterator();
  const _source$0 = Symbol('_source');
  collection.UnmodifiableListView$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
      new(source) {
        this[_source$0] = source;
      }
      get length() {
        return this[_source$0][dartx.length];
      }
      set length(value) {
        super.length = value;
      }
      _get(index) {
        return this[_source$0][dartx.elementAt](index);
      }
    }
    dart.setSignature(UnmodifiableListView, {
      constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
      fields: () => ({[_source$0]: IterableOfE()}),
      getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
      methods: () => ({_get: dart.definiteFunctionType(E, [core.int])})
    });
    dart.defineExtensionMembers(UnmodifiableListView, ['_get', 'length']);
    return UnmodifiableListView;
  });
  collection.UnmodifiableListView = UnmodifiableListView();
  collection._defaultEquals = function(a, b) {
    return dart.equals(a, b);
  };
  dart.lazyFn(collection._defaultEquals, () => dynamicAnddynamicTobool());
  collection._defaultHashCode = function(a) {
    return dart.hashCode(a);
  };
  dart.fn(collection._defaultHashCode, dynamicToint());
  collection._Equality$ = dart.generic(K => {
    const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [K, K]));
    return _Equality;
  });
  collection._Equality = _Equality$();
  collection._Hasher$ = dart.generic(K => {
    const _Hasher = dart.typedef('_Hasher', () => dart.functionType(core.int, [K]));
    return _Hasher;
  });
  collection._Hasher = _Hasher();
  collection.HashMap$ = dart.generic((K, V) => {
    let _HashMapOfK$V = () => (_HashMapOfK$V = dart.constFn(collection._HashMap$(K, V)))();
    let _IdentityHashMapOfK$V = () => (_IdentityHashMapOfK$V = dart.constFn(collection._IdentityHashMap$(K, V)))();
    let _CustomHashMapOfK$V = () => (_CustomHashMapOfK$V = dart.constFn(collection._CustomHashMap$(K, V)))();
    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
    let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    class HashMap extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return new (_HashMapOfK$V())();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return new (_IdentityHashMapOfK$V())();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_CustomHashMapOfK$V())(equals, hashCode, isValidKey);
      }
      static identity() {
        return new (_IdentityHashMapOfK$V())();
      }
      static from(other) {
        let result = HashMapOfK$V().new();
        other[dartx.forEach](dart.fn((k, v) => {
          result._set(K.as(k), V.as(v));
        }, dynamicAnddynamicTovoid$()));
        return result;
      }
      static fromIterable(iterable, opts) {
        let key = opts && 'key' in opts ? opts.key : null;
        let value = opts && 'value' in opts ? opts.value : null;
        let map = HashMapOfK$V().new();
        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
        return map;
      }
      static fromIterables(keys, values) {
        let map = HashMapOfK$V().new();
        collection.Maps._fillMapWithIterables(map, keys, values);
        return map;
      }
    }
    dart.addTypeTests(HashMap);
    HashMap[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(HashMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.HashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.HashMap$(K, V), []),
        from: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Map]),
        fromIterable: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
        fromIterables: dart.definiteFunctionType(collection.HashMap$(K, V), [IterableOfK(), IterableOfV()])
      })
    });
    return HashMap;
  });
  collection.HashMap = HashMap();
  collection.HashSet$ = dart.generic(E => {
    let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
    let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
    let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
    let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
    class HashSet extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return new (_HashSetOfE())();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return new (_IdentityHashSetOfE())();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_CustomHashSetOfE())(equals, hashCode, isValidKey);
      }
      static identity() {
        return new (_IdentityHashSetOfE())();
      }
      static from(elements) {
        let result = HashSetOfE().new();
        for (let e of elements) {
          let element = E.as(e);
          result.add(element);
        }
        return result;
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(HashSet);
    HashSet[dart.implements] = () => [SetOfE()];
    dart.setSignature(HashSet, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.HashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.HashSet$(E), []),
        from: dart.definiteFunctionType(collection.HashSet$(E), [core.Iterable])
      })
    });
    return HashSet;
  });
  collection.HashSet = HashSet();
  collection.IterableMixin$ = dart.generic(E => {
    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class IterableMixin extends core.Object {
      map(T) {
        return f => {
          return _internal.MappedIterable$(E, T).new(this, f);
        };
      }
      where(f) {
        return new (WhereIterableOfE())(this, f);
      }
      expand(T) {
        return f => {
          return new (_internal.ExpandIterable$(E, T))(this, f);
        };
      }
      contains(element) {
        for (let e of this) {
          if (dart.equals(e, element)) return true;
        }
        return false;
      }
      forEach(f) {
        for (let element of this)
          f(element);
      }
      reduce(combine) {
        EAndEToE()._check(combine);
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let value = iterator.current;
        while (dart.test(iterator.moveNext())) {
          value = combine(value, iterator.current);
        }
        return value;
      }
      fold(T) {
        return (initialValue, combine) => {
          let value = initialValue;
          for (let element of this)
            value = combine(value, element);
          return value;
        };
      }
      every(f) {
        for (let element of this) {
          if (!dart.test(f(element))) return false;
        }
        return true;
      }
      join(separator) {
        if (separator === void 0) separator = "";
        let iterator = this.iterator;
        if (!dart.test(iterator.moveNext())) return "";
        let buffer = new core.StringBuffer();
        if (separator == null || separator == "") {
          do {
            buffer.write(dart.str`${iterator.current}`);
          } while (dart.test(iterator.moveNext()));
        } else {
          buffer.write(dart.str`${iterator.current}`);
          while (dart.test(iterator.moveNext())) {
            buffer.write(separator);
            buffer.write(dart.str`${iterator.current}`);
          }
        }
        return buffer.toString();
      }
      any(f) {
        for (let element of this) {
          if (dart.test(f(element))) return true;
        }
        return false;
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        return ListOfE().from(this, {growable: growable});
      }
      toSet() {
        return SetOfE().from(this);
      }
      get length() {
        dart.assert(!_internal.EfficientLength.is(this));
        let count = 0;
        let it = this[dartx.iterator];
        while (dart.test(it.moveNext())) {
          count++;
        }
        return count;
      }
      get isEmpty() {
        return !dart.test(this[dartx.iterator].moveNext());
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      take(count) {
        return TakeIterableOfE().new(this, count);
      }
      takeWhile(test) {
        return new (TakeWhileIterableOfE())(this, test);
      }
      skip(count) {
        return SkipIterableOfE().new(this, count);
      }
      skipWhile(test) {
        return new (SkipWhileIterableOfE())(this, test);
      }
      get first() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        return it.current;
      }
      get last() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) {
          dart.throw(_internal.IterableElementError.noElement());
        }
        let result = null;
        do {
          result = it.current;
        } while (dart.test(it.moveNext()));
        return result;
      }
      get single() {
        let it = this[dartx.iterator];
        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
        let result = it.current;
        if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
        return result;
      }
      firstWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        for (let element of this) {
          if (dart.test(test(element))) return element;
        }
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      lastWhere(test, opts) {
        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
        VoidToE()._check(orElse);
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        if (orElse != null) return orElse();
        dart.throw(_internal.IterableElementError.noElement());
      }
      singleWhere(test) {
        let result = null;
        let foundMatching = false;
        for (let element of this) {
          if (dart.test(test(element))) {
            if (foundMatching) {
              dart.throw(_internal.IterableElementError.tooMany());
            }
            result = element;
            foundMatching = true;
          }
        }
        if (foundMatching) return result;
        dart.throw(_internal.IterableElementError.noElement());
      }
      elementAt(index) {
        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
        core.RangeError.checkNotNegative(index, "index");
        let elementIndex = 0;
        for (let element of this) {
          if (index == elementIndex) return element;
          elementIndex++;
        }
        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
      }
      toString() {
        return collection.IterableBase.iterableToShortString(this, '(', ')');
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(IterableMixin);
    IterableMixin[dart.implements] = () => [IterableOfE()];
    dart.setSignature(IterableMixin, {
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
        contains: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
        every: dart.definiteFunctionType(core.bool, [ETobool()]),
        join: dart.definiteFunctionType(core.String, [], [core.String]),
        any: dart.definiteFunctionType(core.bool, [ETobool()]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        toSet: dart.definiteFunctionType(core.Set$(E), []),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
        elementAt: dart.definiteFunctionType(E, [core.int])
      })
    });
    dart.defineExtensionMembers(IterableMixin, [
      'map',
      'where',
      'expand',
      'contains',
      'forEach',
      'reduce',
      'fold',
      'every',
      'join',
      'any',
      'toList',
      'toSet',
      'take',
      'takeWhile',
      'skip',
      'skipWhile',
      'firstWhere',
      'lastWhere',
      'singleWhere',
      'elementAt',
      'toString',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single'
    ]);
    return IterableMixin;
  });
  collection.IterableMixin = IterableMixin();
  dart.defineLazy(collection, {
    get _toStringVisiting() {
      return [];
    }
  });
  collection._isToStringVisiting = function(o) {
    for (let i = 0; i < dart.notNull(collection._toStringVisiting[dartx.length]); i++) {
      if (core.identical(o, collection._toStringVisiting[dartx._get](i))) return true;
    }
    return false;
  };
  dart.lazyFn(collection._isToStringVisiting, () => ObjectTobool());
  collection._iterablePartsToStrings = function(iterable, parts) {
    let LENGTH_LIMIT = 80;
    let HEAD_COUNT = 3;
    let TAIL_COUNT = 2;
    let MAX_COUNT = 100;
    let OVERHEAD = 2;
    let ELLIPSIS_SIZE = 3;
    let length = 0;
    let count = 0;
    let it = iterable[dartx.iterator];
    while (dart.notNull(length) < LENGTH_LIMIT || count < HEAD_COUNT) {
      if (!dart.test(it.moveNext())) return;
      let next = dart.str`${it.current}`;
      parts[dartx.add](next);
      length = dart.notNull(length) + (dart.notNull(next[dartx.length]) + OVERHEAD);
      count++;
    }
    let penultimateString = null;
    let ultimateString = null;
    let penultimate = null;
    let ultimate = null;
    if (!dart.test(it.moveNext())) {
      if (count <= HEAD_COUNT + TAIL_COUNT) return;
      ultimateString = core.String._check(parts[dartx.removeLast]());
      penultimateString = core.String._check(parts[dartx.removeLast]());
    } else {
      penultimate = it.current;
      count++;
      if (!dart.test(it.moveNext())) {
        if (count <= HEAD_COUNT + 1) {
          parts[dartx.add](dart.str`${penultimate}`);
          return;
        }
        ultimateString = dart.str`${penultimate}`;
        penultimateString = core.String._check(parts[dartx.removeLast]());
        length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + OVERHEAD);
      } else {
        ultimate = it.current;
        count++;
        dart.assert(count < MAX_COUNT);
        while (dart.test(it.moveNext())) {
          penultimate = ultimate;
          ultimate = it.current;
          count++;
          if (count > MAX_COUNT) {
            while (dart.notNull(length) > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD && count > HEAD_COUNT) {
              length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
              count--;
            }
            parts[dartx.add]("...");
            return;
          }
        }
        penultimateString = dart.str`${penultimate}`;
        ultimateString = dart.str`${ultimate}`;
        length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + dart.notNull(penultimateString[dartx.length]) + 2 * OVERHEAD);
      }
    }
    let elision = null;
    if (count > dart.notNull(parts[dartx.length]) + TAIL_COUNT) {
      elision = "...";
      length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
    }
    while (dart.notNull(length) > LENGTH_LIMIT && dart.notNull(parts[dartx.length]) > HEAD_COUNT) {
      length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
      if (elision == null) {
        elision = "...";
        length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
      }
    }
    if (elision != null) {
      parts[dartx.add](elision);
    }
    parts[dartx.add](penultimateString);
    parts[dartx.add](ultimateString);
  };
  dart.lazyFn(collection._iterablePartsToStrings, () => IterableAndListTovoid());
  const _iterator$0 = Symbol('_iterator');
  const _state$ = Symbol('_state');
  const _move = Symbol('_move');
  collection.HasNextIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class HasNextIterator extends core.Object {
      new(iterator) {
        this[_iterator$0] = iterator;
        this[_state$] = collection.HasNextIterator._NOT_MOVED_YET;
      }
      get hasNext() {
        if (this[_state$] == collection.HasNextIterator._NOT_MOVED_YET) this[_move]();
        return this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
      }
      next() {
        if (!dart.test(this.hasNext)) dart.throw(new core.StateError("No more elements"));
        dart.assert(this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT);
        let result = this[_iterator$0].current;
        this[_move]();
        return result;
      }
      [_move]() {
        if (dart.test(this[_iterator$0].moveNext())) {
          this[_state$] = collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
        } else {
          this[_state$] = collection.HasNextIterator._NO_NEXT;
        }
      }
    }
    dart.addTypeTests(HasNextIterator);
    dart.setSignature(HasNextIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection.HasNextIterator$(E), [IteratorOfE()])}),
      fields: () => ({
        [_iterator$0]: IteratorOfE(),
        [_state$]: core.int
      }),
      getters: () => ({hasNext: dart.definiteFunctionType(core.bool, [])}),
      methods: () => ({
        next: dart.definiteFunctionType(E, []),
        [_move]: dart.definiteFunctionType(dart.void, [])
      }),
      sfields: () => ({
        _HAS_NEXT_AND_NEXT_IN_CURRENT: core.int,
        _NO_NEXT: core.int,
        _NOT_MOVED_YET: core.int
      })
    });
    return HasNextIterator;
  });
  collection.HasNextIterator = HasNextIterator();
  collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT = 0;
  collection.HasNextIterator._NO_NEXT = 1;
  collection.HasNextIterator._NOT_MOVED_YET = 2;
  collection.LinkedHashMap$ = dart.generic((K, V) => {
    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
    let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
    let _LinkedCustomHashMapOfK$V = () => (_LinkedCustomHashMapOfK$V = dart.constFn(collection._LinkedCustomHashMap$(K, V)))();
    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
    let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
    let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    class LinkedHashMap extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return JsLinkedHashMapOfK$V().es6();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return _LinkedIdentityHashMapOfK$V().es6();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_LinkedCustomHashMapOfK$V())(equals, hashCode, isValidKey);
      }
      static identity() {
        return _LinkedIdentityHashMapOfK$V().es6();
      }
      static from(other) {
        let result = LinkedHashMapOfK$V().new();
        other[dartx.forEach](dart.fn((k, v) => {
          result._set(K.as(k), V.as(v));
        }, dynamicAnddynamicTovoid$()));
        return result;
      }
      static fromIterable(iterable, opts) {
        let key = opts && 'key' in opts ? opts.key : null;
        let value = opts && 'value' in opts ? opts.value : null;
        let map = LinkedHashMapOfK$V().new();
        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
        return map;
      }
      static fromIterables(keys, values) {
        let map = LinkedHashMapOfK$V().new();
        collection.Maps._fillMapWithIterables(map, keys, values);
        return map;
      }
    }
    dart.addTypeTests(LinkedHashMap);
    LinkedHashMap[dart.implements] = () => [HashMapOfK$V()];
    dart.setSignature(LinkedHashMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), []),
        from: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Map]),
        fromIterable: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
        fromIterables: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [IterableOfK(), IterableOfV()])
      })
    });
    return LinkedHashMap;
  });
  collection.LinkedHashMap = LinkedHashMap();
  collection.LinkedHashSet$ = dart.generic(E => {
    let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
    let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
    let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
    let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
    let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
    class LinkedHashSet extends core.Object {
      static new(opts) {
        let equals = opts && 'equals' in opts ? opts.equals : null;
        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        if (isValidKey == null) {
          if (hashCode == null) {
            if (equals == null) {
              return new (_LinkedHashSetOfE())();
            }
            hashCode = collection._defaultHashCode;
          } else {
            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
              return new (_LinkedIdentityHashSetOfE())();
            }
            if (equals == null) {
              equals = collection._defaultEquals;
            }
          }
        } else {
          if (hashCode == null) {
            hashCode = collection._defaultHashCode;
          }
          if (equals == null) {
            equals = collection._defaultEquals;
          }
        }
        return new (_LinkedCustomHashSetOfE())(equals, hashCode, isValidKey);
      }
      static identity() {
        return new (_LinkedIdentityHashSetOfE())();
      }
      static from(elements) {
        let result = LinkedHashSetOfE().new();
        for (let element of elements) {
          let e = E.as(element);
          result.add(e);
        }
        return result;
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(LinkedHashSet);
    LinkedHashSet[dart.implements] = () => [HashSetOfE()];
    dart.setSignature(LinkedHashSet, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.LinkedHashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
        identity: dart.definiteFunctionType(collection.LinkedHashSet$(E), []),
        from: dart.definiteFunctionType(collection.LinkedHashSet$(E), [core.Iterable])
      })
    });
    return LinkedHashSet;
  });
  collection.LinkedHashSet = LinkedHashSet();
  const _modificationCount = Symbol('_modificationCount');
  const _insertBefore$ = Symbol('_insertBefore');
  const _list = Symbol('_list');
  const _unlink$ = Symbol('_unlink');
  collection.LinkedList$ = dart.generic(E => {
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    class LinkedList extends core.Iterable$(E) {
      new() {
        this[_modificationCount] = 0;
        this[_length$1] = 0;
        this[_first$] = null;
        super.new();
      }
      addFirst(entry) {
        E._check(entry);
        this[_insertBefore$](this[_first$], entry, {updateFirst: true});
        this[_first$] = entry;
      }
      add(entry) {
        E._check(entry);
        this[_insertBefore$](this[_first$], entry, {updateFirst: false});
      }
      addAll(entries) {
        IterableOfE()._check(entries);
        entries[dartx.forEach](dart.bind(this, 'add'));
      }
      remove(entry) {
        E._check(entry);
        if (!dart.equals(entry[_list], this)) return false;
        this[_unlink$](entry);
        return true;
      }
      get iterator() {
        return new (_LinkedListIteratorOfE())(this);
      }
      get length() {
        return this[_length$1];
      }
      clear() {
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        if (dart.test(this.isEmpty)) return;
        let next = this[_first$];
        do {
          let entry = next;
          next = entry[_next$0];
          entry[_next$0] = entry[_previous$0] = entry[_list] = null;
        } while (!core.identical(next, this[_first$]));
        this[_first$] = null;
        this[_length$1] = 0;
      }
      get first() {
        if (dart.test(this.isEmpty)) {
          dart.throw(new core.StateError('No such element'));
        }
        return this[_first$];
      }
      get last() {
        if (dart.test(this.isEmpty)) {
          dart.throw(new core.StateError('No such element'));
        }
        return this[_first$][_previous$0];
      }
      get single() {
        if (dart.test(this.isEmpty)) {
          dart.throw(new core.StateError('No such element'));
        }
        if (dart.notNull(this[_length$1]) > 1) {
          dart.throw(new core.StateError('Too many elements'));
        }
        return this[_first$];
      }
      forEach(action) {
        let modificationCount = this[_modificationCount];
        if (dart.test(this.isEmpty)) return;
        let current = this[_first$];
        do {
          action(current);
          if (modificationCount != this[_modificationCount]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          current = current[_next$0];
        } while (!core.identical(current, this[_first$]));
      }
      get isEmpty() {
        return this[_length$1] == 0;
      }
      [_insertBefore$](entry, newEntry, opts) {
        E._check(entry);
        E._check(newEntry);
        let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
        if (newEntry.list != null) {
          dart.throw(new core.StateError('LinkedListEntry is already in a LinkedList'));
        }
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        newEntry[_list] = this;
        if (dart.test(this.isEmpty)) {
          dart.assert(entry == null);
          newEntry[_previous$0] = newEntry[_next$0] = newEntry;
          this[_first$] = newEntry;
          this[_length$1] = dart.notNull(this[_length$1]) + 1;
          return;
        }
        let predecessor = entry[_previous$0];
        let successor = entry;
        newEntry[_previous$0] = predecessor;
        newEntry[_next$0] = successor;
        predecessor[_next$0] = newEntry;
        successor[_previous$0] = newEntry;
        if (dart.test(updateFirst) && core.identical(entry, this[_first$])) {
          this[_first$] = newEntry;
        }
        this[_length$1] = dart.notNull(this[_length$1]) + 1;
      }
      [_unlink$](entry) {
        E._check(entry);
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        entry[_next$0][_previous$0] = entry[_previous$0];
        let next = entry[_previous$0][_next$0] = entry[_next$0];
        this[_length$1] = dart.notNull(this[_length$1]) - 1;
        entry[_list] = entry[_next$0] = entry[_previous$0] = null;
        if (dart.test(this.isEmpty)) {
          this[_first$] = null;
        } else if (core.identical(entry, this[_first$])) {
          this[_first$] = next;
        }
      }
    }
    dart.setSignature(LinkedList, {
      constructors: () => ({new: dart.definiteFunctionType(collection.LinkedList$(E), [])}),
      fields: () => ({
        [_modificationCount]: core.int,
        [_length$1]: core.int,
        [_first$]: E
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        addFirst: dart.definiteFunctionType(dart.void, [E]),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [E]),
        clear: dart.definiteFunctionType(dart.void, []),
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
        [_unlink$]: dart.definiteFunctionType(dart.void, [E])
      })
    });
    dart.defineExtensionMembers(LinkedList, [
      'forEach',
      'iterator',
      'length',
      'first',
      'last',
      'single',
      'isEmpty'
    ]);
    return LinkedList;
  });
  collection.LinkedList = LinkedList();
  const _visitedFirst = Symbol('_visitedFirst');
  collection._LinkedListIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
    let LinkedListEntryOfE = () => (LinkedListEntryOfE = dart.constFn(collection.LinkedListEntry$(E)))();
    class _LinkedListIterator extends core.Object {
      new(list) {
        this[_list] = list;
        this[_modificationCount] = list[_modificationCount];
        this[_next$0] = list[_first$];
        this[_visitedFirst] = false;
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        if (this[_modificationCount] != this[_list][_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
          this[_current$2] = null;
          return false;
        }
        this[_visitedFirst] = true;
        this[_current$2] = E._check(this[_next$0]);
        this[_next$0] = this[_next$0][_next$0];
        return true;
      }
    }
    dart.addTypeTests(_LinkedListIterator);
    _LinkedListIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_LinkedListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedListIterator$(E), [LinkedListOfE()])}),
      fields: () => ({
        [_list]: LinkedListOfE(),
        [_modificationCount]: core.int,
        [_current$2]: E,
        [_next$0]: LinkedListEntryOfE(),
        [_visitedFirst]: core.bool
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _LinkedListIterator;
  });
  collection._LinkedListIterator = _LinkedListIterator();
  collection.LinkedListEntry$ = dart.generic(E => {
    let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
    class LinkedListEntry extends core.Object {
      new() {
        this[_list] = null;
        this[_next$0] = null;
        this[_previous$0] = null;
      }
      get list() {
        return this[_list];
      }
      unlink() {
        this[_list][_unlink$](E._check(this));
      }
      get next() {
        if (core.identical(this, this[_next$0])) return null;
        return this[_next$0];
      }
      get previous() {
        if (core.identical(this, this[_previous$0])) return null;
        return this[_previous$0];
      }
      insertAfter(entry) {
        E._check(entry);
        this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
      }
      insertBefore(entry) {
        E._check(entry);
        this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
      }
    }
    dart.addTypeTests(LinkedListEntry);
    dart.setSignature(LinkedListEntry, {
      fields: () => ({
        [_list]: LinkedListOfE(),
        [_next$0]: E,
        [_previous$0]: E
      }),
      getters: () => ({
        list: dart.definiteFunctionType(collection.LinkedList$(E), []),
        next: dart.definiteFunctionType(E, []),
        previous: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        unlink: dart.definiteFunctionType(dart.void, []),
        insertAfter: dart.definiteFunctionType(dart.void, [E]),
        insertBefore: dart.definiteFunctionType(dart.void, [E])
      })
    });
    return LinkedListEntry;
  });
  collection.LinkedListEntry = LinkedListEntry();
  collection.MapMixin$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let _MapBaseValueIterableOfK$V = () => (_MapBaseValueIterableOfK$V = dart.constFn(collection._MapBaseValueIterable$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    class MapMixin extends core.Object {
      forEach(action) {
        for (let key of this.keys) {
          action(key, this._get(key));
        }
      }
      addAll(other) {
        MapOfK$V()._check(other);
        for (let key of other[dartx.keys]) {
          this._set(key, other[dartx._get](key));
        }
      }
      containsValue(value) {
        for (let key of this.keys) {
          if (dart.equals(this._get(key), value)) return true;
        }
        return false;
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (dart.test(this.containsKey(key))) {
          return this._get(key);
        }
        return this._set(key, ifAbsent());
      }
      containsKey(key) {
        return this.keys[dartx.contains](key);
      }
      get length() {
        return this.keys[dartx.length];
      }
      get isEmpty() {
        return this.keys[dartx.isEmpty];
      }
      get isNotEmpty() {
        return this.keys[dartx.isNotEmpty];
      }
      get values() {
        return new (_MapBaseValueIterableOfK$V())(this);
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
    }
    dart.addTypeTests(MapMixin);
    MapMixin[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(MapMixin, {
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object])
      })
    });
    dart.defineExtensionMembers(MapMixin, [
      'forEach',
      'addAll',
      'containsValue',
      'putIfAbsent',
      'containsKey',
      'length',
      'isEmpty',
      'isNotEmpty',
      'values'
    ]);
    return MapMixin;
  });
  collection.MapMixin = MapMixin();
  collection.MapBase$ = dart.generic((K, V) => {
    class MapBase extends dart.mixin(core.Object, collection.MapMixin$(K, V)) {}
    return MapBase;
  });
  collection.MapBase = MapBase();
  collection._UnmodifiableMapMixin$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    class _UnmodifiableMapMixin extends core.Object {
      _set(key, value) {
        K._check(key);
        V._check(value);
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
        return value;
      }
      addAll(other) {
        MapOfK$V()._check(other);
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
      clear() {
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
      remove(key) {
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
      }
    }
    dart.addTypeTests(_UnmodifiableMapMixin);
    _UnmodifiableMapMixin[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(_UnmodifiableMapMixin, {
      methods: () => ({
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        clear: dart.definiteFunctionType(dart.void, []),
        remove: dart.definiteFunctionType(V, [core.Object]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()])
      })
    });
    dart.defineExtensionMembers(_UnmodifiableMapMixin, [
      '_set',
      'addAll',
      'clear',
      'remove',
      'putIfAbsent'
    ]);
    return _UnmodifiableMapMixin;
  });
  collection._UnmodifiableMapMixin = _UnmodifiableMapMixin();
  collection.UnmodifiableMapBase$ = dart.generic((K, V) => {
    class UnmodifiableMapBase extends dart.mixin(collection.MapBase$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
      new() {
        super.new();
      }
    }
    return UnmodifiableMapBase;
  });
  collection.UnmodifiableMapBase = UnmodifiableMapBase();
  collection._MapBaseValueIterable$ = dart.generic((K, V) => {
    let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    class _MapBaseValueIterable extends core.Iterable$(V) {
      new(map) {
        this[_map$0] = map;
        super.new();
      }
      get length() {
        return this[_map$0][dartx.length];
      }
      get isEmpty() {
        return this[_map$0][dartx.isEmpty];
      }
      get isNotEmpty() {
        return this[_map$0][dartx.isNotEmpty];
      }
      get first() {
        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.first]);
      }
      get single() {
        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.single]);
      }
      get last() {
        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.last]);
      }
      get iterator() {
        return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
      }
    }
    _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_MapBaseValueIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
      fields: () => ({[_map$0]: MapOfK$V()}),
      getters: () => ({
        first: dart.definiteFunctionType(V, []),
        single: dart.definiteFunctionType(V, []),
        last: dart.definiteFunctionType(V, []),
        iterator: dart.definiteFunctionType(core.Iterator$(V), [])
      })
    });
    dart.defineExtensionMembers(_MapBaseValueIterable, [
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'single',
      'last',
      'iterator'
    ]);
    return _MapBaseValueIterable;
  });
  collection._MapBaseValueIterable = _MapBaseValueIterable();
  collection._MapBaseValueIterator$ = dart.generic((K, V) => {
    let IteratorOfK = () => (IteratorOfK = dart.constFn(core.Iterator$(K)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let IteratorOfV = () => (IteratorOfV = dart.constFn(core.Iterator$(V)))();
    class _MapBaseValueIterator extends core.Object {
      new(map) {
        this[_map$0] = map;
        this[_keys] = map[dartx.keys][dartx.iterator];
        this[_current$2] = null;
      }
      moveNext() {
        if (dart.test(this[_keys].moveNext())) {
          this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
          return true;
        }
        this[_current$2] = null;
        return false;
      }
      get current() {
        return this[_current$2];
      }
    }
    dart.addTypeTests(_MapBaseValueIterator);
    _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
    dart.setSignature(_MapBaseValueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
      fields: () => ({
        [_keys]: IteratorOfK(),
        [_map$0]: MapOfK$V(),
        [_current$2]: V
      }),
      getters: () => ({current: dart.definiteFunctionType(V, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _MapBaseValueIterator;
  });
  collection._MapBaseValueIterator = _MapBaseValueIterator();
  collection.MapView$ = dart.generic((K, V) => {
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    class MapView extends core.Object {
      new(map) {
        this[_map$0] = map;
      }
      _get(key) {
        return this[_map$0][dartx._get](key);
      }
      _set(key, value) {
        K._check(key);
        V._check(value);
        this[_map$0][dartx._set](key, value);
        return value;
      }
      addAll(other) {
        MapOfK$V()._check(other);
        this[_map$0][dartx.addAll](other);
      }
      clear() {
        this[_map$0][dartx.clear]();
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        return this[_map$0][dartx.putIfAbsent](key, ifAbsent);
      }
      containsKey(key) {
        return this[_map$0][dartx.containsKey](key);
      }
      containsValue(value) {
        return this[_map$0][dartx.containsValue](value);
      }
      forEach(action) {
        this[_map$0][dartx.forEach](action);
      }
      get isEmpty() {
        return this[_map$0][dartx.isEmpty];
      }
      get isNotEmpty() {
        return this[_map$0][dartx.isNotEmpty];
      }
      get length() {
        return this[_map$0][dartx.length];
      }
      get keys() {
        return this[_map$0][dartx.keys];
      }
      remove(key) {
        return this[_map$0][dartx.remove](key);
      }
      toString() {
        return dart.toString(this[_map$0]);
      }
      get values() {
        return this[_map$0][dartx.values];
      }
    }
    dart.addTypeTests(MapView);
    MapView[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(MapView, {
      constructors: () => ({new: dart.definiteFunctionType(collection.MapView$(K, V), [MapOfK$V()])}),
      fields: () => ({[_map$0]: MapOfK$V()}),
      getters: () => ({
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        length: dart.definiteFunctionType(core.int, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        clear: dart.definiteFunctionType(dart.void, []),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        remove: dart.definiteFunctionType(V, [core.Object])
      })
    });
    dart.defineExtensionMembers(MapView, [
      '_get',
      '_set',
      'addAll',
      'clear',
      'putIfAbsent',
      'containsKey',
      'containsValue',
      'forEach',
      'remove',
      'isEmpty',
      'isNotEmpty',
      'length',
      'keys',
      'values'
    ]);
    return MapView;
  });
  collection.MapView = MapView();
  collection.UnmodifiableMapView$ = dart.generic((K, V) => {
    class UnmodifiableMapView extends dart.mixin(collection.MapView$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
      new(map) {
        super.new(map);
      }
    }
    return UnmodifiableMapView;
  });
  collection.UnmodifiableMapView = UnmodifiableMapView();
  collection.Maps = class Maps extends core.Object {
    static containsValue(map, value) {
      for (let v of map[dartx.values]) {
        if (dart.equals(v, value)) {
          return true;
        }
      }
      return false;
    }
    static containsKey(map, key) {
      for (let k of map[dartx.keys]) {
        if (dart.equals(k, key)) {
          return true;
        }
      }
      return false;
    }
    static putIfAbsent(map, key, ifAbsent) {
      if (dart.test(map[dartx.containsKey](key))) {
        return map[dartx._get](key);
      }
      let v = ifAbsent();
      map[dartx._set](key, v);
      return v;
    }
    static clear(map) {
      for (let k of map[dartx.keys][dartx.toList]()) {
        map[dartx.remove](k);
      }
    }
    static forEach(map, f) {
      for (let k of map[dartx.keys]) {
        dart.dcall(f, k, map[dartx._get](k));
      }
    }
    static getValues(map) {
      return map[dartx.keys][dartx.map](dart.dynamic)(dart.fn(key => map[dartx._get](key), dynamicTodynamic$()));
    }
    static length(map) {
      return map[dartx.keys][dartx.length];
    }
    static isEmpty(map) {
      return map[dartx.keys][dartx.isEmpty];
    }
    static isNotEmpty(map) {
      return map[dartx.keys][dartx.isNotEmpty];
    }
    static mapToString(m) {
      if (dart.test(collection._isToStringVisiting(m))) {
        return '{...}';
      }
      let result = new core.StringBuffer();
      try {
        collection._toStringVisiting[dartx.add](m);
        result.write('{');
        let first = true;
        m[dartx.forEach](dart.fn((k, v) => {
          if (!first) {
            result.write(', ');
          }
          first = false;
          result.write(k);
          result.write(': ');
          result.write(v);
        }, dynamicAnddynamicTovoid$()));
        result.write('}');
      } finally {
        dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
        collection._toStringVisiting[dartx.removeLast]();
      }
      return result.toString();
    }
    static _id(x) {
      return x;
    }
    static _fillMapWithMappedIterable(map, iterable, key, value) {
      if (key == null) key = collection.Maps._id;
      if (value == null) value = collection.Maps._id;
      for (let element of iterable) {
        map[dartx._set](dart.dcall(key, element), dart.dcall(value, element));
      }
    }
    static _fillMapWithIterables(map, keys, values) {
      let keyIterator = keys[dartx.iterator];
      let valueIterator = values[dartx.iterator];
      let hasNextKey = keyIterator.moveNext();
      let hasNextValue = valueIterator.moveNext();
      while (dart.test(hasNextKey) && dart.test(hasNextValue)) {
        map[dartx._set](keyIterator.current, valueIterator.current);
        hasNextKey = keyIterator.moveNext();
        hasNextValue = valueIterator.moveNext();
      }
      if (dart.test(hasNextKey) || dart.test(hasNextValue)) {
        dart.throw(new core.ArgumentError("Iterables do not have same length."));
      }
    }
  };
  dart.setSignature(collection.Maps, {
    statics: () => ({
      containsValue: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [core.Map, dart.dynamic, VoidTodynamic()]),
      clear: dart.definiteFunctionType(dart.dynamic, [core.Map]),
      forEach: dart.definiteFunctionType(dart.dynamic, [core.Map, dynamicAnddynamicTovoid()]),
      getValues: dart.definiteFunctionType(core.Iterable, [core.Map]),
      length: dart.definiteFunctionType(core.int, [core.Map]),
      isEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
      isNotEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
      mapToString: dart.definiteFunctionType(core.String, [core.Map]),
      _id: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _fillMapWithMappedIterable: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, dynamicTodynamic(), dynamicTodynamic()]),
      _fillMapWithIterables: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, core.Iterable])
    }),
    names: ['containsValue', 'containsKey', 'putIfAbsent', 'clear', 'forEach', 'getValues', 'length', 'isEmpty', 'isNotEmpty', 'mapToString', '_id', '_fillMapWithMappedIterable', '_fillMapWithIterables']
  });
  collection.Queue$ = dart.generic(E => {
    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class Queue extends core.Object {
      static new() {
        return new (ListQueueOfE())();
      }
      static from(elements) {
        return ListQueueOfE().from(elements);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this.iterator);
      }
    }
    dart.addTypeTests(Queue);
    Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
    dart.setSignature(Queue, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.Queue$(E), []),
        from: dart.definiteFunctionType(collection.Queue$(E), [core.Iterable])
      })
    });
    return Queue;
  });
  collection.Queue = Queue();
  const _previousLink = Symbol('_previousLink');
  const _nextLink = Symbol('_nextLink');
  const _link = Symbol('_link');
  collection._DoubleLink$ = dart.generic(E => {
    class _DoubleLink extends core.Object {
      new() {
        this[_previousLink] = null;
        this[_nextLink] = null;
      }
      [_link](previous, next) {
        E._check(previous);
        E._check(next);
        this[_nextLink] = next;
        this[_previousLink] = previous;
        if (previous != null) previous[_nextLink] = this;
        if (next != null) next[_previousLink] = this;
      }
      [_unlink$]() {
        if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
        if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
        this[_nextLink] = null;
        this[_previousLink] = null;
      }
    }
    dart.addTypeTests(_DoubleLink);
    dart.setSignature(_DoubleLink, {
      fields: () => ({
        [_previousLink]: E,
        [_nextLink]: E
      }),
      methods: () => ({
        [_link]: dart.definiteFunctionType(dart.void, [E, E]),
        [_unlink$]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _DoubleLink;
  });
  collection._DoubleLink = _DoubleLink();
  collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
    class DoubleLinkedQueueEntry extends core.Object {
      static new(element) {
        return new (_UserDoubleLinkedQueueEntryOfE())(element);
      }
    }
    dart.addTypeTests(DoubleLinkedQueueEntry);
    dart.setSignature(DoubleLinkedQueueEntry, {
      constructors: () => ({new: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [E])})
    });
    return DoubleLinkedQueueEntry;
  });
  collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
  collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
    class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
      new(element) {
        this.element = element;
        super.new();
      }
      append(e) {
        E._check(e);
        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
      }
      prepend(e) {
        E._check(e);
        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
      }
      remove() {
        this[_unlink$]();
        return this.element;
      }
      previousEntry() {
        return this[_previousLink];
      }
      nextEntry() {
        return this[_nextLink];
      }
    }
    _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
    dart.setSignature(_UserDoubleLinkedQueueEntry, {
      constructors: () => ({new: dart.definiteFunctionType(collection._UserDoubleLinkedQueueEntry$(E), [E])}),
      fields: () => ({element: E}),
      methods: () => ({
        append: dart.definiteFunctionType(dart.void, [E]),
        prepend: dart.definiteFunctionType(dart.void, [E]),
        remove: dart.definiteFunctionType(E, []),
        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
      })
    });
    return _UserDoubleLinkedQueueEntry;
  }, _UserDoubleLinkedQueueEntry => {
    dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
  });
  collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
  const _queue = Symbol('_queue');
  const _append = Symbol('_append');
  const _prepend = Symbol('_prepend');
  const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
  collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    class _DoubleLinkedQueueEntry extends collection._DoubleLink {
      new(queue) {
        this[_queue] = queue;
        super.new();
      }
      [_append](e) {
        E._check(e);
        new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this, this[_nextLink]);
      }
      [_prepend](e) {
        E._check(e);
        new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
      }
      nextEntry() {
        return this[_nextLink][_asNonSentinelEntry]();
      }
      previousEntry() {
        return this[_previousLink][_asNonSentinelEntry]();
      }
    }
    dart.setSignature(_DoubleLinkedQueueEntry, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueEntry$(E), [DoubleLinkedQueueOfE()])}),
      fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
      methods: () => ({
        [_append]: dart.definiteFunctionType(dart.void, [E]),
        [_prepend]: dart.definiteFunctionType(dart.void, [E]),
        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
      })
    });
    return _DoubleLinkedQueueEntry;
  }, _DoubleLinkedQueueEntry => {
    dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
  });
  collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
  const _elementCount = Symbol('_elementCount');
  collection._DoubleLinkedQueueElement$ = dart.generic(E => {
    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
      new(element, queue) {
        this.element = element;
        super.new(queue);
      }
      append(e) {
        E._check(e);
        this[_append](e);
        if (this[_queue] != null) {
          let o = this[_queue];
          o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
        }
      }
      prepend(e) {
        E._check(e);
        this[_prepend](e);
        if (this[_queue] != null) {
          let o = this[_queue];
          o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
        }
      }
      [_remove]() {
        this[_queue] = null;
        this[_unlink$]();
        return this.element;
      }
      remove() {
        if (this[_queue] != null) {
          let o = this[_queue];
          o[_elementCount] = dart.notNull(o[_elementCount]) - 1;
        }
        return this[_remove]();
      }
      [_asNonSentinelEntry]() {
        return this;
      }
    }
    _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
    dart.setSignature(_DoubleLinkedQueueElement, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [E, DoubleLinkedQueueOfE()])}),
      fields: () => ({element: E}),
      methods: () => ({
        append: dart.definiteFunctionType(dart.void, [E]),
        prepend: dart.definiteFunctionType(dart.void, [E]),
        [_remove]: dart.definiteFunctionType(E, []),
        remove: dart.definiteFunctionType(E, []),
        [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
      })
    });
    return _DoubleLinkedQueueElement;
  });
  collection._DoubleLinkedQueueElement = _DoubleLinkedQueueElement();
  collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
      new(queue) {
        super.new(queue);
        this[_previousLink] = this;
        this[_nextLink] = this;
      }
      [_asNonSentinelEntry]() {
        return null;
      }
      [_remove]() {
        dart.throw(_internal.IterableElementError.noElement());
      }
      get element() {
        dart.throw(_internal.IterableElementError.noElement());
      }
    }
    dart.setSignature(_DoubleLinkedQueueSentinel, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueSentinel$(E), [DoubleLinkedQueueOfE()])}),
      getters: () => ({element: dart.definiteFunctionType(E, [])}),
      methods: () => ({
        [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        [_remove]: dart.definiteFunctionType(E, [])
      })
    });
    return _DoubleLinkedQueueSentinel;
  });
  collection._DoubleLinkedQueueSentinel = _DoubleLinkedQueueSentinel();
  const _sentinel = Symbol('_sentinel');
  const _filter = Symbol('_filter');
  collection.DoubleLinkedQueue$ = dart.generic(E => {
    let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
    let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
    let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
    let DoubleLinkedQueueEntryOfETovoid = () => (DoubleLinkedQueueEntryOfETovoid = dart.constFn(dart.functionType(dart.void, [DoubleLinkedQueueEntryOfE()])))();
    class DoubleLinkedQueue extends core.Iterable$(E) {
      new() {
        this[_sentinel] = null;
        this[_elementCount] = 0;
        super.new();
        this[_sentinel] = new (_DoubleLinkedQueueSentinelOfE())(this);
      }
      static from(elements) {
        let list = new (DoubleLinkedQueueOfE())();
        for (let e of elements) {
          let element = E.as(e);
          list.addLast(element);
        }
        return DoubleLinkedQueueOfE()._check(list);
      }
      get length() {
        return this[_elementCount];
      }
      addLast(value) {
        E._check(value);
        this[_sentinel][_prepend](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
      addFirst(value) {
        E._check(value);
        this[_sentinel][_append](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
      add(value) {
        E._check(value);
        this[_sentinel][_prepend](value);
        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        for (let value of iterable) {
          this[_sentinel][_prepend](value);
          this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
        }
      }
      removeLast() {
        let lastEntry = this[_sentinel][_previousLink];
        let result = lastEntry[_remove]();
        this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
        return result;
      }
      removeFirst() {
        let firstEntry = this[_sentinel][_nextLink];
        let result = firstEntry[_remove]();
        this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
        return result;
      }
      remove(o) {
        let entry = this[_sentinel][_nextLink];
        while (!core.identical(entry, this[_sentinel])) {
          if (dart.equals(entry.element, o)) {
            entry[_remove]();
            this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
            return true;
          }
          entry = entry[_nextLink];
        }
        return false;
      }
      [_filter](test, removeMatching) {
        let entry = this[_sentinel][_nextLink];
        while (!core.identical(entry, this[_sentinel])) {
          let next = entry[_nextLink];
          if (core.identical(removeMatching, test(entry.element))) {
            entry[_remove]();
            this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
          }
          entry = next;
        }
      }
      removeWhere(test) {
        this[_filter](test, true);
      }
      retainWhere(test) {
        this[_filter](test, false);
      }
      get first() {
        let firstEntry = this[_sentinel][_nextLink];
        return firstEntry.element;
      }
      get last() {
        let lastEntry = this[_sentinel][_previousLink];
        return lastEntry.element;
      }
      get single() {
        if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
          let entry = this[_sentinel][_nextLink];
          return entry.element;
        }
        dart.throw(_internal.IterableElementError.tooMany());
      }
      lastEntry() {
        return this[_sentinel].previousEntry();
      }
      firstEntry() {
        return this[_sentinel].nextEntry();
      }
      get isEmpty() {
        return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
      }
      clear() {
        this[_sentinel][_nextLink] = this[_sentinel];
        this[_sentinel][_previousLink] = this[_sentinel];
        this[_elementCount] = 0;
      }
      forEachEntry(f) {
        let entry = this[_sentinel][_nextLink];
        while (!core.identical(entry, this[_sentinel])) {
          let nextEntry = entry[_nextLink];
          let element = _DoubleLinkedQueueElementOfE()._check(entry);
          f(element);
          entry = nextEntry;
        }
      }
      get iterator() {
        return new (_DoubleLinkedQueueIteratorOfE())(this[_sentinel]);
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '{', '}');
      }
    }
    DoubleLinkedQueue[dart.implements] = () => [QueueOfE()];
    dart.setSignature(DoubleLinkedQueue, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), []),
        from: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), [core.Iterable])
      }),
      fields: () => ({
        [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
        [_elementCount]: core.int
      }),
      getters: () => ({
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, []),
        iterator: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [])
      }),
      methods: () => ({
        addLast: dart.definiteFunctionType(dart.void, [E]),
        addFirst: dart.definiteFunctionType(dart.void, [E]),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        removeLast: dart.definiteFunctionType(E, []),
        removeFirst: dart.definiteFunctionType(E, []),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
        clear: dart.definiteFunctionType(dart.void, []),
        forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
      })
    });
    dart.defineExtensionMembers(DoubleLinkedQueue, [
      'toString',
      'length',
      'first',
      'last',
      'single',
      'isEmpty',
      'iterator'
    ]);
    return DoubleLinkedQueue;
  });
  collection.DoubleLinkedQueue = DoubleLinkedQueue();
  const _nextEntry = Symbol('_nextEntry');
  collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
    class _DoubleLinkedQueueIterator extends core.Object {
      new(sentinel) {
        this[_sentinel] = sentinel;
        this[_nextEntry] = sentinel[_nextLink];
        this[_current$2] = null;
      }
      moveNext() {
        if (core.identical(this[_nextEntry], this[_sentinel])) {
          this[_current$2] = null;
          this[_nextEntry] = null;
          this[_sentinel] = null;
          return false;
        }
        let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
        if (elementEntry[_queue] == null) {
          dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
        }
        this[_current$2] = elementEntry.element;
        this[_nextEntry] = elementEntry[_nextLink];
        return true;
      }
      get current() {
        return this[_current$2];
      }
    }
    dart.addTypeTests(_DoubleLinkedQueueIterator);
    _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_DoubleLinkedQueueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [_DoubleLinkedQueueSentinelOfE()])}),
      fields: () => ({
        [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
        [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _DoubleLinkedQueueIterator;
  });
  collection._DoubleLinkedQueueIterator = _DoubleLinkedQueueIterator();
  const _head = Symbol('_head');
  const _tail = Symbol('_tail');
  const _table = Symbol('_table');
  const _checkModification = Symbol('_checkModification');
  const _writeToList = Symbol('_writeToList');
  const _preGrow = Symbol('_preGrow');
  const _grow = Symbol('_grow');
  collection.ListQueue$ = dart.generic(E => {
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
    let _ListQueueIteratorOfE = () => (_ListQueueIteratorOfE = dart.constFn(collection._ListQueueIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    class ListQueue extends core.Iterable$(E) {
      new(initialCapacity) {
        if (initialCapacity === void 0) initialCapacity = null;
        this[_head] = 0;
        this[_tail] = 0;
        this[_table] = null;
        this[_modificationCount] = 0;
        super.new();
        if (initialCapacity == null || dart.notNull(initialCapacity) < collection.ListQueue._INITIAL_CAPACITY) {
          initialCapacity = collection.ListQueue._INITIAL_CAPACITY;
        } else if (!dart.test(collection.ListQueue._isPowerOf2(initialCapacity))) {
          initialCapacity = collection.ListQueue._nextPowerOf2(initialCapacity);
        }
        dart.assert(collection.ListQueue._isPowerOf2(initialCapacity));
        this[_table] = ListOfE().new(initialCapacity);
      }
      static from(elements) {
        if (core.List.is(elements)) {
          let length = elements[dartx.length];
          let queue = new (ListQueueOfE())(dart.notNull(length) + 1);
          dart.assert(dart.notNull(queue[_table][dartx.length]) > dart.notNull(length));
          for (let i = 0; i < dart.notNull(length); i++) {
            queue[_table][dartx._set](i, E.as(elements[dartx._get](i)));
          }
          queue[_tail] = length;
          return queue;
        } else {
          let capacity = collection.ListQueue._INITIAL_CAPACITY;
          if (_internal.EfficientLength.is(elements)) {
            capacity = elements[dartx.length];
          }
          let result = new (ListQueueOfE())(capacity);
          for (let element of elements) {
            result.addLast(E.as(element));
          }
          return result;
        }
      }
      get iterator() {
        return new (_ListQueueIteratorOfE())(this);
      }
      forEach(action) {
        let modificationCount = this[_modificationCount];
        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
          action(this[_table][dartx._get](i));
          this[_checkModification](modificationCount);
        }
      }
      get isEmpty() {
        return this[_head] == this[_tail];
      }
      get length() {
        return (dart.notNull(this[_tail]) - dart.notNull(this[_head]) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
      }
      get first() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        return this[_table][dartx._get](this[_head]);
      }
      get last() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        return this[_table][dartx._get]((dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
      }
      get single() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this[_table][dartx._get](this[_head]);
      }
      elementAt(index) {
        core.RangeError.checkValidIndex(index, this);
        return this[_table][dartx._get]((dart.notNull(this[_head]) + dart.notNull(index) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
      }
      toList(opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let list = null;
        if (dart.test(growable)) {
          list = ListOfE().new();
          list[dartx.length] = this.length;
        } else {
          list = ListOfE().new(this.length);
        }
        this[_writeToList](list);
        return list;
      }
      add(value) {
        E._check(value);
        this[_add$0](value);
      }
      addAll(elements) {
        IterableOfE()._check(elements);
        if (ListOfE().is(elements)) {
          let list = elements;
          let addCount = list[dartx.length];
          let length = this.length;
          if (dart.notNull(length) + dart.notNull(addCount) >= dart.notNull(this[_table][dartx.length])) {
            this[_preGrow](dart.notNull(length) + dart.notNull(addCount));
            this[_table][dartx.setRange](length, dart.notNull(length) + dart.notNull(addCount), list, 0);
            this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
          } else {
            let endSpace = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_tail]);
            if (dart.notNull(addCount) < endSpace) {
              this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + dart.notNull(addCount), list, 0);
              this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
            } else {
              let preSpace = dart.notNull(addCount) - endSpace;
              this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + endSpace, list, 0);
              this[_table][dartx.setRange](0, preSpace, list, endSpace);
              this[_tail] = preSpace;
            }
          }
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        } else {
          for (let element of elements)
            this[_add$0](element);
        }
      }
      remove(value) {
        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
          let element = this[_table][dartx._get](i);
          if (dart.equals(element, value)) {
            this[_remove](i);
            this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
            return true;
          }
        }
        return false;
      }
      [_filterWhere](test, removeMatching) {
        let modificationCount = this[_modificationCount];
        let i = this[_head];
        while (i != this[_tail]) {
          let element = this[_table][dartx._get](i);
          let remove = core.identical(removeMatching, test(element));
          this[_checkModification](modificationCount);
          if (remove) {
            i = this[_remove](i);
            modificationCount = this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
          } else {
            i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
          }
        }
      }
      removeWhere(test) {
        this[_filterWhere](test, true);
      }
      retainWhere(test) {
        this[_filterWhere](test, false);
      }
      clear() {
        if (this[_head] != this[_tail]) {
          for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
            this[_table][dartx._set](i, null);
          }
          this[_head] = this[_tail] = 0;
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        }
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, "{", "}");
      }
      addLast(value) {
        E._check(value);
        this[_add$0](value);
      }
      addFirst(value) {
        E._check(value);
        this[_head] = (dart.notNull(this[_head]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        this[_table][dartx._set](this[_head], value);
        if (this[_head] == this[_tail]) this[_grow]();
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
      removeFirst() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        let result = this[_table][dartx._get](this[_head]);
        this[_table][dartx._set](this[_head], null);
        this[_head] = (dart.notNull(this[_head]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        return result;
      }
      removeLast() {
        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        this[_tail] = (dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        let result = this[_table][dartx._get](this[_tail]);
        this[_table][dartx._set](this[_tail], null);
        return result;
      }
      static _isPowerOf2(number) {
        return (dart.notNull(number) & dart.notNull(number) - 1) == 0;
      }
      static _nextPowerOf2(number) {
        dart.assert(dart.notNull(number) > 0);
        number = (dart.notNull(number) << 1 >>> 0) - 1;
        for (;;) {
          let nextNumber = (dart.notNull(number) & dart.notNull(number) - 1) >>> 0;
          if (nextNumber == 0) return number;
          number = nextNumber;
        }
      }
      [_checkModification](expectedModificationCount) {
        if (expectedModificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
      [_add$0](element) {
        E._check(element);
        this[_table][dartx._set](this[_tail], element);
        this[_tail] = (dart.notNull(this[_tail]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
        if (this[_head] == this[_tail]) this[_grow]();
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
      [_remove](offset) {
        let mask = dart.notNull(this[_table][dartx.length]) - 1;
        let startDistance = (dart.notNull(offset) - dart.notNull(this[_head]) & mask) >>> 0;
        let endDistance = (dart.notNull(this[_tail]) - dart.notNull(offset) & mask) >>> 0;
        if (startDistance < endDistance) {
          let i = offset;
          while (i != this[_head]) {
            let prevOffset = (dart.notNull(i) - 1 & mask) >>> 0;
            this[_table][dartx._set](i, this[_table][dartx._get](prevOffset));
            i = prevOffset;
          }
          this[_table][dartx._set](this[_head], null);
          this[_head] = (dart.notNull(this[_head]) + 1 & mask) >>> 0;
          return (dart.notNull(offset) + 1 & mask) >>> 0;
        } else {
          this[_tail] = (dart.notNull(this[_tail]) - 1 & mask) >>> 0;
          let i = offset;
          while (i != this[_tail]) {
            let nextOffset = (dart.notNull(i) + 1 & mask) >>> 0;
            this[_table][dartx._set](i, this[_table][dartx._get](nextOffset));
            i = nextOffset;
          }
          this[_table][dartx._set](this[_tail], null);
          return offset;
        }
      }
      [_grow]() {
        let newTable = ListOfE().new(dart.notNull(this[_table][dartx.length]) * 2);
        let split = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
        newTable[dartx.setRange](0, split, this[_table], this[_head]);
        newTable[dartx.setRange](split, split + dart.notNull(this[_head]), this[_table], 0);
        this[_head] = 0;
        this[_tail] = this[_table][dartx.length];
        this[_table] = newTable;
      }
      [_writeToList](target) {
        ListOfE()._check(target);
        dart.assert(dart.notNull(target[dartx.length]) >= dart.notNull(this.length));
        if (dart.notNull(this[_head]) <= dart.notNull(this[_tail])) {
          let length = dart.notNull(this[_tail]) - dart.notNull(this[_head]);
          target[dartx.setRange](0, length, this[_table], this[_head]);
          return length;
        } else {
          let firstPartSize = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
          target[dartx.setRange](0, firstPartSize, this[_table], this[_head]);
          target[dartx.setRange](firstPartSize, firstPartSize + dart.notNull(this[_tail]), this[_table], 0);
          return dart.notNull(this[_tail]) + firstPartSize;
        }
      }
      [_preGrow](newElementCount) {
        dart.assert(dart.notNull(newElementCount) >= dart.notNull(this.length));
        newElementCount = dart.notNull(newElementCount) + newElementCount[dartx['>>']](1);
        let newCapacity = collection.ListQueue._nextPowerOf2(newElementCount);
        let newTable = ListOfE().new(newCapacity);
        this[_tail] = this[_writeToList](newTable);
        this[_table] = newTable;
        this[_head] = 0;
      }
    }
    ListQueue[dart.implements] = () => [QueueOfE()];
    dart.setSignature(ListQueue, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.ListQueue$(E), [], [core.int]),
        from: dart.definiteFunctionType(collection.ListQueue$(E), [core.Iterable])
      }),
      fields: () => ({
        [_table]: ListOfE(),
        [_head]: core.int,
        [_tail]: core.int,
        [_modificationCount]: core.int
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
        elementAt: dart.definiteFunctionType(E, [core.int]),
        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        clear: dart.definiteFunctionType(dart.void, []),
        addLast: dart.definiteFunctionType(dart.void, [E]),
        addFirst: dart.definiteFunctionType(dart.void, [E]),
        removeFirst: dart.definiteFunctionType(E, []),
        removeLast: dart.definiteFunctionType(E, []),
        [_checkModification]: dart.definiteFunctionType(dart.void, [core.int]),
        [_add$0]: dart.definiteFunctionType(dart.void, [E]),
        [_remove]: dart.definiteFunctionType(core.int, [core.int]),
        [_grow]: dart.definiteFunctionType(dart.void, []),
        [_writeToList]: dart.definiteFunctionType(core.int, [ListOfE()]),
        [_preGrow]: dart.definiteFunctionType(dart.void, [core.int])
      }),
      sfields: () => ({_INITIAL_CAPACITY: core.int}),
      statics: () => ({
        _isPowerOf2: dart.definiteFunctionType(core.bool, [core.int]),
        _nextPowerOf2: dart.definiteFunctionType(core.int, [core.int])
      }),
      names: ['_isPowerOf2', '_nextPowerOf2']
    });
    dart.defineExtensionMembers(ListQueue, [
      'forEach',
      'elementAt',
      'toList',
      'toString',
      'iterator',
      'isEmpty',
      'length',
      'first',
      'last',
      'single'
    ]);
    return ListQueue;
  });
  collection.ListQueue = ListQueue();
  collection.ListQueue._INITIAL_CAPACITY = 8;
  const _end = Symbol('_end');
  const _position = Symbol('_position');
  collection._ListQueueIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
    class _ListQueueIterator extends core.Object {
      new(queue) {
        this[_queue] = queue;
        this[_end] = queue[_tail];
        this[_modificationCount] = queue[_modificationCount];
        this[_position] = queue[_head];
        this[_current$2] = null;
      }
      get current() {
        return this[_current$2];
      }
      moveNext() {
        this[_queue][_checkModification](this[_modificationCount]);
        if (this[_position] == this[_end]) {
          this[_current$2] = null;
          return false;
        }
        this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
        this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
        return true;
      }
    }
    dart.addTypeTests(_ListQueueIterator);
    _ListQueueIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_ListQueueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._ListQueueIterator$(E), [ListQueueOfE()])}),
      fields: () => ({
        [_queue]: ListQueueOfE(),
        [_end]: core.int,
        [_modificationCount]: core.int,
        [_position]: core.int,
        [_current$2]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _ListQueueIterator;
  });
  collection._ListQueueIterator = _ListQueueIterator();
  collection._Predicate$ = dart.generic(T => {
    const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
    return _Predicate;
  });
  collection._Predicate = _Predicate$();
  collection._SplayTreeNode$ = dart.generic(K => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    class _SplayTreeNode extends core.Object {
      new(key) {
        this.key = key;
        this.left = null;
        this.right = null;
      }
    }
    dart.addTypeTests(_SplayTreeNode);
    dart.setSignature(_SplayTreeNode, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeNode$(K), [K])}),
      fields: () => ({
        key: K,
        left: _SplayTreeNodeOfK(),
        right: _SplayTreeNodeOfK()
      })
    });
    return _SplayTreeNode;
  });
  collection._SplayTreeNode = _SplayTreeNode();
  collection._SplayTreeMapNode$ = dart.generic((K, V) => {
    class _SplayTreeMapNode extends collection._SplayTreeNode$(K) {
      new(key, value) {
        this.value = value;
        super.new(key);
      }
    }
    dart.setSignature(_SplayTreeMapNode, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeMapNode$(K, V), [K, V])}),
      fields: () => ({value: V})
    });
    return _SplayTreeMapNode;
  });
  collection._SplayTreeMapNode = _SplayTreeMapNode();
  const _count$ = Symbol('_count');
  const _splayCount = Symbol('_splayCount');
  const _root = Symbol('_root');
  const _dummy = Symbol('_dummy');
  const _comparator = Symbol('_comparator');
  const _compare = Symbol('_compare');
  const _splay = Symbol('_splay');
  const _splayMin = Symbol('_splayMin');
  const _splayMax = Symbol('_splayMax');
  const _addNewRoot = Symbol('_addNewRoot');
  const _clear$ = Symbol('_clear');
  collection._SplayTree$ = dart.generic((K, Node) => {
    class _SplayTree extends core.Object {
      new() {
        this[_count$] = 0;
        this[_modificationCount] = 0;
        this[_splayCount] = 0;
      }
      [_splay](key) {
        K._check(key);
        if (this[_root] == null) return -1;
        let left = this[_dummy];
        let right = this[_dummy];
        let current = this[_root];
        let comp = null;
        while (true) {
          comp = this[_compare](current.key, key);
          if (dart.notNull(comp) > 0) {
            if (current.left == null) break;
            comp = this[_compare](current.left.key, key);
            if (dart.notNull(comp) > 0) {
              let tmp = current.left;
              current.left = tmp.right;
              tmp.right = current;
              current = Node._check(tmp);
              if (current.left == null) break;
            }
            right.left = current;
            right = current;
            current = Node._check(current.left);
          } else if (dart.notNull(comp) < 0) {
            if (current.right == null) break;
            comp = this[_compare](current.right.key, key);
            if (dart.notNull(comp) < 0) {
              let tmp = Node._check(current.right);
              current.right = tmp.left;
              tmp.left = current;
              current = tmp;
              if (current.right == null) break;
            }
            left.right = current;
            left = current;
            current = Node._check(current.right);
          } else {
            break;
          }
        }
        left.right = current.left;
        right.left = current.right;
        current.left = this[_dummy].right;
        current.right = this[_dummy].left;
        this[_root] = current;
        this[_dummy].right = null;
        this[_dummy].left = null;
        this[_splayCount] = dart.notNull(this[_splayCount]) + 1;
        return comp;
      }
      [_splayMin](node) {
        Node._check(node);
        let current = node;
        while (current.left != null) {
          let left = Node._check(current.left);
          current.left = left.right;
          left.right = current;
          current = left;
        }
        return current;
      }
      [_splayMax](node) {
        Node._check(node);
        let current = node;
        while (current.right != null) {
          let right = Node._check(current.right);
          current.right = right.left;
          right.left = current;
          current = right;
        }
        return current;
      }
      [_remove](key) {
        K._check(key);
        if (this[_root] == null) return null;
        let comp = this[_splay](key);
        if (comp != 0) return null;
        let result = this[_root];
        this[_count$] = dart.notNull(this[_count$]) - 1;
        if (this[_root].left == null) {
          this[_root] = Node._check(this[_root].right);
        } else {
          let right = Node._check(this[_root].right);
          this[_root] = this[_splayMax](Node._check(this[_root].left));
          this[_root].right = right;
        }
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        return result;
      }
      [_addNewRoot](node, comp) {
        Node._check(node);
        this[_count$] = dart.notNull(this[_count$]) + 1;
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        if (this[_root] == null) {
          this[_root] = node;
          return;
        }
        if (dart.notNull(comp) < 0) {
          node.left = this[_root];
          node.right = this[_root].right;
          this[_root].right = null;
        } else {
          node.right = this[_root];
          node.left = this[_root].left;
          this[_root].left = null;
        }
        this[_root] = node;
      }
      get [_first$]() {
        if (this[_root] == null) return null;
        this[_root] = this[_splayMin](this[_root]);
        return this[_root];
      }
      get [_last$]() {
        if (this[_root] == null) return null;
        this[_root] = this[_splayMax](this[_root]);
        return this[_root];
      }
      [_clear$]() {
        this[_root] = null;
        this[_count$] = 0;
        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      }
    }
    dart.addTypeTests(_SplayTree);
    dart.setSignature(_SplayTree, {
      fields: () => ({
        [_count$]: core.int,
        [_modificationCount]: core.int,
        [_splayCount]: core.int
      }),
      getters: () => ({
        [_first$]: dart.definiteFunctionType(Node, []),
        [_last$]: dart.definiteFunctionType(Node, [])
      }),
      methods: () => ({
        [_splay]: dart.definiteFunctionType(core.int, [K]),
        [_splayMin]: dart.definiteFunctionType(Node, [Node]),
        [_splayMax]: dart.definiteFunctionType(Node, [Node]),
        [_remove]: dart.definiteFunctionType(Node, [K]),
        [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
        [_clear$]: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SplayTree;
  });
  collection._SplayTree = _SplayTree();
  collection._TypeTest$ = dart.generic(T => {
    class _TypeTest extends core.Object {
      test(v) {
        return T.is(v);
      }
    }
    dart.addTypeTests(_TypeTest);
    dart.setSignature(_TypeTest, {
      methods: () => ({test: dart.definiteFunctionType(core.bool, [dart.dynamic])})
    });
    return _TypeTest;
  });
  collection._TypeTest = _TypeTest();
  collection.SplayTreeMap$ = dart.generic((K, V) => {
    let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
    let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
    let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
    let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
    let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    let KAndVTovoid$ = () => (KAndVTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [K, V])))();
    class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
      new(compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
        this[_comparator] = (() => {
          let l = compare;
          return l != null ? l : ComparatorOfK().as(core.Comparable.compare);
        })();
        this[_validKey] = (() => {
          let l = isValidKey;
          return l != null ? l : dart.fn(v => K.is(v), dynamicTobool$());
        })();
        this[_root] = null;
        super.new();
      }
      static from(other, compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
        other[dartx.forEach](dart.fn((k, v) => {
          result._set(K.as(k), V.as(v));
        }, dynamicAnddynamicTovoid$()));
        return result;
      }
      static fromIterable(iterable, opts) {
        let key = opts && 'key' in opts ? opts.key : null;
        let value = opts && 'value' in opts ? opts.value : null;
        let compare = opts && 'compare' in opts ? opts.compare : null;
        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
        let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
        return map;
      }
      static fromIterables(keys, values, compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
        collection.Maps._fillMapWithIterables(map, keys, values);
        return map;
      }
      [_compare](key1, key2) {
        K._check(key1);
        K._check(key2);
        return this[_comparator](key1, key2);
      }
      _internal() {
        this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
        this[_root] = null;
        this[_comparator] = null;
        this[_validKey] = null;
        super.new();
      }
      _get(key) {
        if (!dart.test(dart.dcall(this[_validKey], key))) return null;
        if (this[_root] != null) {
          let comp = this[_splay](K.as(key));
          if (comp == 0) {
            return this[_root].value;
          }
        }
        return null;
      }
      remove(key) {
        if (!dart.test(dart.dcall(this[_validKey], key))) return null;
        let mapRoot = this[_remove](K.as(key));
        if (mapRoot != null) return mapRoot.value;
        return null;
      }
      _set(key, value) {
        (() => {
          K._check(key);
          V._check(value);
          if (key == null) dart.throw(new core.ArgumentError(key));
          let comp = this[_splay](key);
          if (comp == 0) {
            this[_root].value = value;
            return;
          }
          this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
        })();
        return value;
      }
      putIfAbsent(key, ifAbsent) {
        K._check(key);
        VoidToV()._check(ifAbsent);
        if (key == null) dart.throw(new core.ArgumentError(key));
        let comp = this[_splay](key);
        if (comp == 0) {
          return this[_root].value;
        }
        let modificationCount = this[_modificationCount];
        let splayCount = this[_splayCount];
        let value = ifAbsent();
        if (modificationCount != this[_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
        if (splayCount != this[_splayCount]) {
          comp = this[_splay](key);
          dart.assert(comp != 0);
        }
        this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
        return value;
      }
      addAll(other) {
        MapOfK$V()._check(other);
        other[dartx.forEach](dart.fn((key, value) => {
          this._set(key, value);
        }, KAndVTovoid$()));
      }
      get isEmpty() {
        return this[_root] == null;
      }
      get isNotEmpty() {
        return !dart.test(this.isEmpty);
      }
      forEach(f) {
        let nodes = new (_SplayTreeNodeIteratorOfK())(this);
        while (dart.test(nodes.moveNext())) {
          let node = _SplayTreeMapNodeOfK$V()._check(nodes.current);
          f(node.key, node.value);
        }
      }
      get length() {
        return this[_count$];
      }
      clear() {
        this[_clear$]();
      }
      containsKey(key) {
        return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
      }
      containsValue(value) {
        let found = false;
        let initialSplayCount = this[_splayCount];
        const visit = (function(node) {
          while (node != null) {
            if (dart.equals(node.value, value)) return true;
            if (initialSplayCount != this[_splayCount]) {
              dart.throw(new core.ConcurrentModificationError(this));
            }
            if (node.right != null && dart.test(visit(collection._SplayTreeMapNode._check(node.right)))) return true;
            node = collection._SplayTreeMapNode._check(node.left);
          }
          return false;
        }).bind(this);
        dart.fn(visit, _SplayTreeMapNodeTobool());
        return visit(this[_root]);
      }
      get keys() {
        return new (_SplayTreeKeyIterableOfK())(this);
      }
      get values() {
        return new (_SplayTreeValueIterableOfK$V())(this);
      }
      toString() {
        return collection.Maps.mapToString(this);
      }
      firstKey() {
        if (this[_root] == null) return null;
        return this[_first$].key;
      }
      lastKey() {
        if (this[_root] == null) return null;
        return this[_last$].key;
      }
      lastKeyBefore(key) {
        K._check(key);
        if (key == null) dart.throw(new core.ArgumentError(key));
        if (this[_root] == null) return null;
        let comp = this[_splay](key);
        if (dart.notNull(comp) < 0) return this[_root].key;
        let node = this[_root].left;
        if (node == null) return null;
        while (node.right != null) {
          node = node.right;
        }
        return node.key;
      }
      firstKeyAfter(key) {
        K._check(key);
        if (key == null) dart.throw(new core.ArgumentError(key));
        if (this[_root] == null) return null;
        let comp = this[_splay](key);
        if (dart.notNull(comp) > 0) return this[_root].key;
        let node = this[_root].right;
        if (node == null) return null;
        while (node.left != null) {
          node = node.left;
        }
        return node.key;
      }
    }
    dart.defineNamedConstructor(SplayTreeMap, '_internal');
    SplayTreeMap[dart.implements] = () => [MapOfK$V()];
    dart.setSignature(SplayTreeMap, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [], [ComparatorOfK(), dynamicTobool()]),
        from: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Map], [ComparatorOfK(), dynamicTobool()]),
        fromIterable: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV(), compare: ComparatorOfK(), isValidKey: dynamicTobool()}),
        fromIterables: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [IterableOfK(), IterableOfV()], [ComparatorOfK(), dynamicTobool()]),
        _internal: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [])
      }),
      fields: () => ({
        [_root]: _SplayTreeMapNodeOfK$V(),
        [_dummy]: _SplayTreeMapNodeOfK$V(),
        [_comparator]: ComparatorOfK(),
        [_validKey]: collection._Predicate
      }),
      getters: () => ({
        isEmpty: dart.definiteFunctionType(core.bool, []),
        isNotEmpty: dart.definiteFunctionType(core.bool, []),
        length: dart.definiteFunctionType(core.int, []),
        keys: dart.definiteFunctionType(core.Iterable$(K), []),
        values: dart.definiteFunctionType(core.Iterable$(V), [])
      }),
      methods: () => ({
        [_compare]: dart.definiteFunctionType(core.int, [K, K]),
        _get: dart.definiteFunctionType(V, [core.Object]),
        remove: dart.definiteFunctionType(V, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [K, V]),
        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
        clear: dart.definiteFunctionType(dart.void, []),
        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
        firstKey: dart.definiteFunctionType(K, []),
        lastKey: dart.definiteFunctionType(K, []),
        lastKeyBefore: dart.definiteFunctionType(K, [K]),
        firstKeyAfter: dart.definiteFunctionType(K, [K])
      })
    });
    dart.defineExtensionMembers(SplayTreeMap, [
      '_get',
      'remove',
      '_set',
      'putIfAbsent',
      'addAll',
      'forEach',
      'clear',
      'containsKey',
      'containsValue',
      'isEmpty',
      'isNotEmpty',
      'length',
      'keys',
      'values'
    ]);
    return SplayTreeMap;
  });
  collection.SplayTreeMap = SplayTreeMap();
  const _workList = Symbol('_workList');
  const _tree = Symbol('_tree');
  const _currentNode = Symbol('_currentNode');
  const _findLeftMostDescendent = Symbol('_findLeftMostDescendent');
  const _getValue = Symbol('_getValue');
  const _rebuildWorkList = Symbol('_rebuildWorkList');
  collection._SplayTreeIterator$ = dart.generic((K, T) => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let JSArrayOf_SplayTreeNodeOfK = () => (JSArrayOf_SplayTreeNodeOfK = dart.constFn(_interceptors.JSArray$(_SplayTreeNodeOfK())))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    let ListOf_SplayTreeNodeOfK = () => (ListOf_SplayTreeNodeOfK = dart.constFn(core.List$(_SplayTreeNodeOfK())))();
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    class _SplayTreeIterator extends core.Object {
      new(tree) {
        this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
        this[_tree] = tree;
        this[_modificationCount] = tree[_modificationCount];
        this[_splayCount] = tree[_splayCount];
        this[_currentNode] = null;
        this[_findLeftMostDescendent](tree[_root]);
      }
      startAt(tree, startKey) {
        this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
        this[_tree] = tree;
        this[_modificationCount] = tree[_modificationCount];
        this[_splayCount] = null;
        this[_currentNode] = null;
        if (tree[_root] == null) return;
        let compare = tree[_splay](startKey);
        this[_splayCount] = tree[_splayCount];
        if (dart.notNull(compare) < 0) {
          this[_findLeftMostDescendent](tree[_root].right);
        } else {
          this[_workList][dartx.add](tree[_root]);
        }
      }
      get current() {
        if (this[_currentNode] == null) return null;
        return this[_getValue](this[_currentNode]);
      }
      [_findLeftMostDescendent](node) {
        _SplayTreeNodeOfK()._check(node);
        while (node != null) {
          this[_workList][dartx.add](node);
          node = node.left;
        }
      }
      [_rebuildWorkList](currentNode) {
        _SplayTreeNodeOfK()._check(currentNode);
        dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
        this[_workList][dartx.clear]();
        if (currentNode == null) {
          this[_findLeftMostDescendent](this[_tree][_root]);
        } else {
          this[_tree][_splay](currentNode.key);
          this[_findLeftMostDescendent](this[_tree][_root].right);
          dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
        }
      }
      moveNext() {
        if (this[_modificationCount] != this[_tree][_modificationCount]) {
          dart.throw(new core.ConcurrentModificationError(this[_tree]));
        }
        if (dart.test(this[_workList][dartx.isEmpty])) {
          this[_currentNode] = null;
          return false;
        }
        if (this[_tree][_splayCount] != this[_splayCount] && this[_currentNode] != null) {
          this[_rebuildWorkList](this[_currentNode]);
        }
        this[_currentNode] = this[_workList][dartx.removeLast]();
        this[_findLeftMostDescendent](this[_currentNode].right);
        return true;
      }
    }
    dart.addTypeTests(_SplayTreeIterator);
    dart.defineNamedConstructor(_SplayTreeIterator, 'startAt');
    _SplayTreeIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(_SplayTreeIterator, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
        startAt: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
      }),
      fields: () => ({
        [_tree]: _SplayTreeOfK$_SplayTreeNodeOfK(),
        [_workList]: ListOf_SplayTreeNodeOfK(),
        [_modificationCount]: core.int,
        [_splayCount]: core.int,
        [_currentNode]: _SplayTreeNodeOfK()
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({
        [_findLeftMostDescendent]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
        [_rebuildWorkList]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
        moveNext: dart.definiteFunctionType(core.bool, [])
      })
    });
    return _SplayTreeIterator;
  });
  collection._SplayTreeIterator = _SplayTreeIterator();
  const _copyNode = Symbol('_copyNode');
  collection._SplayTreeKeyIterable$ = dart.generic(K => {
    let _SplayTreeKeyIteratorOfK = () => (_SplayTreeKeyIteratorOfK = dart.constFn(collection._SplayTreeKeyIterator$(K)))();
    let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    class _SplayTreeKeyIterable extends core.Iterable$(K) {
      new(tree) {
        this[_tree] = tree;
        super.new();
      }
      get length() {
        return this[_tree][_count$];
      }
      get isEmpty() {
        return this[_tree][_count$] == 0;
      }
      get iterator() {
        return new (_SplayTreeKeyIteratorOfK())(this[_tree]);
      }
      toSet() {
        let set = new (SplayTreeSetOfK())(this[_tree][_comparator], this[_tree][_validKey]);
        set[_count$] = this[_tree][_count$];
        set[_root] = set[_copyNode](this[_tree][_root]);
        return set;
      }
    }
    _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_SplayTreeKeyIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterable$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
      fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])}),
      methods: () => ({toSet: dart.definiteFunctionType(core.Set$(K), [])})
    });
    dart.defineExtensionMembers(_SplayTreeKeyIterable, ['toSet', 'length', 'isEmpty', 'iterator']);
    return _SplayTreeKeyIterable;
  });
  collection._SplayTreeKeyIterable = _SplayTreeKeyIterable();
  collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
    let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
    class _SplayTreeValueIterable extends core.Iterable$(V) {
      new(map) {
        this[_map$0] = map;
        super.new();
      }
      get length() {
        return this[_map$0][_count$];
      }
      get isEmpty() {
        return this[_map$0][_count$] == 0;
      }
      get iterator() {
        return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
      }
    }
    _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_SplayTreeValueIterable, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
      fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
    });
    dart.defineExtensionMembers(_SplayTreeValueIterable, ['length', 'isEmpty', 'iterator']);
    return _SplayTreeValueIterable;
  });
  collection._SplayTreeValueIterable = _SplayTreeValueIterable();
  collection._SplayTreeKeyIterator$ = dart.generic(K => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    class _SplayTreeKeyIterator extends collection._SplayTreeIterator$(K, K) {
      new(map) {
        super.new(map);
      }
      [_getValue](node) {
        _SplayTreeNodeOfK()._check(node);
        return node.key;
      }
    }
    dart.setSignature(_SplayTreeKeyIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
      methods: () => ({[_getValue]: dart.definiteFunctionType(K, [_SplayTreeNodeOfK()])})
    });
    return _SplayTreeKeyIterator;
  });
  collection._SplayTreeKeyIterator = _SplayTreeKeyIterator();
  collection._SplayTreeValueIterator$ = dart.generic((K, V) => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
    class _SplayTreeValueIterator extends collection._SplayTreeIterator$(K, V) {
      new(map) {
        super.new(map);
      }
      [_getValue](node) {
        _SplayTreeNodeOfK()._check(node);
        let mapNode = _SplayTreeMapNodeOfK$V().as(node);
        return mapNode.value;
      }
    }
    dart.setSignature(_SplayTreeValueIterator, {
      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterator$(K, V), [SplayTreeMapOfK$V()])}),
      methods: () => ({[_getValue]: dart.definiteFunctionType(V, [_SplayTreeNodeOfK()])})
    });
    return _SplayTreeValueIterator;
  });
  collection._SplayTreeValueIterator = _SplayTreeValueIterator();
  collection._SplayTreeNodeIterator$ = dart.generic(K => {
    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
    class _SplayTreeNodeIterator extends collection._SplayTreeIterator$(K, collection._SplayTreeNode$(K)) {
      new(tree) {
        super.new(tree);
      }
      startAt(tree, startKey) {
        super.startAt(tree, startKey);
      }
      [_getValue](node) {
        _SplayTreeNodeOfK()._check(node);
        return node;
      }
    }
    dart.defineNamedConstructor(_SplayTreeNodeIterator, 'startAt');
    dart.setSignature(_SplayTreeNodeIterator, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
        startAt: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
      }),
      methods: () => ({[_getValue]: dart.definiteFunctionType(collection._SplayTreeNode$(K), [_SplayTreeNodeOfK()])})
    });
    return _SplayTreeNodeIterator;
  });
  collection._SplayTreeNodeIterator = _SplayTreeNodeIterator();
  const _clone = Symbol('_clone');
  collection.SplayTreeSet$ = dart.generic(E => {
    let _SplayTreeNodeOfE = () => (_SplayTreeNodeOfE = dart.constFn(collection._SplayTreeNode$(E)))();
    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
    let SplayTreeSetOfE = () => (SplayTreeSetOfE = dart.constFn(collection.SplayTreeSet$(E)))();
    let _SplayTreeKeyIteratorOfE = () => (_SplayTreeKeyIteratorOfE = dart.constFn(collection._SplayTreeKeyIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
    class SplayTreeSet extends dart.mixin(collection._SplayTree$(E, collection._SplayTreeNode$(E)), collection.IterableMixin$(E), collection.SetMixin$(E)) {
      new(compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        this[_dummy] = new (_SplayTreeNodeOfE())(null);
        this[_comparator] = (() => {
          let l = compare;
          return l != null ? l : ComparatorOfE().as(core.Comparable.compare);
        })();
        this[_validKey] = (() => {
          let l = isValidKey;
          return l != null ? l : dart.fn(v => E.is(v), dynamicTobool$());
        })();
        this[_root] = null;
        super.new();
      }
      static from(elements, compare, isValidKey) {
        if (compare === void 0) compare = null;
        if (isValidKey === void 0) isValidKey = null;
        let result = new (SplayTreeSetOfE())(compare, isValidKey);
        for (let element of elements) {
          let e = E.as(element);
          result.add(e);
        }
        return result;
      }
      [_compare](e1, e2) {
        E._check(e1);
        E._check(e2);
        return this[_comparator](e1, e2);
      }
      get iterator() {
        return new (_SplayTreeKeyIteratorOfE())(this);
      }
      get length() {
        return this[_count$];
      }
      get isEmpty() {
        return this[_root] == null;
      }
      get isNotEmpty() {
        return this[_root] != null;
      }
      get first() {
        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[_first$].key;
      }
      get last() {
        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
        return this[_last$].key;
      }
      get single() {
        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
        if (dart.notNull(this[_count$]) > 1) dart.throw(_internal.IterableElementError.tooMany());
        return this[_root].key;
      }
      contains(object) {
        return dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0;
      }
      add(element) {
        E._check(element);
        let compare = this[_splay](element);
        if (compare == 0) return false;
        this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
        return true;
      }
      remove(object) {
        if (!dart.test(dart.dcall(this[_validKey], object))) return false;
        return this[_remove](E.as(object)) != null;
      }
      addAll(elements) {
        IterableOfE()._check(elements);
        for (let element of elements) {
          let compare = this[_splay](element);
          if (compare != 0) {
            this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
          }
        }
      }
      removeAll(elements) {
        for (let element of elements) {
          if (dart.test(dart.dcall(this[_validKey], element))) this[_remove](E.as(element));
        }
      }
      retainAll(elements) {
        let retainSet = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        let modificationCount = this[_modificationCount];
        for (let object of elements) {
          if (modificationCount != this[_modificationCount]) {
            dart.throw(new core.ConcurrentModificationError(this));
          }
          if (dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0) {
            retainSet.add(this[_root].key);
          }
        }
        if (retainSet[_count$] != this[_count$]) {
          this[_root] = retainSet[_root];
          this[_count$] = retainSet[_count$];
          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
        }
      }
      lookup(object) {
        if (!dart.test(dart.dcall(this[_validKey], object))) return null;
        let comp = this[_splay](E.as(object));
        if (comp != 0) return null;
        return this[_root].key;
      }
      intersection(other) {
        let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        for (let element of this) {
          if (dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      difference(other) {
        let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        for (let element of this) {
          if (!dart.test(other.contains(element))) result.add(element);
        }
        return result;
      }
      union(other) {
        SetOfE()._check(other);
        let _ = this[_clone]();
        _.addAll(other);
        return _;
      }
      [_clone]() {
        let set = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
        set[_count$] = this[_count$];
        set[_root] = this[_copyNode](this[_root]);
        return set;
      }
      [_copyNode](node) {
        _SplayTreeNodeOfE()._check(node);
        if (node == null) return null;
        let _ = new (_SplayTreeNodeOfE())(node.key);
        _.left = this[_copyNode](node.left);
        _.right = this[_copyNode](node.right);
        return _;
      }
      clear() {
        this[_clear$]();
      }
      toSet() {
        return this[_clone]();
      }
      toString() {
        return collection.IterableBase.iterableToFullString(this, '{', '}');
      }
    }
    dart.setSignature(SplayTreeSet, {
      constructors: () => ({
        new: dart.definiteFunctionType(collection.SplayTreeSet$(E), [], [ComparatorOfE(), dynamicTobool()]),
        from: dart.definiteFunctionType(collection.SplayTreeSet$(E), [core.Iterable], [ComparatorOfE(), dynamicTobool()])
      }),
      fields: () => ({
        [_root]: _SplayTreeNodeOfE(),
        [_dummy]: _SplayTreeNodeOfE(),
        [_comparator]: ComparatorOfE(),
        [_validKey]: collection._Predicate
      }),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, [])
      }),
      methods: () => ({
        [_compare]: dart.definiteFunctionType(core.int, [E, E]),
        add: dart.definiteFunctionType(core.bool, [E]),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        lookup: dart.definiteFunctionType(E, [core.Object]),
        intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
        union: dart.definiteFunctionType(core.Set$(E), [SetOfE()]),
        [_clone]: dart.definiteFunctionType(collection.SplayTreeSet$(E), []),
        [_copyNode]: dart.definiteFunctionType(collection._SplayTreeNode$(E), [_SplayTreeNodeOfE()]),
        toSet: dart.definiteFunctionType(core.Set$(E), [])
      })
    });
    dart.defineExtensionMembers(SplayTreeSet, [
      'contains',
      'toSet',
      'toString',
      'iterator',
      'length',
      'isEmpty',
      'isNotEmpty',
      'first',
      'last',
      'single'
    ]);
    return SplayTreeSet;
  });
  collection.SplayTreeSet = SplayTreeSet();
  const _processed = Symbol('_processed');
  const _computeKeys$ = Symbol('_computeKeys');
  const _original = Symbol('_original');
  convert._convertJsonToDart = function(json, reviver) {
    dart.assert(reviver != null);
    function walk(e) {
      if (e == null || typeof e != "object") {
        return e;
      }
      if (Object.getPrototypeOf(e) === Array.prototype) {
        for (let i = 0; i < e.length; i++) {
          let item = e[i];
          e[i] = dart.dcall(reviver, i, walk(item));
        }
        return e;
      }
      let map = new convert._JsonMap(e);
      let processed = map[_processed];
      let keys = map[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        let revived = dart.dcall(reviver, key, walk(e[key]));
        processed[key] = revived;
      }
      map[_original] = processed;
      return map;
    }
    dart.fn(walk, dynamicTodynamic$());
    return dart.dcall(reviver, null, walk(json));
  };
  dart.fn(convert._convertJsonToDart, dynamicAndFnTodynamic());
  convert._convertJsonToDartLazy = function(object) {
    if (object == null) return null;
    if (typeof object != "object") {
      return object;
    }
    if (Object.getPrototypeOf(object) !== Array.prototype) {
      return new convert._JsonMap(object);
    }
    for (let i = 0; i < object.length; i++) {
      let item = object[i];
      object[i] = convert._convertJsonToDartLazy(item);
    }
    return object;
  };
  dart.fn(convert._convertJsonToDartLazy, dynamicTodynamic$());
  const _data = Symbol('_data');
  const _isUpgraded = Symbol('_isUpgraded');
  const _upgradedMap = Symbol('_upgradedMap');
  const _process = Symbol('_process');
  const _upgrade = Symbol('_upgrade');
  convert._JsonMap = class _JsonMap extends core.Object {
    new(original) {
      this[_processed] = convert._JsonMap._newJavaScriptObject();
      this[_original] = original;
      this[_data] = null;
    }
    _get(key) {
      if (dart.test(this[_isUpgraded])) {
        return this[_upgradedMap][dartx._get](key);
      } else if (!(typeof key == 'string')) {
        return null;
      } else {
        let result = convert._JsonMap._getProperty(this[_processed], core.String._check(key));
        if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process](core.String._check(key));
        return result;
      }
    }
    get length() {
      return dart.test(this[_isUpgraded]) ? this[_upgradedMap][dartx.length] : this[_computeKeys$]()[dartx.length];
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return dart.notNull(this.length) > 0;
    }
    get keys() {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.keys];
      return new convert._JsonMapKeyIterable(this);
    }
    get values() {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.values];
      return MappedIterableOfString$dynamic().new(this[_computeKeys$](), dart.fn(each => this._get(each), dynamicTodynamic$()));
    }
    _set(key, value) {
      if (dart.test(this[_isUpgraded])) {
        this[_upgradedMap][dartx._set](key, value);
      } else if (dart.test(this.containsKey(key))) {
        let processed = this[_processed];
        convert._JsonMap._setProperty(processed, core.String._check(key), value);
        let original = this[_original];
        if (!core.identical(original, processed)) {
          convert._JsonMap._setProperty(original, core.String._check(key), null);
        }
      } else {
        this[_upgrade]()[dartx._set](key, value);
      }
      return value;
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((key, value) => {
        this._set(key, value);
      }, dynamicAnddynamicTovoid$()));
    }
    containsValue(value) {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
      let keys = this[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        if (dart.equals(this._get(key), value)) return true;
      }
      return false;
    }
    containsKey(key) {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsKey](key);
      if (!(typeof key == 'string')) return false;
      return convert._JsonMap._hasProperty(this[_original], core.String._check(key));
    }
    putIfAbsent(key, ifAbsent) {
      if (dart.test(this.containsKey(key))) return this._get(key);
      let value = ifAbsent();
      this._set(key, value);
      return value;
    }
    remove(key) {
      if (!dart.test(this[_isUpgraded]) && !dart.test(this.containsKey(key))) return null;
      return this[_upgrade]()[dartx.remove](key);
    }
    clear() {
      if (dart.test(this[_isUpgraded])) {
        this[_upgradedMap][dartx.clear]();
      } else {
        if (this[_data] != null) {
          dart.dsend(this[_data], 'clear');
        }
        this[_original] = this[_processed] = null;
        this[_data] = dart.map();
      }
    }
    forEach(f) {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.forEach](f);
      let keys = this[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        let value = convert._JsonMap._getProperty(this[_processed], key);
        if (dart.test(convert._JsonMap._isUnprocessed(value))) {
          value = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
          convert._JsonMap._setProperty(this[_processed], key, value);
        }
        dart.dcall(f, key, value);
        if (!core.identical(keys, this[_data])) {
          dart.throw(new core.ConcurrentModificationError(this));
        }
      }
    }
    toString() {
      return collection.Maps.mapToString(this);
    }
    get [_isUpgraded]() {
      return this[_processed] == null;
    }
    get [_upgradedMap]() {
      dart.assert(this[_isUpgraded]);
      return this[_data];
    }
    [_computeKeys$]() {
      dart.assert(!dart.test(this[_isUpgraded]));
      let keys = core.List._check(this[_data]);
      if (keys == null) {
        keys = this[_data] = convert._JsonMap._getPropertyNames(this[_original]);
      }
      return keys;
    }
    [_upgrade]() {
      if (dart.test(this[_isUpgraded])) return this[_upgradedMap];
      let result = dart.map();
      let keys = this[_computeKeys$]();
      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
        let key = keys[dartx._get](i);
        result[dartx._set](key, this._get(key));
      }
      if (dart.test(keys[dartx.isEmpty])) {
        keys[dartx.add](null);
      } else {
        keys[dartx.clear]();
      }
      this[_original] = this[_processed] = null;
      this[_data] = result;
      dart.assert(this[_isUpgraded]);
      return result;
    }
    [_process](key) {
      if (!dart.test(convert._JsonMap._hasProperty(this[_original], key))) return null;
      let result = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
      return convert._JsonMap._setProperty(this[_processed], key, result);
    }
    static _hasProperty(object, key) {
      return Object.prototype.hasOwnProperty.call(object, key);
    }
    static _getProperty(object, key) {
      return object[key];
    }
    static _setProperty(object, key, value) {
      return object[key] = value;
    }
    static _getPropertyNames(object) {
      return Object.keys(object);
    }
    static _isUnprocessed(object) {
      return typeof object == "undefined";
    }
    static _newJavaScriptObject() {
      return Object.create(null);
    }
  };
  convert._JsonMap[dart.implements] = () => [collection.LinkedHashMap];
  dart.setSignature(convert._JsonMap, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonMap, [dart.dynamic])}),
    fields: () => ({
      [_original]: dart.dynamic,
      [_processed]: dart.dynamic,
      [_data]: dart.dynamic
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      keys: dart.definiteFunctionType(core.Iterable, []),
      values: dart.definiteFunctionType(core.Iterable, []),
      [_isUpgraded]: dart.definiteFunctionType(core.bool, []),
      [_upgradedMap]: dart.definiteFunctionType(core.Map, [])
    }),
    methods: () => ({
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
      remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()]),
      [_computeKeys$]: dart.definiteFunctionType(core.List$(core.String), []),
      [_upgrade]: dart.definiteFunctionType(core.Map, []),
      [_process]: dart.definiteFunctionType(dart.dynamic, [core.String])
    }),
    statics: () => ({
      _hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String]),
      _getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String]),
      _setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
      _getPropertyNames: dart.definiteFunctionType(core.List, [dart.dynamic]),
      _isUnprocessed: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      _newJavaScriptObject: dart.definiteFunctionType(dart.dynamic, [])
    }),
    names: ['_hasProperty', '_getProperty', '_setProperty', '_getPropertyNames', '_isUnprocessed', '_newJavaScriptObject']
  });
  dart.defineExtensionMembers(convert._JsonMap, [
    '_get',
    '_set',
    'addAll',
    'containsValue',
    'containsKey',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'length',
    'isEmpty',
    'isNotEmpty',
    'keys',
    'values'
  ]);
  const _parent = Symbol('_parent');
  convert._JsonMapKeyIterable = class _JsonMapKeyIterable extends _internal.ListIterable {
    new(parent) {
      this[_parent] = parent;
      super.new();
    }
    get length() {
      return this[_parent].length;
    }
    elementAt(index) {
      return core.String._check(dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.elementAt](index) : this[_parent][_computeKeys$]()[dartx._get](index));
    }
    get iterator() {
      return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.iterator] : this[_parent][_computeKeys$]()[dartx.iterator];
    }
    contains(key) {
      return this[_parent].containsKey(key);
    }
  };
  dart.addSimpleTypeTests(convert._JsonMapKeyIterable);
  dart.setSignature(convert._JsonMapKeyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonMapKeyIterable, [convert._JsonMap])}),
    fields: () => ({[_parent]: convert._JsonMap}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator, [])}),
    methods: () => ({elementAt: dart.definiteFunctionType(core.String, [core.int])})
  });
  dart.defineExtensionMembers(convert._JsonMapKeyIterable, ['elementAt', 'contains', 'length', 'iterator']);
  const _reviver = Symbol('_reviver');
  const _sink$ = Symbol('_sink');
  const _stringSink = Symbol('_stringSink');
  convert.StringConversionSinkMixin = class StringConversionSinkMixin extends core.Object {
    add(str) {
      this.addSlice(str, 0, str[dartx.length], false);
    }
    asUtf8Sink(allowMalformed) {
      return new convert._Utf8ConversionSink(this, allowMalformed);
    }
    asStringSink() {
      return new convert._StringConversionSinkAsStringSinkAdapter(this);
    }
  };
  convert.StringConversionSinkMixin[dart.implements] = () => [convert.StringConversionSink];
  dart.setSignature(convert.StringConversionSinkMixin, {
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [core.String]),
      asUtf8Sink: dart.definiteFunctionType(convert.ByteConversionSink, [core.bool]),
      asStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [])
    })
  });
  convert.StringConversionSinkBase = class StringConversionSinkBase extends convert.StringConversionSinkMixin {};
  convert._StringSinkConversionSink = class _StringSinkConversionSink extends convert.StringConversionSinkBase {
    new(stringSink) {
      this[_stringSink] = stringSink;
    }
    close() {}
    addSlice(str, start, end, isLast) {
      if (start != 0 || end != str[dartx.length]) {
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          this[_stringSink].writeCharCode(str[dartx.codeUnitAt](i));
        }
      } else {
        this[_stringSink].write(str);
      }
      if (dart.test(isLast)) this.close();
    }
    add(str) {
      this[_stringSink].write(str);
    }
    asUtf8Sink(allowMalformed) {
      return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
    }
    asStringSink() {
      return convert.ClosableStringSink.fromStringSink(this[_stringSink], dart.bind(this, 'close'));
    }
  };
  dart.setSignature(convert._StringSinkConversionSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringSinkConversionSink, [core.StringSink])}),
    fields: () => ({[_stringSink]: core.StringSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  convert._JsonDecoderSink = class _JsonDecoderSink extends convert._StringSinkConversionSink {
    new(reviver, sink) {
      this[_reviver] = reviver;
      this[_sink$] = sink;
      super.new(new core.StringBuffer());
    }
    close() {
      super.close();
      let buffer = core.StringBuffer._check(this[_stringSink]);
      let accumulated = dart.toString(buffer);
      buffer.clear();
      let decoded = convert._parseJson(accumulated, this[_reviver]);
      this[_sink$].add(decoded);
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._JsonDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonDecoderSink, [convert._Reviver, SinkOfObject()])}),
    fields: () => ({
      [_reviver]: convert._Reviver,
      [_sink$]: SinkOfObject()
    })
  });
  const _allowInvalid = Symbol('_allowInvalid');
  let const$25;
  let const$26;
  let const$27;
  let const$28;
  let const$29;
  convert.Codec$ = dart.generic((S, T) => {
    let _InvertedCodecOfT$S = () => (_InvertedCodecOfT$S = dart.constFn(convert._InvertedCodec$(T, S)))();
    class Codec extends core.Object {
      new() {
      }
      encode(input) {
        S._check(input);
        return this.encoder.convert(input);
      }
      decode(encoded) {
        T._check(encoded);
        return this.decoder.convert(encoded);
      }
      fuse(R) {
        return other => {
          convert.Codec$(T, R)._check(other);
          return new (convert._FusedCodec$(S, T, R))(this, other);
        };
      }
      get inverted() {
        return new (_InvertedCodecOfT$S())(this);
      }
    }
    dart.addTypeTests(Codec);
    dart.setSignature(Codec, {
      constructors: () => ({new: dart.definiteFunctionType(convert.Codec$(S, T), [])}),
      getters: () => ({inverted: dart.definiteFunctionType(convert.Codec$(T, S), [])}),
      methods: () => ({
        encode: dart.definiteFunctionType(T, [S]),
        decode: dart.definiteFunctionType(S, [T]),
        fuse: dart.definiteFunctionType(R => [convert.Codec$(S, R), [convert.Codec$(T, R)]])
      })
    });
    return Codec;
  });
  convert.Codec = Codec();
  core.String = class String extends core.Object {
    static fromCharCodes(charCodes, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      if (_interceptors.JSArray.is(charCodes)) {
        return core.String._stringFromJSArray(JSArrayOfint()._check(charCodes), start, end);
      }
      if (_native_typed_data.NativeUint8List.is(charCodes)) {
        return core.String._stringFromUint8List(charCodes, start, end);
      }
      return core.String._stringFromIterable(charCodes, start, end);
    }
    static fromCharCode(charCode) {
      return _js_helper.Primitives.stringFromCharCode(charCode);
    }
    static fromEnvironment(name, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
      dart.throw(new core.UnsupportedError('String.fromEnvironment can only be used as a const constructor'));
    }
    static _stringFromJSArray(list, start, endOrNull) {
      let len = list[dartx.length];
      let end = core.RangeError.checkValidRange(start, endOrNull, len);
      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(len)) {
        list = JSArrayOfint()._check(list[dartx.sublist](start, end));
      }
      return _js_helper.Primitives.stringFromCharCodes(list);
    }
    static _stringFromUint8List(charCodes, start, endOrNull) {
      let len = charCodes[dartx.length];
      let end = core.RangeError.checkValidRange(start, endOrNull, len);
      return _js_helper.Primitives.stringFromNativeUint8List(charCodes, start, end);
    }
    static _stringFromIterable(charCodes, start, end) {
      if (dart.notNull(start) < 0) dart.throw(new core.RangeError.range(start, 0, charCodes[dartx.length]));
      if (end != null && dart.notNull(end) < dart.notNull(start)) {
        dart.throw(new core.RangeError.range(end, start, charCodes[dartx.length]));
      }
      let it = charCodes[dartx.iterator];
      for (let i = 0; i < dart.notNull(start); i++) {
        if (!dart.test(it.moveNext())) {
          dart.throw(new core.RangeError.range(start, 0, i));
        }
      }
      let list = JSArrayOfint().of([]);
      if (end == null) {
        while (dart.test(it.moveNext()))
          list[dartx.add](it.current);
      } else {
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          if (!dart.test(it.moveNext())) {
            dart.throw(new core.RangeError.range(end, start, i));
          }
          list[dartx.add](it.current);
        }
      }
      return _js_helper.Primitives.stringFromCharCodes(JSArrayOfint()._check(list));
    }
  };
  core.String.is = function is_String(o) {
    return typeof o == "string";
  };
  core.String.as = function as_String(o) {
    if (typeof o == "string" || o == null) return o;
    return dart.as(o, core.String);
  };
  core.String._check = function check_String(o) {
    if (typeof o == "string" || o == null) return o;
    return dart.check(o, core.String);
  };
  core.String[dart.implements] = () => [ComparableOfString(), core.Pattern];
  dart.setSignature(core.String, {
    constructors: () => ({
      fromCharCodes: dart.definiteFunctionType(core.String, [IterableOfint()], [core.int, core.int]),
      fromCharCode: dart.definiteFunctionType(core.String, [core.int]),
      fromEnvironment: dart.definiteFunctionType(core.String, [core.String], {defaultValue: core.String})
    }),
    statics: () => ({
      _stringFromJSArray: dart.definiteFunctionType(core.String, [JSArrayOfint(), core.int, core.int]),
      _stringFromUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
      _stringFromIterable: dart.definiteFunctionType(core.String, [IterableOfint(), core.int, core.int])
    }),
    names: ['_stringFromJSArray', '_stringFromUint8List', '_stringFromIterable']
  });
  core.List$ = dart.generic(E => {
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
    class List extends core.Object {
      static new(length) {
        if (length === void 0) length = null;
        let list = null;
        if (length == null) {
          list = [];
        } else {
          if (!(typeof length == 'number') || dart.notNull(length) < 0) {
            dart.throw(new core.ArgumentError(dart.str`Length must be a non-negative integer: ${length}`));
          }
          list = _interceptors.JSArray.markFixedList(new Array(length));
        }
        return JSArrayOfE().typed(list);
      }
      static filled(length, fill) {
        let result = ListOfE().new(length);
        if (length != 0 && fill != null) {
          for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
            result[dartx._set](i, fill);
          }
        }
        return result;
      }
      static from(elements, opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let list = ListOfE().new();
        for (let e of elements) {
          list[dartx.add](E._check(e));
        }
        if (dart.test(growable)) return list;
        return _internal.makeListFixedLength(E)(list);
      }
      static generate(length, generator, opts) {
        let growable = opts && 'growable' in opts ? opts.growable : true;
        let result = null;
        if (dart.test(growable)) {
          result = JSArrayOfE().of([]);
          result[dartx.length] = length;
        } else {
          result = ListOfE().new(length);
        }
        for (let i = 0; i < dart.notNull(length); i++) {
          result[dartx._set](i, generator(i));
        }
        return result;
      }
      static unmodifiable(elements) {
        let result = ListOfE().from(elements, {growable: false});
        return _internal.makeFixedListUnmodifiable(E)(result);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
    }
    dart.addTypeTests(List);
    List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
    dart.setSignature(List, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.List$(E), [], [core.int]),
        filled: dart.definiteFunctionType(core.List$(E), [core.int, E]),
        from: dart.definiteFunctionType(core.List$(E), [core.Iterable], {growable: core.bool}),
        generate: dart.definiteFunctionType(core.List$(E), [core.int, intToE()], {growable: core.bool}),
        unmodifiable: dart.definiteFunctionType(core.List$(E), [core.Iterable])
      })
    });
    return List;
  });
  core.List = List();
  convert.Encoding = class Encoding extends convert.Codec$(core.String, core.List$(core.int)) {
    new() {
      super.new();
    }
    decodeStream(byteStream) {
      return byteStream.transform(core.String)(this.decoder).fold(dart.dynamic)(new core.StringBuffer(), dart.fn((buffer, string) => ((() => {
        dart.dsend(buffer, 'write', string);
        return buffer;
      })()), dynamicAndStringTodynamic())).then(core.String)(dart.fn(buffer => dart.toString(buffer), dynamicToString()));
    }
    static getByName(name) {
      if (name == null) return null;
      name = name[dartx.toLowerCase]();
      return convert.Encoding._nameToEncoding[dartx._get](name);
    }
  };
  dart.addSimpleTypeTests(convert.Encoding);
  dart.setSignature(convert.Encoding, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Encoding, [])}),
    methods: () => ({decodeStream: dart.definiteFunctionType(async.Future$(core.String), [StreamOfListOfint()])}),
    sfields: () => ({_nameToEncoding: MapOfString$Encoding()}),
    statics: () => ({getByName: dart.definiteFunctionType(convert.Encoding, [core.String])}),
    names: ['getByName']
  });
  dart.defineLazy(convert.Encoding, {
    get _nameToEncoding() {
      return dart.map({"iso_8859-1:1987": convert.LATIN1, "iso-ir-100": convert.LATIN1, "iso_8859-1": convert.LATIN1, "iso-8859-1": convert.LATIN1, latin1: convert.LATIN1, l1: convert.LATIN1, ibm819: convert.LATIN1, cp819: convert.LATIN1, csisolatin1: convert.LATIN1, "iso-ir-6": convert.ASCII, "ansi_x3.4-1968": convert.ASCII, "ansi_x3.4-1986": convert.ASCII, "iso_646.irv:1991": convert.ASCII, "iso646-us": convert.ASCII, "us-ascii": convert.ASCII, us: convert.ASCII, ibm367: convert.ASCII, cp367: convert.ASCII, csascii: convert.ASCII, ascii: convert.ASCII, csutf8: convert.UTF8, "utf-8": convert.UTF8}, core.String, convert.Encoding);
    },
    set _nameToEncoding(_) {}
  });
  convert.AsciiCodec = class AsciiCodec extends convert.Encoding {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      this[_allowInvalid] = allowInvalid;
      super.new();
    }
    get name() {
      return "us-ascii";
    }
    decode(bytes, opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
      if (allowInvalid == null) allowInvalid = this[_allowInvalid];
      if (dart.test(allowInvalid)) {
        return (const$25 || (const$25 = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
      } else {
        return (const$26 || (const$26 = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
      }
    }
    get encoder() {
      return const$27 || (const$27 = dart.const(new convert.AsciiEncoder()));
    }
    get decoder() {
      return dart.test(this[_allowInvalid]) ? const$28 || (const$28 = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const$29 || (const$29 = dart.const(new convert.AsciiDecoder({allowInvalid: false})));
    }
  };
  dart.setSignature(convert.AsciiCodec, {
    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiCodec, [], {allowInvalid: core.bool})}),
    fields: () => ({[_allowInvalid]: core.bool}),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      encoder: dart.definiteFunctionType(convert.AsciiEncoder, []),
      decoder: dart.definiteFunctionType(convert.AsciiDecoder, [])
    }),
    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
  });
  convert.ASCII = dart.const(new convert.AsciiCodec());
  convert._ASCII_MASK = 127;
  const _subsetMask = Symbol('_subsetMask');
  convert.Converter$ = dart.generic((S, T) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let _ConverterStreamEventSinkOfS$dynamic = () => (_ConverterStreamEventSinkOfS$dynamic = dart.constFn(convert._ConverterStreamEventSink$(S, dart.dynamic)))();
    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let EventSinkTo_ConverterStreamEventSinkOfS$dynamic = () => (EventSinkTo_ConverterStreamEventSinkOfS$dynamic = dart.constFn(dart.definiteFunctionType(_ConverterStreamEventSinkOfS$dynamic(), [async.EventSink])))();
    class Converter extends core.Object {
      new() {
      }
      fuse(TT) {
        return other => {
          convert.Converter$(T, TT)._check(other);
          return new (convert._FusedConverter$(S, T, TT))(this, other);
        };
      }
      startChunkedConversion(sink) {
        SinkOfT()._check(sink);
        dart.throw(new core.UnsupportedError(dart.str`This converter does not support chunked conversions: ${this}`));
      }
      bind(stream) {
        StreamOfS()._check(stream);
        return StreamOfT().eventTransformed(stream, dart.fn(sink => new (_ConverterStreamEventSinkOfS$dynamic())(this, sink), EventSinkTo_ConverterStreamEventSinkOfS$dynamic()));
      }
    }
    dart.addTypeTests(Converter);
    Converter[dart.implements] = () => [StreamTransformerOfS$T()];
    dart.setSignature(Converter, {
      constructors: () => ({new: dart.definiteFunctionType(convert.Converter$(S, T), [])}),
      methods: () => ({
        fuse: dart.definiteFunctionType(TT => [convert.Converter$(S, TT), [convert.Converter$(T, TT)]]),
        startChunkedConversion: dart.definiteFunctionType(core.Sink$(S), [SinkOfT()]),
        bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])
      })
    });
    return Converter;
  });
  convert.Converter = Converter();
  convert._UnicodeSubsetEncoder = class _UnicodeSubsetEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
    new(subsetMask) {
      this[_subsetMask] = subsetMask;
      super.new();
    }
    convert(string, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let stringLength = string[dartx.length];
      core.RangeError.checkValidRange(start, end, stringLength);
      if (end == null) end = stringLength;
      let length = dart.notNull(end) - dart.notNull(start);
      let result = typed_data.Uint8List.new(length);
      for (let i = 0; i < length; i++) {
        let codeUnit = string[dartx.codeUnitAt](dart.notNull(start) + i);
        if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
          dart.throw(new core.ArgumentError("String contains invalid characters."));
        }
        result[dartx._set](i, codeUnit);
      }
      return result;
    }
    startChunkedConversion(sink) {
      if (!convert.ByteConversionSink.is(sink)) {
        sink = convert.ByteConversionSink.from(sink);
      }
      return new convert._UnicodeSubsetEncoderSink(this[_subsetMask], convert.ByteConversionSink._check(sink));
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
  dart.setSignature(convert._UnicodeSubsetEncoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoder, [core.int])}),
    fields: () => ({[_subsetMask]: core.int}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()]),
      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [StreamOfString()])
    })
  });
  convert.AsciiEncoder = class AsciiEncoder extends convert._UnicodeSubsetEncoder {
    new() {
      super.new(convert._ASCII_MASK);
    }
  };
  dart.setSignature(convert.AsciiEncoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiEncoder, [])})
  });
  convert._UnicodeSubsetEncoderSink = class _UnicodeSubsetEncoderSink extends convert.StringConversionSinkBase {
    new(subsetMask, sink) {
      this[_subsetMask] = subsetMask;
      this[_sink$] = sink;
    }
    close() {
      this[_sink$].close();
    }
    addSlice(source, start, end, isLast) {
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = source[dartx.codeUnitAt](i);
        if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
          dart.throw(new core.ArgumentError(dart.str`Source contains invalid character with code point: ${codeUnit}.`));
        }
      }
      this[_sink$].add(source[dartx.codeUnits][dartx.sublist](start, end));
      if (dart.test(isLast)) {
        this.close();
      }
    }
  };
  dart.setSignature(convert._UnicodeSubsetEncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoderSink, [core.int, convert.ByteConversionSink])}),
    fields: () => ({
      [_sink$]: convert.ByteConversionSink,
      [_subsetMask]: core.int
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  const _convertInvalid = Symbol('_convertInvalid');
  convert._UnicodeSubsetDecoder = class _UnicodeSubsetDecoder extends convert.Converter$(core.List$(core.int), core.String) {
    new(allowInvalid, subsetMask) {
      this[_allowInvalid] = allowInvalid;
      this[_subsetMask] = subsetMask;
      super.new();
    }
    convert(bytes, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let byteCount = bytes[dartx.length];
      core.RangeError.checkValidRange(start, end, byteCount);
      if (end == null) end = byteCount;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let byte = bytes[dartx._get](i);
        if ((dart.notNull(byte) & ~dart.notNull(this[_subsetMask])) != 0) {
          if (!dart.test(this[_allowInvalid])) {
            dart.throw(new core.FormatException(dart.str`Invalid value in input: ${byte}`));
          }
          return this[_convertInvalid](bytes, start, end);
        }
      }
      return core.String.fromCharCodes(bytes, start, end);
    }
    [_convertInvalid](bytes, start, end) {
      let buffer = new core.StringBuffer();
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let value = bytes[dartx._get](i);
        if ((dart.notNull(value) & ~dart.notNull(this[_subsetMask])) != 0) value = 65533;
        buffer.writeCharCode(value);
      }
      return buffer.toString();
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
  dart.setSignature(convert._UnicodeSubsetDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetDecoder, [core.bool, core.int])}),
    fields: () => ({
      [_allowInvalid]: core.bool,
      [_subsetMask]: core.int
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
      [_convertInvalid]: dart.definiteFunctionType(core.String, [ListOfint(), core.int, core.int]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfListOfint()])
    })
  });
  convert.AsciiDecoder = class AsciiDecoder extends convert._UnicodeSubsetDecoder {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      super.new(allowInvalid, convert._ASCII_MASK);
    }
    startChunkedConversion(sink) {
      let stringSink = null;
      if (convert.StringConversionSink.is(sink)) {
        stringSink = sink;
      } else {
        stringSink = convert.StringConversionSink.from(sink);
      }
      if (dart.test(this[_allowInvalid])) {
        return new convert._ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
      } else {
        return new convert._SimpleAsciiDecoderSink(stringSink);
      }
    }
  };
  dart.setSignature(convert.AsciiDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiDecoder, [], {allowInvalid: core.bool})}),
    methods: () => ({startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])})
  });
  const _utf8Sink = Symbol('_utf8Sink');
  let const$30;
  convert.ChunkedConversionSink$ = dart.generic(T => {
    let _SimpleCallbackSinkOfT = () => (_SimpleCallbackSinkOfT = dart.constFn(convert._SimpleCallbackSink$(T)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    let ListOfTTovoid = () => (ListOfTTovoid = dart.constFn(dart.functionType(dart.void, [ListOfT()])))();
    class ChunkedConversionSink extends core.Object {
      new() {
      }
      static withCallback(callback) {
        return new (_SimpleCallbackSinkOfT())(callback);
      }
    }
    dart.addTypeTests(ChunkedConversionSink);
    ChunkedConversionSink[dart.implements] = () => [SinkOfT()];
    dart.setSignature(ChunkedConversionSink, {
      constructors: () => ({
        new: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), []),
        withCallback: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), [ListOfTTovoid()])
      })
    });
    return ChunkedConversionSink;
  });
  convert.ChunkedConversionSink = ChunkedConversionSink();
  convert.ByteConversionSink = class ByteConversionSink extends convert.ChunkedConversionSink$(core.List$(core.int)) {
    new() {
      super.new();
    }
    static withCallback(callback) {
      return new convert._ByteCallbackSink(callback);
    }
    static from(sink) {
      return new convert._ByteAdapterSink(sink);
    }
  };
  dart.addSimpleTypeTests(convert.ByteConversionSink);
  dart.setSignature(convert.ByteConversionSink, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.ByteConversionSink, []),
      withCallback: dart.definiteFunctionType(convert.ByteConversionSink, [ListOfintTovoid()]),
      from: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
    })
  });
  convert.ByteConversionSinkBase = class ByteConversionSinkBase extends convert.ByteConversionSink {
    new() {
      super.new();
    }
    addSlice(chunk, start, end, isLast) {
      this.add(chunk[dartx.sublist](start, end));
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert.ByteConversionSinkBase, {
    methods: () => ({addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
  });
  convert._ErrorHandlingAsciiDecoderSink = class _ErrorHandlingAsciiDecoderSink extends convert.ByteConversionSinkBase {
    new(utf8Sink) {
      this[_utf8Sink] = utf8Sink;
      super.new();
    }
    close() {
      this[_utf8Sink].close();
    }
    add(source) {
      this.addSlice(source, 0, source[dartx.length], false);
    }
    addSlice(source, start, end, isLast) {
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
          if (dart.notNull(i) > dart.notNull(start)) this[_utf8Sink].addSlice(source, start, i, false);
          this[_utf8Sink].add(const$30 || (const$30 = dart.constList([239, 191, 189], core.int)));
          start = dart.notNull(i) + 1;
        }
      }
      if (dart.notNull(start) < dart.notNull(end)) {
        this[_utf8Sink].addSlice(source, start, end, isLast);
      } else if (dart.test(isLast)) {
        this.close();
      }
    }
  };
  dart.setSignature(convert._ErrorHandlingAsciiDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ErrorHandlingAsciiDecoderSink, [convert.ByteConversionSink])}),
    fields: () => ({[_utf8Sink]: convert.ByteConversionSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()])
    })
  });
  convert._SimpleAsciiDecoderSink = class _SimpleAsciiDecoderSink extends convert.ByteConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    close() {
      this[_sink$].close();
    }
    add(source) {
      for (let i = 0; i < dart.notNull(source[dartx.length]); i++) {
        if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
          dart.throw(new core.FormatException("Source contains non-ASCII bytes."));
        }
      }
      this[_sink$].add(core.String.fromCharCodes(source));
    }
    addSlice(source, start, end, isLast) {
      let length = source[dartx.length];
      core.RangeError.checkValidRange(start, end, length);
      if (dart.notNull(start) < dart.notNull(end)) {
        if (start != 0 || end != length) {
          source = source[dartx.sublist](start, end);
        }
        this.add(source);
      }
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert._SimpleAsciiDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._SimpleAsciiDecoderSink, [core.Sink])}),
    fields: () => ({[_sink$]: core.Sink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()])
    })
  });
  const _urlSafe = Symbol('_urlSafe');
  convert.Base64Encoder = class Base64Encoder extends convert.Converter$(core.List$(core.int), core.String) {
    new() {
      this[_urlSafe] = false;
      super.new();
    }
    urlSafe() {
      this[_urlSafe] = true;
      super.new();
    }
    convert(input) {
      if (dart.test(input[dartx.isEmpty])) return "";
      let encoder = new convert._Base64Encoder(this[_urlSafe]);
      let buffer = encoder.encode(input, 0, input[dartx.length], true);
      return core.String.fromCharCodes(buffer);
    }
    startChunkedConversion(sink) {
      if (convert.StringConversionSink.is(sink)) {
        return new convert._Utf8Base64EncoderSink(sink.asUtf8Sink(false), this[_urlSafe]);
      }
      return new convert._AsciiBase64EncoderSink(sink, this[_urlSafe]);
    }
  };
  dart.addSimpleTypeTests(convert.Base64Encoder);
  dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
  dart.setSignature(convert.Base64Encoder, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.Base64Encoder, []),
      urlSafe: dart.definiteFunctionType(convert.Base64Encoder, [])
    }),
    fields: () => ({[_urlSafe]: core.bool}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [ListOfint()]),
      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
    })
  });
  let const$31;
  const _encoder = Symbol('_encoder');
  let const$32;
  let const$33;
  convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
    new() {
      this[_encoder] = const$31 || (const$31 = dart.const(new convert.Base64Encoder()));
      super.new();
    }
    urlSafe() {
      this[_encoder] = const$32 || (const$32 = dart.const(new convert.Base64Encoder.urlSafe()));
      super.new();
    }
    get encoder() {
      return this[_encoder];
    }
    get decoder() {
      return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
    }
  };
  dart.addSimpleTypeTests(convert.Base64Codec);
  dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
  dart.setSignature(convert.Base64Codec, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.Base64Codec, []),
      urlSafe: dart.definiteFunctionType(convert.Base64Codec, [])
    }),
    fields: () => ({[_encoder]: convert.Base64Encoder}),
    getters: () => ({
      encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
      decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
    })
  });
  convert.BASE64 = dart.const(new convert.Base64Codec());
  convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
  convert._paddingChar = 61;
  const _alphabet = Symbol('_alphabet');
  const _state$0 = Symbol('_state');
  convert._Base64Encoder = class _Base64Encoder extends core.Object {
    new(urlSafe) {
      this[_alphabet] = dart.test(urlSafe) ? convert._Base64Encoder._base64urlAlphabet : convert._Base64Encoder._base64Alphabet;
      this[_state$0] = 0;
    }
    static _encodeState(count, bits) {
      dart.assert(dart.notNull(count) <= convert._Base64Encoder._countMask);
      return (dart.notNull(bits) << convert._Base64Encoder._valueShift | dart.notNull(count)) >>> 0;
    }
    static _stateBits(state) {
      return state[dartx['>>']](convert._Base64Encoder._valueShift);
    }
    static _stateCount(state) {
      return dart.notNull(state) & convert._Base64Encoder._countMask;
    }
    createBuffer(bufferLength) {
      return typed_data.Uint8List.new(bufferLength);
    }
    encode(bytes, start, end, isLast) {
      dart.assert(0 <= dart.notNull(start));
      dart.assert(dart.notNull(start) <= dart.notNull(end));
      dart.assert(bytes == null || dart.notNull(end) <= dart.notNull(bytes[dartx.length]));
      let length = dart.notNull(end) - dart.notNull(start);
      let count = convert._Base64Encoder._stateCount(this[_state$0]);
      let byteCount = dart.notNull(count) + length;
      let fullChunks = (byteCount / 3)[dartx.truncate]();
      let partialChunkLength = byteCount - fullChunks * 3;
      let bufferLength = fullChunks * 4;
      if (dart.test(isLast) && partialChunkLength > 0) {
        bufferLength = bufferLength + 4;
      }
      let output = this.createBuffer(bufferLength);
      this[_state$0] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state$0]);
      if (bufferLength > 0) return output;
      return null;
    }
    static encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
      let bits = convert._Base64Encoder._stateBits(state);
      let expectedChars = 3 - dart.notNull(convert._Base64Encoder._stateCount(state));
      let byteOr = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let byte = bytes[dartx._get](i);
        byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
        bits = (dart.notNull(bits) << 8 | dart.notNull(byte)) & 16777215;
        expectedChars--;
        if (expectedChars == 0) {
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 18 & convert._Base64Encoder._sixBitMask));
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 12 & convert._Base64Encoder._sixBitMask));
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 6 & convert._Base64Encoder._sixBitMask));
          output[dartx._set]((() => {
            let x = outputIndex;
            outputIndex = dart.notNull(x) + 1;
            return x;
          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) & convert._Base64Encoder._sixBitMask));
          expectedChars = 3;
          bits = 0;
        }
      }
      if (dart.notNull(byteOr) >= 0 && dart.notNull(byteOr) <= 255) {
        if (dart.test(isLast) && expectedChars < 3) {
          convert._Base64Encoder.writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
          return 0;
        }
        return convert._Base64Encoder._encodeState(3 - expectedChars, bits);
      }
      let i = start;
      while (dart.notNull(i) < dart.notNull(end)) {
        let byte = bytes[dartx._get](i);
        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) break;
        i = dart.notNull(i) + 1;
      }
      dart.throw(new core.ArgumentError.value(bytes, dart.str`Not a byte value at index ${i}: 0x${bytes[dartx._get](i)[dartx.toRadixString](16)}`));
    }
    static writeFinalChunk(alphabet, output, outputIndex, count, bits) {
      dart.assert(dart.notNull(count) > 0);
      if (count == 1) {
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 2 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 4 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), convert._paddingChar);
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), convert._paddingChar);
      } else {
        dart.assert(count == 2);
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 10 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 4 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 2 & convert._Base64Encoder._sixBitMask));
        output[dartx._set]((() => {
          let x = outputIndex;
          outputIndex = dart.notNull(x) + 1;
          return x;
        })(), convert._paddingChar);
      }
    }
  };
  dart.setSignature(convert._Base64Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Base64Encoder, [core.bool])}),
    fields: () => ({
      [_state$0]: core.int,
      [_alphabet]: core.String
    }),
    methods: () => ({
      createBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
      encode: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint(), core.int, core.int, core.bool])
    }),
    sfields: () => ({
      _base64Alphabet: core.String,
      _base64urlAlphabet: core.String,
      _valueShift: core.int,
      _countMask: core.int,
      _sixBitMask: core.int
    }),
    statics: () => ({
      _encodeState: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _stateBits: dart.definiteFunctionType(core.int, [core.int]),
      _stateCount: dart.definiteFunctionType(core.int, [core.int]),
      encodeChunk: dart.definiteFunctionType(core.int, [core.String, ListOfint(), core.int, core.int, core.bool, typed_data.Uint8List, core.int, core.int]),
      writeFinalChunk: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List, core.int, core.int, core.int])
    }),
    names: ['_encodeState', '_stateBits', '_stateCount', 'encodeChunk', 'writeFinalChunk']
  });
  convert._Base64Encoder._base64Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  convert._Base64Encoder._base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  convert._Base64Encoder._valueShift = 2;
  convert._Base64Encoder._countMask = 3;
  convert._Base64Encoder._sixBitMask = 63;
  convert._BufferCachingBase64Encoder = class _BufferCachingBase64Encoder extends convert._Base64Encoder {
    new(urlSafe) {
      this.bufferCache = null;
      super.new(urlSafe);
    }
    createBuffer(bufferLength) {
      if (this.bufferCache == null || dart.notNull(this.bufferCache[dartx.length]) < dart.notNull(bufferLength)) {
        this.bufferCache = typed_data.Uint8List.new(bufferLength);
      }
      return typed_data.Uint8List.view(this.bufferCache[dartx.buffer], 0, bufferLength);
    }
  };
  dart.setSignature(convert._BufferCachingBase64Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._BufferCachingBase64Encoder, [core.bool])}),
    fields: () => ({bufferCache: typed_data.Uint8List})
  });
  const _add$1 = Symbol('_add');
  convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
    new() {
      super.new();
    }
    add(source) {
      this[_add$1](source, 0, source[dartx.length], false);
    }
    close() {
      this[_add$1](null, 0, 0, true);
    }
    addSlice(source, start, end, isLast) {
      if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      this[_add$1](source, start, end, isLast);
    }
  };
  dart.setSignature(convert._Base64EncoderSink, {
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert._AsciiBase64EncoderSink = class _AsciiBase64EncoderSink extends convert._Base64EncoderSink {
    new(sink, urlSafe) {
      this[_sink$] = sink;
      this[_encoder] = new convert._BufferCachingBase64Encoder(urlSafe);
      super.new();
    }
    [_add$1](source, start, end, isLast) {
      let buffer = this[_encoder].encode(source, start, end, isLast);
      if (buffer != null) {
        let string = core.String.fromCharCodes(buffer);
        this[_sink$].add(string);
      }
      if (dart.test(isLast)) {
        this[_sink$].close();
      }
    }
  };
  dart.setSignature(convert._AsciiBase64EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._AsciiBase64EncoderSink, [SinkOfString(), core.bool])}),
    fields: () => ({
      [_sink$]: SinkOfString(),
      [_encoder]: convert._Base64Encoder
    }),
    methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
  });
  convert._Utf8Base64EncoderSink = class _Utf8Base64EncoderSink extends convert._Base64EncoderSink {
    new(sink, urlSafe) {
      this[_sink$] = sink;
      this[_encoder] = new convert._Base64Encoder(urlSafe);
      super.new();
    }
    [_add$1](source, start, end, isLast) {
      let buffer = this[_encoder].encode(source, start, end, isLast);
      if (buffer != null) {
        this[_sink$].addSlice(buffer, 0, buffer[dartx.length], isLast);
      }
    }
  };
  dart.setSignature(convert._Utf8Base64EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Base64EncoderSink, [convert.ByteConversionSink, core.bool])}),
    fields: () => ({
      [_sink$]: convert.ByteConversionSink,
      [_encoder]: convert._Base64Encoder
    }),
    methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
  });
  convert.Base64Decoder = class Base64Decoder extends convert.Converter$(core.String, core.List$(core.int)) {
    new() {
      super.new();
    }
    convert(input, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      end = core.RangeError.checkValidRange(start, end, input[dartx.length]);
      if (start == end) return typed_data.Uint8List.new(0);
      let decoder = new convert._Base64Decoder();
      let buffer = decoder.decode(input, start, end);
      decoder.close(input, end);
      return buffer;
    }
    startChunkedConversion(sink) {
      return new convert._Base64DecoderSink(sink);
    }
  };
  dart.addSimpleTypeTests(convert.Base64Decoder);
  dart.setSignature(convert.Base64Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Base64Decoder, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
    })
  });
  convert._Base64Decoder = class _Base64Decoder extends core.Object {
    new() {
      this[_state$0] = 0;
    }
    static _encodeCharacterState(count, bits) {
      dart.assert(count == (dart.notNull(count) & convert._Base64Decoder._countMask));
      return (dart.notNull(bits) << convert._Base64Decoder._valueShift | dart.notNull(count)) >>> 0;
    }
    static _stateCount(state) {
      dart.assert(dart.notNull(state) >= 0);
      return dart.notNull(state) & convert._Base64Decoder._countMask;
    }
    static _stateBits(state) {
      dart.assert(dart.notNull(state) >= 0);
      return state[dartx['>>']](convert._Base64Decoder._valueShift);
    }
    static _encodePaddingState(expectedPadding) {
      dart.assert(dart.notNull(expectedPadding) >= 0);
      dart.assert(dart.notNull(expectedPadding) <= 5);
      return -dart.notNull(expectedPadding) - 1;
    }
    static _statePadding(state) {
      dart.assert(dart.notNull(state) < 0);
      return -dart.notNull(state) - 1;
    }
    static _hasSeenPadding(state) {
      return dart.notNull(state) < 0;
    }
    decode(input, start, end) {
      dart.assert(0 <= dart.notNull(start));
      dart.assert(dart.notNull(start) <= dart.notNull(end));
      dart.assert(dart.notNull(end) <= dart.notNull(input[dartx.length]));
      if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state$0]))) {
        this[_state$0] = convert._Base64Decoder._checkPadding(input, start, end, this[_state$0]);
        return null;
      }
      if (start == end) return typed_data.Uint8List.new(0);
      let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state$0]);
      this[_state$0] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state$0]);
      return buffer;
    }
    close(input, end) {
      if (dart.notNull(this[_state$0]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
        dart.throw(new core.FormatException("Missing padding character", input, end));
      }
      if (dart.notNull(this[_state$0]) > 0) {
        dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
      }
      this[_state$0] = convert._Base64Decoder._encodePaddingState(0);
    }
    static decodeChunk(input, start, end, output, outIndex, state) {
      dart.assert(!dart.test(convert._Base64Decoder._hasSeenPadding(state)));
      let asciiMask = 127;
      let asciiMax = 127;
      let eightBitMask = 255;
      let bitsPerCharacter = 6;
      let bits = convert._Base64Decoder._stateBits(state);
      let count = convert._Base64Decoder._stateCount(state);
      let charOr = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = input[dartx.codeUnitAt](i);
        charOr = (dart.notNull(charOr) | dart.notNull(char)) >>> 0;
        let code = convert._Base64Decoder._inverseAlphabet[dartx._get]((dart.notNull(char) & asciiMask) >>> 0);
        if (dart.notNull(code) >= 0) {
          bits = (bits[dartx['<<']](bitsPerCharacter) | dart.notNull(code)) & 16777215;
          count = dart.notNull(count) + 1 & 3;
          if (count == 0) {
            dart.assert(dart.notNull(outIndex) + 3 <= dart.notNull(output[dartx.length]));
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), (bits[dartx['>>']](16) & eightBitMask) >>> 0);
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), (bits[dartx['>>']](8) & eightBitMask) >>> 0);
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), (dart.notNull(bits) & eightBitMask) >>> 0);
            bits = 0;
          }
          continue;
        } else if (code == convert._Base64Decoder._padding && dart.notNull(count) > 1) {
          if (dart.notNull(charOr) < 0 || dart.notNull(charOr) > asciiMax) break;
          if (count == 3) {
            if ((dart.notNull(bits) & 3) != 0) {
              dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
            }
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), bits[dartx['>>']](10));
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), bits[dartx['>>']](2));
          } else {
            if ((dart.notNull(bits) & 15) != 0) {
              dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
            }
            output[dartx._set]((() => {
              let x = outIndex;
              outIndex = dart.notNull(x) + 1;
              return x;
            })(), bits[dartx['>>']](4));
          }
          let expectedPadding = (3 - dart.notNull(count)) * 3;
          if (char == convert._Base64Decoder._char_percent) {
            expectedPadding = expectedPadding + 2;
          }
          state = convert._Base64Decoder._encodePaddingState(expectedPadding);
          return convert._Base64Decoder._checkPadding(input, dart.notNull(i) + 1, end, state);
        }
        dart.throw(new core.FormatException("Invalid character", input, i));
      }
      if (dart.notNull(charOr) >= 0 && dart.notNull(charOr) <= asciiMax) {
        return convert._Base64Decoder._encodeCharacterState(count, bits);
      }
      let i = null;
      for (i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = input[dartx.codeUnitAt](i);
        if (dart.notNull(char) < 0 || dart.notNull(char) > asciiMax) break;
      }
      dart.throw(new core.FormatException("Invalid character", input, i));
    }
    static _allocateBuffer(input, start, end, state) {
      dart.assert(dart.notNull(state) >= 0);
      let paddingStart = convert._Base64Decoder._trimPaddingChars(input, start, end);
      let length = dart.notNull(convert._Base64Decoder._stateCount(state)) + (dart.notNull(paddingStart) - dart.notNull(start));
      let bufferLength = length[dartx['>>']](2) * 3;
      let remainderLength = length & 3;
      if (remainderLength != 0 && dart.notNull(paddingStart) < dart.notNull(end)) {
        bufferLength = bufferLength + (remainderLength - 1);
      }
      if (bufferLength > 0) return typed_data.Uint8List.new(bufferLength);
      return null;
    }
    static _trimPaddingChars(input, start, end) {
      let padding = 0;
      let index = end;
      let newEnd = end;
      while (dart.notNull(index) > dart.notNull(start) && padding < 2) {
        index = dart.notNull(index) - 1;
        let char = input[dartx.codeUnitAt](index);
        if (char == convert._paddingChar) {
          padding++;
          newEnd = index;
          continue;
        }
        if ((dart.notNull(char) | 32) == convert._Base64Decoder._char_d) {
          if (index == start) break;
          index = dart.notNull(index) - 1;
          char = input[dartx.codeUnitAt](index);
        }
        if (char == convert._Base64Decoder._char_3) {
          if (index == start) break;
          index = dart.notNull(index) - 1;
          char = input[dartx.codeUnitAt](index);
        }
        if (char == convert._Base64Decoder._char_percent) {
          padding++;
          newEnd = index;
          continue;
        }
        break;
      }
      return newEnd;
    }
    static _checkPadding(input, start, end, state) {
      dart.assert(convert._Base64Decoder._hasSeenPadding(state));
      if (start == end) return state;
      let expectedPadding = convert._Base64Decoder._statePadding(state);
      dart.assert(dart.notNull(expectedPadding) >= 0);
      dart.assert(dart.notNull(expectedPadding) < 6);
      while (dart.notNull(expectedPadding) > 0) {
        let char = input[dartx.codeUnitAt](start);
        if (expectedPadding == 3) {
          if (char == convert._paddingChar) {
            expectedPadding = dart.notNull(expectedPadding) - 3;
            start = dart.notNull(start) + 1;
            break;
          }
          if (char == convert._Base64Decoder._char_percent) {
            expectedPadding = dart.notNull(expectedPadding) - 1;
            start = dart.notNull(start) + 1;
            if (start == end) break;
            char = input[dartx.codeUnitAt](start);
          } else {
            break;
          }
        }
        let expectedPartialPadding = expectedPadding;
        if (dart.notNull(expectedPartialPadding) > 3) {
          expectedPartialPadding = dart.notNull(expectedPartialPadding) - 3;
        }
        if (expectedPartialPadding == 2) {
          if (char != convert._Base64Decoder._char_3) break;
          start = dart.notNull(start) + 1;
          expectedPadding = dart.notNull(expectedPadding) - 1;
          if (start == end) break;
          char = input[dartx.codeUnitAt](start);
        }
        if ((dart.notNull(char) | 32) != convert._Base64Decoder._char_d) break;
        start = dart.notNull(start) + 1;
        expectedPadding = dart.notNull(expectedPadding) - 1;
        if (start == end) break;
      }
      if (start != end) {
        dart.throw(new core.FormatException("Invalid padding character", input, start));
      }
      return convert._Base64Decoder._encodePaddingState(expectedPadding);
    }
  };
  dart.setSignature(convert._Base64Decoder, {
    fields: () => ({[_state$0]: core.int}),
    methods: () => ({
      decode: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int]),
      close: dart.definiteFunctionType(dart.void, [core.String, core.int])
    }),
    sfields: () => ({
      _valueShift: core.int,
      _countMask: core.int,
      _invalid: core.int,
      _padding: core.int,
      __: core.int,
      _p: core.int,
      _inverseAlphabet: ListOfint(),
      _char_percent: core.int,
      _char_3: core.int,
      _char_d: core.int
    }),
    statics: () => ({
      _encodeCharacterState: dart.definiteFunctionType(core.int, [core.int, core.int]),
      _stateCount: dart.definiteFunctionType(core.int, [core.int]),
      _stateBits: dart.definiteFunctionType(core.int, [core.int]),
      _encodePaddingState: dart.definiteFunctionType(core.int, [core.int]),
      _statePadding: dart.definiteFunctionType(core.int, [core.int]),
      _hasSeenPadding: dart.definiteFunctionType(core.bool, [core.int]),
      decodeChunk: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, typed_data.Uint8List, core.int, core.int]),
      _allocateBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int, core.int]),
      _trimPaddingChars: dart.definiteFunctionType(core.int, [core.String, core.int, core.int]),
      _checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int])
    }),
    names: ['_encodeCharacterState', '_stateCount', '_stateBits', '_encodePaddingState', '_statePadding', '_hasSeenPadding', 'decodeChunk', '_allocateBuffer', '_trimPaddingChars', '_checkPadding']
  });
  convert._Base64Decoder._valueShift = 2;
  convert._Base64Decoder._countMask = 3;
  convert._Base64Decoder._invalid = -2;
  convert._Base64Decoder._padding = -1;
  convert._Base64Decoder._char_percent = 37;
  convert._Base64Decoder._char_3 = 51;
  convert._Base64Decoder._char_d = 100;
  dart.defineLazy(convert._Base64Decoder, {
    get __() {
      return convert._Base64Decoder._invalid;
    },
    get _p() {
      return convert._Base64Decoder._padding;
    },
    get _inverseAlphabet() {
      return typed_data.Int8List.fromList(JSArrayOfint().of([convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 63, convert._Base64Decoder.__, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__]));
    }
  });
  const _decoder = Symbol('_decoder');
  convert._Base64DecoderSink = class _Base64DecoderSink extends convert.StringConversionSinkBase {
    new(sink) {
      this[_decoder] = new convert._Base64Decoder();
      this[_sink$] = sink;
    }
    add(string) {
      if (dart.test(string[dartx.isEmpty])) return;
      let buffer = this[_decoder].decode(string, 0, string[dartx.length]);
      if (buffer != null) this[_sink$].add(buffer);
    }
    close() {
      this[_decoder].close(null, null);
      this[_sink$].close();
    }
    addSlice(string, start, end, isLast) {
      end = core.RangeError.checkValidRange(start, end, string[dartx.length]);
      if (start == end) return;
      let buffer = this[_decoder].decode(string, start, end);
      if (buffer != null) this[_sink$].add(buffer);
      if (dart.test(isLast)) {
        this[_decoder].close(string, end);
        this[_sink$].close();
      }
    }
  };
  dart.setSignature(convert._Base64DecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Base64DecoderSink, [SinkOfListOfint()])}),
    fields: () => ({
      [_sink$]: SinkOfListOfint(),
      [_decoder]: convert._Base64Decoder
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  convert._ByteAdapterSink = class _ByteAdapterSink extends convert.ByteConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    add(chunk) {
      this[_sink$].add(chunk);
    }
    close() {
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._ByteAdapterSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ByteAdapterSink, [SinkOfListOfint()])}),
    fields: () => ({[_sink$]: SinkOfListOfint()}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _buffer = Symbol('_buffer');
  const _callback = Symbol('_callback');
  const _bufferIndex = Symbol('_bufferIndex');
  convert._ByteCallbackSink = class _ByteCallbackSink extends convert.ByteConversionSinkBase {
    new(callback) {
      this[_buffer] = typed_data.Uint8List.new(convert._ByteCallbackSink._INITIAL_BUFFER_SIZE);
      this[_callback] = callback;
      this[_bufferIndex] = 0;
      super.new();
    }
    add(chunk) {
      let freeCount = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_bufferIndex]);
      if (dart.notNull(chunk[dartx.length]) > freeCount) {
        let oldLength = this[_buffer][dartx.length];
        let newLength = dart.notNull(convert._ByteCallbackSink._roundToPowerOf2(dart.notNull(chunk[dartx.length]) + dart.notNull(oldLength))) * 2;
        let grown = typed_data.Uint8List.new(newLength);
        grown[dartx.setRange](0, this[_buffer][dartx.length], this[_buffer]);
        this[_buffer] = grown;
      }
      this[_buffer][dartx.setRange](this[_bufferIndex], dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]), chunk);
      this[_bufferIndex] = dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]);
    }
    static _roundToPowerOf2(v) {
      dart.assert(dart.notNull(v) > 0);
      v = dart.notNull(v) - 1;
      v = (dart.notNull(v) | v[dartx['>>']](1)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](2)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](4)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](8)) >>> 0;
      v = (dart.notNull(v) | v[dartx['>>']](16)) >>> 0;
      v = dart.notNull(v) + 1;
      return v;
    }
    close() {
      this[_callback](this[_buffer][dartx.sublist](0, this[_bufferIndex]));
    }
  };
  dart.setSignature(convert._ByteCallbackSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ByteCallbackSink, [ListOfintTovoid()])}),
    fields: () => ({
      [_callback]: ListOfintTovoid(),
      [_buffer]: ListOfint(),
      [_bufferIndex]: core.int
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [IterableOfint()]),
      close: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({_INITIAL_BUFFER_SIZE: core.int}),
    statics: () => ({_roundToPowerOf2: dart.definiteFunctionType(core.int, [core.int])}),
    names: ['_roundToPowerOf2']
  });
  convert._ByteCallbackSink._INITIAL_BUFFER_SIZE = 1024;
  convert._ChunkedConversionCallback$ = dart.generic(T => {
    const _ChunkedConversionCallback = dart.typedef('_ChunkedConversionCallback', () => dart.functionType(dart.void, [T]));
    return _ChunkedConversionCallback;
  });
  convert._ChunkedConversionCallback = _ChunkedConversionCallback();
  convert.ChunkedConverter$ = dart.generic((S, T, S2, T2) => {
    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    class ChunkedConverter extends convert.Converter$(S, T) {
      new() {
        super.new();
      }
      bind(other) {
        return super.bind(StreamOfS()._check(other));
      }
      startChunkedConversion(sink) {
        return super.startChunkedConversion(SinkOfT()._check(sink));
      }
    }
    dart.setSignature(ChunkedConverter, {
      constructors: () => ({new: dart.definiteFunctionType(convert.ChunkedConverter$(S, T, S2, T2), [])}),
      methods: () => ({
        bind: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
        startChunkedConversion: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
      })
    });
    return ChunkedConverter;
  });
  convert.ChunkedConverter = ChunkedConverter();
  const _accumulated = Symbol('_accumulated');
  convert._SimpleCallbackSink$ = dart.generic(T => {
    let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    let _ChunkedConversionCallbackOfListOfT = () => (_ChunkedConversionCallbackOfListOfT = dart.constFn(convert._ChunkedConversionCallback$(ListOfT())))();
    class _SimpleCallbackSink extends convert.ChunkedConversionSink$(T) {
      new(callback) {
        this[_accumulated] = JSArrayOfT().of([]);
        this[_callback] = callback;
        super.new();
      }
      add(chunk) {
        T._check(chunk);
        this[_accumulated][dartx.add](chunk);
      }
      close() {
        this[_callback](this[_accumulated]);
      }
    }
    dart.setSignature(_SimpleCallbackSink, {
      constructors: () => ({new: dart.definiteFunctionType(convert._SimpleCallbackSink$(T), [_ChunkedConversionCallbackOfListOfT()])}),
      fields: () => ({
        [_callback]: _ChunkedConversionCallbackOfListOfT(),
        [_accumulated]: ListOfT()
      }),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [T]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _SimpleCallbackSink;
  });
  convert._SimpleCallbackSink = _SimpleCallbackSink();
  const _eventSink = Symbol('_eventSink');
  const _chunkedSink = Symbol('_chunkedSink');
  convert._ConverterStreamEventSink$ = dart.generic((S, T) => {
    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
    let SinkOfS = () => (SinkOfS = dart.constFn(core.Sink$(S)))();
    let ConverterOfS$T = () => (ConverterOfS$T = dart.constFn(convert.Converter$(S, T)))();
    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
    class _ConverterStreamEventSink extends core.Object {
      new(converter, sink) {
        this[_eventSink] = sink;
        this[_chunkedSink] = converter.startChunkedConversion(sink);
      }
      add(o) {
        S._check(o);
        this[_chunkedSink].add(o);
      }
      addError(error, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        this[_eventSink].addError(error, stackTrace);
      }
      close() {
        this[_chunkedSink].close();
      }
    }
    dart.addTypeTests(_ConverterStreamEventSink);
    _ConverterStreamEventSink[dart.implements] = () => [EventSinkOfS()];
    dart.setSignature(_ConverterStreamEventSink, {
      constructors: () => ({new: dart.definiteFunctionType(convert._ConverterStreamEventSink$(S, T), [ConverterOfS$T(), EventSinkOfT()])}),
      fields: () => ({
        [_eventSink]: EventSinkOfT(),
        [_chunkedSink]: SinkOfS()
      }),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [S]),
        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _ConverterStreamEventSink;
  });
  convert._ConverterStreamEventSink = _ConverterStreamEventSink();
  const _second = Symbol('_second');
  const _first$0 = Symbol('_first');
  convert._FusedCodec$ = dart.generic((S, M, T) => {
    let CodecOfS$M = () => (CodecOfS$M = dart.constFn(convert.Codec$(S, M)))();
    let CodecOfM$T = () => (CodecOfM$T = dart.constFn(convert.Codec$(M, T)))();
    class _FusedCodec extends convert.Codec$(S, T) {
      get encoder() {
        return this[_first$0].encoder.fuse(T)(this[_second].encoder);
      }
      get decoder() {
        return this[_second].decoder.fuse(S)(this[_first$0].decoder);
      }
      new(first, second) {
        this[_first$0] = first;
        this[_second] = second;
        super.new();
      }
    }
    dart.setSignature(_FusedCodec, {
      constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
      fields: () => ({
        [_first$0]: CodecOfS$M(),
        [_second]: CodecOfM$T()
      }),
      getters: () => ({
        encoder: dart.definiteFunctionType(convert.Converter$(S, T), []),
        decoder: dart.definiteFunctionType(convert.Converter$(T, S), [])
      })
    });
    return _FusedCodec;
  });
  convert._FusedCodec = _FusedCodec();
  const _codec = Symbol('_codec');
  convert._InvertedCodec$ = dart.generic((T, S) => {
    let CodecOfS$T = () => (CodecOfS$T = dart.constFn(convert.Codec$(S, T)))();
    class _InvertedCodec extends convert.Codec$(T, S) {
      new(codec) {
        this[_codec] = codec;
        super.new();
      }
      get encoder() {
        return this[_codec].decoder;
      }
      get decoder() {
        return this[_codec].encoder;
      }
      get inverted() {
        return this[_codec];
      }
    }
    dart.setSignature(_InvertedCodec, {
      constructors: () => ({new: dart.definiteFunctionType(convert._InvertedCodec$(T, S), [CodecOfS$T()])}),
      fields: () => ({[_codec]: CodecOfS$T()}),
      getters: () => ({
        encoder: dart.definiteFunctionType(convert.Converter$(T, S), []),
        decoder: dart.definiteFunctionType(convert.Converter$(S, T), []),
        inverted: dart.definiteFunctionType(convert.Codec$(S, T), [])
      })
    });
    return _InvertedCodec;
  });
  convert._InvertedCodec = _InvertedCodec();
  convert._FusedConverter$ = dart.generic((S, M, T) => {
    let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
    let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
    class _FusedConverter extends convert.Converter$(S, T) {
      new(first, second) {
        this[_first$0] = first;
        this[_second] = second;
        super.new();
      }
      convert(input) {
        S._check(input);
        return this[_second].convert(this[_first$0].convert(input));
      }
      startChunkedConversion(sink) {
        SinkOfT()._check(sink);
        return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
      }
    }
    dart.setSignature(_FusedConverter, {
      constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
      fields: () => ({
        [_first$0]: ConverterOfS$M(),
        [_second]: ConverterOfM$T()
      }),
      methods: () => ({
        convert: dart.definiteFunctionType(T, [S]),
        startChunkedConversion: dart.definiteFunctionType(core.Sink$(S), [SinkOfT()])
      })
    });
    return _FusedConverter;
  });
  convert._FusedConverter = _FusedConverter();
  const _name$0 = Symbol('_name');
  let const$34;
  let const$35;
  let const$36;
  let const$37;
  let const$38;
  let const$39;
  let const$40;
  let const$41;
  convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
    _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
      this[_name$0] = name;
      this.escapeLtGt = escapeLtGt;
      this.escapeQuot = escapeQuot;
      this.escapeApos = escapeApos;
      this.escapeSlash = escapeSlash;
    }
    new(opts) {
      let name = opts && 'name' in opts ? opts.name : "custom";
      let escapeLtGt = opts && 'escapeLtGt' in opts ? opts.escapeLtGt : false;
      let escapeQuot = opts && 'escapeQuot' in opts ? opts.escapeQuot : false;
      let escapeApos = opts && 'escapeApos' in opts ? opts.escapeApos : false;
      let escapeSlash = opts && 'escapeSlash' in opts ? opts.escapeSlash : false;
      this.escapeLtGt = escapeLtGt;
      this.escapeQuot = escapeQuot;
      this.escapeApos = escapeApos;
      this.escapeSlash = escapeSlash;
      this[_name$0] = name;
    }
    toString() {
      return this[_name$0];
    }
  };
  dart.defineNamedConstructor(convert.HtmlEscapeMode, '_');
  dart.setSignature(convert.HtmlEscapeMode, {
    constructors: () => ({
      _: dart.definiteFunctionType(convert.HtmlEscapeMode, [core.String, core.bool, core.bool, core.bool, core.bool]),
      new: dart.definiteFunctionType(convert.HtmlEscapeMode, [], {name: core.String, escapeLtGt: core.bool, escapeQuot: core.bool, escapeApos: core.bool, escapeSlash: core.bool})
    }),
    fields: () => ({
      [_name$0]: core.String,
      escapeLtGt: core.bool,
      escapeQuot: core.bool,
      escapeApos: core.bool,
      escapeSlash: core.bool
    }),
    sfields: () => ({
      UNKNOWN: convert.HtmlEscapeMode,
      ATTRIBUTE: convert.HtmlEscapeMode,
      SQ_ATTRIBUTE: convert.HtmlEscapeMode,
      ELEMENT: convert.HtmlEscapeMode
    })
  });
  dart.defineLazy(convert.HtmlEscapeMode, {
    get UNKNOWN() {
      return const$38 || (const$38 = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
    },
    get ATTRIBUTE() {
      return const$39 || (const$39 = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
    },
    get SQ_ATTRIBUTE() {
      return const$40 || (const$40 = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
    },
    get ELEMENT() {
      return const$41 || (const$41 = dart.const(new convert.HtmlEscapeMode._('element', true, false, false, false)));
    }
  });
  const _convert = Symbol('_convert');
  convert.HtmlEscape = class HtmlEscape extends convert.Converter$(core.String, core.String) {
    new(mode) {
      if (mode === void 0) mode = convert.HtmlEscapeMode.UNKNOWN;
      this.mode = mode;
      super.new();
    }
    convert(text) {
      let val = this[_convert](text, 0, text[dartx.length]);
      return val == null ? text : val;
    }
    [_convert](text, start, end) {
      let result = null;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let ch = text[dartx._get](i);
        let replacement = null;
        switch (ch) {
          case '&':
          {
            replacement = '&amp;';
            break;
          }
          case '"':
          {
            if (dart.test(this.mode.escapeQuot)) replacement = '&quot;';
            break;
          }
          case "'":
          {
            if (dart.test(this.mode.escapeApos)) replacement = '&#39;';
            break;
          }
          case '<':
          {
            if (dart.test(this.mode.escapeLtGt)) replacement = '&lt;';
            break;
          }
          case '>':
          {
            if (dart.test(this.mode.escapeLtGt)) replacement = '&gt;';
            break;
          }
          case '/':
          {
            if (dart.test(this.mode.escapeSlash)) replacement = '&#47;';
            break;
          }
        }
        if (replacement != null) {
          if (result == null) result = new core.StringBuffer();
          if (dart.notNull(i) > dart.notNull(start)) result.write(text[dartx.substring](start, i));
          result.write(replacement);
          start = dart.notNull(i) + 1;
        }
      }
      if (result == null) return null;
      if (dart.notNull(end) > dart.notNull(start)) result.write(text[dartx.substring](start, end));
      return dart.toString(result);
    }
    startChunkedConversion(sink) {
      if (!convert.StringConversionSink.is(sink)) {
        sink = convert.StringConversionSink.from(sink);
      }
      return new convert._HtmlEscapeSink(this, convert.StringConversionSink._check(sink));
    }
  };
  dart.addSimpleTypeTests(convert.HtmlEscape);
  dart.setSignature(convert.HtmlEscape, {
    constructors: () => ({new: dart.definiteFunctionType(convert.HtmlEscape, [], [convert.HtmlEscapeMode])}),
    fields: () => ({mode: convert.HtmlEscapeMode}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [core.String]),
      [_convert]: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()])
    })
  });
  convert.HTML_ESCAPE = dart.const(new convert.HtmlEscape());
  const _escape = Symbol('_escape');
  convert._HtmlEscapeSink = class _HtmlEscapeSink extends convert.StringConversionSinkBase {
    new(escape, sink) {
      this[_escape] = escape;
      this[_sink$] = sink;
    }
    addSlice(chunk, start, end, isLast) {
      let val = this[_escape][_convert](chunk, start, end);
      if (val == null) {
        this[_sink$].addSlice(chunk, start, end, isLast);
      } else {
        this[_sink$].add(val);
        if (dart.test(isLast)) this[_sink$].close();
      }
    }
    close() {
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._HtmlEscapeSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._HtmlEscapeSink, [convert.HtmlEscape, convert.StringConversionSink])}),
    fields: () => ({
      [_escape]: convert.HtmlEscape,
      [_sink$]: convert.StringConversionSink
    }),
    methods: () => ({
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert.JsonUnsupportedObjectError = class JsonUnsupportedObjectError extends core.Error {
    new(unsupportedObject, opts) {
      let cause = opts && 'cause' in opts ? opts.cause : null;
      this.unsupportedObject = unsupportedObject;
      this.cause = cause;
      super.new();
    }
    toString() {
      if (this.cause != null) {
        return "Converting object to an encodable object failed.";
      } else {
        return "Converting object did not return an encodable object.";
      }
    }
  };
  dart.setSignature(convert.JsonUnsupportedObjectError, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonUnsupportedObjectError, [dart.dynamic], {cause: dart.dynamic})}),
    fields: () => ({
      unsupportedObject: dart.dynamic,
      cause: dart.dynamic
    })
  });
  convert.JsonCyclicError = class JsonCyclicError extends convert.JsonUnsupportedObjectError {
    new(object) {
      super.new(object);
    }
    toString() {
      return "Cyclic error in JSON stringify";
    }
  };
  dart.setSignature(convert.JsonCyclicError, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonCyclicError, [core.Object])})
  });
  const _toEncodable = Symbol('_toEncodable');
  let const$42;
  let const$43;
  convert.JsonCodec = class JsonCodec extends convert.Codec$(core.Object, core.String) {
    new(opts) {
      let reviver = opts && 'reviver' in opts ? opts.reviver : null;
      let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
      this[_reviver] = reviver;
      this[_toEncodable] = toEncodable;
      super.new();
    }
    withReviver(reviver) {
      JsonCodec.prototype.new.call(this, {reviver: reviver});
    }
    decode(source, opts) {
      let reviver = opts && 'reviver' in opts ? opts.reviver : null;
      if (reviver == null) reviver = this[_reviver];
      if (reviver == null) return this.decoder.convert(source);
      return new convert.JsonDecoder(reviver).convert(source);
    }
    encode(value, opts) {
      let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
      if (toEncodable == null) toEncodable = this[_toEncodable];
      if (toEncodable == null) return this.encoder.convert(value);
      return new convert.JsonEncoder(toEncodable).convert(value);
    }
    get encoder() {
      if (this[_toEncodable] == null) return const$42 || (const$42 = dart.const(new convert.JsonEncoder()));
      return new convert.JsonEncoder(this[_toEncodable]);
    }
    get decoder() {
      if (this[_reviver] == null) return const$43 || (const$43 = dart.const(new convert.JsonDecoder()));
      return new convert.JsonDecoder(this[_reviver]);
    }
  };
  dart.addSimpleTypeTests(convert.JsonCodec);
  dart.defineNamedConstructor(convert.JsonCodec, 'withReviver');
  dart.setSignature(convert.JsonCodec, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.JsonCodec, [], {reviver: dynamicAnddynamicTodynamic(), toEncodable: dynamicTodynamic()}),
      withReviver: dart.definiteFunctionType(convert.JsonCodec, [dynamicAnddynamicTodynamic()])
    }),
    fields: () => ({
      [_reviver]: convert._Reviver,
      [_toEncodable]: convert._ToEncodable
    }),
    getters: () => ({
      encoder: dart.definiteFunctionType(convert.JsonEncoder, []),
      decoder: dart.definiteFunctionType(convert.JsonDecoder, [])
    }),
    methods: () => ({
      decode: dart.definiteFunctionType(dart.dynamic, [core.String], {reviver: dynamicAnddynamicTodynamic()}),
      encode: dart.definiteFunctionType(core.String, [core.Object], {toEncodable: dynamicTodynamic()})
    })
  });
  convert.JSON = dart.const(new convert.JsonCodec());
  convert._Reviver = dart.typedef('_Reviver', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
  convert._ToEncodable = dart.typedef('_ToEncodable', () => dart.functionType(dart.dynamic, [dart.dynamic]));
  convert.JsonEncoder = class JsonEncoder extends convert.Converter$(core.Object, core.String) {
    new(toEncodable) {
      if (toEncodable === void 0) toEncodable = null;
      this.indent = null;
      this[_toEncodable] = toEncodable;
      super.new();
    }
    withIndent(indent, toEncodable) {
      if (toEncodable === void 0) toEncodable = null;
      this.indent = indent;
      this[_toEncodable] = toEncodable;
      super.new();
    }
    convert(object) {
      return convert._JsonStringStringifier.stringify(object, this[_toEncodable], this.indent);
    }
    startChunkedConversion(sink) {
      if (!convert.StringConversionSink.is(sink)) {
        sink = convert.StringConversionSink.from(sink);
      } else if (convert._Utf8EncoderSink.is(sink)) {
        return new convert._JsonUtf8EncoderSink(sink[_sink$], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
      }
      return new convert._JsonEncoderSink(convert.StringConversionSink._check(sink), this[_toEncodable], this.indent);
    }
    bind(stream) {
      return super.bind(stream);
    }
    fuse(T) {
      return other => {
        if (convert.Utf8Encoder.is(other)) {
          return convert.Converter$(core.Object, T).as(new convert.JsonUtf8Encoder(this.indent, this[_toEncodable]));
        }
        return super.fuse(T)(other);
      };
    }
  };
  dart.addSimpleTypeTests(convert.JsonEncoder);
  dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
  dart.setSignature(convert.JsonEncoder, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.JsonEncoder, [], [dynamicTodynamic()]),
      withIndent: dart.definiteFunctionType(convert.JsonEncoder, [core.String], [dynamicTodynamic()])
    }),
    fields: () => ({
      indent: core.String,
      [_toEncodable]: convert._ToEncodable
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [core.Object]),
      startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfString()]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfObject()]),
      fuse: dart.definiteFunctionType(T => [convert.Converter$(core.Object, T), [convert.Converter$(core.String, T)]])
    })
  });
  const _indent = Symbol('_indent');
  const _bufferSize = Symbol('_bufferSize');
  convert.JsonUtf8Encoder = class JsonUtf8Encoder extends convert.Converter$(core.Object, core.List$(core.int)) {
    new(indent, toEncodable, bufferSize) {
      if (indent === void 0) indent = null;
      if (toEncodable === void 0) toEncodable = null;
      if (bufferSize === void 0) bufferSize = convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE;
      this[_indent] = convert.JsonUtf8Encoder._utf8Encode(indent);
      this[_toEncodable] = toEncodable;
      this[_bufferSize] = bufferSize;
      super.new();
    }
    static _utf8Encode(string) {
      if (string == null) return null;
      if (dart.test(string[dartx.isEmpty])) return typed_data.Uint8List.new(0);
      checkAscii: {
        for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
          if (dart.notNull(string[dartx.codeUnitAt](i)) >= 128) break checkAscii;
        }
        return string[dartx.codeUnits];
      }
      return convert.UTF8.encode(string);
    }
    convert(object) {
      let bytes = JSArrayOfListOfint().of([]);
      function addChunk(chunk, start, end) {
        if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(chunk[dartx.length])) {
          let length = dart.notNull(end) - dart.notNull(start);
          chunk = typed_data.Uint8List.view(chunk[dartx.buffer], dart.notNull(chunk[dartx.offsetInBytes]) + dart.notNull(start), length);
        }
        bytes[dartx.add](chunk);
      }
      dart.fn(addChunk, Uint8ListAndintAndintTovoid$());
      convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], addChunk);
      if (bytes[dartx.length] == 1) return bytes[dartx._get](0);
      let length = 0;
      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        length = dart.notNull(length) + dart.notNull(bytes[dartx._get](i)[dartx.length]);
      }
      let result = typed_data.Uint8List.new(length);
      for (let i = 0, offset = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        let byteList = bytes[dartx._get](i);
        let end = offset + dart.notNull(byteList[dartx.length]);
        result[dartx.setRange](offset, end, byteList);
        offset = end;
      }
      return result;
    }
    startChunkedConversion(sink) {
      let byteSink = null;
      if (convert.ByteConversionSink.is(sink)) {
        byteSink = sink;
      } else {
        byteSink = convert.ByteConversionSink.from(sink);
      }
      return new convert._JsonUtf8EncoderSink(byteSink, this[_toEncodable], this[_indent], this[_bufferSize]);
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
  dart.setSignature(convert.JsonUtf8Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonUtf8Encoder, [], [core.String, dynamicTodynamic(), core.int])}),
    fields: () => ({
      [_indent]: ListOfint(),
      [_toEncodable]: convert._ToEncodable,
      [_bufferSize]: core.int
    }),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.Object]),
      startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfListOfint()]),
      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [StreamOfObject()])
    }),
    sfields: () => ({DEFAULT_BUFFER_SIZE: core.int}),
    statics: () => ({_utf8Encode: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
    names: ['_utf8Encode']
  });
  convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE = 256;
  const _isDone = Symbol('_isDone');
  convert._JsonEncoderSink = class _JsonEncoderSink extends convert.ChunkedConversionSink$(core.Object) {
    new(sink, toEncodable, indent) {
      this[_sink$] = sink;
      this[_toEncodable] = toEncodable;
      this[_indent] = indent;
      this[_isDone] = false;
      super.new();
    }
    add(o) {
      if (dart.test(this[_isDone])) {
        dart.throw(new core.StateError("Only one call to add allowed"));
      }
      this[_isDone] = true;
      let stringSink = this[_sink$].asStringSink();
      convert._JsonStringStringifier.printOn(o, stringSink, this[_toEncodable], this[_indent]);
      stringSink.close();
    }
    close() {}
  };
  dart.addSimpleTypeTests(convert._JsonEncoderSink);
  dart.setSignature(convert._JsonEncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonEncoderSink, [convert.StringConversionSink, convert._ToEncodable, core.String])}),
    fields: () => ({
      [_indent]: core.String,
      [_toEncodable]: convert._ToEncodable,
      [_sink$]: convert.StringConversionSink,
      [_isDone]: core.bool
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [core.Object]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  const _addChunk = Symbol('_addChunk');
  convert._JsonUtf8EncoderSink = class _JsonUtf8EncoderSink extends convert.ChunkedConversionSink$(core.Object) {
    new(sink, toEncodable, indent, bufferSize) {
      this[_sink$] = sink;
      this[_toEncodable] = toEncodable;
      this[_indent] = indent;
      this[_bufferSize] = bufferSize;
      this[_isDone] = false;
      super.new();
    }
    [_addChunk](chunk, start, end) {
      this[_sink$].addSlice(chunk, start, end, false);
    }
    add(object) {
      if (dart.test(this[_isDone])) {
        dart.throw(new core.StateError("Only one call to add allowed"));
      }
      this[_isDone] = true;
      convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], dart.bind(this, _addChunk));
      this[_sink$].close();
    }
    close() {
      if (!dart.test(this[_isDone])) {
        this[_isDone] = true;
        this[_sink$].close();
      }
    }
  };
  dart.addSimpleTypeTests(convert._JsonUtf8EncoderSink);
  dart.setSignature(convert._JsonUtf8EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8EncoderSink, [convert.ByteConversionSink, convert._ToEncodable, ListOfint(), core.int])}),
    fields: () => ({
      [_sink$]: convert.ByteConversionSink,
      [_indent]: ListOfint(),
      [_toEncodable]: convert._ToEncodable,
      [_bufferSize]: core.int,
      [_isDone]: core.bool
    }),
    methods: () => ({
      [_addChunk]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int]),
      add: dart.definiteFunctionType(dart.void, [core.Object]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert.JsonDecoder = class JsonDecoder extends convert.Converter$(core.String, core.Object) {
    new(reviver) {
      if (reviver === void 0) reviver = null;
      this[_reviver] = reviver;
      super.new();
    }
    convert(input) {
      return convert._parseJson(input, this[_reviver]);
    }
    startChunkedConversion(sink) {
      return new convert._JsonDecoderSink(this[_reviver], sink);
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert.JsonDecoder);
  dart.setSignature(convert.JsonDecoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.JsonDecoder, [], [dynamicAnddynamicTodynamic()])}),
    fields: () => ({[_reviver]: convert._Reviver}),
    methods: () => ({
      convert: dart.definiteFunctionType(dart.dynamic, [core.String]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfObject()]),
      bind: dart.definiteFunctionType(async.Stream$(core.Object), [StreamOfString()])
    })
  });
  convert._parseJson = function(source, reviver) {
    if (!(typeof source == 'string')) dart.throw(_js_helper.argumentErrorValue(source));
    let parsed = null;
    try {
      parsed = JSON.parse(source);
    } catch (e) {
      dart.throw(new core.FormatException(String(e)));
    }

    if (reviver == null) {
      return convert._convertJsonToDartLazy(parsed);
    } else {
      return convert._convertJsonToDart(parsed, reviver);
    }
  };
  dart.fn(convert._parseJson, StringAndFnTodynamic());
  convert._defaultToEncodable = function(object) {
    return dart.dsend(object, 'toJson');
  };
  dart.fn(convert._defaultToEncodable, dynamicTodynamic$());
  const _seen = Symbol('_seen');
  const _checkCycle = Symbol('_checkCycle');
  const _removeSeen = Symbol('_removeSeen');
  convert._JsonStringifier = class _JsonStringifier extends core.Object {
    new(toEncodable) {
      this[_seen] = core.List.new();
      this[_toEncodable] = (() => {
        let l = toEncodable;
        return l != null ? l : convert._defaultToEncodable;
      })();
    }
    static hexDigit(x) {
      return dart.notNull(x) < 10 ? 48 + dart.notNull(x) : 87 + dart.notNull(x);
    }
    writeStringContent(s) {
      let offset = 0;
      let length = s[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        let charCode = s[dartx.codeUnitAt](i);
        if (dart.notNull(charCode) > convert._JsonStringifier.BACKSLASH) continue;
        if (dart.notNull(charCode) < 32) {
          if (i > offset) this.writeStringSlice(s, offset, i);
          offset = i + 1;
          this.writeCharCode(convert._JsonStringifier.BACKSLASH);
          switch (charCode) {
            case convert._JsonStringifier.BACKSPACE:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_b);
              break;
            }
            case convert._JsonStringifier.TAB:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_t);
              break;
            }
            case convert._JsonStringifier.NEWLINE:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_n);
              break;
            }
            case convert._JsonStringifier.FORM_FEED:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_f);
              break;
            }
            case convert._JsonStringifier.CARRIAGE_RETURN:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_r);
              break;
            }
            default:
            {
              this.writeCharCode(convert._JsonStringifier.CHAR_u);
              this.writeCharCode(convert._JsonStringifier.CHAR_0);
              this.writeCharCode(convert._JsonStringifier.CHAR_0);
              this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) >> 4 & 15));
              this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) & 15));
              break;
            }
          }
        } else if (charCode == convert._JsonStringifier.QUOTE || charCode == convert._JsonStringifier.BACKSLASH) {
          if (i > offset) this.writeStringSlice(s, offset, i);
          offset = i + 1;
          this.writeCharCode(convert._JsonStringifier.BACKSLASH);
          this.writeCharCode(charCode);
        }
      }
      if (offset == 0) {
        this.writeString(s);
      } else if (offset < dart.notNull(length)) {
        this.writeStringSlice(s, offset, length);
      }
    }
    [_checkCycle](object) {
      for (let i = 0; i < dart.notNull(this[_seen][dartx.length]); i++) {
        if (core.identical(object, this[_seen][dartx._get](i))) {
          dart.throw(new convert.JsonCyclicError(object));
        }
      }
      this[_seen][dartx.add](object);
    }
    [_removeSeen](object) {
      dart.assert(!dart.test(this[_seen][dartx.isEmpty]));
      dart.assert(core.identical(this[_seen][dartx.last], object));
      this[_seen][dartx.removeLast]();
    }
    writeObject(object) {
      if (dart.test(this.writeJsonValue(object))) return;
      this[_checkCycle](object);
      try {
        let customJson = dart.dcall(this[_toEncodable], object);
        if (!dart.test(this.writeJsonValue(customJson))) {
          dart.throw(new convert.JsonUnsupportedObjectError(object));
        }
        this[_removeSeen](object);
      } catch (e) {
        dart.throw(new convert.JsonUnsupportedObjectError(object, {cause: e}));
      }

    }
    writeJsonValue(object) {
      if (typeof object == 'number') {
        if (!dart.test(object[dartx.isFinite])) return false;
        this.writeNumber(object);
        return true;
      } else if (core.identical(object, true)) {
        this.writeString('true');
        return true;
      } else if (core.identical(object, false)) {
        this.writeString('false');
        return true;
      } else if (object == null) {
        this.writeString('null');
        return true;
      } else if (typeof object == 'string') {
        this.writeString('"');
        this.writeStringContent(object);
        this.writeString('"');
        return true;
      } else if (core.List.is(object)) {
        this[_checkCycle](object);
        this.writeList(object);
        this[_removeSeen](object);
        return true;
      } else if (core.Map.is(object)) {
        this[_checkCycle](object);
        let success = this.writeMap(object);
        this[_removeSeen](object);
        return success;
      } else {
        return false;
      }
    }
    writeList(list) {
      this.writeString('[');
      if (dart.notNull(list[dartx.length]) > 0) {
        this.writeObject(list[dartx._get](0));
        for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
          this.writeString(',');
          this.writeObject(list[dartx._get](i));
        }
      }
      this.writeString(']');
    }
    writeMap(map) {
      if (dart.test(map[dartx.isEmpty])) {
        this.writeString("{}");
        return true;
      }
      let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
      let i = 0;
      let allStringKeys = true;
      map[dartx.forEach](dart.fn((key, value) => {
        if (!(typeof key == 'string')) {
          allStringKeys = false;
        }
        keyValueList[dartx._set](i++, key);
        keyValueList[dartx._set](i++, value);
      }, dynamicAnddynamicTovoid$()));
      if (!allStringKeys) return false;
      this.writeString('{');
      let separator = '"';
      for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
        this.writeString(separator);
        separator = ',"';
        this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
        this.writeString('":');
        this.writeObject(keyValueList[dartx._get](i + 1));
      }
      this.writeString('}');
      return true;
    }
  };
  dart.setSignature(convert._JsonStringifier, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringifier, [dynamicTodynamic()])}),
    fields: () => ({
      [_seen]: core.List,
      [_toEncodable]: convert._ToEncodable
    }),
    methods: () => ({
      writeStringContent: dart.definiteFunctionType(dart.void, [core.String]),
      [_checkCycle]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_removeSeen]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      writeObject: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      writeJsonValue: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      writeList: dart.definiteFunctionType(dart.void, [core.List]),
      writeMap: dart.definiteFunctionType(core.bool, [core.Map])
    }),
    sfields: () => ({
      BACKSPACE: core.int,
      TAB: core.int,
      NEWLINE: core.int,
      CARRIAGE_RETURN: core.int,
      FORM_FEED: core.int,
      QUOTE: core.int,
      CHAR_0: core.int,
      BACKSLASH: core.int,
      CHAR_b: core.int,
      CHAR_f: core.int,
      CHAR_n: core.int,
      CHAR_r: core.int,
      CHAR_t: core.int,
      CHAR_u: core.int
    }),
    statics: () => ({hexDigit: dart.definiteFunctionType(core.int, [core.int])}),
    names: ['hexDigit']
  });
  convert._JsonStringifier.BACKSPACE = 8;
  convert._JsonStringifier.TAB = 9;
  convert._JsonStringifier.NEWLINE = 10;
  convert._JsonStringifier.CARRIAGE_RETURN = 13;
  convert._JsonStringifier.FORM_FEED = 12;
  convert._JsonStringifier.QUOTE = 34;
  convert._JsonStringifier.CHAR_0 = 48;
  convert._JsonStringifier.BACKSLASH = 92;
  convert._JsonStringifier.CHAR_b = 98;
  convert._JsonStringifier.CHAR_f = 102;
  convert._JsonStringifier.CHAR_n = 110;
  convert._JsonStringifier.CHAR_r = 114;
  convert._JsonStringifier.CHAR_t = 116;
  convert._JsonStringifier.CHAR_u = 117;
  const _indentLevel = Symbol('_indentLevel');
  convert._JsonPrettyPrintMixin = class _JsonPrettyPrintMixin extends core.Object {
    new() {
      this[_indentLevel] = 0;
    }
    writeList(list) {
      if (dart.test(list[dartx.isEmpty])) {
        this.writeString('[]');
      } else {
        this.writeString('[\n');
        this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
        this.writeIndentation(this[_indentLevel]);
        this.writeObject(list[dartx._get](0));
        for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
          this.writeString(',\n');
          this.writeIndentation(this[_indentLevel]);
          this.writeObject(list[dartx._get](i));
        }
        this.writeString('\n');
        this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
        this.writeIndentation(this[_indentLevel]);
        this.writeString(']');
      }
    }
    writeMap(map) {
      if (dart.test(map[dartx.isEmpty])) {
        this.writeString("{}");
        return true;
      }
      let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
      let i = 0;
      let allStringKeys = true;
      map[dartx.forEach](dart.fn((key, value) => {
        if (!(typeof key == 'string')) {
          allStringKeys = false;
        }
        keyValueList[dartx._set](i++, key);
        keyValueList[dartx._set](i++, value);
      }, dynamicAnddynamicTovoid$()));
      if (!allStringKeys) return false;
      this.writeString('{\n');
      this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
      let separator = "";
      for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
        this.writeString(separator);
        separator = ",\n";
        this.writeIndentation(this[_indentLevel]);
        this.writeString('"');
        this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
        this.writeString('": ');
        this.writeObject(keyValueList[dartx._get](i + 1));
      }
      this.writeString('\n');
      this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
      this.writeIndentation(this[_indentLevel]);
      this.writeString('}');
      return true;
    }
  };
  convert._JsonPrettyPrintMixin[dart.implements] = () => [convert._JsonStringifier];
  dart.setSignature(convert._JsonPrettyPrintMixin, {
    fields: () => ({[_indentLevel]: core.int}),
    methods: () => ({
      writeList: dart.definiteFunctionType(dart.void, [core.List]),
      writeMap: dart.definiteFunctionType(core.bool, [core.Map])
    })
  });
  convert._JsonStringStringifier = class _JsonStringStringifier extends convert._JsonStringifier {
    new(sink, _toEncodable) {
      this[_sink$] = sink;
      super.new(dynamicTodynamic()._check(_toEncodable));
    }
    static stringify(object, toEncodable, indent) {
      let output = new core.StringBuffer();
      convert._JsonStringStringifier.printOn(object, output, toEncodable, indent);
      return output.toString();
    }
    static printOn(object, output, toEncodable, indent) {
      let stringifier = null;
      if (indent == null) {
        stringifier = new convert._JsonStringStringifier(output, toEncodable);
      } else {
        stringifier = new convert._JsonStringStringifierPretty(output, toEncodable, indent);
      }
      dart.dsend(stringifier, 'writeObject', object);
    }
    writeNumber(number) {
      this[_sink$].write(dart.toString(number));
    }
    writeString(string) {
      this[_sink$].write(string);
    }
    writeStringSlice(string, start, end) {
      this[_sink$].write(string[dartx.substring](start, end));
    }
    writeCharCode(charCode) {
      this[_sink$].writeCharCode(charCode);
    }
  };
  dart.setSignature(convert._JsonStringStringifier, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifier, [core.StringSink, dart.dynamic])}),
    fields: () => ({[_sink$]: core.StringSink}),
    methods: () => ({
      writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
      writeString: dart.definiteFunctionType(dart.void, [core.String]),
      writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
    }),
    statics: () => ({
      stringify: dart.definiteFunctionType(core.String, [dart.dynamic, dynamicTodynamic(), core.String]),
      printOn: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StringSink, dynamicTodynamic(), core.String])
    }),
    names: ['stringify', 'printOn']
  });
  convert._JsonStringStringifierPretty = class _JsonStringStringifierPretty extends dart.mixin(convert._JsonStringStringifier, convert._JsonPrettyPrintMixin) {
    new(sink, toEncodable, indent) {
      this[_indent] = indent;
      super.new(sink, toEncodable);
    }
    writeIndentation(count) {
      for (let i = 0; i < dart.notNull(count); i++)
        this.writeString(this[_indent]);
    }
  };
  dart.setSignature(convert._JsonStringStringifierPretty, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifierPretty, [core.StringSink, dynamicTodynamic(), core.String])}),
    fields: () => ({[_indent]: core.String}),
    methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
  });
  convert._AddChunk = dart.typedef('_AddChunk', () => dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int]));
  convert._JsonUtf8Stringifier = class _JsonUtf8Stringifier extends convert._JsonStringifier {
    new(toEncodable, bufferSize, addChunk) {
      this.addChunk = addChunk;
      this.bufferSize = bufferSize;
      this.buffer = typed_data.Uint8List.new(bufferSize);
      this.index = 0;
      super.new(toEncodable);
    }
    static stringify(object, indent, toEncodable, bufferSize, addChunk) {
      let stringifier = null;
      if (indent != null) {
        stringifier = new convert._JsonUtf8StringifierPretty(toEncodable, indent, bufferSize, addChunk);
      } else {
        stringifier = new convert._JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
      }
      stringifier.writeObject(object);
      stringifier.flush();
    }
    flush() {
      if (dart.notNull(this.index) > 0) {
        this.addChunk(this.buffer, 0, this.index);
      }
      this.buffer = null;
      this.index = 0;
    }
    writeNumber(number) {
      this.writeAsciiString(dart.toString(number));
    }
    writeAsciiString(string) {
      for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
        let char = string[dartx.codeUnitAt](i);
        dart.assert(dart.notNull(char) <= 127);
        this.writeByte(char);
      }
    }
    writeString(string) {
      this.writeStringSlice(string, 0, string[dartx.length]);
    }
    writeStringSlice(string, start, end) {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = string[dartx.codeUnitAt](i);
        if (dart.notNull(char) <= 127) {
          this.writeByte(char);
        } else {
          if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(i) + 1 < dart.notNull(end)) {
            let nextChar = string[dartx.codeUnitAt](dart.notNull(i) + 1);
            if ((dart.notNull(nextChar) & 64512) == 56320) {
              char = 65536 + ((dart.notNull(char) & 1023) << 10) + (dart.notNull(nextChar) & 1023);
              this.writeFourByteCharCode(char);
              i = dart.notNull(i) + 1;
              continue;
            }
          }
          this.writeMultiByteCharCode(char);
        }
      }
    }
    writeCharCode(charCode) {
      if (dart.notNull(charCode) <= 127) {
        this.writeByte(charCode);
        return;
      }
      this.writeMultiByteCharCode(charCode);
    }
    writeMultiByteCharCode(charCode) {
      if (dart.notNull(charCode) <= 2047) {
        this.writeByte((192 | charCode[dartx['>>']](6)) >>> 0);
        this.writeByte(128 | dart.notNull(charCode) & 63);
        return;
      }
      if (dart.notNull(charCode) <= 65535) {
        this.writeByte((224 | charCode[dartx['>>']](12)) >>> 0);
        this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
        this.writeByte(128 | dart.notNull(charCode) & 63);
        return;
      }
      this.writeFourByteCharCode(charCode);
    }
    writeFourByteCharCode(charCode) {
      dart.assert(dart.notNull(charCode) <= 1114111);
      this.writeByte((240 | charCode[dartx['>>']](18)) >>> 0);
      this.writeByte(128 | dart.notNull(charCode) >> 12 & 63);
      this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
      this.writeByte(128 | dart.notNull(charCode) & 63);
    }
    writeByte(byte) {
      dart.assert(dart.notNull(byte) <= 255);
      if (this.index == this.buffer[dartx.length]) {
        this.addChunk(this.buffer, 0, this.index);
        this.buffer = typed_data.Uint8List.new(this.bufferSize);
        this.index = 0;
      }
      this.buffer[dartx._set]((() => {
        let x = this.index;
        this.index = dart.notNull(x) + 1;
        return x;
      })(), byte);
    }
  };
  dart.setSignature(convert._JsonUtf8Stringifier, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8Stringifier, [dynamicTodynamic(), core.int, convert._AddChunk])}),
    fields: () => ({
      bufferSize: core.int,
      addChunk: convert._AddChunk,
      buffer: typed_data.Uint8List,
      index: core.int
    }),
    methods: () => ({
      flush: dart.definiteFunctionType(dart.void, []),
      writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
      writeAsciiString: dart.definiteFunctionType(dart.void, [core.String]),
      writeString: dart.definiteFunctionType(dart.void, [core.String]),
      writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeMultiByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeFourByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeByte: dart.definiteFunctionType(dart.void, [core.int])
    }),
    statics: () => ({stringify: dart.definiteFunctionType(dart.void, [core.Object, ListOfint(), dynamicTodynamic(), core.int, Uint8ListAndintAndintTovoid()])}),
    names: ['stringify']
  });
  convert._JsonUtf8StringifierPretty = class _JsonUtf8StringifierPretty extends dart.mixin(convert._JsonUtf8Stringifier, convert._JsonPrettyPrintMixin) {
    new(toEncodable, indent, bufferSize, addChunk) {
      this.indent = indent;
      super.new(toEncodable, core.int._check(bufferSize), addChunk);
    }
    writeIndentation(count) {
      let indent = this.indent;
      let indentLength = indent[dartx.length];
      if (indentLength == 1) {
        let char = indent[dartx._get](0);
        while (dart.notNull(count) > 0) {
          this.writeByte(char);
          count = dart.notNull(count) - 1;
        }
        return;
      }
      while (dart.notNull(count) > 0) {
        count = dart.notNull(count) - 1;
        let end = dart.notNull(this.index) + dart.notNull(indentLength);
        if (end <= dart.notNull(this.buffer[dartx.length])) {
          this.buffer[dartx.setRange](this.index, end, indent);
          this.index = end;
        } else {
          for (let i = 0; i < dart.notNull(indentLength); i++) {
            this.writeByte(indent[dartx._get](i));
          }
        }
      }
    }
  };
  dart.setSignature(convert._JsonUtf8StringifierPretty, {
    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8StringifierPretty, [dynamicTodynamic(), ListOfint(), dart.dynamic, Uint8ListAndintAndintTovoid()])}),
    fields: () => ({indent: ListOfint()}),
    methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
  });
  let const$44;
  let const$45;
  let const$46;
  let const$47;
  let const$48;
  convert.Latin1Codec = class Latin1Codec extends convert.Encoding {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      this[_allowInvalid] = allowInvalid;
      super.new();
    }
    get name() {
      return "iso-8859-1";
    }
    decode(bytes, opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
      if (allowInvalid == null) allowInvalid = this[_allowInvalid];
      if (dart.test(allowInvalid)) {
        return (const$44 || (const$44 = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
      } else {
        return (const$45 || (const$45 = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
      }
    }
    get encoder() {
      return const$46 || (const$46 = dart.const(new convert.Latin1Encoder()));
    }
    get decoder() {
      return dart.test(this[_allowInvalid]) ? const$47 || (const$47 = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const$48 || (const$48 = dart.const(new convert.Latin1Decoder({allowInvalid: false})));
    }
  };
  dart.setSignature(convert.Latin1Codec, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Codec, [], {allowInvalid: core.bool})}),
    fields: () => ({[_allowInvalid]: core.bool}),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      encoder: dart.definiteFunctionType(convert.Latin1Encoder, []),
      decoder: dart.definiteFunctionType(convert.Latin1Decoder, [])
    }),
    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
  });
  convert.LATIN1 = dart.const(new convert.Latin1Codec());
  convert._LATIN1_MASK = 255;
  convert.Latin1Encoder = class Latin1Encoder extends convert._UnicodeSubsetEncoder {
    new() {
      super.new(convert._LATIN1_MASK);
    }
  };
  dart.setSignature(convert.Latin1Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Encoder, [])})
  });
  convert.Latin1Decoder = class Latin1Decoder extends convert._UnicodeSubsetDecoder {
    new(opts) {
      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
      super.new(allowInvalid, convert._LATIN1_MASK);
    }
    startChunkedConversion(sink) {
      let stringSink = null;
      if (convert.StringConversionSink.is(sink)) {
        stringSink = sink;
      } else {
        stringSink = convert.StringConversionSink.from(sink);
      }
      if (!dart.test(this[_allowInvalid])) return new convert._Latin1DecoderSink(stringSink);
      return new convert._Latin1AllowInvalidDecoderSink(stringSink);
    }
  };
  dart.setSignature(convert.Latin1Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Decoder, [], {allowInvalid: core.bool})}),
    methods: () => ({startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])})
  });
  const _addSliceToSink = Symbol('_addSliceToSink');
  convert._Latin1DecoderSink = class _Latin1DecoderSink extends convert.ByteConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    close() {
      this[_sink$].close();
      this[_sink$] = null;
    }
    add(source) {
      this.addSlice(source, 0, source[dartx.length], false);
    }
    [_addSliceToSink](source, start, end, isLast) {
      this[_sink$].add(core.String.fromCharCodes(source, start, end));
      if (dart.test(isLast)) this.close();
    }
    addSlice(source, start, end, isLast) {
      end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
      if (start == end) return;
      if (!typed_data.Uint8List.is(source)) {
        convert._Latin1DecoderSink._checkValidLatin1(source, start, end);
      }
      this[_addSliceToSink](source, start, end, isLast);
    }
    static _checkValidLatin1(source, start, end) {
      let mask = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        mask = (dart.notNull(mask) | dart.notNull(source[dartx._get](i))) >>> 0;
      }
      if (dart.notNull(mask) >= 0 && dart.notNull(mask) <= convert._LATIN1_MASK) {
        return;
      }
      convert._Latin1DecoderSink._reportInvalidLatin1(source, start, end);
    }
    static _reportInvalidLatin1(source, start, end) {
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = source[dartx._get](i);
        if (dart.notNull(char) < 0 || dart.notNull(char) > convert._LATIN1_MASK) {
          dart.throw(new core.FormatException("Source contains non-Latin-1 characters.", source, i));
        }
      }
      dart.assert(false);
    }
  };
  dart.setSignature(convert._Latin1DecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Latin1DecoderSink, [convert.StringConversionSink])}),
    fields: () => ({[_sink$]: convert.StringConversionSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      [_addSliceToSink]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
    }),
    statics: () => ({
      _checkValidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int]),
      _reportInvalidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
    }),
    names: ['_checkValidLatin1', '_reportInvalidLatin1']
  });
  let const$49;
  convert._Latin1AllowInvalidDecoderSink = class _Latin1AllowInvalidDecoderSink extends convert._Latin1DecoderSink {
    new(sink) {
      super.new(sink);
    }
    addSlice(source, start, end, isLast) {
      core.RangeError.checkValidRange(start, end, source[dartx.length]);
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let char = source[dartx._get](i);
        if (dart.notNull(char) > convert._LATIN1_MASK || dart.notNull(char) < 0) {
          if (dart.notNull(i) > dart.notNull(start)) this[_addSliceToSink](source, start, i, false);
          this[_addSliceToSink](const$49 || (const$49 = dart.constList([65533], core.int)), 0, 1, false);
          start = dart.notNull(i) + 1;
        }
      }
      if (dart.notNull(start) < dart.notNull(end)) {
        this[_addSliceToSink](source, start, end, isLast);
      }
      if (dart.test(isLast)) {
        this.close();
      }
    }
  };
  dart.setSignature(convert._Latin1AllowInvalidDecoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Latin1AllowInvalidDecoderSink, [convert.StringConversionSink])})
  });
  convert._LF = 10;
  convert._CR = 13;
  convert.LineSplitter = class LineSplitter extends core.Object {
    new() {
    }
    static split(lines, start, end) {
      return dart.syncStar(function*(lines, start, end) {
        if (start === void 0) start = 0;
        if (end === void 0) end = null;
        end = core.RangeError.checkValidRange(start, end, lines[dartx.length]);
        let sliceStart = start;
        let char = 0;
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          let previousChar = char;
          char = lines[dartx.codeUnitAt](i);
          if (char != convert._CR) {
            if (char != convert._LF) continue;
            if (previousChar == convert._CR) {
              sliceStart = dart.notNull(i) + 1;
              continue;
            }
          }
          yield lines[dartx.substring](sliceStart, i);
          sliceStart = dart.notNull(i) + 1;
        }
        if (dart.notNull(sliceStart) < dart.notNull(end)) {
          yield lines[dartx.substring](sliceStart, end);
        }
      }, core.String, lines, start, end);
    }
    convert(data) {
      let lines = JSArrayOfString().of([]);
      let end = data[dartx.length];
      let sliceStart = 0;
      let char = 0;
      for (let i = 0; i < dart.notNull(end); i++) {
        let previousChar = char;
        char = data[dartx.codeUnitAt](i);
        if (char != convert._CR) {
          if (char != convert._LF) continue;
          if (previousChar == convert._CR) {
            sliceStart = i + 1;
            continue;
          }
        }
        lines[dartx.add](data[dartx.substring](sliceStart, i));
        sliceStart = i + 1;
      }
      if (sliceStart < dart.notNull(end)) {
        lines[dartx.add](data[dartx.substring](sliceStart, end));
      }
      return lines;
    }
    startChunkedConversion(sink) {
      if (!convert.StringConversionSink.is(sink)) {
        sink = convert.StringConversionSink.from(sink);
      }
      return new convert._LineSplitterSink(convert.StringConversionSink._check(sink));
    }
    bind(stream) {
      return StreamOfString().eventTransformed(stream, dart.fn(sink => new convert._LineSplitterEventSink(sink), EventSinkOfStringTo_LineSplitterEventSink()));
    }
  };
  convert.LineSplitter[dart.implements] = () => [StreamTransformerOfString$String()];
  dart.setSignature(convert.LineSplitter, {
    constructors: () => ({new: dart.definiteFunctionType(convert.LineSplitter, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.String), [core.String]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfString()])
    }),
    statics: () => ({split: dart.definiteFunctionType(core.Iterable$(core.String), [core.String], [core.int, core.int])}),
    names: ['split']
  });
  const _carry = Symbol('_carry');
  const _skipLeadingLF = Symbol('_skipLeadingLF');
  const _addLines = Symbol('_addLines');
  convert._LineSplitterSink = class _LineSplitterSink extends convert.StringConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
      this[_carry] = null;
      this[_skipLeadingLF] = false;
    }
    addSlice(chunk, start, end, isLast) {
      end = core.RangeError.checkValidRange(start, end, chunk[dartx.length]);
      if (dart.notNull(start) >= dart.notNull(end)) {
        if (dart.test(isLast)) this.close();
        return;
      }
      if (this[_carry] != null) {
        dart.assert(!dart.test(this[_skipLeadingLF]));
        chunk = dart.notNull(this[_carry]) + dart.notNull(chunk[dartx.substring](start, end));
        start = 0;
        end = chunk[dartx.length];
        this[_carry] = null;
      } else if (dart.test(this[_skipLeadingLF])) {
        if (chunk[dartx.codeUnitAt](start) == convert._LF) {
          start = dart.notNull(start) + 1;
        }
        this[_skipLeadingLF] = false;
      }
      this[_addLines](chunk, start, end);
      if (dart.test(isLast)) this.close();
    }
    close() {
      if (this[_carry] != null) {
        this[_sink$].add(this[_carry]);
        this[_carry] = null;
      }
      this[_sink$].close();
    }
    [_addLines](lines, start, end) {
      let sliceStart = start;
      let char = 0;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let previousChar = char;
        char = lines[dartx.codeUnitAt](i);
        if (char != convert._CR) {
          if (char != convert._LF) continue;
          if (previousChar == convert._CR) {
            sliceStart = dart.notNull(i) + 1;
            continue;
          }
        }
        this[_sink$].add(lines[dartx.substring](sliceStart, i));
        sliceStart = dart.notNull(i) + 1;
      }
      if (dart.notNull(sliceStart) < dart.notNull(end)) {
        this[_carry] = lines[dartx.substring](sliceStart, end);
      } else {
        this[_skipLeadingLF] = char == convert._CR;
      }
    }
  };
  dart.setSignature(convert._LineSplitterSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterSink, [convert.StringConversionSink])}),
    fields: () => ({
      [_sink$]: convert.StringConversionSink,
      [_carry]: core.String,
      [_skipLeadingLF]: core.bool
    }),
    methods: () => ({
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, []),
      [_addLines]: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int])
    })
  });
  convert._LineSplitterEventSink = class _LineSplitterEventSink extends convert._LineSplitterSink {
    new(eventSink) {
      this[_eventSink] = eventSink;
      super.new(convert.StringConversionSink.from(eventSink));
    }
    addError(o, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_eventSink].addError(o, stackTrace);
    }
  };
  convert._LineSplitterEventSink[dart.implements] = () => [EventSinkOfString()];
  dart.setSignature(convert._LineSplitterEventSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])}),
    fields: () => ({[_eventSink]: EventSinkOfString()}),
    methods: () => ({addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
  });
  convert.StringConversionSink = class StringConversionSink extends convert.ChunkedConversionSink$(core.String) {
    new() {
      super.new();
    }
    static withCallback(callback) {
      return new convert._StringCallbackSink(callback);
    }
    static from(sink) {
      return new convert._StringAdapterSink(sink);
    }
    static fromStringSink(sink) {
      return new convert._StringSinkConversionSink(sink);
    }
  };
  dart.addSimpleTypeTests(convert.StringConversionSink);
  dart.setSignature(convert.StringConversionSink, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert.StringConversionSink, []),
      withCallback: dart.definiteFunctionType(convert.StringConversionSink, [StringTovoid()]),
      from: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
      fromStringSink: dart.definiteFunctionType(convert.StringConversionSink, [core.StringSink])
    })
  });
  core.StringSink = class StringSink extends core.Object {};
  convert.ClosableStringSink = class ClosableStringSink extends core.StringSink {
    static fromStringSink(sink, onClose) {
      return new convert._ClosableStringSink(sink, onClose);
    }
  };
  dart.setSignature(convert.ClosableStringSink, {
    constructors: () => ({fromStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [core.StringSink, VoidTovoid()])})
  });
  convert._StringSinkCloseCallback = dart.typedef('_StringSinkCloseCallback', () => dart.functionType(dart.void, []));
  convert._ClosableStringSink = class _ClosableStringSink extends core.Object {
    new(sink, callback) {
      this[_sink$] = sink;
      this[_callback] = callback;
    }
    close() {
      this[_callback]();
    }
    writeCharCode(charCode) {
      this[_sink$].writeCharCode(charCode);
    }
    write(o) {
      this[_sink$].write(o);
    }
    writeln(o) {
      if (o === void 0) o = "";
      this[_sink$].writeln(o);
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      this[_sink$].writeAll(objects, separator);
    }
  };
  convert._ClosableStringSink[dart.implements] = () => [convert.ClosableStringSink];
  dart.setSignature(convert._ClosableStringSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._ClosableStringSink, [core.StringSink, convert._StringSinkCloseCallback])}),
    fields: () => ({
      [_callback]: convert._StringSinkCloseCallback,
      [_sink$]: core.StringSink
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String])
    })
  });
  const _flush = Symbol('_flush');
  convert._StringConversionSinkAsStringSinkAdapter = class _StringConversionSinkAsStringSinkAdapter extends core.Object {
    new(chunkedSink) {
      this[_chunkedSink] = chunkedSink;
      this[_buffer] = new core.StringBuffer();
    }
    close() {
      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
      this[_chunkedSink].close();
    }
    writeCharCode(charCode) {
      this[_buffer].writeCharCode(charCode);
      if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
    }
    write(o) {
      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
      this[_chunkedSink].add(dart.toString(o));
    }
    writeln(o) {
      if (o === void 0) o = "";
      this[_buffer].writeln(o);
      if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
      let iterator = objects[dartx.iterator];
      if (!dart.test(iterator.moveNext())) return;
      if (dart.test(separator[dartx.isEmpty])) {
        do {
          this[_chunkedSink].add(dart.toString(iterator.current));
        } while (dart.test(iterator.moveNext()));
      } else {
        this[_chunkedSink].add(dart.toString(iterator.current));
        while (dart.test(iterator.moveNext())) {
          this.write(separator);
          this[_chunkedSink].add(dart.toString(iterator.current));
        }
      }
    }
    [_flush]() {
      let accumulated = dart.toString(this[_buffer]);
      this[_buffer].clear();
      this[_chunkedSink].add(accumulated);
    }
  };
  convert._StringConversionSinkAsStringSinkAdapter[dart.implements] = () => [convert.ClosableStringSink];
  dart.setSignature(convert._StringConversionSinkAsStringSinkAdapter, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringConversionSinkAsStringSinkAdapter, [convert.StringConversionSink])}),
    fields: () => ({
      [_buffer]: core.StringBuffer,
      [_chunkedSink]: convert.StringConversionSink
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
      [_flush]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({_MIN_STRING_SIZE: core.int})
  });
  convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE = 16;
  convert._StringCallbackSink = class _StringCallbackSink extends convert._StringSinkConversionSink {
    new(callback) {
      this[_callback] = callback;
      super.new(new core.StringBuffer());
    }
    close() {
      let buffer = core.StringBuffer._check(this[_stringSink]);
      let accumulated = dart.toString(buffer);
      buffer.clear();
      this[_callback](accumulated);
    }
    asUtf8Sink(allowMalformed) {
      return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
    }
  };
  dart.setSignature(convert._StringCallbackSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringCallbackSink, [StringTovoid()])}),
    fields: () => ({[_callback]: StringTovoid()})
  });
  convert._StringAdapterSink = class _StringAdapterSink extends convert.StringConversionSinkBase {
    new(sink) {
      this[_sink$] = sink;
    }
    add(str) {
      this[_sink$].add(str);
    }
    addSlice(str, start, end, isLast) {
      if (start == 0 && end == str[dartx.length]) {
        this.add(str);
      } else {
        this.add(str[dartx.substring](start, end));
      }
      if (dart.test(isLast)) this.close();
    }
    close() {
      this[_sink$].close();
    }
  };
  dart.setSignature(convert._StringAdapterSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._StringAdapterSink, [SinkOfString()])}),
    fields: () => ({[_sink$]: SinkOfString()}),
    methods: () => ({
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
      close: dart.definiteFunctionType(dart.void, [])
    })
  });
  convert._Utf8StringSinkAdapter = class _Utf8StringSinkAdapter extends convert.ByteConversionSink {
    new(sink, stringSink, allowMalformed) {
      this[_sink$] = sink;
      this[_decoder] = new convert._Utf8Decoder(stringSink, allowMalformed);
      super.new();
    }
    close() {
      this[_decoder].close();
      if (this[_sink$] != null) this[_sink$].close();
    }
    add(chunk) {
      this.addSlice(chunk, 0, chunk[dartx.length], false);
    }
    addSlice(codeUnits, startIndex, endIndex, isLast) {
      this[_decoder].convert(codeUnits, startIndex, endIndex);
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert._Utf8StringSinkAdapter, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8StringSinkAdapter, [core.Sink, core.StringSink, core.bool])}),
    fields: () => ({
      [_decoder]: convert._Utf8Decoder,
      [_sink$]: core.Sink
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
    })
  });
  convert._Utf8ConversionSink = class _Utf8ConversionSink extends convert.ByteConversionSink {
    new(sink, allowMalformed) {
      _Utf8ConversionSink.prototype._.call(this, sink, new core.StringBuffer(), allowMalformed);
    }
    _(chunkedSink, stringBuffer, allowMalformed) {
      this[_chunkedSink] = chunkedSink;
      this[_decoder] = new convert._Utf8Decoder(stringBuffer, allowMalformed);
      this[_buffer] = stringBuffer;
      super.new();
    }
    close() {
      this[_decoder].close();
      if (dart.test(this[_buffer].isNotEmpty)) {
        let accumulated = dart.toString(this[_buffer]);
        this[_buffer].clear();
        this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], true);
      } else {
        this[_chunkedSink].close();
      }
    }
    add(chunk) {
      this.addSlice(chunk, 0, chunk[dartx.length], false);
    }
    addSlice(chunk, startIndex, endIndex, isLast) {
      this[_decoder].convert(chunk, startIndex, endIndex);
      if (dart.test(this[_buffer].isNotEmpty)) {
        let accumulated = dart.toString(this[_buffer]);
        this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], isLast);
        this[_buffer].clear();
        return;
      }
      if (dart.test(isLast)) this.close();
    }
  };
  dart.defineNamedConstructor(convert._Utf8ConversionSink, '_');
  dart.setSignature(convert._Utf8ConversionSink, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.bool]),
      _: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.StringBuffer, core.bool])
    }),
    fields: () => ({
      [_decoder]: convert._Utf8Decoder,
      [_chunkedSink]: convert.StringConversionSink,
      [_buffer]: core.StringBuffer
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
    })
  });
  convert.UNICODE_REPLACEMENT_CHARACTER_RUNE = 65533;
  convert.UNICODE_BOM_CHARACTER_RUNE = 65279;
  const _allowMalformed = Symbol('_allowMalformed');
  let const$50;
  convert.Utf8Codec = class Utf8Codec extends convert.Encoding {
    new(opts) {
      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
      this[_allowMalformed] = allowMalformed;
      super.new();
    }
    get name() {
      return "utf-8";
    }
    decode(codeUnits, opts) {
      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : null;
      if (allowMalformed == null) allowMalformed = this[_allowMalformed];
      return new convert.Utf8Decoder({allowMalformed: allowMalformed}).convert(codeUnits);
    }
    get encoder() {
      return const$50 || (const$50 = dart.const(new convert.Utf8Encoder()));
    }
    get decoder() {
      return new convert.Utf8Decoder({allowMalformed: this[_allowMalformed]});
    }
  };
  dart.setSignature(convert.Utf8Codec, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Codec, [], {allowMalformed: core.bool})}),
    fields: () => ({[_allowMalformed]: core.bool}),
    getters: () => ({
      name: dart.definiteFunctionType(core.String, []),
      encoder: dart.definiteFunctionType(convert.Utf8Encoder, []),
      decoder: dart.definiteFunctionType(convert.Utf8Decoder, [])
    }),
    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowMalformed: core.bool})})
  });
  convert.UTF8 = dart.const(new convert.Utf8Codec());
  const _fillBuffer = Symbol('_fillBuffer');
  const _writeSurrogate = Symbol('_writeSurrogate');
  convert.Utf8Encoder = class Utf8Encoder extends convert.Converter$(core.String, core.List$(core.int)) {
    new() {
      super.new();
    }
    convert(string, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let stringLength = string[dartx.length];
      core.RangeError.checkValidRange(start, end, stringLength);
      if (end == null) end = stringLength;
      let length = dart.notNull(end) - dart.notNull(start);
      if (length == 0) return typed_data.Uint8List.new(0);
      let encoder = new convert._Utf8Encoder.withBufferSize(length * 3);
      let endPosition = encoder[_fillBuffer](string, start, end);
      dart.assert(dart.notNull(endPosition) >= dart.notNull(end) - 1);
      if (endPosition != end) {
        let lastCodeUnit = string[dartx.codeUnitAt](dart.notNull(end) - 1);
        dart.assert(convert._isLeadSurrogate(lastCodeUnit));
        let wasCombined = encoder[_writeSurrogate](lastCodeUnit, 0);
        dart.assert(!dart.test(wasCombined));
      }
      return encoder[_buffer][dartx.sublist](0, encoder[_bufferIndex]);
    }
    startChunkedConversion(sink) {
      if (!convert.ByteConversionSink.is(sink)) {
        sink = convert.ByteConversionSink.from(sink);
      }
      return new convert._Utf8EncoderSink(convert.ByteConversionSink._check(sink));
    }
    bind(stream) {
      return super.bind(stream);
    }
  };
  dart.addSimpleTypeTests(convert.Utf8Encoder);
  dart.setSignature(convert.Utf8Encoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Encoder, [])}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()]),
      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [StreamOfString()])
    })
  });
  convert._Utf8Encoder = class _Utf8Encoder extends core.Object {
    new() {
      _Utf8Encoder.prototype.withBufferSize.call(this, convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE);
    }
    withBufferSize(bufferSize) {
      this[_buffer] = convert._Utf8Encoder._createBuffer(bufferSize);
      this[_carry] = 0;
      this[_bufferIndex] = 0;
    }
    static _createBuffer(size) {
      return typed_data.Uint8List.new(size);
    }
    [_writeSurrogate](leadingSurrogate, nextCodeUnit) {
      if (dart.test(convert._isTailSurrogate(nextCodeUnit))) {
        let rune = convert._combineSurrogatePair(leadingSurrogate, nextCodeUnit);
        dart.assert(dart.notNull(rune) > convert._THREE_BYTE_LIMIT);
        dart.assert(dart.notNull(rune) <= convert._FOUR_BYTE_LIMIT);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), (240 | rune[dartx['>>']](18)) >>> 0);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(rune) >> 12 & 63);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(rune) >> 6 & 63);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(rune) & 63);
        return true;
      } else {
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), (224 | leadingSurrogate[dartx['>>']](12)) >>> 0);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(leadingSurrogate) >> 6 & 63);
        this[_buffer][dartx._set]((() => {
          let x = this[_bufferIndex];
          this[_bufferIndex] = dart.notNull(x) + 1;
          return x;
        })(), 128 | dart.notNull(leadingSurrogate) & 63);
        return false;
      }
    }
    [_fillBuffer](str, start, end) {
      if (start != end && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](dart.notNull(end) - 1)))) {
        end = dart.notNull(end) - 1;
      }
      let stringIndex = null;
      for (stringIndex = start; dart.notNull(stringIndex) < dart.notNull(end); stringIndex = dart.notNull(stringIndex) + 1) {
        let codeUnit = str[dartx.codeUnitAt](stringIndex);
        if (dart.notNull(codeUnit) <= convert._ONE_BYTE_LIMIT) {
          if (dart.notNull(this[_bufferIndex]) >= dart.notNull(this[_buffer][dartx.length])) break;
          this[_buffer][dartx._set]((() => {
            let x = this[_bufferIndex];
            this[_bufferIndex] = dart.notNull(x) + 1;
            return x;
          })(), codeUnit);
        } else if (dart.test(convert._isLeadSurrogate(codeUnit))) {
          if (dart.notNull(this[_bufferIndex]) + 3 >= dart.notNull(this[_buffer][dartx.length])) break;
          let nextCodeUnit = str[dartx.codeUnitAt](dart.notNull(stringIndex) + 1);
          let wasCombined = this[_writeSurrogate](codeUnit, nextCodeUnit);
          if (dart.test(wasCombined)) {
            stringIndex = dart.notNull(stringIndex) + 1;
          }
        } else {
          let rune = codeUnit;
          if (dart.notNull(rune) <= convert._TWO_BYTE_LIMIT) {
            if (dart.notNull(this[_bufferIndex]) + 1 >= dart.notNull(this[_buffer][dartx.length])) break;
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), (192 | rune[dartx['>>']](6)) >>> 0);
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), 128 | dart.notNull(rune) & 63);
          } else {
            dart.assert(dart.notNull(rune) <= convert._THREE_BYTE_LIMIT);
            if (dart.notNull(this[_bufferIndex]) + 2 >= dart.notNull(this[_buffer][dartx.length])) break;
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), (224 | rune[dartx['>>']](12)) >>> 0);
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), 128 | dart.notNull(rune) >> 6 & 63);
            this[_buffer][dartx._set]((() => {
              let x = this[_bufferIndex];
              this[_bufferIndex] = dart.notNull(x) + 1;
              return x;
            })(), 128 | dart.notNull(rune) & 63);
          }
        }
      }
      return stringIndex;
    }
  };
  dart.defineNamedConstructor(convert._Utf8Encoder, 'withBufferSize');
  dart.setSignature(convert._Utf8Encoder, {
    constructors: () => ({
      new: dart.definiteFunctionType(convert._Utf8Encoder, []),
      withBufferSize: dart.definiteFunctionType(convert._Utf8Encoder, [core.int])
    }),
    fields: () => ({
      [_carry]: core.int,
      [_bufferIndex]: core.int,
      [_buffer]: ListOfint()
    }),
    methods: () => ({
      [_writeSurrogate]: dart.definiteFunctionType(core.bool, [core.int, core.int]),
      [_fillBuffer]: dart.definiteFunctionType(core.int, [core.String, core.int, core.int])
    }),
    sfields: () => ({_DEFAULT_BYTE_BUFFER_SIZE: core.int}),
    statics: () => ({_createBuffer: dart.definiteFunctionType(core.List$(core.int), [core.int])}),
    names: ['_createBuffer']
  });
  convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE = 1024;
  convert._Utf8EncoderSink = class _Utf8EncoderSink extends dart.mixin(convert._Utf8Encoder, convert.StringConversionSinkMixin) {
    new(sink) {
      this[_sink$] = sink;
      super.new();
    }
    close() {
      if (this[_carry] != 0) {
        this.addSlice("", 0, 0, true);
        return;
      }
      this[_sink$].close();
    }
    addSlice(str, start, end, isLast) {
      this[_bufferIndex] = 0;
      if (start == end && !dart.test(isLast)) {
        return;
      }
      if (this[_carry] != 0) {
        let nextCodeUnit = 0;
        if (start != end) {
          nextCodeUnit = str[dartx.codeUnitAt](start);
        } else {
          dart.assert(isLast);
        }
        let wasCombined = this[_writeSurrogate](this[_carry], nextCodeUnit);
        dart.assert(!dart.test(wasCombined) || start != end);
        if (dart.test(wasCombined)) {
          start = dart.notNull(start) + 1;
        }
        this[_carry] = 0;
      }
      do {
        start = this[_fillBuffer](str, start, end);
        let isLastSlice = dart.test(isLast) && start == end;
        if (start == dart.notNull(end) - 1 && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](start)))) {
          if (dart.test(isLast) && dart.notNull(this[_bufferIndex]) < dart.notNull(this[_buffer][dartx.length]) - 3) {
            let hasBeenCombined = this[_writeSurrogate](str[dartx.codeUnitAt](start), 0);
            dart.assert(!dart.test(hasBeenCombined));
          } else {
            this[_carry] = str[dartx.codeUnitAt](start);
          }
          start = dart.notNull(start) + 1;
        }
        this[_sink$].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
        this[_bufferIndex] = 0;
      } while (dart.notNull(start) < dart.notNull(end));
      if (dart.test(isLast)) this.close();
    }
  };
  dart.setSignature(convert._Utf8EncoderSink, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8EncoderSink, [convert.ByteConversionSink])}),
    fields: () => ({[_sink$]: convert.ByteConversionSink}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
    })
  });
  convert.Utf8Decoder = class Utf8Decoder extends convert.Converter$(core.List$(core.int), core.String) {
    new(opts) {
      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
      this[_allowMalformed] = allowMalformed;
      super.new();
    }
    convert(codeUnits, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let result = convert.Utf8Decoder._convertIntercepted(this[_allowMalformed], codeUnits, start, end);
      if (result != null) {
        return result;
      }
      let length = codeUnits[dartx.length];
      core.RangeError.checkValidRange(start, end, length);
      if (end == null) end = length;
      let buffer = new core.StringBuffer();
      let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
      decoder.convert(codeUnits, start, end);
      decoder.close();
      return buffer.toString();
    }
    startChunkedConversion(sink) {
      let stringSink = null;
      if (convert.StringConversionSink.is(sink)) {
        stringSink = sink;
      } else {
        stringSink = convert.StringConversionSink.from(sink);
      }
      return stringSink.asUtf8Sink(this[_allowMalformed]);
    }
    bind(stream) {
      return super.bind(stream);
    }
    fuse(T) {
      return next => {
        return super.fuse(T)(next);
      };
    }
    static _convertIntercepted(allowMalformed, codeUnits, start, end) {
      return null;
    }
  };
  dart.addSimpleTypeTests(convert.Utf8Decoder);
  dart.setSignature(convert.Utf8Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Decoder, [], {allowMalformed: core.bool})}),
    fields: () => ({[_allowMalformed]: core.bool}),
    methods: () => ({
      convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()]),
      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfListOfint()]),
      fuse: dart.definiteFunctionType(T => [convert.Converter$(core.List$(core.int), T), [convert.Converter$(core.String, T)]])
    }),
    statics: () => ({_convertIntercepted: dart.definiteFunctionType(core.String, [core.bool, ListOfint(), core.int, core.int])}),
    names: ['_convertIntercepted']
  });
  convert._ONE_BYTE_LIMIT = 127;
  convert._TWO_BYTE_LIMIT = 2047;
  convert._THREE_BYTE_LIMIT = 65535;
  convert._FOUR_BYTE_LIMIT = 1114111;
  convert._SURROGATE_MASK = 63488;
  convert._SURROGATE_TAG_MASK = 64512;
  convert._SURROGATE_VALUE_MASK = 1023;
  convert._LEAD_SURROGATE_MIN = 55296;
  convert._TAIL_SURROGATE_MIN = 56320;
  convert._isLeadSurrogate = function(codeUnit) {
    return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._LEAD_SURROGATE_MIN;
  };
  dart.lazyFn(convert._isLeadSurrogate, () => intTobool());
  convert._isTailSurrogate = function(codeUnit) {
    return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._TAIL_SURROGATE_MIN;
  };
  dart.lazyFn(convert._isTailSurrogate, () => intTobool());
  convert._combineSurrogatePair = function(lead, tail) {
    return (65536 + ((dart.notNull(lead) & convert._SURROGATE_VALUE_MASK) << 10) | dart.notNull(tail) & convert._SURROGATE_VALUE_MASK) >>> 0;
  };
  dart.fn(convert._combineSurrogatePair, intAndintToint());
  const _isFirstCharacter = Symbol('_isFirstCharacter');
  const _value = Symbol('_value');
  const _expectedUnits = Symbol('_expectedUnits');
  const _extraUnits = Symbol('_extraUnits');
  convert._Utf8Decoder = class _Utf8Decoder extends core.Object {
    new(stringSink, allowMalformed) {
      this[_stringSink] = stringSink;
      this[_allowMalformed] = allowMalformed;
      this[_isFirstCharacter] = true;
      this[_value] = 0;
      this[_expectedUnits] = 0;
      this[_extraUnits] = 0;
    }
    get hasPartialInput() {
      return dart.notNull(this[_expectedUnits]) > 0;
    }
    close() {
      this.flush();
    }
    flush() {
      if (dart.test(this.hasPartialInput)) {
        if (!dart.test(this[_allowMalformed])) {
          dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
        }
        this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
        this[_value] = 0;
        this[_expectedUnits] = 0;
        this[_extraUnits] = 0;
      }
    }
    convert(codeUnits, startIndex, endIndex) {
      let value = this[_value];
      let expectedUnits = this[_expectedUnits];
      let extraUnits = this[_extraUnits];
      this[_value] = 0;
      this[_expectedUnits] = 0;
      this[_extraUnits] = 0;
      function scanOneByteCharacters(units, from) {
        let to = endIndex;
        let mask = convert._ONE_BYTE_LIMIT;
        for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(i) + 1) {
          let unit = dart.dindex(units, i);
          if (!dart.equals(dart.dsend(unit, '&', mask), unit)) return dart.notNull(i) - dart.notNull(from);
        }
        return dart.notNull(to) - dart.notNull(from);
      }
      dart.fn(scanOneByteCharacters, dynamicAndintToint());
      const addSingleBytes = (function(from, to) {
        dart.assert(dart.notNull(from) >= dart.notNull(startIndex) && dart.notNull(from) <= dart.notNull(endIndex));
        dart.assert(dart.notNull(to) >= dart.notNull(startIndex) && dart.notNull(to) <= dart.notNull(endIndex));
        this[_stringSink].write(core.String.fromCharCodes(codeUnits, from, to));
      }).bind(this);
      dart.fn(addSingleBytes, intAndintTovoid());
      let i = startIndex;
      loop:
        while (true) {
          multibyte:
            if (dart.notNull(expectedUnits) > 0) {
              do {
                if (i == endIndex) {
                  break loop;
                }
                let unit = codeUnits[dartx._get](i);
                if ((dart.notNull(unit) & 192) != 128) {
                  expectedUnits = 0;
                  if (!dart.test(this[_allowMalformed])) {
                    dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
                  }
                  this[_isFirstCharacter] = false;
                  this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
                  break multibyte;
                } else {
                  value = (dart.notNull(value) << 6 | dart.notNull(unit) & 63) >>> 0;
                  expectedUnits = dart.notNull(expectedUnits) - 1;
                  i = dart.notNull(i) + 1;
                }
              } while (dart.notNull(expectedUnits) > 0);
              if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
                if (!dart.test(this[_allowMalformed])) {
                  dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
                }
                expectedUnits = extraUnits = 0;
                value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
              }
              if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
                if (!dart.test(this[_allowMalformed])) {
                  dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
                }
                value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
              }
              if (!dart.test(this[_isFirstCharacter]) || value != convert.UNICODE_BOM_CHARACTER_RUNE) {
                this[_stringSink].writeCharCode(value);
              }
              this[_isFirstCharacter] = false;
            }
          while (dart.notNull(i) < dart.notNull(endIndex)) {
            let oneBytes = scanOneByteCharacters(codeUnits, i);
            if (dart.notNull(oneBytes) > 0) {
              this[_isFirstCharacter] = false;
              addSingleBytes(i, dart.notNull(i) + dart.notNull(oneBytes));
              i = dart.notNull(i) + dart.notNull(oneBytes);
              if (i == endIndex) break;
            }
            let unit = codeUnits[dartx._get]((() => {
              let x = i;
              i = dart.notNull(x) + 1;
              return x;
            })());
            if (dart.notNull(unit) < 0) {
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
              }
              this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
            } else {
              dart.assert(dart.notNull(unit) > convert._ONE_BYTE_LIMIT);
              if ((dart.notNull(unit) & 224) == 192) {
                value = dart.notNull(unit) & 31;
                expectedUnits = extraUnits = 1;
                continue loop;
              }
              if ((dart.notNull(unit) & 240) == 224) {
                value = dart.notNull(unit) & 15;
                expectedUnits = extraUnits = 2;
                continue loop;
              }
              if ((dart.notNull(unit) & 248) == 240 && dart.notNull(unit) < 245) {
                value = dart.notNull(unit) & 7;
                expectedUnits = extraUnits = 3;
                continue loop;
              }
              if (!dart.test(this[_allowMalformed])) {
                dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
              }
              value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
              expectedUnits = extraUnits = 0;
              this[_isFirstCharacter] = false;
              this[_stringSink].writeCharCode(value);
            }
          }
          break loop;
        }
      if (dart.notNull(expectedUnits) > 0) {
        this[_value] = value;
        this[_expectedUnits] = expectedUnits;
        this[_extraUnits] = extraUnits;
      }
    }
  };
  dart.setSignature(convert._Utf8Decoder, {
    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Decoder, [core.StringSink, core.bool])}),
    fields: () => ({
      [_allowMalformed]: core.bool,
      [_stringSink]: core.StringSink,
      [_isFirstCharacter]: core.bool,
      [_value]: core.int,
      [_expectedUnits]: core.int,
      [_extraUnits]: core.int
    }),
    getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      flush: dart.definiteFunctionType(dart.void, []),
      convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
    }),
    sfields: () => ({_LIMITS: ListOfint()})
  });
  convert._Utf8Decoder._LIMITS = dart.constList([convert._ONE_BYTE_LIMIT, convert._TWO_BYTE_LIMIT, convert._THREE_BYTE_LIMIT, convert._FOUR_BYTE_LIMIT], core.int);
  core._symbolToString = function(symbol) {
    return _internal.Symbol.getName(_internal.Symbol._check(symbol));
  };
  dart.lazyFn(core._symbolToString, () => SymbolToString());
  core.StrongModeError = class StrongModeError extends core.Error {
    new() {
      super.new();
    }
  };
  core.Deprecated = class Deprecated extends core.Object {
    new(expires) {
      this.expires = expires;
    }
    toString() {
      return dart.str`Deprecated feature. Will be removed ${this.expires}`;
    }
  };
  dart.setSignature(core.Deprecated, {
    constructors: () => ({new: dart.definiteFunctionType(core.Deprecated, [core.String])}),
    fields: () => ({expires: core.String})
  });
  core._Override = class _Override extends core.Object {
    new() {
    }
  };
  dart.setSignature(core._Override, {
    constructors: () => ({new: dart.definiteFunctionType(core._Override, [])})
  });
  core.deprecated = dart.const(new core.Deprecated("next release"));
  core.override = dart.const(new core._Override());
  core._Proxy = class _Proxy extends core.Object {
    new() {
    }
  };
  dart.setSignature(core._Proxy, {
    constructors: () => ({new: dart.definiteFunctionType(core._Proxy, [])})
  });
  core.proxy = dart.const(new core._Proxy());
  dart.defineExtensionNames([
    'toString'
  ]);
  core.bool = class bool extends core.Object {
    static fromEnvironment(name, opts) {
      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
      dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
    }
    [dartx.toString]() {
      return this ? "true" : "false";
    }
  };
  core.bool.is = function is_bool(o) {
    return o === true || o === false;
  };
  core.bool.as = function as_bool(o) {
    if (o === true || o === false || o == null) return o;
    return dart.as(o, core.bool);
  };
  core.bool._check = function check_bool(o) {
    if (o === true || o === false || o == null) return o;
    return dart.check(o, core.bool);
  };
  dart.setSignature(core.bool, {
    constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.bool, [core.String], {defaultValue: core.bool})})
  });
  core.Comparator$ = dart.generic(T => {
    const Comparator = dart.typedef('Comparator', () => dart.functionType(core.int, [T, T]));
    return Comparator;
  });
  core.Comparator = Comparator();
  core.Comparable$ = dart.generic(T => {
    class Comparable extends core.Object {
      static compare(a, b) {
        return a[dartx.compareTo](b);
      }
    }
    dart.addTypeTests(Comparable);
    dart.setSignature(Comparable, {
      statics: () => ({compare: dart.definiteFunctionType(core.int, [core.Comparable, core.Comparable])}),
      names: ['compare']
    });
    return Comparable;
  });
  core.Comparable = Comparable();
  const _value$ = Symbol('_value');
  core.DateTime = class DateTime extends core.Object {
    new(year, month, day, hour, minute, second, millisecond, microsecond) {
      if (month === void 0) month = 1;
      if (day === void 0) day = 1;
      if (hour === void 0) hour = 0;
      if (minute === void 0) minute = 0;
      if (second === void 0) second = 0;
      if (millisecond === void 0) millisecond = 0;
      if (microsecond === void 0) microsecond = 0;
      DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, false);
    }
    utc(year, month, day, hour, minute, second, millisecond, microsecond) {
      if (month === void 0) month = 1;
      if (day === void 0) day = 1;
      if (hour === void 0) hour = 0;
      if (minute === void 0) minute = 0;
      if (second === void 0) second = 0;
      if (millisecond === void 0) millisecond = 0;
      if (microsecond === void 0) microsecond = 0;
      DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, true);
    }
    now() {
      DateTime.prototype._now.call(this);
    }
    static parse(formattedString) {
      let re = core.RegExp.new('^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)' + '(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{1,6}))?)?)?' + '( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$');
      let match = re.firstMatch(formattedString);
      if (match != null) {
        function parseIntOrZero(matched) {
          if (matched == null) return 0;
          return core.int.parse(matched);
        }
        dart.fn(parseIntOrZero, StringToint$());
        function parseMilliAndMicroseconds(matched) {
          if (matched == null) return 0;
          let length = matched[dartx.length];
          dart.assert(dart.notNull(length) >= 1);
          dart.assert(dart.notNull(length) <= 6);
          let result = 0;
          for (let i = 0; i < 6; i++) {
            result = result * 10;
            if (i < dart.notNull(matched[dartx.length])) {
              result = result + ((dart.notNull(matched[dartx.codeUnitAt](i)) ^ 48) >>> 0);
            }
          }
          return result;
        }
        dart.fn(parseMilliAndMicroseconds, StringToint$());
        let years = core.int.parse(match._get(1));
        let month = core.int.parse(match._get(2));
        let day = core.int.parse(match._get(3));
        let hour = parseIntOrZero(match._get(4));
        let minute = parseIntOrZero(match._get(5));
        let second = parseIntOrZero(match._get(6));
        let addOneMillisecond = false;
        let milliAndMicroseconds = parseMilliAndMicroseconds(match._get(7));
        let millisecond = (dart.notNull(milliAndMicroseconds) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
        let microsecond = dart.asInt(milliAndMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_MILLISECOND));
        let isUtc = false;
        if (match._get(8) != null) {
          isUtc = true;
          if (match._get(9) != null) {
            let sign = match._get(9) == '-' ? -1 : 1;
            let hourDifference = core.int.parse(match._get(10));
            let minuteDifference = parseIntOrZero(match._get(11));
            minuteDifference = dart.notNull(minuteDifference) + 60 * dart.notNull(hourDifference);
            minute = dart.notNull(minute) - sign * dart.notNull(minuteDifference);
          }
        }
        let value = core.DateTime._brokenDownDateToValue(years, month, day, hour, minute, second, millisecond, microsecond, isUtc);
        if (value == null) {
          dart.throw(new core.FormatException("Time out of range", formattedString));
        }
        return new core.DateTime._withValue(value, {isUtc: isUtc});
      } else {
        dart.throw(new core.FormatException("Invalid date format", formattedString));
      }
    }
    fromMillisecondsSinceEpoch(millisecondsSinceEpoch, opts) {
      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
      DateTime.prototype._withValue.call(this, millisecondsSinceEpoch, {isUtc: isUtc});
    }
    fromMicrosecondsSinceEpoch(microsecondsSinceEpoch, opts) {
      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
      DateTime.prototype._withValue.call(this, core.DateTime._microsecondInRoundedMilliseconds(microsecondsSinceEpoch), {isUtc: isUtc});
    }
    _withValue(value, opts) {
      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : null;
      this[_value$] = value;
      this.isUtc = isUtc;
      if (dart.notNull(this.millisecondsSinceEpoch[dartx.abs]()) > core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH || this.millisecondsSinceEpoch[dartx.abs]() == core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH && this.microsecond != 0) {
        dart.throw(new core.ArgumentError(this.millisecondsSinceEpoch));
      }
      if (this.isUtc == null) dart.throw(new core.ArgumentError(this.isUtc));
    }
    ['=='](other) {
      if (!core.DateTime.is(other)) return false;
      return dart.equals(this[_value$], dart.dload(other, _value$)) && dart.equals(this.isUtc, dart.dload(other, 'isUtc'));
    }
    isBefore(other) {
      return dart.notNull(this[_value$]) < dart.notNull(other[_value$]);
    }
    isAfter(other) {
      return dart.notNull(this[_value$]) > dart.notNull(other[_value$]);
    }
    isAtSameMomentAs(other) {
      return this[_value$] == other[_value$];
    }
    compareTo(other) {
      return this[_value$][dartx.compareTo](other[_value$]);
    }
    get hashCode() {
      return (dart.notNull(this[_value$]) ^ this[_value$][dartx['>>']](30)) & 1073741823;
    }
    toLocal() {
      if (dart.test(this.isUtc)) {
        return new core.DateTime._withValue(this[_value$], {isUtc: false});
      }
      return this;
    }
    toUtc() {
      if (dart.test(this.isUtc)) return this;
      return new core.DateTime._withValue(this[_value$], {isUtc: true});
    }
    static _fourDigits(n) {
      let absN = n[dartx.abs]();
      let sign = dart.notNull(n) < 0 ? "-" : "";
      if (dart.notNull(absN) >= 1000) return dart.str`${n}`;
      if (dart.notNull(absN) >= 100) return dart.str`${sign}0${absN}`;
      if (dart.notNull(absN) >= 10) return dart.str`${sign}00${absN}`;
      return dart.str`${sign}000${absN}`;
    }
    static _sixDigits(n) {
      dart.assert(dart.notNull(n) < -9999 || dart.notNull(n) > 9999);
      let absN = n[dartx.abs]();
      let sign = dart.notNull(n) < 0 ? "-" : "+";
      if (dart.notNull(absN) >= 100000) return dart.str`${sign}${absN}`;
      return dart.str`${sign}0${absN}`;
    }
    static _threeDigits(n) {
      if (dart.notNull(n) >= 100) return dart.str`${n}`;
      if (dart.notNull(n) >= 10) return dart.str`0${n}`;
      return dart.str`00${n}`;
    }
    static _twoDigits(n) {
      if (dart.notNull(n) >= 10) return dart.str`${n}`;
      return dart.str`0${n}`;
    }
    toString() {
      let y = core.DateTime._fourDigits(this.year);
      let m = core.DateTime._twoDigits(this.month);
      let d = core.DateTime._twoDigits(this.day);
      let h = core.DateTime._twoDigits(this.hour);
      let min = core.DateTime._twoDigits(this.minute);
      let sec = core.DateTime._twoDigits(this.second);
      let ms = core.DateTime._threeDigits(this.millisecond);
      let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
      if (dart.test(this.isUtc)) {
        return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}Z`;
      } else {
        return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}`;
      }
    }
    toIso8601String() {
      let y = dart.notNull(this.year) >= -9999 && dart.notNull(this.year) <= 9999 ? core.DateTime._fourDigits(this.year) : core.DateTime._sixDigits(this.year);
      let m = core.DateTime._twoDigits(this.month);
      let d = core.DateTime._twoDigits(this.day);
      let h = core.DateTime._twoDigits(this.hour);
      let min = core.DateTime._twoDigits(this.minute);
      let sec = core.DateTime._twoDigits(this.second);
      let ms = core.DateTime._threeDigits(this.millisecond);
      let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
      if (dart.test(this.isUtc)) {
        return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}Z`;
      } else {
        return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}`;
      }
    }
    add(duration) {
      return new core.DateTime._withValue(dart.notNull(this[_value$]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
    }
    subtract(duration) {
      return new core.DateTime._withValue(dart.notNull(this[_value$]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
    }
    difference(other) {
      return new core.Duration({milliseconds: dart.notNull(this[_value$]) - dart.notNull(other[_value$])});
    }
    _internal(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
      this.isUtc = typeof isUtc == 'boolean' ? isUtc : dart.throw(new core.ArgumentError.value(isUtc, 'isUtc'));
      this[_value$] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
    }
    _now() {
      this.isUtc = false;
      this[_value$] = _js_helper.Primitives.dateNow();
    }
    static _brokenDownDateToValue(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
      return dart.asInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc));
    }
    get millisecondsSinceEpoch() {
      return this[_value$];
    }
    get microsecondsSinceEpoch() {
      return dart.notNull(this[_value$]) * 1000;
    }
    get timeZoneName() {
      if (dart.test(this.isUtc)) return "UTC";
      return _js_helper.Primitives.getTimeZoneName(this);
    }
    get timeZoneOffset() {
      if (dart.test(this.isUtc)) return new core.Duration();
      return new core.Duration({minutes: _js_helper.Primitives.getTimeZoneOffsetInMinutes(this)});
    }
    get year() {
      return core.int._check(_js_helper.Primitives.getYear(this));
    }
    get month() {
      return core.int._check(_js_helper.Primitives.getMonth(this));
    }
    get day() {
      return core.int._check(_js_helper.Primitives.getDay(this));
    }
    get hour() {
      return core.int._check(_js_helper.Primitives.getHours(this));
    }
    get minute() {
      return core.int._check(_js_helper.Primitives.getMinutes(this));
    }
    get second() {
      return core.int._check(_js_helper.Primitives.getSeconds(this));
    }
    get millisecond() {
      return core.int._check(_js_helper.Primitives.getMilliseconds(this));
    }
    get microsecond() {
      return 0;
    }
    get weekday() {
      return core.int._check(_js_helper.Primitives.getWeekday(this));
    }
    static _microsecondInRoundedMilliseconds(microsecond) {
      return (dart.notNull(microsecond) / 1000)[dartx.round]();
    }
  };
  dart.defineNamedConstructor(core.DateTime, 'utc');
  dart.defineNamedConstructor(core.DateTime, 'now');
  dart.defineNamedConstructor(core.DateTime, 'fromMillisecondsSinceEpoch');
  dart.defineNamedConstructor(core.DateTime, 'fromMicrosecondsSinceEpoch');
  dart.defineNamedConstructor(core.DateTime, '_withValue');
  dart.defineNamedConstructor(core.DateTime, '_internal');
  dart.defineNamedConstructor(core.DateTime, '_now');
  core.DateTime[dart.implements] = () => [ComparableOfDateTime()];
  dart.setSignature(core.DateTime, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      utc: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      now: dart.definiteFunctionType(core.DateTime, []),
      fromMillisecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
      fromMicrosecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
      _withValue: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
      _internal: dart.definiteFunctionType(core.DateTime, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
      _now: dart.definiteFunctionType(core.DateTime, [])
    }),
    fields: () => ({
      [_value$]: core.int,
      isUtc: core.bool
    }),
    getters: () => ({
      millisecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
      microsecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
      timeZoneName: dart.definiteFunctionType(core.String, []),
      timeZoneOffset: dart.definiteFunctionType(core.Duration, []),
      year: dart.definiteFunctionType(core.int, []),
      month: dart.definiteFunctionType(core.int, []),
      day: dart.definiteFunctionType(core.int, []),
      hour: dart.definiteFunctionType(core.int, []),
      minute: dart.definiteFunctionType(core.int, []),
      second: dart.definiteFunctionType(core.int, []),
      millisecond: dart.definiteFunctionType(core.int, []),
      microsecond: dart.definiteFunctionType(core.int, []),
      weekday: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      isBefore: dart.definiteFunctionType(core.bool, [core.DateTime]),
      isAfter: dart.definiteFunctionType(core.bool, [core.DateTime]),
      isAtSameMomentAs: dart.definiteFunctionType(core.bool, [core.DateTime]),
      compareTo: dart.definiteFunctionType(core.int, [core.DateTime]),
      toLocal: dart.definiteFunctionType(core.DateTime, []),
      toUtc: dart.definiteFunctionType(core.DateTime, []),
      toIso8601String: dart.definiteFunctionType(core.String, []),
      add: dart.definiteFunctionType(core.DateTime, [core.Duration]),
      subtract: dart.definiteFunctionType(core.DateTime, [core.Duration]),
      difference: dart.definiteFunctionType(core.Duration, [core.DateTime])
    }),
    sfields: () => ({
      MONDAY: core.int,
      TUESDAY: core.int,
      WEDNESDAY: core.int,
      THURSDAY: core.int,
      FRIDAY: core.int,
      SATURDAY: core.int,
      SUNDAY: core.int,
      DAYS_PER_WEEK: core.int,
      JANUARY: core.int,
      FEBRUARY: core.int,
      MARCH: core.int,
      APRIL: core.int,
      MAY: core.int,
      JUNE: core.int,
      JULY: core.int,
      AUGUST: core.int,
      SEPTEMBER: core.int,
      OCTOBER: core.int,
      NOVEMBER: core.int,
      DECEMBER: core.int,
      MONTHS_PER_YEAR: core.int,
      _MAX_MILLISECONDS_SINCE_EPOCH: core.int
    }),
    statics: () => ({
      parse: dart.definiteFunctionType(core.DateTime, [core.String]),
      _fourDigits: dart.definiteFunctionType(core.String, [core.int]),
      _sixDigits: dart.definiteFunctionType(core.String, [core.int]),
      _threeDigits: dart.definiteFunctionType(core.String, [core.int]),
      _twoDigits: dart.definiteFunctionType(core.String, [core.int]),
      _brokenDownDateToValue: dart.definiteFunctionType(core.int, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
      _microsecondInRoundedMilliseconds: dart.definiteFunctionType(core.int, [core.int])
    }),
    names: ['parse', '_fourDigits', '_sixDigits', '_threeDigits', '_twoDigits', '_brokenDownDateToValue', '_microsecondInRoundedMilliseconds']
  });
  dart.defineExtensionMembers(core.DateTime, ['compareTo']);
  core.DateTime.MONDAY = 1;
  core.DateTime.TUESDAY = 2;
  core.DateTime.WEDNESDAY = 3;
  core.DateTime.THURSDAY = 4;
  core.DateTime.FRIDAY = 5;
  core.DateTime.SATURDAY = 6;
  core.DateTime.SUNDAY = 7;
  core.DateTime.DAYS_PER_WEEK = 7;
  core.DateTime.JANUARY = 1;
  core.DateTime.FEBRUARY = 2;
  core.DateTime.MARCH = 3;
  core.DateTime.APRIL = 4;
  core.DateTime.MAY = 5;
  core.DateTime.JUNE = 6;
  core.DateTime.JULY = 7;
  core.DateTime.AUGUST = 8;
  core.DateTime.SEPTEMBER = 9;
  core.DateTime.OCTOBER = 10;
  core.DateTime.NOVEMBER = 11;
  core.DateTime.DECEMBER = 12;
  core.DateTime.MONTHS_PER_YEAR = 12;
  core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
  const _duration = Symbol('_duration');
  core.Duration = class Duration extends core.Object {
    new(opts) {
      let days = opts && 'days' in opts ? opts.days : 0;
      let hours = opts && 'hours' in opts ? opts.hours : 0;
      let minutes = opts && 'minutes' in opts ? opts.minutes : 0;
      let seconds = opts && 'seconds' in opts ? opts.seconds : 0;
      let milliseconds = opts && 'milliseconds' in opts ? opts.milliseconds : 0;
      let microseconds = opts && 'microseconds' in opts ? opts.microseconds : 0;
      Duration.prototype._microseconds.call(this, core.Duration.MICROSECONDS_PER_DAY * dart.notNull(days) + core.Duration.MICROSECONDS_PER_HOUR * dart.notNull(hours) + core.Duration.MICROSECONDS_PER_MINUTE * dart.notNull(minutes) + core.Duration.MICROSECONDS_PER_SECOND * dart.notNull(seconds) + core.Duration.MICROSECONDS_PER_MILLISECOND * dart.notNull(milliseconds) + dart.notNull(microseconds));
    }
    _microseconds(duration) {
      this[_duration] = duration;
    }
    ['+'](other) {
      return new core.Duration._microseconds(dart.notNull(this[_duration]) + dart.notNull(other[_duration]));
    }
    ['-'](other) {
      return new core.Duration._microseconds(dart.notNull(this[_duration]) - dart.notNull(other[_duration]));
    }
    ['*'](factor) {
      return new core.Duration._microseconds((dart.notNull(this[_duration]) * dart.notNull(factor))[dartx.round]());
    }
    ['~/'](quotient) {
      if (quotient == 0) dart.throw(new core.IntegerDivisionByZeroException());
      return new core.Duration._microseconds((dart.notNull(this[_duration]) / dart.notNull(quotient))[dartx.truncate]());
    }
    ['<'](other) {
      return dart.notNull(this[_duration]) < dart.notNull(other[_duration]);
    }
    ['>'](other) {
      return dart.notNull(this[_duration]) > dart.notNull(other[_duration]);
    }
    ['<='](other) {
      return dart.notNull(this[_duration]) <= dart.notNull(other[_duration]);
    }
    ['>='](other) {
      return dart.notNull(this[_duration]) >= dart.notNull(other[_duration]);
    }
    get inDays() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_DAY)[dartx.truncate]();
    }
    get inHours() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_HOUR)[dartx.truncate]();
    }
    get inMinutes() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MINUTE)[dartx.truncate]();
    }
    get inSeconds() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_SECOND)[dartx.truncate]();
    }
    get inMilliseconds() {
      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
    }
    get inMicroseconds() {
      return this[_duration];
    }
    ['=='](other) {
      if (!core.Duration.is(other)) return false;
      return dart.equals(this[_duration], dart.dload(other, _duration));
    }
    get hashCode() {
      return dart.hashCode(this[_duration]);
    }
    compareTo(other) {
      return this[_duration][dartx.compareTo](other[_duration]);
    }
    toString() {
      function sixDigits(n) {
        if (dart.notNull(n) >= 100000) return dart.str`${n}`;
        if (dart.notNull(n) >= 10000) return dart.str`0${n}`;
        if (dart.notNull(n) >= 1000) return dart.str`00${n}`;
        if (dart.notNull(n) >= 100) return dart.str`000${n}`;
        if (dart.notNull(n) >= 10) return dart.str`0000${n}`;
        return dart.str`00000${n}`;
      }
      dart.fn(sixDigits, intToString());
      function twoDigits(n) {
        if (dart.notNull(n) >= 10) return dart.str`${n}`;
        return dart.str`0${n}`;
      }
      dart.fn(twoDigits, intToString());
      if (dart.notNull(this.inMicroseconds) < 0) {
        return dart.str`-${this._negate()}`;
      }
      let twoDigitMinutes = twoDigits(dart.asInt(this.inMinutes[dartx.remainder](core.Duration.MINUTES_PER_HOUR)));
      let twoDigitSeconds = twoDigits(dart.asInt(this.inSeconds[dartx.remainder](core.Duration.SECONDS_PER_MINUTE)));
      let sixDigitUs = sixDigits(dart.asInt(this.inMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_SECOND)));
      return dart.str`${this.inHours}:${twoDigitMinutes}:${twoDigitSeconds}.${sixDigitUs}`;
    }
    get isNegative() {
      return dart.notNull(this[_duration]) < 0;
    }
    abs() {
      return new core.Duration._microseconds(this[_duration][dartx.abs]());
    }
    _negate() {
      return new core.Duration._microseconds(-dart.notNull(this[_duration]));
    }
  };
  dart.defineNamedConstructor(core.Duration, '_microseconds');
  core.Duration[dart.implements] = () => [ComparableOfDuration()];
  dart.setSignature(core.Duration, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.Duration, [], {days: core.int, hours: core.int, minutes: core.int, seconds: core.int, milliseconds: core.int, microseconds: core.int}),
      _microseconds: dart.definiteFunctionType(core.Duration, [core.int])
    }),
    fields: () => ({[_duration]: core.int}),
    getters: () => ({
      inDays: dart.definiteFunctionType(core.int, []),
      inHours: dart.definiteFunctionType(core.int, []),
      inMinutes: dart.definiteFunctionType(core.int, []),
      inSeconds: dart.definiteFunctionType(core.int, []),
      inMilliseconds: dart.definiteFunctionType(core.int, []),
      inMicroseconds: dart.definiteFunctionType(core.int, []),
      isNegative: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      '+': dart.definiteFunctionType(core.Duration, [core.Duration]),
      '-': dart.definiteFunctionType(core.Duration, [core.Duration]),
      '*': dart.definiteFunctionType(core.Duration, [core.num]),
      '~/': dart.definiteFunctionType(core.Duration, [core.int]),
      '<': dart.definiteFunctionType(core.bool, [core.Duration]),
      '>': dart.definiteFunctionType(core.bool, [core.Duration]),
      '<=': dart.definiteFunctionType(core.bool, [core.Duration]),
      '>=': dart.definiteFunctionType(core.bool, [core.Duration]),
      compareTo: dart.definiteFunctionType(core.int, [core.Duration]),
      abs: dart.definiteFunctionType(core.Duration, []),
      _negate: dart.definiteFunctionType(core.Duration, [])
    }),
    sfields: () => ({
      MICROSECONDS_PER_MILLISECOND: core.int,
      MILLISECONDS_PER_SECOND: core.int,
      SECONDS_PER_MINUTE: core.int,
      MINUTES_PER_HOUR: core.int,
      HOURS_PER_DAY: core.int,
      MICROSECONDS_PER_SECOND: core.int,
      MICROSECONDS_PER_MINUTE: core.int,
      MICROSECONDS_PER_HOUR: core.int,
      MICROSECONDS_PER_DAY: core.int,
      MILLISECONDS_PER_MINUTE: core.int,
      MILLISECONDS_PER_HOUR: core.int,
      MILLISECONDS_PER_DAY: core.int,
      SECONDS_PER_HOUR: core.int,
      SECONDS_PER_DAY: core.int,
      MINUTES_PER_DAY: core.int,
      ZERO: core.Duration
    })
  });
  dart.defineExtensionMembers(core.Duration, ['compareTo']);
  core.Duration.MICROSECONDS_PER_MILLISECOND = 1000;
  core.Duration.MILLISECONDS_PER_SECOND = 1000;
  core.Duration.SECONDS_PER_MINUTE = 60;
  core.Duration.MINUTES_PER_HOUR = 60;
  core.Duration.HOURS_PER_DAY = 24;
  dart.defineLazy(core.Duration, {
    get MICROSECONDS_PER_SECOND() {
      return core.Duration.MICROSECONDS_PER_MILLISECOND * core.Duration.MILLISECONDS_PER_SECOND;
    },
    get MICROSECONDS_PER_MINUTE() {
      return core.Duration.MICROSECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
    },
    get MICROSECONDS_PER_HOUR() {
      return core.Duration.MICROSECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
    },
    get MICROSECONDS_PER_DAY() {
      return core.Duration.MICROSECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get MILLISECONDS_PER_MINUTE() {
      return core.Duration.MILLISECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
    },
    get MILLISECONDS_PER_HOUR() {
      return core.Duration.MILLISECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
    },
    get MILLISECONDS_PER_DAY() {
      return core.Duration.MILLISECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get SECONDS_PER_HOUR() {
      return core.Duration.SECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
    },
    get SECONDS_PER_DAY() {
      return core.Duration.SECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get MINUTES_PER_DAY() {
      return core.Duration.MINUTES_PER_HOUR * core.Duration.HOURS_PER_DAY;
    },
    get ZERO() {
      return dart.const(new core.Duration({seconds: 0}));
    }
  });
  core.TypeError = class TypeError extends core.AssertionError {
    new() {
      super.new();
    }
  };
  core.CastError = class CastError extends core.Error {
    new() {
      super.new();
    }
  };
  core.NullThrownError = class NullThrownError extends core.Error {
    new() {
      super.new();
    }
    toString() {
      return "Throw of null.";
    }
  };
  const _hasValue = Symbol('_hasValue');
  const _errorName = Symbol('_errorName');
  const _errorExplanation = Symbol('_errorExplanation');
  core.ArgumentError = class ArgumentError extends core.Error {
    new(message) {
      if (message === void 0) message = null;
      this.message = message;
      this.invalidValue = null;
      this[_hasValue] = false;
      this.name = null;
      super.new();
    }
    value(value, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      this.name = name;
      this.message = message;
      this.invalidValue = value;
      this[_hasValue] = true;
      super.new();
    }
    notNull(name) {
      if (name === void 0) name = null;
      this.name = name;
      this[_hasValue] = false;
      this.message = "Must not be null";
      this.invalidValue = null;
      super.new();
    }
    get [_errorName]() {
      return dart.str`Invalid argument${!dart.test(this[_hasValue]) ? "(s)" : ""}`;
    }
    get [_errorExplanation]() {
      return "";
    }
    toString() {
      let nameString = "";
      if (this.name != null) {
        nameString = dart.str` (${this.name})`;
      }
      let message = this.message == null ? "" : dart.str`: ${this.message}`;
      let prefix = dart.str`${this[_errorName]}${nameString}${message}`;
      if (!dart.test(this[_hasValue])) return prefix;
      let explanation = this[_errorExplanation];
      let errorValue = core.Error.safeToString(this.invalidValue);
      return dart.str`${prefix}${explanation}: ${errorValue}`;
    }
  };
  dart.defineNamedConstructor(core.ArgumentError, 'value');
  dart.defineNamedConstructor(core.ArgumentError, 'notNull');
  dart.setSignature(core.ArgumentError, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.ArgumentError, [], [dart.dynamic]),
      value: dart.definiteFunctionType(core.ArgumentError, [dart.dynamic], [core.String, core.String]),
      notNull: dart.definiteFunctionType(core.ArgumentError, [], [core.String])
    }),
    fields: () => ({
      [_hasValue]: core.bool,
      invalidValue: dart.dynamic,
      name: core.String,
      message: dart.dynamic
    }),
    getters: () => ({
      [_errorName]: dart.definiteFunctionType(core.String, []),
      [_errorExplanation]: dart.definiteFunctionType(core.String, [])
    })
  });
  core.RangeError = class RangeError extends core.ArgumentError {
    new(message) {
      this.start = null;
      this.end = null;
      super.new(message);
    }
    value(value, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      this.start = null;
      this.end = null;
      super.value(value, name, message != null ? message : "Value not in range");
    }
    range(invalidValue, minValue, maxValue, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      this.start = minValue;
      this.end = maxValue;
      super.value(invalidValue, name, message != null ? message : "Invalid value");
    }
    static index(index, indexable, name, message, length) {
      return new core.IndexError(index, indexable, name, message, length);
    }
    static checkValueInInterval(value, minValue, maxValue, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      if (dart.notNull(value) < dart.notNull(minValue) || dart.notNull(value) > dart.notNull(maxValue)) {
        dart.throw(new core.RangeError.range(value, minValue, maxValue, name, message));
      }
    }
    static checkValidIndex(index, indexable, name, length, message) {
      if (name === void 0) name = null;
      if (length === void 0) length = null;
      if (message === void 0) message = null;
      if (length == null) length = core.int._check(dart.dload(indexable, 'length'));
      if (0 > dart.notNull(index) || dart.notNull(index) >= dart.notNull(length)) {
        if (name == null) name = "index";
        dart.throw(core.RangeError.index(index, indexable, name, message, length));
      }
    }
    static checkValidRange(start, end, length, startName, endName, message) {
      if (startName === void 0) startName = null;
      if (endName === void 0) endName = null;
      if (message === void 0) message = null;
      if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(length)) {
        if (startName == null) startName = "start";
        dart.throw(new core.RangeError.range(start, 0, length, startName, message));
      }
      if (end != null) {
        if (dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length)) {
          if (endName == null) endName = "end";
          dart.throw(new core.RangeError.range(end, start, length, endName, message));
        }
        return end;
      }
      return length;
    }
    static checkNotNegative(value, name, message) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      if (dart.notNull(value) < 0) dart.throw(new core.RangeError.range(value, 0, null, name, message));
    }
    get [_errorName]() {
      return "RangeError";
    }
    get [_errorExplanation]() {
      dart.assert(this[_hasValue]);
      let explanation = "";
      if (this.start == null) {
        if (this.end != null) {
          explanation = dart.str`: Not less than or equal to ${this.end}`;
        }
      } else if (this.end == null) {
        explanation = dart.str`: Not greater than or equal to ${this.start}`;
      } else if (dart.notNull(this.end) > dart.notNull(this.start)) {
        explanation = dart.str`: Not in range ${this.start}..${this.end}, inclusive`;
      } else if (dart.notNull(this.end) < dart.notNull(this.start)) {
        explanation = ": Valid value range is empty";
      } else {
        explanation = dart.str`: Only valid value is ${this.start}`;
      }
      return explanation;
    }
  };
  dart.defineNamedConstructor(core.RangeError, 'value');
  dart.defineNamedConstructor(core.RangeError, 'range');
  dart.setSignature(core.RangeError, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.RangeError, [dart.dynamic]),
      value: dart.definiteFunctionType(core.RangeError, [core.num], [core.String, core.String]),
      range: dart.definiteFunctionType(core.RangeError, [core.num, core.int, core.int], [core.String, core.String]),
      index: dart.definiteFunctionType(core.RangeError, [core.int, dart.dynamic], [core.String, core.String, core.int])
    }),
    fields: () => ({
      start: core.num,
      end: core.num
    }),
    statics: () => ({
      checkValueInInterval: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.String, core.String]),
      checkValidIndex: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic], [core.String, core.int, core.String]),
      checkValidRange: dart.definiteFunctionType(core.int, [core.int, core.int, core.int], [core.String, core.String, core.String]),
      checkNotNegative: dart.definiteFunctionType(dart.void, [core.int], [core.String, core.String])
    }),
    names: ['checkValueInInterval', 'checkValidIndex', 'checkValidRange', 'checkNotNegative']
  });
  core.IndexError = class IndexError extends core.ArgumentError {
    new(invalidValue, indexable, name, message, length) {
      if (name === void 0) name = null;
      if (message === void 0) message = null;
      if (length === void 0) length = null;
      this.indexable = indexable;
      this.length = core.int._check(length != null ? length : dart.dload(indexable, 'length'));
      super.value(invalidValue, name, message != null ? message : "Index out of range");
    }
    get start() {
      return 0;
    }
    get end() {
      return dart.notNull(this.length) - 1;
    }
    get [_errorName]() {
      return "RangeError";
    }
    get [_errorExplanation]() {
      dart.assert(this[_hasValue]);
      if (dart.test(dart.dsend(this.invalidValue, '<', 0))) {
        return ": index must not be negative";
      }
      if (this.length == 0) {
        return ": no indices are valid";
      }
      return dart.str`: index should be less than ${this.length}`;
    }
  };
  core.IndexError[dart.implements] = () => [core.RangeError];
  dart.setSignature(core.IndexError, {
    constructors: () => ({new: dart.definiteFunctionType(core.IndexError, [core.int, dart.dynamic], [core.String, core.String, core.int])}),
    fields: () => ({
      indexable: dart.dynamic,
      length: core.int
    }),
    getters: () => ({
      start: dart.definiteFunctionType(core.int, []),
      end: dart.definiteFunctionType(core.int, [])
    })
  });
  const _className = Symbol('_className');
  core.AbstractClassInstantiationError = class AbstractClassInstantiationError extends core.Error {
    new(className) {
      this[_className] = className;
      super.new();
    }
    toString() {
      return dart.str`Cannot instantiate abstract class: '${this[_className]}'`;
    }
  };
  dart.setSignature(core.AbstractClassInstantiationError, {
    constructors: () => ({new: dart.definiteFunctionType(core.AbstractClassInstantiationError, [core.String])}),
    fields: () => ({[_className]: core.String})
  });
  const _receiver$ = Symbol('_receiver');
  const _memberName = Symbol('_memberName');
  const _arguments = Symbol('_arguments');
  const _namedArguments = Symbol('_namedArguments');
  const _existingArgumentNames = Symbol('_existingArgumentNames');
  core.NoSuchMethodError = class NoSuchMethodError extends core.Error {
    new(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
      if (existingArgumentNames === void 0) existingArgumentNames = null;
      this[_receiver$] = receiver;
      this[_memberName] = memberName;
      this[_arguments] = positionalArguments;
      this[_namedArguments] = namedArguments;
      this[_existingArgumentNames] = existingArgumentNames;
      super.new();
    }
    toString() {
      let sb = new core.StringBuffer();
      let i = 0;
      if (this[_arguments] != null) {
        for (; i < dart.notNull(this[_arguments][dartx.length]); i++) {
          if (i > 0) {
            sb.write(", ");
          }
          sb.write(core.Error.safeToString(this[_arguments][dartx._get](i)));
        }
      }
      if (this[_namedArguments] != null) {
        this[_namedArguments][dartx.forEach](dart.fn((key, value) => {
          if (i > 0) {
            sb.write(", ");
          }
          sb.write(core._symbolToString(key));
          sb.write(": ");
          sb.write(core.Error.safeToString(value));
          i++;
        }, SymbolAnddynamicTovoid()));
      }
      if (this[_existingArgumentNames] == null) {
        return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
      } else {
        let actualParameters = sb.toString();
        sb = new core.StringBuffer();
        for (let i = 0; i < dart.notNull(this[_existingArgumentNames][dartx.length]); i++) {
          if (i > 0) {
            sb.write(", ");
          }
          sb.write(this[_existingArgumentNames][dartx._get](i));
        }
        let formalParameters = sb.toString();
        return "NoSuchMethodError: incorrect number of arguments passed to " + dart.str`method named '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Tried calling: ${this[_memberName]}(${actualParameters})\n` + dart.str`Found: ${this[_memberName]}(${formalParameters})`;
      }
    }
  };
  dart.setSignature(core.NoSuchMethodError, {
    constructors: () => ({new: dart.definiteFunctionType(core.NoSuchMethodError, [core.Object, core.Symbol, core.List, MapOfSymbol$dynamic()], [core.List])}),
    fields: () => ({
      [_receiver$]: core.Object,
      [_memberName]: core.Symbol,
      [_arguments]: core.List,
      [_namedArguments]: MapOfSymbol$dynamic(),
      [_existingArgumentNames]: core.List
    })
  });
  core.UnsupportedError = class UnsupportedError extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return dart.str`Unsupported operation: ${this.message}`;
    }
  };
  dart.setSignature(core.UnsupportedError, {
    constructors: () => ({new: dart.definiteFunctionType(core.UnsupportedError, [core.String])}),
    fields: () => ({message: core.String})
  });
  core.UnimplementedError = class UnimplementedError extends core.Error {
    new(message) {
      if (message === void 0) message = null;
      this.message = message;
      super.new();
    }
    toString() {
      return this.message != null ? dart.str`UnimplementedError: ${this.message}` : "UnimplementedError";
    }
  };
  core.UnimplementedError[dart.implements] = () => [core.UnsupportedError];
  dart.setSignature(core.UnimplementedError, {
    constructors: () => ({new: dart.definiteFunctionType(core.UnimplementedError, [], [core.String])}),
    fields: () => ({message: core.String})
  });
  core.StateError = class StateError extends core.Error {
    new(message) {
      this.message = message;
      super.new();
    }
    toString() {
      return dart.str`Bad state: ${this.message}`;
    }
  };
  dart.setSignature(core.StateError, {
    constructors: () => ({new: dart.definiteFunctionType(core.StateError, [core.String])}),
    fields: () => ({message: core.String})
  });
  core.ConcurrentModificationError = class ConcurrentModificationError extends core.Error {
    new(modifiedObject) {
      if (modifiedObject === void 0) modifiedObject = null;
      this.modifiedObject = modifiedObject;
      super.new();
    }
    toString() {
      if (this.modifiedObject == null) {
        return "Concurrent modification during iteration.";
      }
      return "Concurrent modification during iteration: " + dart.str`${core.Error.safeToString(this.modifiedObject)}.`;
    }
  };
  dart.setSignature(core.ConcurrentModificationError, {
    constructors: () => ({new: dart.definiteFunctionType(core.ConcurrentModificationError, [], [core.Object])}),
    fields: () => ({modifiedObject: core.Object})
  });
  core.OutOfMemoryError = class OutOfMemoryError extends core.Object {
    new() {
    }
    toString() {
      return "Out of Memory";
    }
    get stackTrace() {
      return null;
    }
  };
  core.OutOfMemoryError[dart.implements] = () => [core.Error];
  dart.setSignature(core.OutOfMemoryError, {
    constructors: () => ({new: dart.definiteFunctionType(core.OutOfMemoryError, [])}),
    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
  });
  core.StackOverflowError = class StackOverflowError extends core.Object {
    new() {
    }
    toString() {
      return "Stack Overflow";
    }
    get stackTrace() {
      return null;
    }
  };
  core.StackOverflowError[dart.implements] = () => [core.Error];
  dart.setSignature(core.StackOverflowError, {
    constructors: () => ({new: dart.definiteFunctionType(core.StackOverflowError, [])}),
    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
  });
  core.CyclicInitializationError = class CyclicInitializationError extends core.Error {
    new(variableName) {
      if (variableName === void 0) variableName = null;
      this.variableName = variableName;
      super.new();
    }
    toString() {
      return this.variableName == null ? "Reading static variable during its initialization" : dart.str`Reading static variable '${this.variableName}' during its initialization`;
    }
  };
  dart.setSignature(core.CyclicInitializationError, {
    constructors: () => ({new: dart.definiteFunctionType(core.CyclicInitializationError, [], [core.String])}),
    fields: () => ({variableName: core.String})
  });
  core.Exception = class Exception extends core.Object {
    static new(message) {
      if (message === void 0) message = null;
      return new core._Exception(message);
    }
  };
  dart.setSignature(core.Exception, {
    constructors: () => ({new: dart.definiteFunctionType(core.Exception, [], [dart.dynamic])})
  });
  core._Exception = class _Exception extends core.Object {
    new(message) {
      if (message === void 0) message = null;
      this.message = message;
    }
    toString() {
      if (this.message == null) return "Exception";
      return dart.str`Exception: ${this.message}`;
    }
  };
  core._Exception[dart.implements] = () => [core.Exception];
  dart.setSignature(core._Exception, {
    constructors: () => ({new: dart.definiteFunctionType(core._Exception, [], [dart.dynamic])}),
    fields: () => ({message: dart.dynamic})
  });
  core.FormatException = class FormatException extends core.Object {
    new(message, source, offset) {
      if (message === void 0) message = "";
      if (source === void 0) source = null;
      if (offset === void 0) offset = null;
      this.message = message;
      this.source = source;
      this.offset = offset;
    }
    toString() {
      let report = "FormatException";
      if (this.message != null && "" != this.message) {
        report = dart.str`${report}: ${this.message}`;
      }
      let offset = this.offset;
      if (!(typeof this.source == 'string')) {
        if (offset != null) {
          report = report + dart.str` (at offset ${offset})`;
        }
        return report;
      }
      if (offset != null && (dart.notNull(offset) < 0 || dart.notNull(offset) > dart.notNull(core.num._check(dart.dload(this.source, 'length'))))) {
        offset = null;
      }
      if (offset == null) {
        let source = core.String._check(this.source);
        if (dart.notNull(source[dartx.length]) > 78) {
          source = dart.notNull(source[dartx.substring](0, 75)) + "...";
        }
        return dart.str`${report}\n${source}`;
      }
      let lineNum = 1;
      let lineStart = 0;
      let lastWasCR = null;
      for (let i = 0; i < dart.notNull(offset); i++) {
        let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
        if (char == 10) {
          if (lineStart != i || !dart.test(lastWasCR)) {
            lineNum++;
          }
          lineStart = i + 1;
          lastWasCR = false;
        } else if (char == 13) {
          lineNum++;
          lineStart = i + 1;
          lastWasCR = true;
        }
      }
      if (lineNum > 1) {
        report = report + dart.str` (at line ${lineNum}, character ${dart.notNull(offset) - lineStart + 1})\n`;
      } else {
        report = report + dart.str` (at character ${dart.notNull(offset) + 1})\n`;
      }
      let lineEnd = core.int._check(dart.dload(this.source, 'length'));
      for (let i = offset; dart.notNull(i) < dart.notNull(core.num._check(dart.dload(this.source, 'length'))); i = dart.notNull(i) + 1) {
        let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
        if (char == 10 || char == 13) {
          lineEnd = i;
          break;
        }
      }
      let length = dart.notNull(lineEnd) - lineStart;
      let start = lineStart;
      let end = lineEnd;
      let prefix = "";
      let postfix = "";
      if (length > 78) {
        let index = dart.notNull(offset) - lineStart;
        if (index < 75) {
          end = start + 75;
          postfix = "...";
        } else if (dart.notNull(end) - dart.notNull(offset) < 75) {
          start = dart.notNull(end) - 75;
          prefix = "...";
        } else {
          start = dart.notNull(offset) - 36;
          end = dart.notNull(offset) + 36;
          prefix = postfix = "...";
        }
      }
      let slice = core.String._check(dart.dsend(this.source, 'substring', start, end));
      let markOffset = dart.notNull(offset) - start + dart.notNull(prefix[dartx.length]);
      return dart.str`${report}${prefix}${slice}${postfix}\n${" "[dartx['*']](markOffset)}^\n`;
    }
  };
  core.FormatException[dart.implements] = () => [core.Exception];
  dart.setSignature(core.FormatException, {
    constructors: () => ({new: dart.definiteFunctionType(core.FormatException, [], [core.String, dart.dynamic, core.int])}),
    fields: () => ({
      message: core.String,
      source: dart.dynamic,
      offset: core.int
    })
  });
  core.IntegerDivisionByZeroException = class IntegerDivisionByZeroException extends core.Object {
    new() {
    }
    toString() {
      return "IntegerDivisionByZeroException";
    }
  };
  core.IntegerDivisionByZeroException[dart.implements] = () => [core.Exception];
  dart.setSignature(core.IntegerDivisionByZeroException, {
    constructors: () => ({new: dart.definiteFunctionType(core.IntegerDivisionByZeroException, [])})
  });
  const _getKey = Symbol('_getKey');
  core.Expando$ = dart.generic(T => {
    class Expando extends core.Object {
      new(name) {
        if (name === void 0) name = null;
        this.name = name;
      }
      toString() {
        return dart.str`Expando:${this.name}`;
      }
      _get(object) {
        let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
        return T._check(values == null ? null : _js_helper.Primitives.getProperty(values, this[_getKey]()));
      }
      _set(object, value) {
        T._check(value);
        let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
        if (values == null) {
          values = new core.Object();
          _js_helper.Primitives.setProperty(object, core.Expando._EXPANDO_PROPERTY_NAME, values);
        }
        _js_helper.Primitives.setProperty(values, this[_getKey](), value);
        return value;
      }
      [_getKey]() {
        let key = core.String._check(_js_helper.Primitives.getProperty(this, core.Expando._KEY_PROPERTY_NAME));
        if (key == null) {
          key = dart.str`expando\$key\$${(() => {
            let x = core.Expando._keyCount;
            core.Expando._keyCount = dart.notNull(x) + 1;
            return x;
          })()}`;
          _js_helper.Primitives.setProperty(this, core.Expando._KEY_PROPERTY_NAME, key);
        }
        return key;
      }
    }
    dart.addTypeTests(Expando);
    dart.setSignature(Expando, {
      constructors: () => ({new: dart.definiteFunctionType(core.Expando$(T), [], [core.String])}),
      fields: () => ({name: core.String}),
      methods: () => ({
        _get: dart.definiteFunctionType(T, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [core.Object, T]),
        [_getKey]: dart.definiteFunctionType(core.String, [])
      }),
      sfields: () => ({
        _KEY_PROPERTY_NAME: core.String,
        _EXPANDO_PROPERTY_NAME: core.String,
        _keyCount: core.int
      })
    });
    return Expando;
  });
  core.Expando = Expando();
  core.Expando._KEY_PROPERTY_NAME = 'expando$key';
  core.Expando._EXPANDO_PROPERTY_NAME = 'expando$values';
  core.Expando._keyCount = 0;
  core.Function = class Function extends core.Object {
    static apply(f, positionalArguments, namedArguments) {
      if (namedArguments === void 0) namedArguments = null;
      return dart.dcall.apply(null, [f].concat(positionalArguments));
    }
    static _toMangledNames(namedArguments) {
      let result = dart.map({}, core.String, dart.dynamic);
      namedArguments[dartx.forEach](dart.fn((symbol, value) => {
        result[dartx._set](core._symbolToString(symbol), value);
      }, SymbolAnddynamicTovoid()));
      return result;
    }
  };
  dart.setSignature(core.Function, {
    statics: () => ({
      apply: dart.definiteFunctionType(dart.dynamic, [core.Function, core.List], [MapOfSymbol$dynamic()]),
      _toMangledNames: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [MapOfSymbol$dynamic()])
    }),
    names: ['apply', '_toMangledNames']
  });
  core.identical = function(a, b) {
    return a == null ? b == null : a === b;
  };
  dart.fn(core.identical, ObjectAndObjectTobool());
  core.identityHashCode = function(object) {
    return _js_helper.objectHashCode(object);
  };
  dart.fn(core.identityHashCode, ObjectToint());
  core._Generator$ = dart.generic(E => {
    const _Generator = dart.typedef('_Generator', () => dart.functionType(E, [core.int]));
    return _Generator;
  });
  core._Generator = _Generator();
  const _end$ = Symbol('_end');
  const _start$0 = Symbol('_start');
  const _generator$ = Symbol('_generator');
  core._GeneratorIterable$ = dart.generic(E => {
    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
    let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
    class _GeneratorIterable extends core.Iterable$(E) {
      new(end, generator) {
        this[_end$] = end;
        this[_start$0] = 0;
        this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
        super.new();
      }
      slice(start, end, generator) {
        this[_start$0] = start;
        this[_end$] = end;
        this[_generator$] = generator;
        super.new();
      }
      get iterator() {
        return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
      }
      get length() {
        return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
      }
      skip(count) {
        core.RangeError.checkNotNegative(count, "count");
        if (count == 0) return this;
        let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
        if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
        return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
      }
      take(count) {
        core.RangeError.checkNotNegative(count, "count");
        if (count == 0) return new (EmptyIterableOfE())();
        let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
        if (newEnd >= dart.notNull(this[_end$])) return this;
        return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
      }
      static _id(n) {
        return n;
      }
    }
    dart.defineNamedConstructor(_GeneratorIterable, 'slice');
    _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(_GeneratorIterable, {
      constructors: () => ({
        new: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, _GeneratorOfE()]),
        slice: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, core.int, _GeneratorOfE()])
      }),
      fields: () => ({
        [_start$0]: core.int,
        [_end$]: core.int,
        [_generator$]: _GeneratorOfE()
      }),
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({
        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
        take: dart.definiteFunctionType(core.Iterable$(E), [core.int])
      }),
      statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
      names: ['_id']
    });
    dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
    return _GeneratorIterable;
  });
  core._GeneratorIterable = _GeneratorIterable();
  const _index$1 = Symbol('_index');
  const _current$3 = Symbol('_current');
  core._GeneratorIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
    class _GeneratorIterator extends core.Object {
      new(index, end, generator) {
        this[_index$1] = index;
        this[_end$] = end;
        this[_generator$] = generator;
        this[_current$3] = null;
      }
      moveNext() {
        if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
          this[_current$3] = this[_generator$](this[_index$1]);
          this[_index$1] = dart.notNull(this[_index$1]) + 1;
          return true;
        } else {
          this[_current$3] = null;
          return false;
        }
      }
      get current() {
        return this[_current$3];
      }
    }
    dart.addTypeTests(_GeneratorIterator);
    _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_GeneratorIterator, {
      constructors: () => ({new: dart.definiteFunctionType(core._GeneratorIterator$(E), [core.int, core.int, _GeneratorOfE()])}),
      fields: () => ({
        [_end$]: core.int,
        [_generator$]: _GeneratorOfE(),
        [_index$1]: core.int,
        [_current$3]: E
      }),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _GeneratorIterator;
  });
  core._GeneratorIterator = _GeneratorIterator();
  core.BidirectionalIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class BidirectionalIterator extends core.Object {}
    dart.addTypeTests(BidirectionalIterator);
    BidirectionalIterator[dart.implements] = () => [IteratorOfE()];
    return BidirectionalIterator;
  });
  core.BidirectionalIterator = BidirectionalIterator();
  core.Map$ = dart.generic((K, V) => {
    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
    let UnmodifiableMapViewOfK$V = () => (UnmodifiableMapViewOfK$V = dart.constFn(collection.UnmodifiableMapView$(K, V)))();
    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
    class Map extends core.Object {
      static new() {
        return JsLinkedHashMapOfK$V().es6();
      }
      static from(other) {
        return LinkedHashMapOfK$V().from(other);
      }
      static unmodifiable(other) {
        return new (UnmodifiableMapViewOfK$V())(MapOfK$V().from(other));
      }
      static identity() {
        return LinkedHashMapOfK$V().identity();
      }
      static fromIterable(iterable, opts) {
        return LinkedHashMapOfK$V().fromIterable(iterable, opts);
      }
      static fromIterables(keys, values) {
        return LinkedHashMapOfK$V().fromIterables(keys, values);
      }
    }
    dart.addTypeTests(Map);
    dart.setSignature(Map, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.Map$(K, V), []),
        from: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
        unmodifiable: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
        identity: dart.definiteFunctionType(core.Map$(K, V), []),
        fromIterable: dart.definiteFunctionType(core.Map$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
        fromIterables: dart.definiteFunctionType(core.Map$(K, V), [IterableOfK(), IterableOfV()])
      })
    });
    return Map;
  });
  core.Map = Map$();
  core.Null = class Null extends core.Object {
    static _uninstantiable() {
      dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
    }
    toString() {
      return "null";
    }
  };
  core.Null.is = function is_Null(o) {
    return o == null;
  };
  core.Null.as = function as_Null(o) {
    if (o == null) return o;
    return dart.as(o, core.Null);
  };
  core.Null._check = function check_Null(o) {
    if (o == null) return o;
    return dart.check(o, core.Null);
  };
  dart.setSignature(core.Null, {
    constructors: () => ({_uninstantiable: dart.definiteFunctionType(core.Null, [])})
  });
  core.Pattern = class Pattern extends core.Object {};
  core.print = function(object) {
    let line = dart.str`${object}`;
    if (_internal.printToZone == null) {
      _internal.printToConsole(line);
    } else {
      dart.dcall(_internal.printToZone, line);
    }
  };
  dart.fn(core.print, ObjectTovoid());
  core.RegExp = class RegExp extends core.Object {
    static new(source, opts) {
      let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
      let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
      return new _js_helper.JSSyntaxRegExp(source, {multiLine: multiLine, caseSensitive: caseSensitive});
    }
  };
  core.RegExp[dart.implements] = () => [core.Pattern];
  dart.setSignature(core.RegExp, {
    constructors: () => ({new: dart.definiteFunctionType(core.RegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})})
  });
  core.Set$ = dart.generic(E => {
    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    class Set extends core.Iterable$(E) {
      static new() {
        return LinkedHashSetOfE().new();
      }
      static identity() {
        return LinkedHashSetOfE().identity();
      }
      static from(elements) {
        return LinkedHashSetOfE().from(elements);
      }
    }
    Set[dart.implements] = () => [_internal.EfficientLength];
    dart.setSignature(Set, {
      constructors: () => ({
        new: dart.definiteFunctionType(core.Set$(E), []),
        identity: dart.definiteFunctionType(core.Set$(E), []),
        from: dart.definiteFunctionType(core.Set$(E), [IterableOfE()])
      })
    });
    return Set;
  });
  core.Set = Set();
  core.Sink$ = dart.generic(T => {
    class Sink extends core.Object {}
    dart.addTypeTests(Sink);
    return Sink;
  });
  core.Sink = Sink();
  core.StackTrace = class StackTrace extends core.Object {
    new() {
    }
    static fromString(stackTraceString) {
      return new core._StringStackTrace(stackTraceString);
    }
    static get current() {
      if (Error.captureStackTrace != null) {
        let error = new Error();
        Error.captureStackTrace(error);
        return _js_helper.getTraceFromException(error);
      }
      try {
        dart.throw('');
      } catch (_) {
        let stackTrace = dart.stackTrace(_);
        return stackTrace;
      }

    }
  };
  dart.setSignature(core.StackTrace, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.StackTrace, []),
      fromString: dart.definiteFunctionType(core.StackTrace, [core.String])
    }),
    sgetters: () => ({current: dart.definiteFunctionType(core.StackTrace, [])})
  });
  const _stackTrace = Symbol('_stackTrace');
  core._StringStackTrace = class _StringStackTrace extends core.Object {
    new(stackTrace) {
      this[_stackTrace] = stackTrace;
    }
    toString() {
      return this[_stackTrace];
    }
  };
  core._StringStackTrace[dart.implements] = () => [core.StackTrace];
  dart.setSignature(core._StringStackTrace, {
    constructors: () => ({new: dart.definiteFunctionType(core._StringStackTrace, [core.String])}),
    fields: () => ({[_stackTrace]: core.String})
  });
  const _stop = Symbol('_stop');
  core.Stopwatch = class Stopwatch extends core.Object {
    get frequency() {
      return core.Stopwatch._frequency;
    }
    new() {
      this[_start$0] = null;
      this[_stop] = null;
      core.Stopwatch._initTicker();
    }
    start() {
      if (dart.test(this.isRunning)) return;
      if (this[_start$0] == null) {
        this[_start$0] = core.Stopwatch._now();
      } else {
        this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
        this[_stop] = null;
      }
    }
    stop() {
      if (!dart.test(this.isRunning)) return;
      this[_stop] = core.Stopwatch._now();
    }
    reset() {
      if (this[_start$0] == null) return;
      this[_start$0] = core.Stopwatch._now();
      if (this[_stop] != null) {
        this[_stop] = this[_start$0];
      }
    }
    get elapsedTicks() {
      if (this[_start$0] == null) {
        return 0;
      }
      return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
    }
    get elapsed() {
      return new core.Duration({microseconds: this.elapsedMicroseconds});
    }
    get elapsedMicroseconds() {
      return (dart.notNull(this.elapsedTicks) * 1000000 / dart.notNull(this.frequency))[dartx.truncate]();
    }
    get elapsedMilliseconds() {
      return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
    }
    get isRunning() {
      return this[_start$0] != null && this[_stop] == null;
    }
    static _initTicker() {
      _js_helper.Primitives.initTicker();
      core.Stopwatch._frequency = _js_helper.Primitives.timerFrequency;
    }
    static _now() {
      return core.int._check(dart.dsend(_js_helper.Primitives, 'timerTicks'));
    }
  };
  dart.setSignature(core.Stopwatch, {
    constructors: () => ({new: dart.definiteFunctionType(core.Stopwatch, [])}),
    fields: () => ({
      [_start$0]: core.int,
      [_stop]: core.int
    }),
    getters: () => ({
      frequency: dart.definiteFunctionType(core.int, []),
      elapsedTicks: dart.definiteFunctionType(core.int, []),
      elapsed: dart.definiteFunctionType(core.Duration, []),
      elapsedMicroseconds: dart.definiteFunctionType(core.int, []),
      elapsedMilliseconds: dart.definiteFunctionType(core.int, []),
      isRunning: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      start: dart.definiteFunctionType(dart.void, []),
      stop: dart.definiteFunctionType(dart.void, []),
      reset: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({_frequency: core.int}),
    statics: () => ({
      _initTicker: dart.definiteFunctionType(dart.void, []),
      _now: dart.definiteFunctionType(core.int, [])
    }),
    names: ['_initTicker', '_now']
  });
  core.Stopwatch._frequency = null;
  core.Runes = class Runes extends core.Iterable$(core.int) {
    new(string) {
      this.string = string;
      super.new();
    }
    get iterator() {
      return new core.RuneIterator(this.string);
    }
    get last() {
      if (this.string[dartx.length] == 0) {
        dart.throw(new core.StateError('No elements.'));
      }
      let length = this.string[dartx.length];
      let code = this.string[dartx.codeUnitAt](dart.notNull(length) - 1);
      if (dart.test(core._isTrailSurrogate(code)) && dart.notNull(this.string[dartx.length]) > 1) {
        let previousCode = this.string[dartx.codeUnitAt](dart.notNull(length) - 2);
        if (dart.test(core._isLeadSurrogate(previousCode))) {
          return core._combineSurrogatePair(previousCode, code);
        }
      }
      return code;
    }
  };
  dart.addSimpleTypeTests(core.Runes);
  dart.setSignature(core.Runes, {
    constructors: () => ({new: dart.definiteFunctionType(core.Runes, [core.String])}),
    fields: () => ({string: core.String}),
    getters: () => ({
      iterator: dart.definiteFunctionType(core.RuneIterator, []),
      last: dart.definiteFunctionType(core.int, [])
    })
  });
  dart.defineExtensionMembers(core.Runes, ['iterator', 'last']);
  core._isLeadSurrogate = function(code) {
    return (dart.notNull(code) & 64512) == 55296;
  };
  dart.fn(core._isLeadSurrogate, intTobool());
  core._isTrailSurrogate = function(code) {
    return (dart.notNull(code) & 64512) == 56320;
  };
  dart.fn(core._isTrailSurrogate, intTobool());
  core._combineSurrogatePair = function(start, end) {
    return 65536 + ((dart.notNull(start) & 1023) << 10) + (dart.notNull(end) & 1023);
  };
  dart.fn(core._combineSurrogatePair, intAndintToint());
  const _position$ = Symbol('_position');
  const _nextPosition = Symbol('_nextPosition');
  const _currentCodePoint = Symbol('_currentCodePoint');
  const _checkSplitSurrogate = Symbol('_checkSplitSurrogate');
  core.RuneIterator = class RuneIterator extends core.Object {
    new(string) {
      this.string = string;
      this[_position$] = 0;
      this[_nextPosition] = 0;
      this[_currentCodePoint] = null;
    }
    at(string, index) {
      this.string = string;
      this[_position$] = index;
      this[_nextPosition] = index;
      this[_currentCodePoint] = null;
      core.RangeError.checkValueInInterval(index, 0, string[dartx.length]);
      this[_checkSplitSurrogate](index);
    }
    [_checkSplitSurrogate](index) {
      if (dart.notNull(index) > 0 && dart.notNull(index) < dart.notNull(this.string[dartx.length]) && dart.test(core._isLeadSurrogate(this.string[dartx.codeUnitAt](dart.notNull(index) - 1))) && dart.test(core._isTrailSurrogate(this.string[dartx.codeUnitAt](index)))) {
        dart.throw(new core.ArgumentError(dart.str`Index inside surrogate pair: ${index}`));
      }
    }
    get rawIndex() {
      return this[_position$] != this[_nextPosition] ? this[_position$] : null;
    }
    set rawIndex(rawIndex) {
      core.RangeError.checkValidIndex(rawIndex, this.string, "rawIndex");
      this.reset(rawIndex);
      this.moveNext();
    }
    reset(rawIndex) {
      if (rawIndex === void 0) rawIndex = 0;
      core.RangeError.checkValueInInterval(rawIndex, 0, this.string[dartx.length], "rawIndex");
      this[_checkSplitSurrogate](rawIndex);
      this[_position$] = this[_nextPosition] = rawIndex;
      this[_currentCodePoint] = null;
    }
    get current() {
      return this[_currentCodePoint];
    }
    get currentSize() {
      return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position$]);
    }
    get currentAsString() {
      if (this[_position$] == this[_nextPosition]) return null;
      if (dart.notNull(this[_position$]) + 1 == this[_nextPosition]) return this.string[dartx._get](this[_position$]);
      return this.string[dartx.substring](this[_position$], this[_nextPosition]);
    }
    moveNext() {
      this[_position$] = this[_nextPosition];
      if (this[_position$] == this.string[dartx.length]) {
        this[_currentCodePoint] = null;
        return false;
      }
      let codeUnit = this.string[dartx.codeUnitAt](this[_position$]);
      let nextPosition = dart.notNull(this[_position$]) + 1;
      if (dart.test(core._isLeadSurrogate(codeUnit)) && nextPosition < dart.notNull(this.string[dartx.length])) {
        let nextCodeUnit = this.string[dartx.codeUnitAt](nextPosition);
        if (dart.test(core._isTrailSurrogate(nextCodeUnit))) {
          this[_nextPosition] = nextPosition + 1;
          this[_currentCodePoint] = core._combineSurrogatePair(codeUnit, nextCodeUnit);
          return true;
        }
      }
      this[_nextPosition] = nextPosition;
      this[_currentCodePoint] = codeUnit;
      return true;
    }
    movePrevious() {
      this[_nextPosition] = this[_position$];
      if (this[_position$] == 0) {
        this[_currentCodePoint] = null;
        return false;
      }
      let position = dart.notNull(this[_position$]) - 1;
      let codeUnit = this.string[dartx.codeUnitAt](position);
      if (dart.test(core._isTrailSurrogate(codeUnit)) && position > 0) {
        let prevCodeUnit = this.string[dartx.codeUnitAt](position - 1);
        if (dart.test(core._isLeadSurrogate(prevCodeUnit))) {
          this[_position$] = position - 1;
          this[_currentCodePoint] = core._combineSurrogatePair(prevCodeUnit, codeUnit);
          return true;
        }
      }
      this[_position$] = position;
      this[_currentCodePoint] = codeUnit;
      return true;
    }
  };
  dart.defineNamedConstructor(core.RuneIterator, 'at');
  core.RuneIterator[dart.implements] = () => [BidirectionalIteratorOfint()];
  dart.setSignature(core.RuneIterator, {
    constructors: () => ({
      new: dart.definiteFunctionType(core.RuneIterator, [core.String]),
      at: dart.definiteFunctionType(core.RuneIterator, [core.String, core.int])
    }),
    fields: () => ({
      string: core.String,
      [_position$]: core.int,
      [_nextPosition]: core.int,
      [_currentCodePoint]: core.int
    }),
    getters: () => ({
      rawIndex: dart.definiteFunctionType(core.int, []),
      current: dart.definiteFunctionType(core.int, []),
      currentSize: dart.definiteFunctionType(core.int, []),
      currentAsString: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({rawIndex: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [_checkSplitSurrogate]: dart.definiteFunctionType(dart.void, [core.int]),
      reset: dart.definiteFunctionType(dart.void, [], [core.int]),
      moveNext: dart.definiteFunctionType(core.bool, []),
      movePrevious: dart.definiteFunctionType(core.bool, [])
    })
  });
  const _contents = Symbol('_contents');
  const _writeString = Symbol('_writeString');
  core.StringBuffer = class StringBuffer extends core.Object {
    new(content) {
      if (content === void 0) content = "";
      this[_contents] = dart.str`${content}`;
    }
    get length() {
      return this[_contents][dartx.length];
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    write(obj) {
      this[_writeString](dart.str`${obj}`);
    }
    writeCharCode(charCode) {
      this[_writeString](core.String.fromCharCode(charCode));
    }
    writeAll(objects, separator) {
      if (separator === void 0) separator = "";
      this[_contents] = core.StringBuffer._writeAll(this[_contents], objects, separator);
    }
    writeln(obj) {
      if (obj === void 0) obj = "";
      this[_writeString](dart.str`${obj}\n`);
    }
    clear() {
      this[_contents] = "";
    }
    toString() {
      return _js_helper.Primitives.flattenString(this[_contents]);
    }
    [_writeString](str) {
      this[_contents] = _js_helper.Primitives.stringConcatUnchecked(this[_contents], core.String._check(str));
    }
    static _writeAll(string, objects, separator) {
      let iterator = objects[dartx.iterator];
      if (!dart.test(iterator.moveNext())) return string;
      if (dart.test(separator[dartx.isEmpty])) {
        do {
          string = core.StringBuffer._writeOne(string, iterator.current);
        } while (dart.test(iterator.moveNext()));
      } else {
        string = core.StringBuffer._writeOne(string, iterator.current);
        while (dart.test(iterator.moveNext())) {
          string = core.StringBuffer._writeOne(string, separator);
          string = core.StringBuffer._writeOne(string, iterator.current);
        }
      }
      return string;
    }
    static _writeOne(string, obj) {
      return _js_helper.Primitives.stringConcatUnchecked(string, dart.str`${obj}`);
    }
  };
  core.StringBuffer[dart.implements] = () => [core.StringSink];
  dart.setSignature(core.StringBuffer, {
    constructors: () => ({new: dart.definiteFunctionType(core.StringBuffer, [], [core.Object])}),
    fields: () => ({[_contents]: core.String}),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      write: dart.definiteFunctionType(dart.void, [core.Object]),
      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      [_writeString]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    statics: () => ({
      _writeAll: dart.definiteFunctionType(core.String, [core.String, core.Iterable, core.String]),
      _writeOne: dart.definiteFunctionType(core.String, [core.String, core.Object])
    }),
    names: ['_writeAll', '_writeOne']
  });
  core.Symbol = class Symbol extends core.Object {
    static new(name) {
      return new _internal.Symbol(name);
    }
  };
  dart.setSignature(core.Symbol, {
    constructors: () => ({new: dart.definiteFunctionType(core.Symbol, [core.String])})
  });
  const _userInfo = Symbol('_userInfo');
  const _host = Symbol('_host');
  const _port = Symbol('_port');
  const _path = Symbol('_path');
  const _query = Symbol('_query');
  const _fragment = Symbol('_fragment');
  const _pathSegments = Symbol('_pathSegments');
  const _queryParameters = Symbol('_queryParameters');
  const _queryParameterLists = Symbol('_queryParameterLists');
  const _writeAuthority = Symbol('_writeAuthority');
  let const$51;
  const _mergePaths = Symbol('_mergePaths');
  const _toWindowsFilePath = Symbol('_toWindowsFilePath');
  const _toFilePath = Symbol('_toFilePath');
  const _isPathAbsolute = Symbol('_isPathAbsolute');
  core.Uri = class Uri extends core.Object {
    _internal(scheme, userInfo, host, port, path, query, fragment) {
      this.scheme = scheme;
      this[_userInfo] = userInfo;
      this[_host] = host;
      this[_port] = port;
      this[_path] = path;
      this[_query] = query;
      this[_fragment] = fragment;
      this[_pathSegments] = null;
      this[_queryParameters] = null;
      this[_queryParameterLists] = null;
    }
    static new(opts) {
      let scheme = opts && 'scheme' in opts ? opts.scheme : "";
      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
      let host = opts && 'host' in opts ? opts.host : null;
      let port = opts && 'port' in opts ? opts.port : null;
      let path = opts && 'path' in opts ? opts.path : null;
      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
      let query = opts && 'query' in opts ? opts.query : null;
      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
      scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
      userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
      host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
      if (query == "") query = null;
      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
      fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
      port = core.Uri._makePort(port, scheme);
      let isFile = scheme == "file";
      if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
        host = "";
      }
      let hasAuthority = host != null;
      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
      if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
        path = core.Uri._normalizeRelativePath(path);
      } else {
        path = core.Uri._removeDotSegments(path);
      }
      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
    }
    static http(authority, unencodedPath, queryParameters) {
      if (queryParameters === void 0) queryParameters = null;
      return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
    }
    static https(authority, unencodedPath, queryParameters) {
      if (queryParameters === void 0) queryParameters = null;
      return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
    }
    get authority() {
      if (!dart.test(this.hasAuthority)) return "";
      let sb = new core.StringBuffer();
      this[_writeAuthority](sb);
      return sb.toString();
    }
    get userInfo() {
      return this[_userInfo];
    }
    get host() {
      if (this[_host] == null) return "";
      if (dart.test(this[_host][dartx.startsWith]('['))) {
        return this[_host][dartx.substring](1, dart.notNull(this[_host][dartx.length]) - 1);
      }
      return this[_host];
    }
    get port() {
      if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
      return this[_port];
    }
    static _defaultPort(scheme) {
      if (scheme == "http") return 80;
      if (scheme == "https") return 443;
      return 0;
    }
    get path() {
      return this[_path];
    }
    get query() {
      return this[_query] == null ? "" : this[_query];
    }
    get fragment() {
      return this[_fragment] == null ? "" : this[_fragment];
    }
    static parse(uri, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      let EOI = -1;
      let scheme = "";
      let userinfo = "";
      let host = null;
      let port = null;
      let path = null;
      let query = null;
      let fragment = null;
      if (end == null) end = uri[dartx.length];
      let index = start;
      let pathStart = start;
      let char = EOI;
      function parseAuth() {
        if (index == end) {
          char = EOI;
          return;
        }
        let authStart = index;
        let lastColon = -1;
        let lastAt = -1;
        char = uri[dartx.codeUnitAt](index);
        while (dart.notNull(index) < dart.notNull(end)) {
          char = uri[dartx.codeUnitAt](index);
          if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
            break;
          }
          if (char == core.Uri._AT_SIGN) {
            lastAt = index;
            lastColon = -1;
          } else if (char == core.Uri._COLON) {
            lastColon = index;
          } else if (char == core.Uri._LEFT_BRACKET) {
            lastColon = -1;
            let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
            if (endBracket == -1) {
              index = end;
              char = EOI;
              break;
            } else {
              index = endBracket;
            }
          }
          index = dart.notNull(index) + 1;
          char = EOI;
        }
        let hostStart = authStart;
        let hostEnd = index;
        if (dart.notNull(lastAt) >= 0) {
          userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
          hostStart = dart.notNull(lastAt) + 1;
        }
        if (dart.notNull(lastColon) >= 0) {
          let portNumber = null;
          if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
            portNumber = 0;
            for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
              let digit = uri[dartx.codeUnitAt](i);
              if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
                core.Uri._fail(uri, i, "Invalid port number");
              }
              portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
            }
          }
          port = core.Uri._makePort(portNumber, scheme);
          hostEnd = lastColon;
        }
        host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
        if (dart.notNull(index) < dart.notNull(end)) {
          char = uri[dartx.codeUnitAt](index);
        }
      }
      dart.fn(parseAuth, VoidTovoid$());
      let NOT_IN_PATH = 0;
      let IN_PATH = 1;
      let ALLOW_AUTH = 2;
      let state = NOT_IN_PATH;
      let i = index;
      while (dart.notNull(i) < dart.notNull(end)) {
        char = uri[dartx.codeUnitAt](i);
        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
          state = NOT_IN_PATH;
          break;
        }
        if (char == core.Uri._SLASH) {
          state = i == start ? ALLOW_AUTH : IN_PATH;
          break;
        }
        if (char == core.Uri._COLON) {
          if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
          scheme = core.Uri._makeScheme(uri, start, i);
          i = dart.notNull(i) + 1;
          pathStart = i;
          if (i == end) {
            char = EOI;
            state = NOT_IN_PATH;
          } else {
            char = uri[dartx.codeUnitAt](i);
            if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
              state = NOT_IN_PATH;
            } else if (char == core.Uri._SLASH) {
              state = ALLOW_AUTH;
            } else {
              state = IN_PATH;
            }
          }
          break;
        }
        i = dart.notNull(i) + 1;
        char = EOI;
      }
      index = i;
      if (state == ALLOW_AUTH) {
        dart.assert(char == core.Uri._SLASH);
        index = dart.notNull(index) + 1;
        if (index == end) {
          char = EOI;
          state = NOT_IN_PATH;
        } else {
          char = uri[dartx.codeUnitAt](index);
          if (char == core.Uri._SLASH) {
            index = dart.notNull(index) + 1;
            parseAuth();
            pathStart = index;
          }
          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
            state = NOT_IN_PATH;
          } else {
            state = IN_PATH;
          }
        }
      }
      dart.assert(state == IN_PATH || state == NOT_IN_PATH);
      if (state == IN_PATH) {
        while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
          char = uri[dartx.codeUnitAt](index);
          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
            break;
          }
          char = EOI;
        }
        state = NOT_IN_PATH;
      }
      dart.assert(state == NOT_IN_PATH);
      let hasAuthority = host != null;
      path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
      if (char == core.Uri._QUESTION) {
        let numberSignIndex = -1;
        for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
          if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
            numberSignIndex = i;
            break;
          }
        }
        if (numberSignIndex < 0) {
          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
        } else {
          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
          fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
        }
      } else if (char == core.Uri._NUMBER_SIGN) {
        fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
      }
      return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
    }
    static _fail(uri, index, message) {
      dart.throw(new core.FormatException(message, uri, index));
    }
    static _makeHttpUri(scheme, authority, unencodedPath, queryParameters) {
      let userInfo = "";
      let host = null;
      let port = null;
      if (authority != null && dart.test(authority[dartx.isNotEmpty])) {
        let hostStart = 0;
        let hasUserInfo = false;
        for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
          if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
            hasUserInfo = true;
            userInfo = authority[dartx.substring](0, i);
            hostStart = i + 1;
            break;
          }
        }
        let hostEnd = hostStart;
        if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
          for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
            if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
          }
          if (hostEnd == authority[dartx.length]) {
            dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
          }
          core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
          hostEnd++;
          if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
            dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
          }
        }
        let hasPort = false;
        for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
            let portString = authority[dartx.substring](hostEnd + 1);
            if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
            break;
          }
        }
        host = authority[dartx.substring](hostStart, hostEnd);
      }
      return core.Uri.new({scheme: scheme, userInfo: userInfo, host: core.String._check(host), port: core.int._check(port), pathSegments: unencodedPath[dartx.split]("/"), queryParameters: queryParameters});
    }
    static file(path, opts) {
      let windows = opts && 'windows' in opts ? opts.windows : null;
      windows = windows == null ? core.Uri._isWindows : windows;
      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
    }
    static directory(path, opts) {
      let windows = opts && 'windows' in opts ? opts.windows : null;
      windows = windows == null ? core.Uri._isWindows : windows;
      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
    }
    static dataFromString(content, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let base64 = opts && 'base64' in opts ? opts.base64 : false;
      let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
      return data.uri;
    }
    static dataFromBytes(bytes, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
      let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
      return data.uri;
    }
    static get base() {
      let uri = _js_helper.Primitives.currentUri();
      if (uri != null) return core.Uri.parse(uri);
      dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
    }
    static get _isWindows() {
      return false;
    }
    static _checkNonWindowsPathReservedCharacters(segments, argumentError) {
      segments[dartx.forEach](dart.fn(segment => {
        if (dart.test(segment[dartx.contains]("/"))) {
          if (dart.test(argumentError)) {
            dart.throw(new core.ArgumentError(dart.str`Illegal path character ${segment}`));
          } else {
            dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
          }
        }
      }, StringTovoid$()));
    }
    static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
      if (firstSegment === void 0) firstSegment = 0;
      for (let segment of segments[dartx.skip](firstSegment)) {
        if (dart.test(segment[dartx.contains](core.RegExp.new('["*/:<>?\\\\|]')))) {
          if (dart.test(argumentError)) {
            dart.throw(new core.ArgumentError("Illegal character in path"));
          } else {
            dart.throw(new core.UnsupportedError("Illegal character in path"));
          }
        }
      }
    }
    static _checkWindowsDriveLetter(charCode, argumentError) {
      if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
        return;
      }
      if (dart.test(argumentError)) {
        dart.throw(new core.ArgumentError("Illegal drive letter " + core.String.fromCharCode(charCode)));
      } else {
        dart.throw(new core.UnsupportedError("Illegal drive letter " + core.String.fromCharCode(charCode)));
      }
    }
    static _makeFileUri(path, slashTerminated) {
      let sep = "/";
      let segments = path[dartx.split](sep);
      if (dart.test(slashTerminated) && dart.test(segments[dartx.isNotEmpty]) && dart.test(segments[dartx.last][dartx.isNotEmpty])) {
        segments[dartx.add]("");
      }
      if (dart.test(path[dartx.startsWith](sep))) {
        return core.Uri.new({scheme: "file", pathSegments: segments});
      } else {
        return core.Uri.new({pathSegments: segments});
      }
    }
    static _makeWindowsFileUrl(path, slashTerminated) {
      if (dart.test(path[dartx.startsWith]("\\\\?\\"))) {
        if (dart.test(path[dartx.startsWith]("UNC\\", 4))) {
          path = path[dartx.replaceRange](0, 7, '\\');
        } else {
          path = path[dartx.substring](4);
          if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
            dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
          }
        }
      } else {
        path = path[dartx.replaceAll]("/", '\\');
      }
      let sep = '\\';
      if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
        core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
        if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
          dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
        }
        let pathSegments = path[dartx.split](sep);
        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
          pathSegments[dartx.add]("");
        }
        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
        return core.Uri.new({scheme: "file", pathSegments: pathSegments});
      }
      if (dart.test(path[dartx.startsWith](sep))) {
        if (dart.test(path[dartx.startsWith](sep, 1))) {
          let pathStart = path[dartx.indexOf]('\\', 2);
          let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
          let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
          let pathSegments = pathPart[dartx.split](sep);
          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
          if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
            pathSegments[dartx.add]("");
          }
          return core.Uri.new({scheme: "file", host: hostPart, pathSegments: pathSegments});
        } else {
          let pathSegments = path[dartx.split](sep);
          if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
            pathSegments[dartx.add]("");
          }
          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
          return core.Uri.new({scheme: "file", pathSegments: pathSegments});
        }
      } else {
        let pathSegments = path[dartx.split](sep);
        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
          pathSegments[dartx.add]("");
        }
        return core.Uri.new({pathSegments: pathSegments});
      }
    }
    replace(opts) {
      let scheme = opts && 'scheme' in opts ? opts.scheme : null;
      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
      let host = opts && 'host' in opts ? opts.host : null;
      let port = opts && 'port' in opts ? opts.port : null;
      let path = opts && 'path' in opts ? opts.path : null;
      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
      let query = opts && 'query' in opts ? opts.query : null;
      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
      let schemeChanged = false;
      if (scheme != null) {
        scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
        schemeChanged = true;
      } else {
        scheme = this.scheme;
      }
      let isFile = scheme == "file";
      if (userInfo != null) {
        userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
      } else {
        userInfo = this[_userInfo];
      }
      if (port != null) {
        port = core.Uri._makePort(port, scheme);
      } else {
        port = this[_port];
        if (schemeChanged) {
          port = core.Uri._makePort(port, scheme);
        }
      }
      if (host != null) {
        host = core.Uri._makeHost(host, 0, host[dartx.length], false);
      } else if (dart.test(this.hasAuthority)) {
        host = this[_host];
      } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
        host = "";
      }
      let hasAuthority = host != null;
      if (path != null || pathSegments != null) {
        path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
      } else {
        path = this[_path];
        if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
          path = "/" + dart.notNull(path);
        }
      }
      if (query != null || queryParameters != null) {
        query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
      } else {
        query = this[_query];
      }
      if (fragment != null) {
        fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
      } else {
        fragment = this[_fragment];
      }
      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
    }
    removeFragment() {
      if (!dart.test(this.hasFragment)) return this;
      return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
    }
    get pathSegments() {
      let result = this[_pathSegments];
      if (result != null) return result;
      let pathToSplit = this.path;
      if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
        pathToSplit = pathToSplit[dartx.substring](1);
      }
      result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
      this[_pathSegments] = result;
      return result;
    }
    get queryParameters() {
      if (this[_queryParameters] == null) {
        this[_queryParameters] = new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
      }
      return this[_queryParameters];
    }
    get queryParametersAll() {
      if (this[_queryParameterLists] == null) {
        let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
        for (let key of queryParameterLists[dartx.keys]) {
          queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
        }
        this[_queryParameterLists] = MapOfString$ListOfString().unmodifiable(queryParameterLists);
      }
      return this[_queryParameterLists];
    }
    normalizePath() {
      let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
      if (core.identical(path, this[_path])) return this;
      return this.replace({path: path});
    }
    static _makePort(port, scheme) {
      if (port != null && port == core.Uri._defaultPort(scheme)) return null;
      return port;
    }
    static _makeHost(host, start, end, strictIPv6) {
      if (host == null) return null;
      if (start == end) return "";
      if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
        if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
          core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
        }
        core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
        return host[dartx.substring](start, end)[dartx.toLowerCase]();
      }
      if (!dart.test(strictIPv6)) {
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
            core.Uri.parseIPv6Address(host, start, end);
            return dart.str`[${host}]`;
          }
        }
      }
      return core.Uri._normalizeRegName(host, start, end);
    }
    static _isRegNameChar(char) {
      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
    }
    static _normalizeRegName(host, start, end) {
      let buffer = null;
      let sectionStart = start;
      let index = start;
      let isNormalized = true;
      while (dart.notNull(index) < dart.notNull(end)) {
        let char = host[dartx.codeUnitAt](index);
        if (char == core.Uri._PERCENT) {
          let replacement = core.Uri._normalizeEscape(host, index, true);
          if (replacement == null && isNormalized) {
            index = dart.notNull(index) + 3;
            continue;
          }
          if (buffer == null) buffer = new core.StringBuffer();
          let slice = host[dartx.substring](sectionStart, index);
          if (!isNormalized) slice = slice[dartx.toLowerCase]();
          buffer.write(slice);
          let sourceLength = 3;
          if (replacement == null) {
            replacement = host[dartx.substring](index, dart.notNull(index) + 3);
          } else if (replacement == "%") {
            replacement = "%25";
            sourceLength = 1;
          }
          buffer.write(replacement);
          index = dart.notNull(index) + sourceLength;
          sectionStart = index;
          isNormalized = true;
        } else if (dart.test(core.Uri._isRegNameChar(char))) {
          if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
            if (buffer == null) buffer = new core.StringBuffer();
            if (dart.notNull(sectionStart) < dart.notNull(index)) {
              buffer.write(host[dartx.substring](sectionStart, index));
              sectionStart = index;
            }
            isNormalized = false;
          }
          index = dart.notNull(index) + 1;
        } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
          core.Uri._fail(host, index, "Invalid character");
        } else {
          let sourceLength = 1;
          if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
            let tail = host[dartx.codeUnitAt](dart.notNull(index) + 1);
            if ((dart.notNull(tail) & 64512) == 56320) {
              char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
              sourceLength = 2;
            }
          }
          if (buffer == null) buffer = new core.StringBuffer();
          let slice = host[dartx.substring](sectionStart, index);
          if (!isNormalized) slice = slice[dartx.toLowerCase]();
          buffer.write(slice);
          buffer.write(core.Uri._escapeChar(char));
          index = dart.notNull(index) + sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null) return host[dartx.substring](start, end);
      if (dart.notNull(sectionStart) < dart.notNull(end)) {
        let slice = host[dartx.substring](sectionStart, end);
        if (!isNormalized) slice = slice[dartx.toLowerCase]();
        buffer.write(slice);
      }
      return dart.toString(buffer);
    }
    static _makeScheme(scheme, start, end) {
      if (start == end) return "";
      let firstCodeUnit = scheme[dartx.codeUnitAt](start);
      if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
        core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
      }
      let containsUpperCase = false;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = scheme[dartx.codeUnitAt](i);
        if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
          core.Uri._fail(scheme, i, "Illegal scheme character");
        }
        if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
          containsUpperCase = true;
        }
      }
      scheme = scheme[dartx.substring](start, end);
      if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
      return scheme;
    }
    static _makeUserInfo(userInfo, start, end) {
      if (userInfo == null) return "";
      return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
    }
    static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
      let isFile = scheme == "file";
      let ensureLeadingSlash = isFile || dart.test(hasAuthority);
      if (path == null && pathSegments == null) return isFile ? "/" : "";
      if (path != null && pathSegments != null) {
        dart.throw(new core.ArgumentError('Both path and pathSegments specified'));
      }
      let result = null;
      if (path != null) {
        result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
      } else {
        result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
      }
      if (dart.test(dart.dload(result, 'isEmpty'))) {
        if (isFile) return "/";
      } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
        result = "/" + dart.notNull(core.String._check(result));
      }
      result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
      return core.String._check(result);
    }
    static _normalizePath(path, scheme, hasAuthority) {
      if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
        return core.Uri._normalizeRelativePath(path);
      }
      return core.Uri._removeDotSegments(path);
    }
    static _makeQuery(query, start, end, queryParameters) {
      if (query == null && queryParameters == null) return null;
      if (query != null && queryParameters != null) {
        dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
      }
      if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
      let result = new core.StringBuffer();
      let separator = "";
      function writeParameter(key, value) {
        result.write(separator);
        separator = "&";
        result.write(core.Uri.encodeQueryComponent(key));
        if (value != null && dart.test(value[dartx.isNotEmpty])) {
          result.write("=");
          result.write(core.Uri.encodeQueryComponent(value));
        }
      }
      dart.fn(writeParameter, StringAndStringTovoid$());
      queryParameters[dartx.forEach](dart.fn((key, value) => {
        if (value == null || typeof value == 'string') {
          writeParameter(key, core.String._check(value));
        } else {
          let values = core.Iterable._check(value);
          for (let value of values) {
            core.String._check(value);
            writeParameter(key, value);
          }
        }
      }, StringAnddynamicTovoid()));
      return result.toString();
    }
    static _makeFragment(fragment, start, end) {
      if (fragment == null) return null;
      return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
    }
    static _stringOrNullLength(s) {
      return s == null ? 0 : s[dartx.length];
    }
    static _normalizeEscape(source, index, lowerCase) {
      dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
      if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
        return "%";
      }
      let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
      let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
      let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
      let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
      if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
        return "%";
      }
      let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
      if (dart.test(core.Uri._isUnreservedChar(value))) {
        if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
          value = (value | 32) >>> 0;
        }
        return core.String.fromCharCode(value);
      }
      if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
        return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
      }
      return null;
    }
    static _parseHexDigit(char) {
      let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
      if (digit <= 9) return digit;
      let lowerCase = (dart.notNull(char) | 32) >>> 0;
      if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
        return lowerCase - (core.Uri._LOWER_CASE_A - 10);
      }
      return -1;
    }
    static _escapeChar(char) {
      dart.assert(dart.notNull(char) <= 1114111);
      let codeUnits = null;
      if (dart.notNull(char) < 128) {
        codeUnits = ListOfint().new(3);
        codeUnits[dartx._set](0, core.Uri._PERCENT);
        codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
        codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
      } else {
        let flag = 192;
        let encodedBytes = 2;
        if (dart.notNull(char) > 2047) {
          flag = 224;
          encodedBytes = 3;
          if (dart.notNull(char) > 65535) {
            encodedBytes = 4;
            flag = 240;
          }
        }
        codeUnits = ListOfint().new(3 * encodedBytes);
        let index = 0;
        while (--encodedBytes >= 0) {
          let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
          codeUnits[dartx._set](index, core.Uri._PERCENT);
          codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
          codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
          index = index + 3;
          flag = 128;
        }
      }
      return core.String.fromCharCodes(codeUnits);
    }
    static _normalize(component, start, end, charTable) {
      let buffer = null;
      let sectionStart = start;
      let index = start;
      while (dart.notNull(index) < dart.notNull(end)) {
        let char = component[dartx.codeUnitAt](index);
        if (dart.notNull(char) < 127 && (dart.notNull(charTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0) {
          index = dart.notNull(index) + 1;
        } else {
          let replacement = null;
          let sourceLength = null;
          if (char == core.Uri._PERCENT) {
            replacement = core.Uri._normalizeEscape(component, index, false);
            if (replacement == null) {
              index = dart.notNull(index) + 3;
              continue;
            }
            if ("%" == replacement) {
              replacement = "%25";
              sourceLength = 1;
            } else {
              sourceLength = 3;
            }
          } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
            core.Uri._fail(component, index, "Invalid character");
          } else {
            sourceLength = 1;
            if ((dart.notNull(char) & 64512) == 55296) {
              if (dart.notNull(index) + 1 < dart.notNull(end)) {
                let tail = component[dartx.codeUnitAt](dart.notNull(index) + 1);
                if ((dart.notNull(tail) & 64512) == 56320) {
                  sourceLength = 2;
                  char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
                }
              }
            }
            replacement = core.Uri._escapeChar(char);
          }
          if (buffer == null) buffer = new core.StringBuffer();
          buffer.write(component[dartx.substring](sectionStart, index));
          buffer.write(replacement);
          index = dart.notNull(index) + dart.notNull(sourceLength);
          sectionStart = index;
        }
      }
      if (buffer == null) {
        return component[dartx.substring](start, end);
      }
      if (dart.notNull(sectionStart) < dart.notNull(end)) {
        buffer.write(component[dartx.substring](sectionStart, end));
      }
      return dart.toString(buffer);
    }
    static _isSchemeCharacter(ch) {
      return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
    }
    static _isGeneralDelimiter(ch) {
      return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
    }
    get isAbsolute() {
      return this.scheme != "" && this.fragment == "";
    }
    [_mergePaths](base, reference) {
      let backCount = 0;
      let refStart = 0;
      while (dart.test(reference[dartx.startsWith]("../", refStart))) {
        refStart = refStart + 3;
        backCount++;
      }
      let baseEnd = base[dartx.lastIndexOf]('/');
      while (dart.notNull(baseEnd) > 0 && backCount > 0) {
        let newEnd = base[dartx.lastIndexOf]('/', dart.notNull(baseEnd) - 1);
        if (dart.notNull(newEnd) < 0) {
          break;
        }
        let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
        if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
          break;
        }
        baseEnd = newEnd;
        backCount--;
      }
      return base[dartx.replaceRange](dart.notNull(baseEnd) + 1, null, reference[dartx.substring](refStart - 3 * backCount));
    }
    static _mayContainDotSegments(path) {
      if (dart.test(path[dartx.startsWith]('.'))) return true;
      let index = path[dartx.indexOf]("/.");
      return index != -1;
    }
    static _removeDotSegments(path) {
      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
      dart.assert(path[dartx.isNotEmpty]);
      let output = JSArrayOfString().of([]);
      let appendSlash = false;
      for (let segment of path[dartx.split]("/")) {
        appendSlash = false;
        if (segment == "..") {
          if (dart.test(output[dartx.isNotEmpty])) {
            output[dartx.removeLast]();
            if (dart.test(output[dartx.isEmpty])) {
              output[dartx.add]("");
            }
          }
          appendSlash = true;
        } else if ("." == segment) {
          appendSlash = true;
        } else {
          output[dartx.add](segment);
        }
      }
      if (appendSlash) output[dartx.add]("");
      return output[dartx.join]("/");
    }
    static _normalizeRelativePath(path) {
      dart.assert(!dart.test(path[dartx.startsWith]('/')));
      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
      dart.assert(path[dartx.isNotEmpty]);
      let output = JSArrayOfString().of([]);
      let appendSlash = false;
      for (let segment of path[dartx.split]("/")) {
        appendSlash = false;
        if (".." == segment) {
          if (!dart.test(output[dartx.isEmpty]) && output[dartx.last] != "..") {
            output[dartx.removeLast]();
            appendSlash = true;
          } else {
            output[dartx.add]("..");
          }
        } else if ("." == segment) {
          appendSlash = true;
        } else {
          output[dartx.add](segment);
        }
      }
      if (dart.test(output[dartx.isEmpty]) || output[dartx.length] == 1 && dart.test(output[dartx._get](0)[dartx.isEmpty])) {
        return "./";
      }
      if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
      return output[dartx.join]("/");
    }
    resolve(reference) {
      return this.resolveUri(core.Uri.parse(reference));
    }
    resolveUri(reference) {
      let targetScheme = null;
      let targetUserInfo = "";
      let targetHost = null;
      let targetPort = null;
      let targetPath = null;
      let targetQuery = null;
      if (dart.test(reference.scheme[dartx.isNotEmpty])) {
        targetScheme = reference.scheme;
        if (dart.test(reference.hasAuthority)) {
          targetUserInfo = reference.userInfo;
          targetHost = reference.host;
          targetPort = dart.test(reference.hasPort) ? reference.port : null;
        }
        targetPath = core.Uri._removeDotSegments(reference.path);
        if (dart.test(reference.hasQuery)) {
          targetQuery = reference.query;
        }
      } else {
        targetScheme = this.scheme;
        if (dart.test(reference.hasAuthority)) {
          targetUserInfo = reference.userInfo;
          targetHost = reference.host;
          targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
          targetPath = core.Uri._removeDotSegments(reference.path);
          if (dart.test(reference.hasQuery)) targetQuery = reference.query;
        } else {
          targetUserInfo = this[_userInfo];
          targetHost = this[_host];
          targetPort = this[_port];
          if (reference.path == "") {
            targetPath = this[_path];
            if (dart.test(reference.hasQuery)) {
              targetQuery = reference.query;
            } else {
              targetQuery = this[_query];
            }
          } else {
            if (dart.test(reference.hasAbsolutePath)) {
              targetPath = core.Uri._removeDotSegments(reference.path);
            } else {
              if (dart.test(this.hasEmptyPath)) {
                if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
                  targetPath = reference.path;
                } else {
                  targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
                }
              } else {
                let mergedPath = this[_mergePaths](this[_path], reference.path);
                if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
                  targetPath = core.Uri._removeDotSegments(mergedPath);
                } else {
                  targetPath = core.Uri._normalizeRelativePath(mergedPath);
                }
              }
            }
            if (dart.test(reference.hasQuery)) targetQuery = reference.query;
          }
        }
      }
      let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
      return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
    }
    get hasScheme() {
      return this.scheme[dartx.isNotEmpty];
    }
    get hasAuthority() {
      return this[_host] != null;
    }
    get hasPort() {
      return this[_port] != null;
    }
    get hasQuery() {
      return this[_query] != null;
    }
    get hasFragment() {
      return this[_fragment] != null;
    }
    get hasEmptyPath() {
      return this[_path][dartx.isEmpty];
    }
    get hasAbsolutePath() {
      return this[_path][dartx.startsWith]('/');
    }
    get origin() {
      if (this.scheme == "" || this[_host] == null || this[_host] == "") {
        dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
      }
      if (this.scheme != "http" && this.scheme != "https") {
        dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
      }
      if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
      return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
    }
    toFilePath(opts) {
      let windows = opts && 'windows' in opts ? opts.windows : null;
      if (this.scheme != "" && this.scheme != "file") {
        dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
      }
      if (this.query != "") {
        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
      }
      if (this.fragment != "") {
        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
      }
      if (windows == null) windows = core.Uri._isWindows;
      return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
    }
    [_toFilePath]() {
      if (this.host != "") {
        dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
      }
      core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
      let result = new core.StringBuffer();
      if (dart.test(this[_isPathAbsolute])) result.write("/");
      result.writeAll(this.pathSegments, "/");
      return result.toString();
    }
    [_toWindowsFilePath]() {
      let hasDriveLetter = false;
      let segments = this.pathSegments;
      if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
        core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
        core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
        hasDriveLetter = true;
      } else {
        core.Uri._checkWindowsPathReservedCharacters(segments, false);
      }
      let result = new core.StringBuffer();
      if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
      if (this.host != "") {
        result.write("\\");
        result.write(this.host);
        result.write("\\");
      }
      result.writeAll(segments, "\\");
      if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
      return result.toString();
    }
    get [_isPathAbsolute]() {
      if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
      return this.path[dartx.startsWith]('/');
    }
    [_writeAuthority](ss) {
      if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
        ss.write(this[_userInfo]);
        ss.write("@");
      }
      if (this[_host] != null) ss.write(this[_host]);
      if (this[_port] != null) {
        ss.write(":");
        ss.write(this[_port]);
      }
    }
    get data() {
      return this.scheme == "data" ? core.UriData.fromUri(this) : null;
    }
    toString() {
      let sb = new core.StringBuffer();
      core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
      if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
        sb.write("//");
        this[_writeAuthority](sb);
      }
      sb.write(this.path);
      if (this[_query] != null) {
        sb.write("?");
        sb.write(this[_query]);
      }
      if (this[_fragment] != null) {
        sb.write("#");
        sb.write(this[_fragment]);
      }
      return sb.toString();
    }
    ['=='](other) {
      if (!core.Uri.is(other)) return false;
      let uri = core.Uri._check(other);
      return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
    }
    get hashCode() {
      function combine(part, current) {
        return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
      }
      dart.fn(combine, dynamicAnddynamicToint());
      return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
    }
    static _addIfNonEmpty(sb, test, first, second) {
      if ("" != test) {
        sb.write(first);
        sb.write(second);
      }
    }
    static encodeComponent(component) {
      return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
    }
    static encodeQueryComponent(component, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
    }
    static decodeComponent(encodedComponent) {
      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
    }
    static decodeQueryComponent(encodedComponent, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
    }
    static encodeFull(uri) {
      return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
    }
    static decodeFull(uri) {
      return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
    }
    static splitQueryString(query, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
        let index = element[dartx.indexOf]("=");
        if (index == -1) {
          if (element != "") {
            map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
          }
        } else if (index != 0) {
          let key = element[dartx.substring](0, index);
          let value = element[dartx.substring](dart.notNull(index) + 1);
          map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
        }
        return map;
      }, MapOfString$StringAndStringToMapOfString$String()));
    }
    static _createList() {
      return [];
    }
    static _splitQueryStringAll(query, opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
      let result = dart.map();
      let i = 0;
      let start = 0;
      let equalsIndex = -1;
      function parsePair(start, equalsIndex, end) {
        let key = null;
        let value = null;
        if (start == end) return;
        if (dart.notNull(equalsIndex) < 0) {
          key = core.Uri._uriDecode(query, start, end, encoding, true);
          value = "";
        } else {
          key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
          value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
        }
        dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
      }
      dart.fn(parsePair, intAndintAndintTovoid());
      let _equals = 61;
      let _ampersand = 38;
      while (i < dart.notNull(query[dartx.length])) {
        let char = query[dartx.codeUnitAt](i);
        if (char == _equals) {
          if (equalsIndex < 0) equalsIndex = i;
        } else if (char == _ampersand) {
          parsePair(start, equalsIndex, i);
          start = i + 1;
          equalsIndex = -1;
        }
        i++;
      }
      parsePair(start, equalsIndex, i);
      return result;
    }
    static parseIPv4Address(host) {
      function error(msg) {
        dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
      }
      dart.fn(error, StringTovoid$());
      let bytes = host[dartx.split]('.');
      if (bytes[dartx.length] != 4) {
        error('IPv4 address should contain exactly 4 parts');
      }
      return bytes[dartx.map](core.int)(dart.fn(byteString => {
        let byte = core.int.parse(byteString);
        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
          error('each part must be in the range of `0..255`');
        }
        return byte;
      }, StringToint$()))[dartx.toList]();
    }
    static parseIPv6Address(host, start, end) {
      if (start === void 0) start = 0;
      if (end === void 0) end = null;
      if (end == null) end = host[dartx.length];
      function error(msg, position) {
        if (position === void 0) position = null;
        dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
      }
      dart.fn(error, String__Tovoid());
      function parseHex(start, end) {
        if (dart.notNull(end) - dart.notNull(start) > 4) {
          error('an IPv6 part can only contain a maximum of 4 hex digits', start);
        }
        let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
        if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
          error('each part must be in the range of `0x0..0xFFFF`', start);
        }
        return value;
      }
      dart.fn(parseHex, intAndintToint());
      if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
      let parts = JSArrayOfint().of([]);
      let wildcardSeen = false;
      let partStart = start;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
          if (i == start) {
            i = dart.notNull(i) + 1;
            if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
              error('invalid start colon.', i);
            }
            partStart = i;
          }
          if (i == partStart) {
            if (wildcardSeen) {
              error('only one wildcard `::` is allowed', i);
            }
            wildcardSeen = true;
            parts[dartx.add](-1);
          } else {
            parts[dartx.add](parseHex(partStart, i));
          }
          partStart = dart.notNull(i) + 1;
        }
      }
      if (parts[dartx.length] == 0) error('too few parts');
      let atEnd = partStart == end;
      let isLastWildcard = parts[dartx.last] == -1;
      if (atEnd && !isLastWildcard) {
        error('expected a part after last `:`', end);
      }
      if (!atEnd) {
        try {
          parts[dartx.add](parseHex(partStart, end));
        } catch (e) {
          try {
            let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
            parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
            parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
          } catch (e) {
            error('invalid end of IPv6 address.', partStart);
          }

        }

      }
      if (wildcardSeen) {
        if (dart.notNull(parts[dartx.length]) > 7) {
          error('an address with a wildcard must have less than 7 parts');
        }
      } else if (parts[dartx.length] != 8) {
        error('an address without a wildcard must contain exactly 8 parts');
      }
      let bytes = typed_data.Uint8List.new(16);
      for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
        let value = parts[dartx._get](i);
        if (value == -1) {
          let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
          for (let j = 0; j < wildCardLength; j++) {
            bytes[dartx._set](index, 0);
            bytes[dartx._set](index + 1, 0);
            index = index + 2;
          }
        } else {
          bytes[dartx._set](index, value[dartx['>>']](8));
          bytes[dartx._set](index + 1, dart.notNull(value) & 255);
          index = index + 2;
        }
      }
      return bytes;
    }
    static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
      if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
        return text;
      }
      let result = new core.StringBuffer();
      let bytes = encoding.encode(text);
      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        let byte = bytes[dartx._get](i);
        if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
          result.writeCharCode(byte);
        } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
          result.write('+');
        } else {
          let hexDigits = '0123456789ABCDEF';
          result.write('%');
          result.write(hexDigits[dartx._get](dart.notNull(byte) >> 4 & 15));
          result.write(hexDigits[dartx._get](dart.notNull(byte) & 15));
        }
      }
      return result.toString();
    }
    static _hexCharPairToByte(s, pos) {
      let byte = 0;
      for (let i = 0; i < 2; i++) {
        let charCode = s[dartx.codeUnitAt](dart.notNull(pos) + i);
        if (48 <= dart.notNull(charCode) && dart.notNull(charCode) <= 57) {
          byte = byte * 16 + dart.notNull(charCode) - 48;
        } else {
          charCode = (dart.notNull(charCode) | 32) >>> 0;
          if (97 <= dart.notNull(charCode) && dart.notNull(charCode) <= 102) {
            byte = byte * 16 + dart.notNull(charCode) - 87;
          } else {
            dart.throw(new core.ArgumentError("Invalid URL encoding"));
          }
        }
      }
      return byte;
    }
    static _uriDecode(text, start, end, encoding, plusToSpace) {
      dart.assert(0 <= dart.notNull(start));
      dart.assert(dart.notNull(start) <= dart.notNull(end));
      dart.assert(dart.notNull(end) <= dart.notNull(text[dartx.length]));
      dart.assert(encoding != null);
      let simple = true;
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        let codeUnit = text[dartx.codeUnitAt](i);
        if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
          simple = false;
          break;
        }
      }
      let bytes = null;
      if (simple) {
        if (dart.equals(convert.UTF8, encoding) || dart.equals(convert.LATIN1, encoding) || dart.equals(convert.ASCII, encoding)) {
          return text[dartx.substring](start, end);
        } else {
          bytes = text[dartx.substring](start, end)[dartx.codeUnits];
        }
      } else {
        bytes = ListOfint().new();
        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
          let codeUnit = text[dartx.codeUnitAt](i);
          if (dart.notNull(codeUnit) > 127) {
            dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
          }
          if (codeUnit == core.Uri._PERCENT) {
            if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
              dart.throw(new core.ArgumentError('Truncated URI'));
            }
            bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
            i = dart.notNull(i) + 2;
          } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
            bytes[dartx.add](core.Uri._SPACE);
          } else {
            bytes[dartx.add](codeUnit);
          }
        }
      }
      return encoding.decode(bytes);
    }
    static _isAlphabeticCharacter(codeUnit) {
      let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
      return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
    }
    static _isUnreservedChar(char) {
      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
    }
  };
  dart.defineNamedConstructor(core.Uri, '_internal');
  dart.setSignature(core.Uri, {
    constructors: () => ({
      _internal: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, core.int, core.String, core.String, core.String]),
      new: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
      http: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
      https: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
      file: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
      directory: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
      dataFromString: dart.definiteFunctionType(core.Uri, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
      dataFromBytes: dart.definiteFunctionType(core.Uri, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic})
    }),
    fields: () => ({
      scheme: core.String,
      [_userInfo]: core.String,
      [_host]: core.String,
      [_port]: core.int,
      [_path]: core.String,
      [_query]: core.String,
      [_fragment]: core.String,
      [_pathSegments]: ListOfString(),
      [_queryParameters]: MapOfString$String(),
      [_queryParameterLists]: MapOfString$ListOfString()
    }),
    getters: () => ({
      authority: dart.definiteFunctionType(core.String, []),
      userInfo: dart.definiteFunctionType(core.String, []),
      host: dart.definiteFunctionType(core.String, []),
      port: dart.definiteFunctionType(core.int, []),
      path: dart.definiteFunctionType(core.String, []),
      query: dart.definiteFunctionType(core.String, []),
      fragment: dart.definiteFunctionType(core.String, []),
      pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
      queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
      isAbsolute: dart.definiteFunctionType(core.bool, []),
      hasScheme: dart.definiteFunctionType(core.bool, []),
      hasAuthority: dart.definiteFunctionType(core.bool, []),
      hasPort: dart.definiteFunctionType(core.bool, []),
      hasQuery: dart.definiteFunctionType(core.bool, []),
      hasFragment: dart.definiteFunctionType(core.bool, []),
      hasEmptyPath: dart.definiteFunctionType(core.bool, []),
      hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
      origin: dart.definiteFunctionType(core.String, []),
      [_isPathAbsolute]: dart.definiteFunctionType(core.bool, []),
      data: dart.definiteFunctionType(core.UriData, [])
    }),
    methods: () => ({
      replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
      removeFragment: dart.definiteFunctionType(core.Uri, []),
      normalizePath: dart.definiteFunctionType(core.Uri, []),
      [_mergePaths]: dart.definiteFunctionType(core.String, [core.String, core.String]),
      resolve: dart.definiteFunctionType(core.Uri, [core.String]),
      resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
      toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
      [_toFilePath]: dart.definiteFunctionType(core.String, []),
      [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
      [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
    }),
    sfields: () => ({
      _SPACE: core.int,
      _DOUBLE_QUOTE: core.int,
      _NUMBER_SIGN: core.int,
      _PERCENT: core.int,
      _ASTERISK: core.int,
      _PLUS: core.int,
      _DOT: core.int,
      _SLASH: core.int,
      _ZERO: core.int,
      _NINE: core.int,
      _COLON: core.int,
      _LESS: core.int,
      _GREATER: core.int,
      _QUESTION: core.int,
      _AT_SIGN: core.int,
      _UPPER_CASE_A: core.int,
      _UPPER_CASE_F: core.int,
      _UPPER_CASE_Z: core.int,
      _LEFT_BRACKET: core.int,
      _BACKSLASH: core.int,
      _RIGHT_BRACKET: core.int,
      _LOWER_CASE_A: core.int,
      _LOWER_CASE_F: core.int,
      _LOWER_CASE_Z: core.int,
      _BAR: core.int,
      _hexDigits: core.String,
      _unreservedTable: ListOfint(),
      _unreserved2396Table: ListOfint(),
      _encodeFullTable: ListOfint(),
      _schemeTable: ListOfint(),
      _schemeLowerTable: ListOfint(),
      _subDelimitersTable: ListOfint(),
      _genDelimitersTable: ListOfint(),
      _userinfoTable: ListOfint(),
      _regNameTable: ListOfint(),
      _pathCharTable: ListOfint(),
      _pathCharOrSlashTable: ListOfint(),
      _queryCharTable: ListOfint(),
      _needsNoEncoding: core.RegExp
    }),
    sgetters: () => ({
      base: dart.definiteFunctionType(core.Uri, []),
      _isWindows: dart.definiteFunctionType(core.bool, [])
    }),
    statics: () => ({
      _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
      parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
      _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
      _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
      _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
      _checkWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool], [core.int]),
      _checkWindowsDriveLetter: dart.definiteFunctionType(dart.dynamic, [core.int, core.bool]),
      _makeFileUri: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
      _makeWindowsFileUrl: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
      _makePort: dart.definiteFunctionType(core.int, [core.int, core.String]),
      _makeHost: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.bool]),
      _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
      _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
      _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
      _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
      _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
      _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
      _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
      _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
      _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
      _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
      _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
      _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
      _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
      _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
      _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
      _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
      encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
      encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
      decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
      decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
      encodeFull: dart.definiteFunctionType(core.String, [core.String]),
      decodeFull: dart.definiteFunctionType(core.String, [core.String]),
      splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
      _createList: dart.definiteFunctionType(core.List, []),
      _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
      parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
      parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
      _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
      _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
      _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
      _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
      _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
    }),
    names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
  });
  core.Uri._SPACE = 32;
  core.Uri._DOUBLE_QUOTE = 34;
  core.Uri._NUMBER_SIGN = 35;
  core.Uri._PERCENT = 37;
  core.Uri._ASTERISK = 42;
  core.Uri._PLUS = 43;
  core.Uri._DOT = 46;
  core.Uri._SLASH = 47;
  core.Uri._ZERO = 48;
  core.Uri._NINE = 57;
  core.Uri._COLON = 58;
  core.Uri._LESS = 60;
  core.Uri._GREATER = 62;
  core.Uri._QUESTION = 63;
  core.Uri._AT_SIGN = 64;
  core.Uri._UPPER_CASE_A = 65;
  core.Uri._UPPER_CASE_F = 70;
  core.Uri._UPPER_CASE_Z = 90;
  core.Uri._LEFT_BRACKET = 91;
  core.Uri._BACKSLASH = 92;
  core.Uri._RIGHT_BRACKET = 93;
  core.Uri._LOWER_CASE_A = 97;
  core.Uri._LOWER_CASE_F = 102;
  core.Uri._LOWER_CASE_Z = 122;
  core.Uri._BAR = 124;
  core.Uri._hexDigits = "0123456789ABCDEF";
  core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
  core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
  core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
  core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
  core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
  core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
  core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
  core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
  core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
  core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
  core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
  core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
  dart.defineLazy(core.Uri, {
    get _needsNoEncoding() {
      return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
    }
  });
  const _text = Symbol('_text');
  const _separatorIndices = Symbol('_separatorIndices');
  const _uriCache = Symbol('_uriCache');
  core.UriData = class UriData extends core.Object {
    _(text, separatorIndices, uriCache) {
      this[_text] = text;
      this[_separatorIndices] = separatorIndices;
      this[_uriCache] = uriCache;
    }
    static fromString(content, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let base64 = opts && 'base64' in opts ? opts.base64 : false;
      let buffer = new core.StringBuffer();
      let indices = JSArrayOfint().of([core.UriData._noScheme]);
      let charsetName = null;
      let encodingName = null;
      if (parameters != null) charsetName = parameters[dartx._get]("charset");
      if (encoding == null) {
        if (charsetName != null) {
          encoding = convert.Encoding.getByName(charsetName);
        }
      } else if (charsetName == null) {
        encodingName = encoding.name;
      }
      let t = encoding;
      t == null ? encoding = convert.ASCII : t;
      core.UriData._writeUri(mimeType, encodingName, parameters, buffer, indices);
      indices[dartx.add](buffer.length);
      if (dart.test(base64)) {
        buffer.write(';base64,');
        indices[dartx.add](dart.notNull(buffer.length) - 1);
        buffer.write(encoding.fuse(core.String)(convert.BASE64).encode(content));
      } else {
        buffer.write(',');
        core.UriData._uriEncodeBytes(core.UriData._uricTable, encoding.encode(content), buffer);
      }
      return new core.UriData._(buffer.toString(), indices, null);
    }
    static fromBytes(bytes, opts) {
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
      let buffer = new core.StringBuffer();
      let indices = JSArrayOfint().of([core.UriData._noScheme]);
      core.UriData._writeUri(core.String._check(mimeType), null, parameters, buffer, indices);
      indices[dartx.add](buffer.length);
      if (dart.test(percentEncoded)) {
        buffer.write(',');
        core.UriData._uriEncodeBytes(core.UriData._uricTable, bytes, buffer);
      } else {
        buffer.write(';base64,');
        indices[dartx.add](dart.notNull(buffer.length) - 1);
        convert.BASE64.encoder.startChunkedConversion(convert.StringConversionSink.fromStringSink(buffer)).addSlice(bytes, 0, bytes[dartx.length], true);
      }
      return new core.UriData._(buffer.toString(), indices, null);
    }
    static fromUri(uri) {
      if (uri.scheme != "data") {
        dart.throw(new core.ArgumentError.value(uri, "uri", "Scheme must be 'data'"));
      }
      if (dart.test(uri.hasAuthority)) {
        dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have authority"));
      }
      if (dart.test(uri.hasFragment)) {
        dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have a fragment part"));
      }
      if (!dart.test(uri.hasQuery)) {
        return core.UriData._parse(uri.path, 0, uri);
      }
      return core.UriData._parse(dart.str`${uri}`, 5, uri);
    }
    static _writeUri(mimeType, charsetName, parameters, buffer, indices) {
      if (mimeType == null || mimeType == "text/plain") {
        mimeType = "";
      }
      if (dart.test(mimeType[dartx.isEmpty]) || core.identical(mimeType, "application/octet-stream")) {
        buffer.write(mimeType);
      } else {
        let slashIndex = core.UriData._validateMimeType(mimeType);
        if (dart.notNull(slashIndex) < 0) {
          dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
        }
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
        buffer.write("/");
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
      }
      if (charsetName != null) {
        if (indices != null) {
          indices[dartx.add](buffer.length);
          indices[dartx.add](dart.notNull(buffer.length) + 8);
        }
        buffer.write(";charset=");
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
      }
      dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
        if (dart.test(key[dartx.isEmpty])) {
          dart.throw(new core.ArgumentError.value("", "Parameter names must not be empty"));
        }
        if (dart.test(value[dartx.isEmpty])) {
          dart.throw(new core.ArgumentError.value("", "Parameter values must not be empty", dart.str`parameters["${key}"]`));
        }
        if (indices != null) indices[dartx.add](buffer.length);
        buffer.write(';');
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
        if (indices != null) indices[dartx.add](buffer.length);
        buffer.write('=');
        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
      }, StringAndStringTovoid$())));
    }
    static _validateMimeType(mimeType) {
      let slashIndex = -1;
      for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
        let char = mimeType[dartx.codeUnitAt](i);
        if (char != core.Uri._SLASH) continue;
        if (slashIndex < 0) {
          slashIndex = i;
          continue;
        }
        return -1;
      }
      return slashIndex;
    }
    static parse(uri) {
      if (!dart.test(uri[dartx.startsWith]("data:"))) {
        dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
      }
      return core.UriData._parse(uri, 5, null);
    }
    get uri() {
      if (this[_uriCache] != null) return this[_uriCache];
      let path = this[_text];
      let query = null;
      let colonIndex = this[_separatorIndices][dartx._get](0);
      let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
      let end = null;
      if (dart.notNull(queryIndex) >= 0) {
        query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
        end = queryIndex;
      }
      path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
      this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
      return this[_uriCache];
    }
    get mimeType() {
      let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
      let end = this[_separatorIndices][dartx._get](1);
      if (start == end) return "text/plain";
      return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
    }
    get charset() {
      let parameterStart = 1;
      let parameterEnd = dart.notNull(this[_separatorIndices][dartx.length]) - 1;
      if (dart.test(this.isBase64)) {
        parameterEnd = parameterEnd - 1;
      }
      for (let i = parameterStart; i < parameterEnd; i = i + 2) {
        let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
        let keyEnd = this[_separatorIndices][dartx._get](i + 1);
        if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
          return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
        }
      }
      return "US-ASCII";
    }
    get isBase64() {
      return this[_separatorIndices][dartx.length][dartx.isOdd];
    }
    get contentText() {
      return this[_text][dartx.substring](dart.notNull(this[_separatorIndices][dartx.last]) + 1);
    }
    contentAsBytes() {
      let text = this[_text];
      let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
      if (dart.test(this.isBase64)) {
        return convert.BASE64.decoder.convert(text, start);
      }
      let percent = 37;
      let length = dart.notNull(text[dartx.length]) - start;
      for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
        let codeUnit = text[dartx.codeUnitAt](i);
        if (codeUnit == percent) {
          i = i + 2;
          length = length - 2;
        }
      }
      let result = typed_data.Uint8List.new(length);
      if (length == text[dartx.length]) {
        result[dartx.setRange](0, length, text[dartx.codeUnits], start);
        return result;
      }
      let index = 0;
      for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
        let codeUnit = text[dartx.codeUnitAt](i);
        if (codeUnit != percent) {
          result[dartx._set](index++, codeUnit);
        } else {
          if (i + 2 < dart.notNull(text[dartx.length])) {
            let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
            let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
            if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
              let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
              result[dartx._set](index++, byte);
              i = i + 2;
              continue;
            }
          }
          dart.throw(new core.FormatException("Invalid percent escape", text, i));
        }
      }
      dart.assert(index == result[dartx.length]);
      return result;
    }
    contentAsString(opts) {
      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
      if (encoding == null) {
        let charset = this.charset;
        encoding = convert.Encoding.getByName(charset);
        if (encoding == null) {
          dart.throw(new core.UnsupportedError(dart.str`Unknown charset: ${charset}`));
        }
      }
      let text = this[_text];
      let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
      if (dart.test(this.isBase64)) {
        let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
        return converter.convert(text[dartx.substring](start));
      }
      return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
    }
    get parameters() {
      let result = dart.map({}, core.String, core.String);
      for (let i = 3; i < dart.notNull(this[_separatorIndices][dartx.length]); i = i + 2) {
        let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
        let equals = this[_separatorIndices][dartx._get](i - 1);
        let end = this[_separatorIndices][dartx._get](i);
        let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
        let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
        result[dartx._set](key, value);
      }
      return result;
    }
    static _parse(text, start, sourceUri) {
      dart.assert(start == 0 || start == 5);
      dart.assert(start == 5 == text[dartx.startsWith]("data:"));
      let comma = 44;
      let slash = 47;
      let semicolon = 59;
      let equals = 61;
      let indices = JSArrayOfint().of([dart.notNull(start) - 1]);
      let slashIndex = -1;
      let char = null;
      let i = start;
      for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
        char = text[dartx.codeUnitAt](i);
        if (dart.equals(char, comma) || dart.equals(char, semicolon)) break;
        if (dart.equals(char, slash)) {
          if (dart.notNull(slashIndex) < 0) {
            slashIndex = i;
            continue;
          }
          dart.throw(new core.FormatException("Invalid MIME type", text, i));
        }
      }
      if (dart.notNull(slashIndex) < 0 && dart.notNull(i) > dart.notNull(start)) {
        dart.throw(new core.FormatException("Invalid MIME type", text, i));
      }
      while (!dart.equals(char, comma)) {
        indices[dartx.add](i);
        i = dart.notNull(i) + 1;
        let equalsIndex = -1;
        for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
          char = text[dartx.codeUnitAt](i);
          if (dart.equals(char, equals)) {
            if (dart.notNull(equalsIndex) < 0) equalsIndex = i;
          } else if (dart.equals(char, semicolon) || dart.equals(char, comma)) {
            break;
          }
        }
        if (dart.notNull(equalsIndex) >= 0) {
          indices[dartx.add](equalsIndex);
        } else {
          let lastSeparator = indices[dartx.last];
          if (!dart.equals(char, comma) || i != dart.notNull(lastSeparator) + 7 || !dart.test(text[dartx.startsWith]("base64", dart.notNull(lastSeparator) + 1))) {
            dart.throw(new core.FormatException("Expecting '='", text, i));
          }
          break;
        }
      }
      indices[dartx.add](i);
      return new core.UriData._(text, indices, sourceUri);
    }
    static _uriEncodeBytes(canonicalTable, bytes, buffer) {
      let byteOr = 0;
      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
        let byte = bytes[dartx._get](i);
        byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
        if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
          buffer.writeCharCode(byte);
        } else {
          buffer.writeCharCode(core.Uri._PERCENT);
          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
        }
      }
      if ((dart.notNull(byteOr) & ~255) != 0) {
        for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
          let byte = bytes[dartx._get](i);
          if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
            dart.throw(new core.ArgumentError.value(byte, "non-byte value"));
          }
        }
      }
    }
    toString() {
      return this[_separatorIndices][dartx._get](0) == core.UriData._noScheme ? dart.str`data:${this[_text]}` : this[_text];
    }
  };
  dart.defineNamedConstructor(core.UriData, '_');
  dart.setSignature(core.UriData, {
    constructors: () => ({
      _: dart.definiteFunctionType(core.UriData, [core.String, ListOfint(), core.Uri]),
      fromString: dart.definiteFunctionType(core.UriData, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
      fromBytes: dart.definiteFunctionType(core.UriData, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic}),
      fromUri: dart.definiteFunctionType(core.UriData, [core.Uri])
    }),
    fields: () => ({
      [_text]: core.String,
      [_separatorIndices]: ListOfint(),
      [_uriCache]: core.Uri
    }),
    getters: () => ({
      uri: dart.definiteFunctionType(core.Uri, []),
      mimeType: dart.definiteFunctionType(core.String, []),
      charset: dart.definiteFunctionType(core.String, []),
      isBase64: dart.definiteFunctionType(core.bool, []),
      contentText: dart.definiteFunctionType(core.String, []),
      parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
    }),
    methods: () => ({
      contentAsBytes: dart.definiteFunctionType(core.List$(core.int), []),
      contentAsString: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding})
    }),
    sfields: () => ({
      _noScheme: core.int,
      _tokenCharTable: ListOfint(),
      _uricTable: ListOfint()
    }),
    statics: () => ({
      _writeUri: dart.definiteFunctionType(dart.void, [core.String, core.String, MapOfString$String(), core.StringBuffer, core.List]),
      _validateMimeType: dart.definiteFunctionType(core.int, [core.String]),
      parse: dart.definiteFunctionType(core.UriData, [core.String]),
      _parse: dart.definiteFunctionType(core.UriData, [core.String, core.int, core.Uri]),
      _uriEncodeBytes: dart.definiteFunctionType(dart.void, [ListOfint(), ListOfint(), core.StringSink])
    }),
    names: ['_writeUri', '_validateMimeType', 'parse', '_parse', '_uriEncodeBytes']
  });
  core.UriData._noScheme = -1;
  core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
  core.UriData._uricTable = core.Uri._queryCharTable;
  developer.debugger = function(opts) {
    let when = opts && 'when' in opts ? opts.when : true;
    let message = opts && 'message' in opts ? opts.message : null;
    if (dart.test(when)) {
      debugger;
    }
    return when;
  };
  dart.fn(developer.debugger, __Tobool());
  developer.inspect = function(object) {
    return object;
  };
  dart.fn(developer.inspect, ObjectToObject());
  developer.log = function(message, opts) {
    let time = opts && 'time' in opts ? opts.time : null;
    let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
    let level = opts && 'level' in opts ? opts.level : 0;
    let name = opts && 'name' in opts ? opts.name : '';
    let zone = opts && 'zone' in opts ? opts.zone : null;
    let error = opts && 'error' in opts ? opts.error : null;
    let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
  };
  dart.fn(developer.log, String__Tovoid$());
  dart.defineLazy(developer, {
    get _extensions() {
      return MapOfString$ServiceExtensionHandler().new();
    }
  });
  developer._clockValue = 0;
  const _result = Symbol('_result');
  const _errorCode = Symbol('_errorCode');
  const _errorDetail = Symbol('_errorDetail');
  const _isError = Symbol('_isError');
  const _toString = Symbol('_toString');
  developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
    result(result) {
      this[_result] = result;
      this[_errorCode] = null;
      this[_errorDetail] = null;
      if (!(typeof this[_result] == 'string')) {
        dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
      }
    }
    error(errorCode, errorDetail) {
      this[_result] = null;
      this[_errorCode] = errorCode;
      this[_errorDetail] = errorDetail;
      developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
      if (!(typeof this[_errorDetail] == 'string')) {
        dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
      }
    }
    static _errorCodeMessage(errorCode) {
      developer.ServiceExtensionResponse._validateErrorCode(errorCode);
      if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
        return "Invalid params";
      }
      return "Server error";
    }
    static _validateErrorCode(errorCode) {
      if (!(typeof errorCode == 'number')) {
        dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
      }
      if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
        return;
      }
      if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
        return;
      }
      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
    }
    [_isError]() {
      return this[_errorCode] != null && this[_errorDetail] != null;
    }
    [_toString]() {
      if (this[_result] != null) {
        return this[_result];
      } else {
        dart.assert(this[_errorCode] != null);
        dart.assert(this[_errorDetail] != null);
        return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
      }
    }
  };
  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
  dart.setSignature(developer.ServiceExtensionResponse, {
    constructors: () => ({
      result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
      error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
    }),
    fields: () => ({
      [_result]: core.String,
      [_errorCode]: core.int,
      [_errorDetail]: core.String
    }),
    methods: () => ({
      [_isError]: dart.definiteFunctionType(core.bool, []),
      [_toString]: dart.definiteFunctionType(core.String, [])
    }),
    sfields: () => ({
      kInvalidParams: core.int,
      kExtensionError: core.int,
      kExtensionErrorMax: core.int,
      kExtensionErrorMin: core.int,
      invalidParams: core.int,
      extensionError: core.int,
      extensionErrorMax: core.int,
      extensionErrorMin: core.int
    }),
    statics: () => ({
      _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
      _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
    }),
    names: ['_errorCodeMessage', '_validateErrorCode']
  });
  developer.ServiceExtensionResponse.invalidParams = -32602;
  developer.ServiceExtensionResponse.extensionError = -32000;
  developer.ServiceExtensionResponse.extensionErrorMax = -32000;
  developer.ServiceExtensionResponse.extensionErrorMin = -32016;
  dart.defineLazy(developer.ServiceExtensionResponse, {
    get kInvalidParams() {
      return developer.ServiceExtensionResponse.invalidParams;
    },
    get kExtensionError() {
      return developer.ServiceExtensionResponse.extensionError;
    },
    get kExtensionErrorMax() {
      return developer.ServiceExtensionResponse.extensionErrorMax;
    },
    get kExtensionErrorMin() {
      return developer.ServiceExtensionResponse.extensionErrorMin;
    }
  });
  developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
  developer.registerExtension = function(method, handler) {
    if (!(typeof method == 'string')) {
      dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
    }
    if (!dart.test(method[dartx.startsWith]('ext.'))) {
      dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
    }
    if (developer._lookupExtension(method) != null) {
      dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
    }
    if (!developer.ServiceExtensionHandler.is(handler)) {
      dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
    }
    developer._registerExtension(method, handler);
  };
  dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
  developer.postEvent = function(eventKind, eventData) {
    if (!(typeof eventKind == 'string')) {
      dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
    }
    if (!core.Map.is(eventData)) {
      dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
    }
    let eventDataAsString = convert.JSON.encode(eventData);
    developer._postEvent(eventKind, eventDataAsString);
  };
  dart.fn(developer.postEvent, StringAndMapTovoid());
  developer._postEvent = function(eventKind, eventData) {
  };
  dart.fn(developer._postEvent, StringAndStringTodynamic());
  developer._lookupExtension = function(method) {
    return developer._extensions[dartx._get](method);
  };
  dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
  developer._registerExtension = function(method, handler) {
    developer._extensions[dartx._set](method, handler);
  };
  dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
  developer.UserTag = class UserTag extends core.Object {
    static new(label) {
      return developer._FakeUserTag.new(label);
    }
    static get defaultTag() {
      return developer._FakeUserTag._defaultTag;
    }
  };
  dart.setSignature(developer.UserTag, {
    constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
    sfields: () => ({MAX_USER_TAGS: core.int}),
    sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
  });
  developer.UserTag.MAX_USER_TAGS = 64;
  developer._FakeUserTag = class _FakeUserTag extends core.Object {
    real(label) {
      this.label = label;
    }
    static new(label) {
      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
      if (existingTag != null) {
        return developer._FakeUserTag._check(existingTag);
      }
      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
      }
      let instance = new developer._FakeUserTag.real(label);
      developer._FakeUserTag._instances[dartx._set](label, instance);
      return instance;
    }
    makeCurrent() {
      let old = developer._currentTag;
      developer._currentTag = this;
      return old;
    }
  };
  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
  dart.setSignature(developer._FakeUserTag, {
    constructors: () => ({
      real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
      new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
    }),
    fields: () => ({label: core.String}),
    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
    sfields: () => ({
      _instances: core.Map,
      _defaultTag: developer.UserTag
    })
  });
  dart.defineLazy(developer._FakeUserTag, {
    get _instances() {
      return dart.map();
    },
    set _instances(_) {},
    get _defaultTag() {
      return developer._FakeUserTag.new('Default');
    }
  });
  dart.defineLazy(developer, {
    get _currentTag() {
      return developer._FakeUserTag._defaultTag;
    },
    set _currentTag(_) {}
  });
  developer.getCurrentTag = function() {
    return developer._currentTag;
  };
  dart.fn(developer.getCurrentTag, VoidToUserTag());
  developer.Metric = class Metric extends core.Object {
    new(name, description) {
      this.name = name;
      this.description = description;
      if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
        dart.throw(new core.ArgumentError('Invalid Metric name.'));
      }
    }
  };
  dart.setSignature(developer.Metric, {
    constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
    fields: () => ({
      name: core.String,
      description: core.String
    })
  });
  const _value$0 = Symbol('_value');
  const _toJSON = Symbol('_toJSON');
  developer.Gauge = class Gauge extends developer.Metric {
    get value() {
      return this[_value$0];
    }
    set value(v) {
      if (dart.notNull(v) < dart.notNull(this.min)) {
        v = this.min;
      } else if (dart.notNull(v) > dart.notNull(this.max)) {
        v = this.max;
      }
      this[_value$0] = v;
    }
    new(name, description, min, max) {
      this.min = min;
      this.max = max;
      this[_value$0] = null;
      super.new(name, description);
      if (!(typeof this.min == 'number')) {
        dart.throw(new core.ArgumentError('min must be a double'));
      }
      if (!(typeof this.max == 'number')) {
        dart.throw(new core.ArgumentError('max must be a double'));
      }
      if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
        dart.throw(new core.ArgumentError('min must be less than max'));
      }
      this[_value$0] = this.min;
    }
    [_toJSON]() {
      let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
      return map;
    }
  };
  dart.setSignature(developer.Gauge, {
    constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
    fields: () => ({
      min: core.double,
      max: core.double,
      [_value$0]: core.double
    }),
    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
  });
  developer.Counter = class Counter extends developer.Metric {
    new(name, description) {
      this[_value$0] = 0.0;
      super.new(name, description);
    }
    get value() {
      return this[_value$0];
    }
    set value(v) {
      this[_value$0] = v;
    }
    [_toJSON]() {
      let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
      return map;
    }
  };
  dart.setSignature(developer.Counter, {
    constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
    fields: () => ({[_value$0]: core.double}),
    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
  });
  developer.Metrics = class Metrics extends core.Object {
    static register(metric) {
      if (!developer.Metric.is(metric)) {
        dart.throw(new core.ArgumentError('metric must be a Metric'));
      }
      if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
        dart.throw(new core.ArgumentError('Registered metrics have unique names'));
      }
      developer.Metrics._metrics[dartx._set](metric.name, metric);
    }
    static deregister(metric) {
      if (!developer.Metric.is(metric)) {
        dart.throw(new core.ArgumentError('metric must be a Metric'));
      }
      developer.Metrics._metrics[dartx.remove](metric.name);
    }
    static _printMetric(id) {
      let metric = developer.Metrics._metrics[dartx._get](id);
      if (metric == null) {
        return null;
      }
      return convert.JSON.encode(metric[_toJSON]());
    }
    static _printMetrics() {
      let metrics = [];
      for (let metric of developer.Metrics._metrics[dartx.values]) {
        metrics[dartx.add](metric[_toJSON]());
      }
      let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
      return convert.JSON.encode(map);
    }
  };
  dart.setSignature(developer.Metrics, {
    sfields: () => ({_metrics: MapOfString$Metric()}),
    statics: () => ({
      register: dart.definiteFunctionType(dart.void, [developer.Metric]),
      deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
      _printMetric: dart.definiteFunctionType(core.String, [core.String]),
      _printMetrics: dart.definiteFunctionType(core.String, [])
    }),
    names: ['register', 'deregister', '_printMetric', '_printMetrics']
  });
  dart.defineLazy(developer.Metrics, {
    get _metrics() {
      return MapOfString$Metric().new();
    }
  });
  developer._isProduct = false;
  developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
  developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
  const _appendArguments = Symbol('_appendArguments');
  developer.Timeline = class Timeline extends core.Object {
    static startSync(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      if (!dart.test(developer._isDartStreamEnabled())) {
        developer.Timeline._stack[dartx.add](null);
        return;
      }
      let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
      if (core.Map.is(arguments$)) {
        block[_appendArguments](arguments$);
      }
      developer.Timeline._stack[dartx.add](block);
    }
    static finishSync() {
      if (developer._isProduct) {
        return;
      }
      if (developer.Timeline._stack[dartx.length] == 0) {
        dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
      }
      let block = developer.Timeline._stack[dartx.removeLast]();
      if (block == null) {
        return;
      }
      block.finish();
    }
    static instantSync(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      if (!dart.test(developer._isDartStreamEnabled())) {
        return;
      }
      let instantArguments = null;
      if (core.Map.is(arguments$)) {
        instantArguments = core.Map.from(arguments$);
      }
      developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
    }
    static timeSync(name, func, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      developer.Timeline.startSync(name, {arguments: arguments$});
      try {
        return func();
      } finally {
        developer.Timeline.finishSync();
      }
    }
    static get now() {
      return developer._getTraceClock();
    }
  };
  dart.setSignature(developer.Timeline, {
    sfields: () => ({
      _stack: ListOf_SyncBlock(),
      _isolateId: core.int,
      _isolateIdString: core.String
    }),
    sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
    statics: () => ({
      startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      finishSync: dart.definiteFunctionType(dart.void, []),
      instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
    }),
    names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
  });
  dart.defineLazy(developer.Timeline, {
    get _stack() {
      return ListOf_SyncBlock().new();
    },
    get _isolateId() {
      return developer._getIsolateNum();
    },
    get _isolateIdString() {
      return dart.toString(developer.Timeline._isolateId);
    }
  });
  const _stack = Symbol('_stack');
  const _taskId = Symbol('_taskId');
  const _start$1 = Symbol('_start');
  const _finish = Symbol('_finish');
  developer.TimelineTask = class TimelineTask extends core.Object {
    new() {
      this[_stack] = JSArrayOf_AsyncBlock().of([]);
      this[_taskId] = developer._getNextAsyncId();
    }
    withTaskId(taskId) {
      this[_stack] = JSArrayOf_AsyncBlock().of([]);
      this[_taskId] = taskId;
      if (!(typeof taskId == 'number')) {
        dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
      }
    }
    start(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      let block = new developer._AsyncBlock._(name, this[_taskId]);
      if (core.Map.is(arguments$)) {
        block[_appendArguments](arguments$);
      }
      this[_stack][dartx.add](block);
      block[_start$1]();
    }
    instant(name, opts) {
      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
      if (developer._isProduct) {
        return;
      }
      if (!(typeof name == 'string')) {
        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
      }
      let instantArguments = null;
      if (core.Map.is(arguments$)) {
        instantArguments = core.Map.from(arguments$);
      }
      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
    }
    finish() {
      if (developer._isProduct) {
        return;
      }
      if (this[_stack][dartx.length] == 0) {
        dart.throw(new core.StateError('Uneven calls to start and finish'));
      }
      let block = this[_stack][dartx.removeLast]();
      block[_finish]();
    }
    pass() {
      if (dart.notNull(this[_stack][dartx.length]) > 0) {
        dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
      }
      let r = this[_taskId];
      return r;
    }
  };
  dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
  dart.setSignature(developer.TimelineTask, {
    constructors: () => ({
      new: dart.definiteFunctionType(developer.TimelineTask, []),
      withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
    }),
    fields: () => ({
      [_taskId]: core.int,
      [_stack]: ListOf_AsyncBlock()
    }),
    methods: () => ({
      start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
      finish: dart.definiteFunctionType(dart.void, []),
      pass: dart.definiteFunctionType(core.int, [])
    })
  });
  const _arguments$ = Symbol('_arguments');
  developer._AsyncBlock = class _AsyncBlock extends core.Object {
    _(name, taskId) {
      this.name = name;
      this[_taskId] = taskId;
      this.category = 'Dart';
      this[_arguments$] = null;
    }
    [_start$1]() {
      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
    }
    [_finish]() {
      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
    }
    [_appendArguments](arguments$) {
      if (this[_arguments$] == null) {
        this[_arguments$] = dart.map();
      }
      this[_arguments$][dartx.addAll](arguments$);
    }
  };
  dart.defineNamedConstructor(developer._AsyncBlock, '_');
  dart.setSignature(developer._AsyncBlock, {
    constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
    fields: () => ({
      category: core.String,
      name: core.String,
      [_taskId]: core.int,
      [_arguments$]: core.Map
    }),
    methods: () => ({
      [_start$1]: dart.definiteFunctionType(dart.void, []),
      [_finish]: dart.definiteFunctionType(dart.void, []),
      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
    })
  });
  const _startCpu = Symbol('_startCpu');
  developer._SyncBlock = class _SyncBlock extends core.Object {
    _(name, start, startCpu) {
      this.name = name;
      this[_start$1] = start;
      this[_startCpu] = startCpu;
      this.category = 'Dart';
      this[_arguments$] = null;
    }
    finish() {
      developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
    }
    [_appendArguments](arguments$) {
      if (arguments$ == null) {
        return;
      }
      if (this[_arguments$] == null) {
        this[_arguments$] = dart.map();
      }
      this[_arguments$][dartx.addAll](arguments$);
    }
  };
  dart.defineNamedConstructor(developer._SyncBlock, '_');
  dart.setSignature(developer._SyncBlock, {
    constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
    fields: () => ({
      category: core.String,
      name: core.String,
      [_arguments$]: core.Map,
      [_start$1]: core.int,
      [_startCpu]: core.int
    }),
    methods: () => ({
      finish: dart.definiteFunctionType(dart.void, []),
      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
    })
  });
  developer._fastPathArguments = null;
  developer._argumentsAsJson = function(arguments$) {
    if (arguments$ == null || arguments$[dartx.length] == 0) {
      if (developer._fastPathArguments == null) {
        developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
      }
      return developer._fastPathArguments;
    }
    arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
    return convert.JSON.encode(arguments$);
  };
  dart.fn(developer._argumentsAsJson, MapToString());
  developer._isDartStreamEnabled = function() {
    return false;
  };
  dart.fn(developer._isDartStreamEnabled, VoidTobool());
  developer._getNextAsyncId = function() {
    return 0;
  };
  dart.fn(developer._getNextAsyncId, VoidToint());
  developer._getTraceClock = function() {
    let x = developer._clockValue;
    developer._clockValue = dart.notNull(x) + 1;
    return x;
  };
  dart.fn(developer._getTraceClock, VoidToint());
  developer._getThreadCpuClock = function() {
    return -1;
  };
  dart.fn(developer._getThreadCpuClock, VoidToint());
  developer._getIsolateNum = function() {
    return 0;
  };
  dart.fn(developer._getIsolateNum, VoidToint());
  developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
  };
  dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
  developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
  };
  dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
  developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
  };
  dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
  developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
    new(serverUri) {
      this.majorVersion = developer._getServiceMajorVersion();
      this.minorVersion = developer._getServiceMinorVersion();
      this.serverUri = serverUri;
    }
    toString() {
      if (this.serverUri != null) {
        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
      } else {
        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
      }
    }
  };
  dart.setSignature(developer.ServiceProtocolInfo, {
    constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
    fields: () => ({
      majorVersion: core.int,
      minorVersion: core.int,
      serverUri: core.Uri
    })
  });
  developer.Service = class Service extends core.Object {
    static getInfo() {
      return dart.async(function*() {
        let receivePort = isolate.RawReceivePort.new();
        let uriCompleter = CompleterOfUri().new();
        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
        developer._getServerInfo(receivePort.sendPort);
        let uri = (yield uriCompleter.future);
        receivePort.close();
        return new developer.ServiceProtocolInfo(uri);
      }, developer.ServiceProtocolInfo);
    }
    static controlWebServer(opts) {
      return dart.async(function*(opts) {
        let enable = opts && 'enable' in opts ? opts.enable : false;
        if (!(typeof enable == 'boolean')) {
          dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
        }
        let receivePort = isolate.RawReceivePort.new();
        let uriCompleter = CompleterOfUri().new();
        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
        developer._webServerControl(receivePort.sendPort, enable);
        let uri = (yield uriCompleter.future);
        receivePort.close();
        return new developer.ServiceProtocolInfo(uri);
      }, developer.ServiceProtocolInfo, opts);
    }
  };
  dart.setSignature(developer.Service, {
    statics: () => ({
      getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
    }),
    names: ['getInfo', 'controlWebServer']
  });
  developer._getServerInfo = function(sp) {
    sp.send(null);
  };
  dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
  developer._webServerControl = function(sp, enable) {
    sp.send(null);
  };
  dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
  developer._getServiceMajorVersion = function() {
    return 0;
  };
  dart.fn(developer._getServiceMajorVersion, VoidToint());
  developer._getServiceMinorVersion = function() {
    return 0;
  };
  dart.fn(developer._getServiceMinorVersion, VoidToint());
  isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
    new(message) {
      this.message = message;
    }
    toString() {
      return dart.str`IsolateSpawnException: ${this.message}`;
    }
  };
  isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
  dart.setSignature(isolate.IsolateSpawnException, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.IsolateSpawnException, [core.String])}),
    fields: () => ({message: core.String})
  });
  const _pause = Symbol('_pause');
  isolate.Isolate = class Isolate extends core.Object {
    new(controlPort, opts) {
      let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
      let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
      this.controlPort = controlPort;
      this.pauseCapability = pauseCapability;
      this.terminateCapability = terminateCapability;
    }
    static get current() {
      return isolate.Isolate._currentIsolateCache;
    }
    static spawn(entryPoint, message, opts) {
      let paused = opts && 'paused' in opts ? opts.paused : false;
      try {
        return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
      } catch (e) {
        let st = dart.stackTrace(e);
        return FutureOfIsolate().error(e, st);
      }

    }
    static spawnUri(uri, args, message, opts) {
      let paused = opts && 'paused' in opts ? opts.paused : false;
      let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
      if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
      try {
        if (core.List.is(args)) {
          for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
            if (!(typeof args[dartx._get](i) == 'string')) {
              dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
            }
          }
        } else if (args != null) {
          dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
        }
        return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
      } catch (e) {
        let st = dart.stackTrace(e);
        return FutureOfIsolate().error(e, st);
      }

    }
    pause(resumeCapability) {
      if (resumeCapability === void 0) resumeCapability = null;
      if (resumeCapability == null) resumeCapability = isolate.Capability.new();
      this[_pause](resumeCapability);
      return resumeCapability;
    }
    [_pause](resumeCapability) {
      let message = core.List.new(3);
      message[dartx._set](0, "pause");
      message[dartx._set](1, this.pauseCapability);
      message[dartx._set](2, resumeCapability);
      this.controlPort.send(message);
    }
    resume(resumeCapability) {
      let message = core.List.new(2);
      message[dartx._set](0, "resume");
      message[dartx._set](1, resumeCapability);
      this.controlPort.send(message);
    }
    addOnExitListener(responsePort) {
      let message = core.List.new(2);
      message[dartx._set](0, "add-ondone");
      message[dartx._set](1, responsePort);
      this.controlPort.send(message);
    }
    removeOnExitListener(responsePort) {
      let message = core.List.new(2);
      message[dartx._set](0, "remove-ondone");
      message[dartx._set](1, responsePort);
      this.controlPort.send(message);
    }
    setErrorsFatal(errorsAreFatal) {
      let message = core.List.new(3);
      message[dartx._set](0, "set-errors-fatal");
      message[dartx._set](1, this.terminateCapability);
      message[dartx._set](2, errorsAreFatal);
      this.controlPort.send(message);
    }
    kill(priority) {
      if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
      this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
    }
    ping(responsePort, pingType) {
      if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
      let message = core.List.new(3);
      message[dartx._set](0, "ping");
      message[dartx._set](1, responsePort);
      message[dartx._set](2, pingType);
      this.controlPort.send(message);
    }
    addErrorListener(port) {
      let message = core.List.new(2);
      message[dartx._set](0, "getErrors");
      message[dartx._set](1, port);
      this.controlPort.send(message);
    }
    removeErrorListener(port) {
      let message = core.List.new(2);
      message[dartx._set](0, "stopErrors");
      message[dartx._set](1, port);
      this.controlPort.send(message);
    }
    get errors() {
      let controller = null;
      let port = null;
      function handleError(message) {
        let errorDescription = core.String._check(dart.dindex(message, 0));
        let stackDescription = core.String._check(dart.dindex(message, 1));
        let error = new isolate.RemoteError(errorDescription, stackDescription);
        controller.addError(error, error.stackTrace);
      }
      dart.fn(handleError, dynamicTovoid$());
      controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
          port = isolate.RawReceivePort.new(handleError);
          this.addErrorListener(port.sendPort);
        }, VoidTovoid$()), onCancel: dart.fn(() => {
          this.removeErrorListener(port.sendPort);
          port.close();
          port = null;
        }, VoidTovoid$())});
      return controller.stream;
    }
  };
  dart.setSignature(isolate.Isolate, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.Isolate, [isolate.SendPort], {pauseCapability: isolate.Capability, terminateCapability: isolate.Capability})}),
    fields: () => ({
      controlPort: isolate.SendPort,
      pauseCapability: isolate.Capability,
      terminateCapability: isolate.Capability
    }),
    getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
    methods: () => ({
      pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
      [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
      resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
      addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
      kill: dart.definiteFunctionType(dart.void, [], [core.int]),
      ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
    }),
    sfields: () => ({
      IMMEDIATE: core.int,
      BEFORE_NEXT_EVENT: core.int,
      AS_EVENT: core.int,
      _currentIsolateCache: isolate.Isolate
    }),
    sgetters: () => ({current: dart.definiteFunctionType(isolate.Isolate, [])}),
    statics: () => ({
      spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
      spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
    }),
    names: ['spawn', 'spawnUri']
  });
  isolate.Isolate.IMMEDIATE = 0;
  isolate.Isolate.BEFORE_NEXT_EVENT = 1;
  isolate.Isolate.AS_EVENT = 2;
  dart.defineLazy(isolate.Isolate, {
    get _currentIsolateCache() {
      return _isolate_helper.IsolateNatives.currentIsolate;
    }
  });
  isolate.SendPort = class SendPort extends core.Object {};
  isolate.SendPort[dart.implements] = () => [isolate.Capability];
  isolate.ReceivePort = class ReceivePort extends core.Object {
    static new() {
      return new _isolate_helper.ReceivePortImpl();
    }
    static fromRawReceivePort(rawPort) {
      return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
    }
  };
  isolate.ReceivePort[dart.implements] = () => [async.Stream];
  dart.setSignature(isolate.ReceivePort, {
    constructors: () => ({
      new: dart.definiteFunctionType(isolate.ReceivePort, []),
      fromRawReceivePort: dart.definiteFunctionType(isolate.ReceivePort, [isolate.RawReceivePort])
    })
  });
  isolate.RawReceivePort = class RawReceivePort extends core.Object {
    static new(handler) {
      if (handler === void 0) handler = null;
      return new _isolate_helper.RawReceivePortImpl(handler);
    }
  };
  dart.setSignature(isolate.RawReceivePort, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.RawReceivePort, [], [dynamicTovoid()])})
  });
  isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
    new(message, source, stackTrace) {
      this.message = message;
      this.source = source;
      this.stackTrace = stackTrace;
    }
    toString() {
      return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
    }
  };
  isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
  dart.setSignature(isolate._IsolateUnhandledException, {
    constructors: () => ({new: dart.definiteFunctionType(isolate._IsolateUnhandledException, [dart.dynamic, dart.dynamic, core.StackTrace])}),
    fields: () => ({
      message: dart.dynamic,
      source: dart.dynamic,
      stackTrace: core.StackTrace
    })
  });
  const _description = Symbol('_description');
  isolate.RemoteError = class RemoteError extends core.Object {
    new(description, stackDescription) {
      this[_description] = description;
      this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
    }
    toString() {
      return this[_description];
    }
  };
  isolate.RemoteError[dart.implements] = () => [core.Error];
  dart.setSignature(isolate.RemoteError, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.RemoteError, [core.String, core.String])}),
    fields: () => ({
      [_description]: core.String,
      stackTrace: core.StackTrace
    })
  });
  const _trace$ = Symbol('_trace');
  isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
    new(trace) {
      this[_trace$] = trace;
    }
    toString() {
      return this[_trace$];
    }
  };
  isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
  dart.setSignature(isolate._RemoteStackTrace, {
    constructors: () => ({new: dart.definiteFunctionType(isolate._RemoteStackTrace, [core.String])}),
    fields: () => ({[_trace$]: core.String})
  });
  isolate.Capability = class Capability extends core.Object {
    static new() {
      return new _isolate_helper.CapabilityImpl();
    }
  };
  dart.setSignature(isolate.Capability, {
    constructors: () => ({new: dart.definiteFunctionType(isolate.Capability, [])})
  });
  dart.defineLazy(js, {
    get _global() {
      return dart.global;
    }
  });
  dart.defineLazy(js, {
    get context() {
      return js._wrapToDart(js._global);
    }
  });
  const _jsObject = Symbol('_jsObject');
  js.JsObject = class JsObject extends core.Object {
    _fromJs(jsObject) {
      this[_jsObject] = jsObject;
      dart.assert(this[_jsObject] != null);
    }
    static new(constructor, arguments$) {
      if (arguments$ === void 0) arguments$ = null;
      let ctor = constructor[_jsObject];
      if (arguments$ == null) {
        return js._wrapToDart(new ctor());
      }
      let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
      return js._wrapToDart(new ctor(...unwrapped));
    }
    static fromBrowserObject(object) {
      if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
        dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
      }
      return js._wrapToDart(js._convertToJS(object));
    }
    static jsify(object) {
      if (!core.Map.is(object) && !core.Iterable.is(object)) {
        dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
      }
      return js._wrapToDart(js.JsObject._convertDataTree(object));
    }
    static _convertDataTree(data) {
      let _convertedObjects = collection.HashMap.identity();
      function _convert(o) {
        if (dart.test(_convertedObjects.containsKey(o))) {
          return _convertedObjects._get(o);
        }
        if (core.Map.is(o)) {
          let convertedMap = {};
          _convertedObjects._set(o, convertedMap);
          for (let key of o[dartx.keys]) {
            convertedMap[key] = _convert(o[dartx._get](key));
          }
          return convertedMap;
        } else if (core.Iterable.is(o)) {
          let convertedList = [];
          _convertedObjects._set(o, convertedList);
          convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
          return convertedList;
        } else {
          return js._convertToJS(o);
        }
      }
      dart.fn(_convert, dynamicTodynamic$());
      return _convert(data);
    }
    _get(property) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      return js._convertToDart(this[_jsObject][property]);
    }
    _set(property, value) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      this[_jsObject][property] = js._convertToJS(value);
      return value;
    }
    get hashCode() {
      return 0;
    }
    ['=='](other) {
      return js.JsObject.is(other) && this[_jsObject] === other[_jsObject];
    }
    hasProperty(property) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      return property in this[_jsObject];
    }
    deleteProperty(property) {
      if (!(typeof property == 'string') && !(typeof property == 'number')) {
        dart.throw(new core.ArgumentError("property is not a String or num"));
      }
      delete this[_jsObject][property];
    }
    instanceof(type) {
      return this[_jsObject] instanceof js._convertToJS(type);
    }
    toString() {
      try {
        return String(this[_jsObject]);
      } catch (e) {
        return super.toString();
      }

    }
    callMethod(method, args) {
      if (args === void 0) args = null;
      if (!(typeof method == 'string') && !(typeof method == 'number')) {
        dart.throw(new core.ArgumentError("method is not a String or num"));
      }
      if (args != null) args = core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS));
      let fn = this[_jsObject][method];
      if (!(fn instanceof Function)) {
        dart.throw(new core.NoSuchMethodError(this[_jsObject], core.Symbol.new(core.String._check(method)), args, dart.map({}, core.Symbol, dart.dynamic)));
      }
      return js._convertToDart(fn.apply(this[_jsObject], args));
    }
  };
  dart.defineNamedConstructor(js.JsObject, '_fromJs');
  dart.setSignature(js.JsObject, {
    constructors: () => ({
      _fromJs: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
      new: dart.definiteFunctionType(js.JsObject, [js.JsFunction], [core.List]),
      fromBrowserObject: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
      jsify: dart.definiteFunctionType(js.JsObject, [dart.dynamic])
    }),
    fields: () => ({[_jsObject]: dart.dynamic}),
    methods: () => ({
      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
      _set: dart.definiteFunctionType(dart.dynamic, [core.Object, dart.dynamic]),
      hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      deleteProperty: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      instanceof: dart.definiteFunctionType(core.bool, [js.JsFunction]),
      callMethod: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.List])
    }),
    statics: () => ({_convertDataTree: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
    names: ['_convertDataTree']
  });
  js.JsFunction = class JsFunction extends js.JsObject {
    static withThis(f) {
      return new js.JsFunction._fromJs(function() {
        let args = [js._convertToDart(this)];
        for (let arg of arguments) {
          args.push(js._convertToDart(arg));
        }
        return js._convertToJS(f(...args));
      });
    }
    _fromJs(jsObject) {
      super._fromJs(jsObject);
    }
    apply(args, opts) {
      let thisArg = opts && 'thisArg' in opts ? opts.thisArg : null;
      return js._convertToDart(this[_jsObject].apply(js._convertToJS(thisArg), args == null ? null : core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS))));
    }
  };
  dart.defineNamedConstructor(js.JsFunction, '_fromJs');
  dart.setSignature(js.JsFunction, {
    constructors: () => ({
      withThis: dart.definiteFunctionType(js.JsFunction, [core.Function]),
      _fromJs: dart.definiteFunctionType(js.JsFunction, [dart.dynamic])
    }),
    methods: () => ({apply: dart.definiteFunctionType(dart.dynamic, [core.List], {thisArg: dart.dynamic})})
  });
  const _checkIndex = Symbol('_checkIndex');
  const _checkInsertIndex = Symbol('_checkInsertIndex');
  js.JsArray$ = dart.generic(E => {
    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    let JSArrayOfEAndEToint = () => (JSArrayOfEAndEToint = dart.constFn(_interceptors.JSArray$(EAndEToint())))();
    class JsArray extends dart.mixin(js.JsObject, collection.ListMixin$(E)) {
      new() {
        super._fromJs([]);
      }
      from(other) {
        super._fromJs((() => {
          let _ = [];
          _[dartx.addAll](other[dartx.map](dart.dynamic)(js._convertToJS));
          return _;
        })());
      }
      _fromJs(jsObject) {
        super._fromJs(jsObject);
      }
      [_checkIndex](index) {
        if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length))) {
          dart.throw(new core.RangeError.range(index, 0, this.length));
        }
      }
      [_checkInsertIndex](index) {
        if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length) + 1)) {
          dart.throw(new core.RangeError.range(index, 0, this.length));
        }
      }
      static _checkRange(start, end, length) {
        if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(length)) {
          dart.throw(new core.RangeError.range(start, 0, length));
        }
        if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(length)) {
          dart.throw(new core.RangeError.range(end, start, length));
        }
      }
      _get(index) {
        if (typeof index == 'number' && index == index[dartx.toInt]()) {
          this[_checkIndex](dart.asInt(index));
        }
        return E.as(super._get(index));
      }
      _set(index, value) {
        E._check(value);
        if (typeof index == 'number' && index == index[dartx.toInt]()) {
          this[_checkIndex](dart.asInt(index));
        }
        super._set(index, value);
        return value;
      }
      get length() {
        let len = this[_jsObject].length;
        if (typeof len === "number" && len >>> 0 === len) {
          return len;
        }
        dart.throw(new core.StateError('Bad JsArray length'));
      }
      set length(length) {
        super._set('length', length);
      }
      add(value) {
        E._check(value);
        this.callMethod('push', JSArrayOfE().of([value]));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        let list = iterable instanceof Array ? iterable : core.List.from(iterable);
        this.callMethod('push', core.List._check(list));
      }
      insert(index, element) {
        E._check(element);
        this[_checkInsertIndex](index);
        this.callMethod('splice', JSArrayOfObject().of([index, 0, element]));
      }
      removeAt(index) {
        this[_checkIndex](index);
        return E.as(dart.dindex(this.callMethod('splice', JSArrayOfint().of([index, 1])), 0));
      }
      removeLast() {
        if (this.length == 0) dart.throw(new core.RangeError(-1));
        return E.as(this.callMethod('pop'));
      }
      removeRange(start, end) {
        js.JsArray._checkRange(start, end, this.length);
        this.callMethod('splice', JSArrayOfint().of([start, dart.notNull(end) - dart.notNull(start)]));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        js.JsArray._checkRange(start, end, this.length);
        let length = dart.notNull(end) - dart.notNull(start);
        if (length == 0) return;
        if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
        let args = JSArrayOfObject().of([start, length]);
        args[dartx.addAll](iterable[dartx.skip](skipCount)[dartx.take](length));
        this.callMethod('splice', args);
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        this.callMethod('sort', compare == null ? [] : JSArrayOfEAndEToint().of([compare]));
      }
    }
    dart.addTypeTests(JsArray);
    dart.defineNamedConstructor(JsArray, 'from');
    dart.defineNamedConstructor(JsArray, '_fromJs');
    dart.setSignature(JsArray, {
      constructors: () => ({
        new: dart.definiteFunctionType(js.JsArray$(E), []),
        from: dart.definiteFunctionType(js.JsArray$(E), [IterableOfE()]),
        _fromJs: dart.definiteFunctionType(js.JsArray$(E), [dart.dynamic])
      }),
      getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        [_checkIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
        [_checkInsertIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
        _get: dart.definiteFunctionType(E, [core.Object]),
        _set: dart.definiteFunctionType(dart.void, [core.Object, E]),
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()])
      }),
      statics: () => ({_checkRange: dart.definiteFunctionType(dart.dynamic, [core.int, core.int, core.int])}),
      names: ['_checkRange']
    });
    dart.defineExtensionMembers(JsArray, [
      '_get',
      '_set',
      'add',
      'addAll',
      'insert',
      'removeAt',
      'removeLast',
      'removeRange',
      'setRange',
      'sort',
      'length',
      'length'
    ]);
    return JsArray;
  });
  js.JsArray = JsArray();
  js._isBrowserType = function(o) {
    return o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || o instanceof ImageData || o instanceof Node || window.TypedData && o instanceof TypedData || o instanceof Window;
  };
  dart.fn(js._isBrowserType, dynamicTobool$());
  const _dartObj = Symbol('_dartObj');
  js._DartObject = class _DartObject extends core.Object {
    new(dartObj) {
      this[_dartObj] = dartObj;
    }
  };
  dart.setSignature(js._DartObject, {
    constructors: () => ({new: dart.definiteFunctionType(js._DartObject, [dart.dynamic])}),
    fields: () => ({[_dartObj]: dart.dynamic})
  });
  js._convertToJS = function(o) {
    if (o == null || typeof o == 'string' || typeof o == 'number' || typeof o == 'boolean' || dart.test(js._isBrowserType(o))) {
      return o;
    } else if (core.DateTime.is(o)) {
      return _js_helper.Primitives.lazyAsJsDate(o);
    } else if (js.JsObject.is(o)) {
      return o[_jsObject];
    } else if (core.Function.is(o)) {
      return js._putIfAbsent(js._jsProxies, o, js._wrapDartFunction);
    } else {
      return js._putIfAbsent(js._jsProxies, o, dart.fn(o => new js._DartObject(o), dynamicTo_DartObject()));
    }
  };
  dart.fn(js._convertToJS, dynamicTodynamic$());
  js._wrapDartFunction = function(f) {
    let wrapper = function() {
      let args = Array.prototype.map.call(arguments, js._convertToDart);
      return js._convertToJS(f(...args));
    };
    js._dartProxies.set(wrapper, f);
    return wrapper;
  };
  dart.fn(js._wrapDartFunction, dynamicTodynamic$());
  js._convertToDart = function(o) {
    if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean" || dart.test(js._isBrowserType(o))) {
      return o;
    } else if (o instanceof Date) {
      let ms = o.getTime();
      return new core.DateTime.fromMillisecondsSinceEpoch(dart.asInt(ms));
    } else if (js._DartObject.is(o) && dart.jsobject != dart.getReifiedType(o)) {
      return o[_dartObj];
    } else {
      return js._putIfAbsent(js._dartProxies, o, js._wrapToDart);
    }
  };
  dart.fn(js._convertToDart, dynamicToObject());
  js._wrapToDart = function(o) {
    if (typeof o == "function") {
      return new js.JsFunction._fromJs(o);
    }
    if (o instanceof Array) {
      return new js.JsArray._fromJs(o);
    }
    return new js.JsObject._fromJs(o);
  };
  dart.fn(js._wrapToDart, dynamicToJsObject());
  dart.defineLazy(js, {
    get _dartProxies() {
      return new WeakMap();
    }
  });
  dart.defineLazy(js, {
    get _jsProxies() {
      return new WeakMap();
    }
  });
  js._putIfAbsent = function(weakMap, o, getValue) {
    let value = weakMap.get(o);
    if (value == null) {
      value = dart.dcall(getValue, o);
      weakMap.set(o, value);
    }
    return value;
  };
  dart.fn(js._putIfAbsent, dynamicAnddynamicAndFnToObject());
  js.allowInterop = function(F) {
    return f => {
      return f;
    };
  };
  dart.fn(js.allowInterop, FToF());
  dart.defineLazy(js, {
    get _interopCaptureThisExpando() {
      return new (ExpandoOfFunction())();
    },
    set _interopCaptureThisExpando(_) {}
  });
  js.allowInteropCaptureThis = function(f) {
    let ret = js._interopCaptureThisExpando._get(f);
    if (ret == null) {
      ret = function() {
        let args = [this];
        for (let arg of arguments) {
          args.push(arg);
        }
        return f(...args);
      };
      js._interopCaptureThisExpando._set(f, ret);
    }
    return ret;
  };
  dart.fn(js.allowInteropCaptureThis, FunctionToFunction());
  js_util.jsify = function(object) {
    if (!core.Map.is(object) && !core.Iterable.is(object)) {
      dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
    }
    return js_util._convertDataTree(object);
  };
  dart.fn(js_util.jsify, dynamicTodynamic$());
  js_util._convertDataTree = function(data) {
    let _convertedObjects = collection.HashMap.identity();
    function _convert(o) {
      if (dart.test(_convertedObjects.containsKey(o))) {
        return _convertedObjects._get(o);
      }
      if (core.Map.is(o)) {
        let convertedMap = {};
        _convertedObjects._set(o, convertedMap);
        for (let key of o[dartx.keys]) {
          convertedMap[key] = _convert(o[dartx._get](key));
        }
        return convertedMap;
      } else if (core.Iterable.is(o)) {
        let convertedList = [];
        _convertedObjects._set(o, convertedList);
        convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
        return convertedList;
      } else {
        return o;
      }
    }
    dart.fn(_convert, dynamicTodynamic$());
    return _convert(data);
  };
  dart.fn(js_util._convertDataTree, dynamicTodynamic$());
  js_util.newObject = function() {
    return {};
  };
  dart.fn(js_util.newObject, VoidTodynamic$());
  js_util.hasProperty = function(o, name) {
    return name in o;
  };
  dart.fn(js_util.hasProperty, dynamicAnddynamicTodynamic$());
  js_util.getProperty = function(o, name) {
    return o[name];
  };
  dart.fn(js_util.getProperty, dynamicAnddynamicTodynamic$());
  js_util.setProperty = function(o, name, value) {
    return o[name] = value;
  };
  dart.fn(js_util.setProperty, dynamicAnddynamicAnddynamicTodynamic());
  js_util.callMethod = function(o, method, args) {
    return o[method].apply(o, args);
  };
  dart.fn(js_util.callMethod, dynamicAndStringAndListTodynamic());
  js_util.instanceof = function(o, type) {
    return o instanceof type;
  };
  dart.fn(js_util.instanceof, dynamicAndFunctionTodynamic());
  js_util.callConstructor = function(constr, arguments$) {
    if (arguments$ == null) {
      return new constr();
    }
    if (arguments$ instanceof Array) {
      let argumentCount = arguments$.length;
      switch (argumentCount) {
        case 0:
        {
          return new constr();
        }
        case 1:
        {
          let arg0 = arguments$[0];
          return new constr(arg0);
        }
        case 2:
        {
          let arg0 = arguments$[0];
          let arg1 = arguments$[1];
          return new constr(arg0, arg1);
        }
        case 3:
        {
          let arg0 = arguments$[0];
          let arg1 = arguments$[1];
          let arg2 = arguments$[2];
          return new constr(arg0, arg1, arg2);
        }
        case 4:
        {
          let arg0 = arguments$[0];
          let arg1 = arguments$[1];
          let arg2 = arguments$[2];
          let arg3 = arguments$[3];
          return new constr(arg0, arg1, arg2, arg3);
        }
      }
    }
    let args = [null];
    args[dartx.addAll](arguments$);
    let factoryFunction = constr.bind.apply(constr, args);
    String(factoryFunction);
    return new factoryFunction();
  };
  dart.fn(js_util.callConstructor, FunctionAndListTodynamic());
  math.E = 2.718281828459045;
  math.LN10 = 2.302585092994046;
  math.LN2 = 0.6931471805599453;
  math.LOG2E = 1.4426950408889634;
  math.LOG10E = 0.4342944819032518;
  math.PI = 3.141592653589793;
  math.SQRT1_2 = 0.7071067811865476;
  math.SQRT2 = 1.4142135623730951;
  math.min = function(T) {
    return (a, b) => {
      return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
    };
  };
  dart.fn(math.min, TAndTToT());
  math.max = function(T) {
    return (a, b) => {
      return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
    };
  };
  dart.fn(math.max, TAndTToT$());
  math.atan2 = function(a, b) {
    return Math.atan2(_js_helper.checkNum(a), _js_helper.checkNum(b));
  };
  dart.fn(math.atan2, numAndnumTodouble());
  math.pow = function(x, exponent) {
    _js_helper.checkNum(x);
    _js_helper.checkNum(exponent);
    return Math.pow(x, exponent);
  };
  dart.fn(math.pow, numAndnumTonum());
  math.sin = function(x) {
    return Math.sin(_js_helper.checkNum(x));
  };
  dart.fn(math.sin, numTodouble());
  math.cos = function(x) {
    return Math.cos(_js_helper.checkNum(x));
  };
  dart.fn(math.cos, numTodouble());
  math.tan = function(x) {
    return Math.tan(_js_helper.checkNum(x));
  };
  dart.fn(math.tan, numTodouble());
  math.acos = function(x) {
    return Math.acos(_js_helper.checkNum(x));
  };
  dart.fn(math.acos, numTodouble());
  math.asin = function(x) {
    return Math.asin(_js_helper.checkNum(x));
  };
  dart.fn(math.asin, numTodouble());
  math.atan = function(x) {
    return Math.atan(_js_helper.checkNum(x));
  };
  dart.fn(math.atan, numTodouble());
  math.sqrt = function(x) {
    return Math.sqrt(_js_helper.checkNum(x));
  };
  dart.fn(math.sqrt, numTodouble());
  math.exp = function(x) {
    return Math.exp(_js_helper.checkNum(x));
  };
  dart.fn(math.exp, numTodouble());
  math.log = function(x) {
    return Math.log(_js_helper.checkNum(x));
  };
  dart.fn(math.log, numTodouble());
  math._POW2_32 = 4294967296;
  math._JSRandom = class _JSRandom extends core.Object {
    new() {
    }
    nextInt(max) {
      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
      }
      return Math.random() * max >>> 0;
    }
    nextDouble() {
      return Math.random();
    }
    nextBool() {
      return Math.random() < 0.5;
    }
  };
  math._JSRandom[dart.implements] = () => [math.Random];
  dart.setSignature(math._JSRandom, {
    constructors: () => ({new: dart.definiteFunctionType(math._JSRandom, [])}),
    methods: () => ({
      nextInt: dart.definiteFunctionType(core.int, [core.int]),
      nextDouble: dart.definiteFunctionType(core.double, []),
      nextBool: dart.definiteFunctionType(core.bool, [])
    })
  });
  const _lo = Symbol('_lo');
  const _hi = Symbol('_hi');
  const _nextState = Symbol('_nextState');
  math._Random = class _Random extends core.Object {
    new(seed) {
      this[_lo] = 0;
      this[_hi] = 0;
      let empty_seed = 0;
      if (dart.notNull(seed) < 0) {
        empty_seed = -1;
      }
      do {
        let low = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
        seed = ((dart.notNull(seed) - low) / math._POW2_32)[dartx.truncate]();
        let high = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
        seed = ((dart.notNull(seed) - high) / math._POW2_32)[dartx.truncate]();
        let tmplow = low << 21 >>> 0;
        let tmphigh = (high << 21 | low[dartx['>>']](11)) >>> 0;
        tmplow = ((~low & math._Random._MASK32) >>> 0) + tmplow;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = ((~high >>> 0) + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmphigh = high[dartx['>>']](24);
        tmplow = (low[dartx['>>']](24) | high << 8) >>> 0;
        low = (low ^ tmplow) >>> 0;
        high = (high ^ tmphigh) >>> 0;
        tmplow = low * 265;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = (high * 265 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmphigh = high[dartx['>>']](14);
        tmplow = (low[dartx['>>']](14) | high << 18) >>> 0;
        low = (low ^ tmplow) >>> 0;
        high = (high ^ tmphigh) >>> 0;
        tmplow = low * 21;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = (high * 21 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmphigh = high[dartx['>>']](28);
        tmplow = (low[dartx['>>']](28) | high << 4) >>> 0;
        low = (low ^ tmplow) >>> 0;
        high = (high ^ tmphigh) >>> 0;
        tmplow = low << 31 >>> 0;
        tmphigh = (high << 31 | low[dartx['>>']](1)) >>> 0;
        tmplow = tmplow + low;
        low = (tmplow & math._Random._MASK32) >>> 0;
        high = (high + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        tmplow = dart.notNull(this[_lo]) * 1037;
        this[_lo] = (tmplow & math._Random._MASK32) >>> 0;
        this[_hi] = (dart.notNull(this[_hi]) * 1037 + ((tmplow - dart.notNull(this[_lo])) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
        this[_lo] = (dart.notNull(this[_lo]) ^ low) >>> 0;
        this[_hi] = (dart.notNull(this[_hi]) ^ high) >>> 0;
      } while (seed != empty_seed);
      if (this[_hi] == 0 && this[_lo] == 0) {
        this[_lo] = 23063;
      }
      this[_nextState]();
      this[_nextState]();
      this[_nextState]();
      this[_nextState]();
    }
    [_nextState]() {
      let tmpHi = 4294901760 * dart.notNull(this[_lo]);
      let tmpHiLo = (tmpHi & math._Random._MASK32) >>> 0;
      let tmpHiHi = tmpHi - tmpHiLo;
      let tmpLo = 55905 * dart.notNull(this[_lo]);
      let tmpLoLo = (tmpLo & math._Random._MASK32) >>> 0;
      let tmpLoHi = tmpLo - tmpLoLo;
      let newLo = tmpLoLo + tmpHiLo + dart.notNull(this[_hi]);
      this[_lo] = (newLo & math._Random._MASK32) >>> 0;
      let newLoHi = newLo - dart.notNull(this[_lo]);
      this[_hi] = (((tmpLoHi + tmpHiHi + newLoHi) / math._POW2_32)[dartx.truncate]() & math._Random._MASK32) >>> 0;
      dart.assert(dart.notNull(this[_lo]) < math._POW2_32);
      dart.assert(dart.notNull(this[_hi]) < math._POW2_32);
    }
    nextInt(max) {
      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
      }
      if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
        this[_nextState]();
        return (dart.notNull(this[_lo]) & dart.notNull(max) - 1) >>> 0;
      }
      let rnd32 = null;
      let result = null;
      do {
        this[_nextState]();
        rnd32 = this[_lo];
        result = dart.asInt(rnd32[dartx.remainder](max));
      } while (dart.notNull(rnd32) - dart.notNull(result) + dart.notNull(max) >= math._POW2_32);
      return result;
    }
    nextDouble() {
      this[_nextState]();
      let bits26 = (dart.notNull(this[_lo]) & (1 << 26) - 1) >>> 0;
      this[_nextState]();
      let bits27 = (dart.notNull(this[_lo]) & (1 << 27) - 1) >>> 0;
      return (bits26 * math._Random._POW2_27_D + bits27) / math._Random._POW2_53_D;
    }
    nextBool() {
      this[_nextState]();
      return (dart.notNull(this[_lo]) & 1) == 0;
    }
  };
  math._Random[dart.implements] = () => [math.Random];
  dart.setSignature(math._Random, {
    constructors: () => ({new: dart.definiteFunctionType(math._Random, [core.int])}),
    fields: () => ({
      [_lo]: core.int,
      [_hi]: core.int
    }),
    methods: () => ({
      [_nextState]: dart.definiteFunctionType(dart.void, []),
      nextInt: dart.definiteFunctionType(core.int, [core.int]),
      nextDouble: dart.definiteFunctionType(core.double, []),
      nextBool: dart.definiteFunctionType(core.bool, [])
    }),
    sfields: () => ({
      _POW2_53_D: core.double,
      _POW2_27_D: core.double,
      _MASK32: core.int
    })
  });
  math._Random._POW2_53_D = 1.0 * 9007199254740992;
  math._Random._POW2_27_D = 1.0 * (1 << 27);
  math._Random._MASK32 = 4294967295;
  const _buffer$ = Symbol('_buffer');
  const _getRandomBytes = Symbol('_getRandomBytes');
  math._JSSecureRandom = class _JSSecureRandom extends core.Object {
    new() {
      this[_buffer$] = typed_data.ByteData.new(8);
      let crypto = self.crypto;
      if (crypto != null) {
        let getRandomValues = crypto.getRandomValues;
        if (getRandomValues != null) {
          return;
        }
      }
      dart.throw(new core.UnsupportedError("No source of cryptographically secure random numbers available."));
    }
    [_getRandomBytes](start, length) {
      crypto.getRandomValues(this[_buffer$][dartx.buffer][dartx.asUint8List](start, length));
    }
    nextBool() {
      this[_getRandomBytes](0, 1);
      return this[_buffer$][dartx.getUint8](0)[dartx.isOdd];
    }
    nextDouble() {
      this[_getRandomBytes](1, 7);
      this[_buffer$][dartx.setUint8](0, 63);
      let highByte = this[_buffer$][dartx.getUint8](1);
      this[_buffer$][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
      let result = dart.notNull(this[_buffer$][dartx.getFloat64](0)) - 1.0;
      if ((dart.notNull(highByte) & 16) != 0) {
        result = result + 1.1102230246251565e-16;
      }
      return result;
    }
    nextInt(max) {
      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
      }
      let byteCount = 1;
      if (dart.notNull(max) > 255) {
        byteCount++;
        if (dart.notNull(max) > 65535) {
          byteCount++;
          if (dart.notNull(max) > 16777215) {
            byteCount++;
          }
        }
      }
      this[_buffer$][dartx.setUint32](0, 0);
      let start = 4 - byteCount;
      let randomLimit = dart.asInt(math.pow(256, byteCount));
      while (true) {
        this[_getRandomBytes](start, byteCount);
        let random = this[_buffer$][dartx.getUint32](0);
        if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
          return (dart.notNull(random) & dart.notNull(max) - 1) >>> 0;
        }
        let result = dart.asInt(random[dartx.remainder](max));
        if (dart.notNull(random) - dart.notNull(result) + dart.notNull(max) < dart.notNull(randomLimit)) {
          return result;
        }
      }
    }
  };
  math._JSSecureRandom[dart.implements] = () => [math.Random];
  dart.setSignature(math._JSSecureRandom, {
    constructors: () => ({new: dart.definiteFunctionType(math._JSSecureRandom, [])}),
    fields: () => ({[_buffer$]: typed_data.ByteData}),
    methods: () => ({
      [_getRandomBytes]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      nextBool: dart.definiteFunctionType(core.bool, []),
      nextDouble: dart.definiteFunctionType(core.double, []),
      nextInt: dart.definiteFunctionType(core.int, [core.int])
    })
  });
  math._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
    static combine(hash, value) {
      hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
      hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
      return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
    }
    static finish(hash) {
      hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
      return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
    }
    static hash2(a, b) {
      return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
    }
    static hash4(a, b, c, d) {
      return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
    }
  };
  dart.setSignature(math._JenkinsSmiHash, {
    statics: () => ({
      combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
      finish: dart.definiteFunctionType(core.int, [core.int]),
      hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
      hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['combine', 'finish', 'hash2', 'hash4']
  });
  math.Point$ = dart.generic(T => {
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    class Point extends core.Object {
      new(x, y) {
        this.x = x;
        this.y = y;
      }
      toString() {
        return dart.str`Point(${this.x}, ${this.y})`;
      }
      ['=='](other) {
        if (!PointOfnum().is(other)) return false;
        return dart.equals(this.x, dart.dload(other, 'x')) && dart.equals(this.y, dart.dload(other, 'y'));
      }
      get hashCode() {
        return math._JenkinsSmiHash.hash2(dart.hashCode(this.x), dart.hashCode(this.y));
      }
      ['+'](other) {
        PointOfT()._check(other);
        return new (PointOfT())(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
      }
      ['-'](other) {
        PointOfT()._check(other);
        return new (PointOfT())(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
      }
      ['*'](factor) {
        return new (PointOfT())(dart.notNull(this.x) * dart.notNull(factor), dart.notNull(this.y) * dart.notNull(factor));
      }
      get magnitude() {
        return math.sqrt(dart.notNull(this.x) * dart.notNull(this.x) + dart.notNull(this.y) * dart.notNull(this.y));
      }
      distanceTo(other) {
        PointOfT()._check(other);
        let dx = dart.notNull(this.x) - dart.notNull(other.x);
        let dy = dart.notNull(this.y) - dart.notNull(other.y);
        return math.sqrt(dx * dx + dy * dy);
      }
      squaredDistanceTo(other) {
        PointOfT()._check(other);
        let dx = dart.notNull(this.x) - dart.notNull(other.x);
        let dy = dart.notNull(this.y) - dart.notNull(other.y);
        return dx * dx + dy * dy;
      }
    }
    dart.addTypeTests(Point);
    dart.setSignature(Point, {
      constructors: () => ({new: dart.definiteFunctionType(math.Point$(T), [T, T])}),
      fields: () => ({
        x: T,
        y: T
      }),
      getters: () => ({magnitude: dart.definiteFunctionType(core.double, [])}),
      methods: () => ({
        '+': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
        '-': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
        '*': dart.definiteFunctionType(math.Point$(T), [core.num]),
        distanceTo: dart.definiteFunctionType(core.double, [PointOfT()]),
        squaredDistanceTo: dart.definiteFunctionType(T, [PointOfT()])
      })
    });
    return Point;
  });
  math.Point = Point$();
  let const$52;
  math.Random = class Random extends core.Object {
    static new(seed) {
      if (seed === void 0) seed = null;
      return seed == null ? const$52 || (const$52 = dart.const(new math._JSRandom())) : new math._Random(seed);
    }
    static secure() {
      return math.Random._secureRandom;
    }
  };
  dart.setSignature(math.Random, {
    constructors: () => ({
      new: dart.definiteFunctionType(math.Random, [], [core.int]),
      secure: dart.definiteFunctionType(math.Random, [])
    }),
    sfields: () => ({_secureRandom: math._JSSecureRandom})
  });
  dart.defineLazy(math.Random, {
    get _secureRandom() {
      return new math._JSSecureRandom();
    }
  });
  math._RectangleBase$ = dart.generic(T => {
    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    dart.defineExtensionNames([
      'right',
      'bottom',
      'toString',
      '==',
      'hashCode',
      'intersection',
      'intersects',
      'boundingBox',
      'containsRectangle',
      'containsPoint',
      'topLeft',
      'topRight',
      'bottomRight',
      'bottomLeft'
    ]);
    class _RectangleBase extends core.Object {
      new() {
      }
      get right() {
        return dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]);
      }
      get bottom() {
        return dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
      }
      toString() {
        return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
      }
      ['=='](other) {
        if (!RectangleOfnum().is(other)) return false;
        let otherRect = RectangleOfnum().as(other);
        return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
      }
      get hashCode() {
        return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
      }
      intersection(other) {
        RectangleOfT()._check(other);
        let x0 = math.max(T)(this[dartx.left], other[dartx.left]);
        let x1 = math.min(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
        if (dart.notNull(x0) <= dart.notNull(x1)) {
          let y0 = math.max(T)(this[dartx.top], other[dartx.top]);
          let y1 = math.min(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
          if (dart.notNull(y0) <= dart.notNull(y1)) {
            return new (RectangleOfT())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
          }
        }
        return null;
      }
      intersects(other) {
        return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
      }
      boundingBox(other) {
        RectangleOfT()._check(other);
        let right = math.max(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
        let bottom = math.max(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        let left = math.min(T)(this[dartx.left], other[dartx.left]);
        let top = math.min(T)(this[dartx.top], other[dartx.top]);
        return new (RectangleOfT())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
      }
      containsRectangle(another) {
        return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
      }
      containsPoint(another) {
        return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
      }
      get topLeft() {
        return new (PointOfT())(this[dartx.left], this[dartx.top]);
      }
      get topRight() {
        return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
      }
      get bottomRight() {
        return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
      }
      get bottomLeft() {
        return new (PointOfT())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
      }
    }
    dart.addTypeTests(_RectangleBase);
    dart.setSignature(_RectangleBase, {
      constructors: () => ({new: dart.definiteFunctionType(math._RectangleBase$(T), [])}),
      getters: () => ({
        right: dart.definiteFunctionType(T, []),
        bottom: dart.definiteFunctionType(T, []),
        topLeft: dart.definiteFunctionType(math.Point$(T), []),
        topRight: dart.definiteFunctionType(math.Point$(T), []),
        bottomRight: dart.definiteFunctionType(math.Point$(T), []),
        bottomLeft: dart.definiteFunctionType(math.Point$(T), [])
      }),
      methods: () => ({
        intersection: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
        intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
        boundingBox: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
        containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
        containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
      })
    });
    dart.defineExtensionMembers(_RectangleBase, [
      'toString',
      '==',
      'intersection',
      'intersects',
      'boundingBox',
      'containsRectangle',
      'containsPoint',
      'right',
      'bottom',
      'hashCode',
      'topLeft',
      'topRight',
      'bottomRight',
      'bottomLeft'
    ]);
    return _RectangleBase;
  });
  math._RectangleBase = _RectangleBase();
  math.Rectangle$ = dart.generic(T => {
    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    dart.defineExtensionNames([
      'left',
      'top',
      'width',
      'height'
    ]);
    class Rectangle extends math._RectangleBase$(T) {
      get left() {
        return this[left$];
      }
      set left(value) {
        super.left = value;
      }
      get top() {
        return this[top$];
      }
      set top(value) {
        super.top = value;
      }
      get width() {
        return this[width$];
      }
      set width(value) {
        super.width = value;
      }
      get height() {
        return this[height$];
      }
      set height(value) {
        super.height = value;
      }
      new(left, top, width, height) {
        this[left$] = left;
        this[top$] = top;
        this[width$] = dart.notNull(width) < 0 ? -dart.notNull(width) * 0 : width;
        this[height$] = dart.notNull(height) < 0 ? -dart.notNull(height) * 0 : height;
        super.new();
      }
      static fromPoints(a, b) {
        let left = math.min(T)(a.x, b.x);
        let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
        let top = math.min(T)(a.y, b.y);
        let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
        return new (RectangleOfT())(left, top, width, height);
      }
    }
    const left$ = Symbol(Rectangle.name + "." + 'left'.toString());
    const top$ = Symbol(Rectangle.name + "." + 'top'.toString());
    const width$ = Symbol(Rectangle.name + "." + 'width'.toString());
    const height$ = Symbol(Rectangle.name + "." + 'height'.toString());
    dart.setSignature(Rectangle, {
      constructors: () => ({
        new: dart.definiteFunctionType(math.Rectangle$(T), [T, T, T, T]),
        fromPoints: dart.definiteFunctionType(math.Rectangle$(T), [PointOfT(), PointOfT()])
      }),
      fields: () => ({
        left: T,
        top: T,
        width: T,
        height: T
      })
    });
    dart.defineExtensionMembers(Rectangle, ['left', 'top', 'width', 'height']);
    return Rectangle;
  });
  math.Rectangle = Rectangle();
  const _width = Symbol('_width');
  const _height = Symbol('_height');
  math.MutableRectangle$ = dart.generic(T => {
    let MutableRectangleOfT = () => (MutableRectangleOfT = dart.constFn(math.MutableRectangle$(T)))();
    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
    class MutableRectangle extends math._RectangleBase$(T) {
      get left() {
        return this[left$];
      }
      set left(value) {
        this[left$] = value;
      }
      get top() {
        return this[top$];
      }
      set top(value) {
        this[top$] = value;
      }
      new(left, top, width, height) {
        this[left$] = left;
        this[top$] = top;
        this[_width] = dart.notNull(width) < 0 ? math._clampToZero(T)(width) : width;
        this[_height] = dart.notNull(height) < 0 ? math._clampToZero(T)(height) : height;
        super.new();
      }
      static fromPoints(a, b) {
        let left = math.min(T)(a.x, b.x);
        let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
        let top = math.min(T)(a.y, b.y);
        let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
        return new (MutableRectangleOfT())(left, top, width, height);
      }
      get width() {
        return this[_width];
      }
      set width(width) {
        T._check(width);
        if (dart.notNull(width) < 0) width = math._clampToZero(T)(width);
        this[_width] = width;
      }
      get height() {
        return this[_height];
      }
      set height(height) {
        T._check(height);
        if (dart.notNull(height) < 0) height = math._clampToZero(T)(height);
        this[_height] = height;
      }
    }
    const left$ = Symbol(MutableRectangle.name + "." + 'left'.toString());
    const top$ = Symbol(MutableRectangle.name + "." + 'top'.toString());
    MutableRectangle[dart.implements] = () => [RectangleOfT()];
    dart.setSignature(MutableRectangle, {
      constructors: () => ({
        new: dart.definiteFunctionType(math.MutableRectangle$(T), [T, T, T, T]),
        fromPoints: dart.definiteFunctionType(math.MutableRectangle$(T), [PointOfT(), PointOfT()])
      }),
      fields: () => ({
        left: T,
        top: T,
        [_width]: T,
        [_height]: T
      }),
      getters: () => ({
        width: dart.definiteFunctionType(T, []),
        height: dart.definiteFunctionType(T, [])
      }),
      setters: () => ({
        width: dart.definiteFunctionType(dart.void, [T]),
        height: dart.definiteFunctionType(dart.void, [T])
      })
    });
    dart.defineExtensionMembers(MutableRectangle, ['left', 'top', 'width', 'height']);
    return MutableRectangle;
  });
  math.MutableRectangle = MutableRectangle();
  math._clampToZero = function(T) {
    return value => {
      dart.assert(dart.notNull(value) < 0);
      return -dart.notNull(value) * 0;
    };
  };
  dart.fn(math._clampToZero, TToT());
  mirrors.MirrorSystem = class MirrorSystem extends core.Object {
    findLibrary(libraryName) {
      return this.libraries[dartx.values][dartx.singleWhere](dart.fn(library => dart.equals(library.simpleName, libraryName), LibraryMirrorTobool()));
    }
    static getName(symbol) {
      return _js_mirrors.getName(symbol);
    }
    static getSymbol(name, library) {
      if (library === void 0) library = null;
      return _js_mirrors.getSymbol(name, library);
    }
  };
  dart.setSignature(mirrors.MirrorSystem, {
    methods: () => ({findLibrary: dart.definiteFunctionType(mirrors.LibraryMirror, [core.Symbol])}),
    statics: () => ({
      getName: dart.definiteFunctionType(core.String, [core.Symbol]),
      getSymbol: dart.definiteFunctionType(core.Symbol, [core.String], [mirrors.LibraryMirror])
    }),
    names: ['getName', 'getSymbol']
  });
  mirrors.currentMirrorSystem = function() {
    return mirrors.MirrorSystem._check(_js_mirrors.currentJsMirrorSystem);
  };
  dart.fn(mirrors.currentMirrorSystem, VoidToMirrorSystem());
  mirrors.reflect = function(reflectee) {
    return _js_mirrors.reflect(reflectee);
  };
  dart.lazyFn(mirrors.reflect, () => ObjectToInstanceMirror());
  mirrors.reflectClass = function(key) {
    if (!core.Type.is(key) || dart.equals(key, dart.wrapType(dart.dynamic))) {
      dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
    }
    let tm = mirrors.reflectType(key);
    if (!mirrors.ClassMirror.is(tm)) {
      dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
    }
    return mirrors.ClassMirror._check(mirrors.ClassMirror.as(tm).originalDeclaration);
  };
  dart.lazyFn(mirrors.reflectClass, () => TypeToClassMirror());
  mirrors.reflectType = function(key) {
    if (dart.equals(key, dart.wrapType(dart.dynamic))) {
      return mirrors.currentMirrorSystem().dynamicType;
    }
    return _js_mirrors.reflectType(key);
  };
  dart.lazyFn(mirrors.reflectType, () => TypeToTypeMirror());
  mirrors.Mirror = class Mirror extends core.Object {};
  mirrors.IsolateMirror = class IsolateMirror extends core.Object {};
  mirrors.IsolateMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.DeclarationMirror = class DeclarationMirror extends core.Object {};
  mirrors.DeclarationMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.ObjectMirror = class ObjectMirror extends core.Object {};
  mirrors.ObjectMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.InstanceMirror = class InstanceMirror extends core.Object {};
  mirrors.InstanceMirror[dart.implements] = () => [mirrors.ObjectMirror];
  mirrors.ClosureMirror = class ClosureMirror extends core.Object {};
  mirrors.ClosureMirror[dart.implements] = () => [mirrors.InstanceMirror];
  mirrors.LibraryMirror = class LibraryMirror extends core.Object {};
  mirrors.LibraryMirror[dart.implements] = () => [mirrors.DeclarationMirror, mirrors.ObjectMirror];
  mirrors.LibraryDependencyMirror = class LibraryDependencyMirror extends core.Object {};
  mirrors.LibraryDependencyMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.CombinatorMirror = class CombinatorMirror extends core.Object {};
  mirrors.CombinatorMirror[dart.implements] = () => [mirrors.Mirror];
  mirrors.TypeMirror = class TypeMirror extends core.Object {};
  mirrors.TypeMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  mirrors.ClassMirror = class ClassMirror extends core.Object {};
  mirrors.ClassMirror[dart.implements] = () => [mirrors.TypeMirror, mirrors.ObjectMirror];
  mirrors.FunctionTypeMirror = class FunctionTypeMirror extends core.Object {};
  mirrors.FunctionTypeMirror[dart.implements] = () => [mirrors.ClassMirror];
  mirrors.TypeVariableMirror = class TypeVariableMirror extends mirrors.TypeMirror {};
  mirrors.TypedefMirror = class TypedefMirror extends core.Object {};
  mirrors.TypedefMirror[dart.implements] = () => [mirrors.TypeMirror];
  mirrors.MethodMirror = class MethodMirror extends core.Object {};
  mirrors.MethodMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  mirrors.VariableMirror = class VariableMirror extends core.Object {};
  mirrors.VariableMirror[dart.implements] = () => [mirrors.DeclarationMirror];
  mirrors.ParameterMirror = class ParameterMirror extends core.Object {};
  mirrors.ParameterMirror[dart.implements] = () => [mirrors.VariableMirror];
  mirrors.SourceLocation = class SourceLocation extends core.Object {};
  mirrors.Comment = class Comment extends core.Object {
    new(text, trimmedText, isDocComment) {
      this.text = text;
      this.trimmedText = trimmedText;
      this.isDocComment = isDocComment;
    }
  };
  dart.setSignature(mirrors.Comment, {
    constructors: () => ({new: dart.definiteFunctionType(mirrors.Comment, [core.String, core.String, core.bool])}),
    fields: () => ({
      text: core.String,
      trimmedText: core.String,
      isDocComment: core.bool
    })
  });
  mirrors.MirrorsUsed = class MirrorsUsed extends core.Object {
    new(opts) {
      let symbols = opts && 'symbols' in opts ? opts.symbols : null;
      let targets = opts && 'targets' in opts ? opts.targets : null;
      let metaTargets = opts && 'metaTargets' in opts ? opts.metaTargets : null;
      let override = opts && 'override' in opts ? opts.override : null;
      this.symbols = symbols;
      this.targets = targets;
      this.metaTargets = metaTargets;
      this.override = override;
    }
  };
  dart.setSignature(mirrors.MirrorsUsed, {
    constructors: () => ({new: dart.definiteFunctionType(mirrors.MirrorsUsed, [], {symbols: dart.dynamic, targets: dart.dynamic, metaTargets: dart.dynamic, override: dart.dynamic})}),
    fields: () => ({
      symbols: dart.dynamic,
      targets: dart.dynamic,
      metaTargets: dart.dynamic,
      override: dart.dynamic
    })
  });
  typed_data.ByteBuffer = class ByteBuffer extends core.Object {};
  typed_data.TypedData = class TypedData extends core.Object {};
  const _littleEndian = Symbol('_littleEndian');
  typed_data.Endianness = class Endianness extends core.Object {
    _(littleEndian) {
      this[_littleEndian] = littleEndian;
    }
  };
  dart.defineNamedConstructor(typed_data.Endianness, '_');
  dart.setSignature(typed_data.Endianness, {
    constructors: () => ({_: dart.definiteFunctionType(typed_data.Endianness, [core.bool])}),
    fields: () => ({[_littleEndian]: core.bool}),
    sfields: () => ({
      BIG_ENDIAN: typed_data.Endianness,
      LITTLE_ENDIAN: typed_data.Endianness,
      HOST_ENDIAN: typed_data.Endianness
    })
  });
  dart.defineLazy(typed_data.Endianness, {
    get BIG_ENDIAN() {
      return dart.const(new typed_data.Endianness._(false));
    },
    get LITTLE_ENDIAN() {
      return dart.const(new typed_data.Endianness._(true));
    },
    get HOST_ENDIAN() {
      return typed_data.ByteData.view(typed_data.Uint16List.fromList(JSArrayOfint().of([1]))[dartx.buffer])[dartx.getInt8](0) == 1 ? typed_data.Endianness.LITTLE_ENDIAN : typed_data.Endianness.BIG_ENDIAN;
    }
  });
  typed_data.ByteData = class ByteData extends core.Object {
    static new(length) {
      return _native_typed_data.NativeByteData.new(length);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asByteData](offsetInBytes, length);
    }
  };
  typed_data.ByteData[dart.implements] = () => [typed_data.TypedData];
  dart.setSignature(typed_data.ByteData, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.ByteData, [core.int]),
      view: dart.definiteFunctionType(typed_data.ByteData, [typed_data.ByteBuffer], [core.int, core.int])
    })
  });
  typed_data.Int8List = class Int8List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeInt8List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt8List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt8List](offsetInBytes, length);
    }
  };
  typed_data.Int8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int8List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int8List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int8List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int8List.BYTES_PER_ELEMENT = 1;
  typed_data.Uint8List = class Uint8List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint8List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint8List](offsetInBytes, length);
    }
  };
  typed_data.Uint8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint8List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint8List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint8List.BYTES_PER_ELEMENT = 1;
  typed_data.Uint8ClampedList = class Uint8ClampedList extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint8ClampedList.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint8ClampedList.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint8ClampedList](offsetInBytes, length);
    }
  };
  typed_data.Uint8ClampedList[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint8ClampedList, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint8ClampedList, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint8ClampedList, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint8ClampedList, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint8ClampedList.BYTES_PER_ELEMENT = 1;
  typed_data.Int16List = class Int16List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeInt16List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt16List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt16List](offsetInBytes, length);
    }
  };
  typed_data.Int16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int16List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int16List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int16List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int16List.BYTES_PER_ELEMENT = 2;
  typed_data.Uint16List = class Uint16List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint16List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint16List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint16List](offsetInBytes, length);
    }
  };
  typed_data.Uint16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint16List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint16List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint16List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint16List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint16List.BYTES_PER_ELEMENT = 2;
  typed_data.Int32List = class Int32List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeInt32List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt32List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt32List](offsetInBytes, length);
    }
  };
  typed_data.Int32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int32List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int32List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int32List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int32List.BYTES_PER_ELEMENT = 4;
  typed_data.Uint32List = class Uint32List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeUint32List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeUint32List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint32List](offsetInBytes, length);
    }
  };
  typed_data.Uint32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint32List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint32List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint32List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint32List.BYTES_PER_ELEMENT = 4;
  typed_data.Int64List = class Int64List extends core.Object {
    static new(length) {
      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
    }
    static fromList(elements) {
      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt64List](offsetInBytes, length);
    }
  };
  typed_data.Int64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Int64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int64List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int64List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Int64List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int64List.BYTES_PER_ELEMENT = 8;
  typed_data.Uint64List = class Uint64List extends core.Object {
    static new(length) {
      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
    }
    static fromList(elements) {
      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asUint64List](offsetInBytes, length);
    }
  };
  typed_data.Uint64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
  dart.setSignature(typed_data.Uint64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Uint64List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Uint64List, [ListOfint()]),
      view: dart.definiteFunctionType(typed_data.Uint64List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Uint64List.BYTES_PER_ELEMENT = 8;
  typed_data.Float32List = class Float32List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeFloat32List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat32List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat32List](offsetInBytes, length);
    }
  };
  typed_data.Float32List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
  dart.setSignature(typed_data.Float32List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float32List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float32List, [ListOfdouble()]),
      view: dart.definiteFunctionType(typed_data.Float32List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float32List.BYTES_PER_ELEMENT = 4;
  typed_data.Float64List = class Float64List extends core.Object {
    static new(length) {
      return _native_typed_data.NativeFloat64List.new(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat64List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat64List](offsetInBytes, length);
    }
  };
  typed_data.Float64List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
  dart.setSignature(typed_data.Float64List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float64List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float64List, [ListOfdouble()]),
      view: dart.definiteFunctionType(typed_data.Float64List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float64List.BYTES_PER_ELEMENT = 8;
  typed_data.Float32x4List = class Float32x4List extends core.Object {
    static new(length) {
      return new _native_typed_data.NativeFloat32x4List(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat32x4List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat32x4List](offsetInBytes, length);
    }
  };
  typed_data.Float32x4List[dart.implements] = () => [ListOfFloat32x4(), typed_data.TypedData];
  dart.setSignature(typed_data.Float32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float32x4List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float32x4List, [ListOfFloat32x4()]),
      view: dart.definiteFunctionType(typed_data.Float32x4List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float32x4List.BYTES_PER_ELEMENT = 16;
  typed_data.Int32x4List = class Int32x4List extends core.Object {
    static new(length) {
      return new _native_typed_data.NativeInt32x4List(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeInt32x4List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asInt32x4List](offsetInBytes, length);
    }
  };
  typed_data.Int32x4List[dart.implements] = () => [ListOfInt32x4(), typed_data.TypedData];
  dart.setSignature(typed_data.Int32x4List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Int32x4List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Int32x4List, [ListOfInt32x4()]),
      view: dart.definiteFunctionType(typed_data.Int32x4List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Int32x4List.BYTES_PER_ELEMENT = 16;
  typed_data.Float64x2List = class Float64x2List extends core.Object {
    static new(length) {
      return new _native_typed_data.NativeFloat64x2List(length);
    }
    static fromList(elements) {
      return _native_typed_data.NativeFloat64x2List.fromList(elements);
    }
    static view(buffer, offsetInBytes, length) {
      if (offsetInBytes === void 0) offsetInBytes = 0;
      if (length === void 0) length = null;
      return buffer[dartx.asFloat64x2List](offsetInBytes, length);
    }
  };
  typed_data.Float64x2List[dart.implements] = () => [ListOfFloat64x2(), typed_data.TypedData];
  dart.setSignature(typed_data.Float64x2List, {
    constructors: () => ({
      new: dart.definiteFunctionType(typed_data.Float64x2List, [core.int]),
      fromList: dart.definiteFunctionType(typed_data.Float64x2List, [ListOfFloat64x2()]),
      view: dart.definiteFunctionType(typed_data.Float64x2List, [typed_data.ByteBuffer], [core.int, core.int])
    }),
    sfields: () => ({BYTES_PER_ELEMENT: core.int})
  });
  typed_data.Float64x2List.BYTES_PER_ELEMENT = 16;
  indexed_db._KeyRangeFactoryProvider = class _KeyRangeFactoryProvider extends core.Object {
    static createKeyRange_only(value) {
      return indexed_db._KeyRangeFactoryProvider._only(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(value));
    }
    static createKeyRange_lowerBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider._lowerBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
    }
    static createKeyRange_upperBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider._upperBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
    }
    static createKeyRange_bound(lower, upper, lowerOpen, upperOpen) {
      if (lowerOpen === void 0) lowerOpen = false;
      if (upperOpen === void 0) upperOpen = false;
      return indexed_db._KeyRangeFactoryProvider._bound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(lower), indexed_db._KeyRangeFactoryProvider._translateKey(upper), lowerOpen, upperOpen);
    }
    static _class() {
      if (indexed_db._KeyRangeFactoryProvider._cachedClass != null) return indexed_db._KeyRangeFactoryProvider._cachedClass;
      return indexed_db._KeyRangeFactoryProvider._cachedClass = indexed_db._KeyRangeFactoryProvider._uncachedClass();
    }
    static _uncachedClass() {
      return window.webkitIDBKeyRange || window.mozIDBKeyRange || window.msIDBKeyRange || window.IDBKeyRange;
    }
    static _translateKey(idbkey) {
      return idbkey;
    }
    static _only(cls, value) {
      return cls.only(value);
    }
    static _lowerBound(cls, bound, open) {
      return cls.lowerBound(bound, open);
    }
    static _upperBound(cls, bound, open) {
      return cls.upperBound(bound, open);
    }
    static _bound(cls, lower, upper, lowerOpen, upperOpen) {
      return cls.bound(lower, upper, lowerOpen, upperOpen);
    }
  };
  dart.setSignature(indexed_db._KeyRangeFactoryProvider, {
    sfields: () => ({_cachedClass: dart.dynamic}),
    statics: () => ({
      createKeyRange_only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
      createKeyRange_lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      createKeyRange_upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      createKeyRange_bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
      _class: dart.definiteFunctionType(dart.dynamic, []),
      _uncachedClass: dart.definiteFunctionType(dart.dynamic, []),
      _translateKey: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic]),
      _lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['createKeyRange_only', 'createKeyRange_lowerBound', 'createKeyRange_upperBound', 'createKeyRange_bound', '_class', '_uncachedClass', '_translateKey', '_only', '_lowerBound', '_upperBound', '_bound']
  });
  indexed_db._KeyRangeFactoryProvider._cachedClass = null;
  indexed_db._convertNativeToDart_IDBKey = function(nativeKey) {
    function containsDate(object) {
      if (dart.test(html_common.isJavaScriptDate(object))) return true;
      if (core.List.is(object)) {
        for (let i = 0; i < dart.notNull(object[dartx.length]); i++) {
          if (dart.test(containsDate(object[dartx._get](i)))) return true;
        }
      }
      return false;
    }
    dart.fn(containsDate, dynamicTobool$());
    if (dart.test(containsDate(nativeKey))) {
      dart.throw(new core.UnimplementedError('Key containing DateTime'));
    }
    return nativeKey;
  };
  dart.fn(indexed_db._convertNativeToDart_IDBKey, dynamicTodynamic$());
  indexed_db._convertDartToNative_IDBKey = function(dartKey) {
    return dartKey;
  };
  dart.fn(indexed_db._convertDartToNative_IDBKey, dynamicTodynamic$());
  indexed_db._convertNativeToDart_IDBAny = function(object) {
    return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false});
  };
  dart.fn(indexed_db._convertNativeToDart_IDBAny, dynamicTodynamic$());
  indexed_db._idbKey = 'JSExtendableArray|=Object|num|String';
  indexed_db._annotation_Creates_IDBKey = dart.const(new _js_helper.Creates(indexed_db._idbKey));
  indexed_db._annotation_Returns_IDBKey = dart.const(new _js_helper.Returns(indexed_db._idbKey));
  const _delete = Symbol('_delete');
  const _update = Symbol('_update');
  const _update_1 = Symbol('_update_1');
  dart.defineExtensionNames([
    'delete',
    'update',
    'next',
    'advance',
    'continuePrimaryKey',
    'direction',
    'key',
    'primaryKey',
    'source'
  ]);
  indexed_db.Cursor = class Cursor extends _interceptors.Interceptor {
    [dartx.delete]() {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_delete]());
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.update](value) {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_update](value));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.next](key) {
      if (key === void 0) key = null;
      if (key == null) {
        this.continue();
      } else {
        this.continue(key);
      }
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.direction]() {
      return this.direction;
    }
    get [dartx.key]() {
      return this.key;
    }
    get [dartx.primaryKey]() {
      return this.primaryKey;
    }
    get [dartx.source]() {
      return this.source;
    }
    [dartx.advance](...args) {
      return this.advance.apply(this, args);
    }
    [dartx.continuePrimaryKey](...args) {
      return this.continuePrimaryKey.apply(this, args);
    }
    [_delete](...args) {
      return this.delete.apply(this, args);
    }
    [_update](value) {
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      return this[_update_1](value_1);
    }
    [_update_1](...args) {
      return this.update.apply(this, args);
    }
  };
  dart.setSignature(indexed_db.Cursor, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Cursor, [])}),
    fields: () => ({
      [dartx.direction]: core.String,
      [dartx.key]: core.Object,
      [dartx.primaryKey]: core.Object,
      [dartx.source]: core.Object
    }),
    methods: () => ({
      [dartx.delete]: dart.definiteFunctionType(async.Future, []),
      [dartx.update]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.next]: dart.definiteFunctionType(dart.void, [], [core.Object]),
      [dartx.advance]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.continuePrimaryKey]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
      [_delete]: dart.definiteFunctionType(indexed_db.Request, []),
      [_update]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
      [_update_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.IDBCursor, indexed_db.Cursor);
  const _get_value = Symbol('_get_value');
  dart.defineExtensionNames([
    'value'
  ]);
  indexed_db.CursorWithValue = class CursorWithValue extends indexed_db.Cursor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return indexed_db._convertNativeToDart_IDBAny(this[_get_value]);
    }
    get [_get_value]() {
      return this.value;
    }
  };
  dart.setSignature(indexed_db.CursorWithValue, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.CursorWithValue, [])}),
    fields: () => ({[_get_value]: dart.dynamic}),
    getters: () => ({[dartx.value]: dart.definiteFunctionType(dart.dynamic, [])})
  });
  dart.registerExtension(dart.global.IDBCursorWithValue, indexed_db.CursorWithValue);
  const _createObjectStore = Symbol('_createObjectStore');
  const _transaction = Symbol('_transaction');
  const _createObjectStore_1 = Symbol('_createObjectStore_1');
  const _createObjectStore_2 = Symbol('_createObjectStore_2');
  const _addEventListener = Symbol('_addEventListener');
  const _removeEventListener = Symbol('_removeEventListener');
  dart.defineExtensionNames([
    'on',
    'addEventListener',
    'removeEventListener',
    'dispatchEvent'
  ]);
  html$.EventTarget = class EventTarget extends _interceptors.Interceptor {
    _created() {
      super.new();
    }
    get [dartx.on]() {
      return new html$.Events(this);
    }
    [dartx.addEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      if (listener != null) {
        this[_addEventListener](type, listener, useCapture);
      }
    }
    [dartx.removeEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      if (listener != null) {
        this[_removeEventListener](type, listener, useCapture);
      }
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_addEventListener](...args) {
      return this.addEventListener.apply(this, args);
    }
    [dartx.dispatchEvent](...args) {
      return this.dispatchEvent.apply(this, args);
    }
    [_removeEventListener](...args) {
      return this.removeEventListener.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.EventTarget, '_created');
  dart.setSignature(html$.EventTarget, {
    constructors: () => ({
      _created: dart.definiteFunctionType(html$.EventTarget, []),
      _: dart.definiteFunctionType(html$.EventTarget, [])
    }),
    getters: () => ({[dartx.on]: dart.definiteFunctionType(html$.Events, [])}),
    methods: () => ({
      [dartx.addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      [dartx.removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      [dartx.dispatchEvent]: dart.definiteFunctionType(core.bool, [html$.Event]),
      [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
    })
  });
  dart.registerExtension(dart.global.EventTarget, html$.EventTarget);
  dart.defineExtensionNames([
    'createObjectStore',
    'transaction',
    'transactionStore',
    'transactionList',
    'transactionStores',
    'close',
    'deleteObjectStore',
    'onAbort',
    'onClose',
    'onError',
    'onVersionChange',
    'name',
    'objectStoreNames',
    'version'
  ]);
  indexed_db.Database = class Database extends html$.EventTarget {
    [dartx.createObjectStore](name, opts) {
      let keyPath = opts && 'keyPath' in opts ? opts.keyPath : null;
      let autoIncrement = opts && 'autoIncrement' in opts ? opts.autoIncrement : null;
      let options = dart.map();
      if (keyPath != null) {
        options[dartx._set]('keyPath', keyPath);
      }
      if (autoIncrement != null) {
        options[dartx._set]('autoIncrement', autoIncrement);
      }
      return this[_createObjectStore](name, options);
    }
    [dartx.transaction](storeName_OR_storeNames, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      return this[_transaction](storeName_OR_storeNames, mode);
    }
    [dartx.transactionStore](storeName, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      return this[_transaction](storeName, mode);
    }
    [dartx.transactionList](storeNames, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      let storeNames_1 = html_common.convertDartToNative_StringArray(storeNames);
      return this[_transaction](storeNames_1, mode);
    }
    [dartx.transactionStores](storeNames, mode) {
      if (mode != 'readonly' && mode != 'readwrite') {
        dart.throw(new core.ArgumentError(mode));
      }
      return this[_transaction](storeNames, mode);
    }
    [_transaction](...args) {
      return this.transaction.apply(this, args);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.objectStoreNames]() {
      return this.objectStoreNames;
    }
    get [dartx.version]() {
      return this.version;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [_createObjectStore](name, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_createObjectStore_1](name, options_1);
      }
      return this[_createObjectStore_2](name);
    }
    [_createObjectStore_1](...args) {
      return this.createObjectStore.apply(this, args);
    }
    [_createObjectStore_2](...args) {
      return this.createObjectStore.apply(this, args);
    }
    [dartx.deleteObjectStore](...args) {
      return this.deleteObjectStore.apply(this, args);
    }
    get [dartx.onAbort]() {
      return indexed_db.Database.abortEvent.forTarget(this);
    }
    get [dartx.onClose]() {
      return indexed_db.Database.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return indexed_db.Database.errorEvent.forTarget(this);
    }
    get [dartx.onVersionChange]() {
      return indexed_db.Database.versionChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.Database, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Database, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.objectStoreNames]: ListOfString(),
      [dartx.version]: core.Object
    }),
    getters: () => ({
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onVersionChange]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
    }),
    methods: () => ({
      [dartx.createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], {keyPath: core.String, autoIncrement: core.bool}),
      [dartx.transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, core.String]),
      [dartx.transactionStore]: dart.definiteFunctionType(indexed_db.Transaction, [core.String, core.String]),
      [dartx.transactionList]: dart.definiteFunctionType(indexed_db.Transaction, [ListOfString(), core.String]),
      [dartx.transactionStores]: dart.definiteFunctionType(indexed_db.Transaction, [html$.DomStringList, core.String]),
      [_transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, dart.dynamic]),
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [_createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], [core.Map]),
      [_createObjectStore_1]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic, dart.dynamic]),
      [_createObjectStore_2]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic]),
      [dartx.deleteObjectStore]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfEvent(),
      closeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      versionChangeEvent: EventStreamProviderOfVersionChangeEvent()
    })
  });
  dart.defineLazy(indexed_db.Database, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get versionChangeEvent() {
      return dart.const(new (EventStreamProviderOfVersionChangeEvent())('versionchange'));
    }
  });
  dart.registerExtension(dart.global.IDBDatabase, indexed_db.Database);
  const _open = Symbol('_open');
  const _deleteDatabase = Symbol('_deleteDatabase');
  const _webkitGetDatabaseNames = Symbol('_webkitGetDatabaseNames');
  dart.defineExtensionNames([
    'open',
    'deleteDatabase',
    'getDatabaseNames',
    'supportsDatabaseNames',
    'cmp'
  ]);
  indexed_db.IdbFactory = class IdbFactory extends _interceptors.Interceptor {
    static get supported() {
      return !!(window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB);
    }
    [dartx.open](name, opts) {
      let version = opts && 'version' in opts ? opts.version : null;
      let onUpgradeNeeded = opts && 'onUpgradeNeeded' in opts ? opts.onUpgradeNeeded : null;
      let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
      if (version == null != (onUpgradeNeeded == null)) {
        return FutureOfDatabase().error(new core.ArgumentError('version and onUpgradeNeeded must be specified together'));
      }
      try {
        let request = null;
        if (version != null) {
          request = this[_open](name, version);
        } else {
          request = this[_open](name);
        }
        if (onUpgradeNeeded != null) {
          dart.dsend(dart.dload(request, 'onUpgradeNeeded'), 'listen', onUpgradeNeeded);
        }
        if (onBlocked != null) {
          dart.dsend(dart.dload(request, 'onBlocked'), 'listen', onBlocked);
        }
        return indexed_db._completeRequest(indexed_db.Database)(indexed_db.Request._check(request));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfDatabase().error(e, stacktrace);
      }

    }
    [dartx.deleteDatabase](name, opts) {
      let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
      try {
        let request = this[_deleteDatabase](name);
        if (onBlocked != null) {
          request[dartx.onBlocked].listen(onBlocked);
        }
        let completer = CompleterOfIdbFactory().sync();
        request[dartx.onSuccess].listen(dart.fn(e => {
          completer.complete(this);
        }, EventTovoid$()));
        request[dartx.onError].listen(dart.bind(completer, 'completeError'));
        return completer.future;
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfIdbFactory().error(e, stacktrace);
      }

    }
    [dartx.getDatabaseNames]() {
      try {
        let request = this[_webkitGetDatabaseNames]();
        return indexed_db._completeRequest(ListOfString())(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfListOfString().error(e, stacktrace);
      }

    }
    get [dartx.supportsDatabaseNames]() {
      return dart.test(indexed_db.IdbFactory.supported) && !!(this.getDatabaseNames || this.webkitGetDatabaseNames);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cmp](...args) {
      return this.cmp.apply(this, args);
    }
    [_deleteDatabase](...args) {
      return this.deleteDatabase.apply(this, args);
    }
    [_open](...args) {
      return this.open.apply(this, args);
    }
    [_webkitGetDatabaseNames](...args) {
      return this.webkitGetDatabaseNames.apply(this, args);
    }
  };
  dart.setSignature(indexed_db.IdbFactory, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.IdbFactory, [])}),
    getters: () => ({[dartx.supportsDatabaseNames]: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      [dartx.open]: dart.definiteFunctionType(async.Future$(indexed_db.Database), [core.String], {version: core.int, onUpgradeNeeded: dynamicTovoid(), onBlocked: dynamicTovoid()}),
      [dartx.deleteDatabase]: dart.definiteFunctionType(async.Future$(indexed_db.IdbFactory), [core.String], {onBlocked: EventTovoid()}),
      [dartx.getDatabaseNames]: dart.definiteFunctionType(async.Future$(core.List$(core.String)), []),
      [dartx.cmp]: dart.definiteFunctionType(core.int, [core.Object, core.Object]),
      [_deleteDatabase]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String]),
      [_open]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String], [core.int]),
      [_webkitGetDatabaseNames]: dart.definiteFunctionType(indexed_db.Request, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.IDBFactory, indexed_db.IdbFactory);
  indexed_db._completeRequest = function(T) {
    return request => {
      let completer = async.Completer$(T).sync();
      request[dartx.onSuccess].listen(dart.fn(e => {
        let result = indexed_db._cast(T)(request[dartx.result]);
        completer.complete(result);
      }, EventTovoid$()));
      request[dartx.onError].listen(dart.bind(completer, 'completeError'));
      return completer.future;
    };
  };
  dart.lazyFn(indexed_db._completeRequest, () => RequestToFutureOfT());
  const _count$0 = Symbol('_count');
  const _get$ = Symbol('_get');
  const _getKey$ = Symbol('_getKey');
  const _openCursor = Symbol('_openCursor');
  const _openKeyCursor = Symbol('_openKeyCursor');
  dart.defineExtensionNames([
    'count',
    'get',
    'getKey',
    'openCursor',
    'openKeyCursor',
    'getAll',
    'getAllKeys',
    'keyPath',
    'multiEntry',
    'name',
    'objectStore',
    'unique'
  ]);
  indexed_db.Index = class Index extends _interceptors.Interceptor {
    [dartx.count](key_OR_range) {
      if (key_OR_range === void 0) key_OR_range = null;
      try {
        let request = this[_count$0](key_OR_range);
        return indexed_db._completeRequest(core.int)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfint().error(e, stacktrace);
      }

    }
    [dartx.get](key) {
      try {
        let request = this[_get$](key);
        return indexed_db._completeRequest(dart.dynamic)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.getKey](key) {
      try {
        let request = this[_getKey$](key);
        return indexed_db._completeRequest(dart.dynamic)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.openCursor](opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let range = opts && 'range' in opts ? opts.range : null;
      let direction = opts && 'direction' in opts ? opts.direction : null;
      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
      let key_OR_range = null;
      if (key != null) {
        if (range != null) {
          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
        }
        key_OR_range = key;
      } else {
        key_OR_range = range;
      }
      let request = null;
      if (direction == null) {
        request = this[_openCursor](key_OR_range, "next");
      } else {
        request = this[_openCursor](key_OR_range, direction);
      }
      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
    }
    [dartx.openKeyCursor](opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let range = opts && 'range' in opts ? opts.range : null;
      let direction = opts && 'direction' in opts ? opts.direction : null;
      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
      let key_OR_range = null;
      if (key != null) {
        if (range != null) {
          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
        }
        key_OR_range = key;
      } else {
        key_OR_range = range;
      }
      let request = null;
      if (direction == null) {
        request = this[_openKeyCursor](key_OR_range, "next");
      } else {
        request = this[_openKeyCursor](key_OR_range, direction);
      }
      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.Cursor)(indexed_db.Request._check(request), autoAdvance);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.keyPath]() {
      return this.keyPath;
    }
    get [dartx.multiEntry]() {
      return this.multiEntry;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.objectStore]() {
      return this.objectStore;
    }
    get [dartx.unique]() {
      return this.unique;
    }
    [_count$0](...args) {
      return this.count.apply(this, args);
    }
    [_get$](...args) {
      return this.get.apply(this, args);
    }
    [dartx.getAll](...args) {
      return this.getAll.apply(this, args);
    }
    [dartx.getAllKeys](...args) {
      return this.getAllKeys.apply(this, args);
    }
    [_getKey$](...args) {
      return this.getKey.apply(this, args);
    }
    [_openCursor](...args) {
      return this.openCursor.apply(this, args);
    }
    [_openKeyCursor](...args) {
      return this.openKeyCursor.apply(this, args);
    }
  };
  dart.setSignature(indexed_db.Index, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Index, [])}),
    fields: () => ({
      [dartx.keyPath]: core.Object,
      [dartx.multiEntry]: core.bool,
      [dartx.name]: core.String,
      [dartx.objectStore]: indexed_db.ObjectStore,
      [dartx.unique]: core.bool
    }),
    methods: () => ({
      [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
      [dartx.get]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.getKey]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
      [dartx.openKeyCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.Cursor), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
      [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [_getKey$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
      [_openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String])
    })
  });
  dart.registerExtension(dart.global.IDBIndex, indexed_db.Index);
  dart.defineExtensionNames([
    'lower',
    'lowerOpen',
    'upper',
    'upperOpen'
  ]);
  indexed_db.KeyRange = class KeyRange extends _interceptors.Interceptor {
    static only(value) {
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_only(value);
    }
    static lowerBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
    }
    static upperBound(bound, open) {
      if (open === void 0) open = false;
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
    }
    static bound(lower, upper, lowerOpen, upperOpen) {
      if (lowerOpen === void 0) lowerOpen = false;
      if (upperOpen === void 0) upperOpen = false;
      return indexed_db._KeyRangeFactoryProvider.createKeyRange_bound(lower, upper, lowerOpen, upperOpen);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.lower]() {
      return this.lower;
    }
    get [dartx.lowerOpen]() {
      return this.lowerOpen;
    }
    get [dartx.upper]() {
      return this.upper;
    }
    get [dartx.upperOpen]() {
      return this.upperOpen;
    }
  };
  dart.setSignature(indexed_db.KeyRange, {
    constructors: () => ({
      only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
      lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
      bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
      _: dart.definiteFunctionType(indexed_db.KeyRange, [])
    }),
    fields: () => ({
      [dartx.lower]: core.Object,
      [dartx.lowerOpen]: core.bool,
      [dartx.upper]: core.Object,
      [dartx.upperOpen]: core.bool
    }),
    statics: () => ({
      bound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object, core.Object], [core.bool, core.bool]),
      lowerBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool]),
      only_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object]),
      upperBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool])
    }),
    names: ['bound_', 'lowerBound_', 'only_', 'upperBound_']
  });
  dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
  const _add$2 = Symbol('_add');
  const _clear$0 = Symbol('_clear');
  const _put = Symbol('_put');
  const _createIndex = Symbol('_createIndex');
  const _add_1 = Symbol('_add_1');
  const _add_2 = Symbol('_add_2');
  const _createIndex_1 = Symbol('_createIndex_1');
  const _createIndex_2 = Symbol('_createIndex_2');
  const _put_1 = Symbol('_put_1');
  const _put_2 = Symbol('_put_2');
  dart.defineExtensionNames([
    'add',
    'clear',
    'delete',
    'count',
    'put',
    'getObject',
    'openCursor',
    'createIndex',
    'deleteIndex',
    'getAll',
    'getAllKeys',
    'index',
    'openKeyCursor',
    'autoIncrement',
    'indexNames',
    'keyPath',
    'name',
    'transaction'
  ]);
  indexed_db.ObjectStore = class ObjectStore extends _interceptors.Interceptor {
    [dartx.add](value, key) {
      if (key === void 0) key = null;
      try {
        let request = null;
        if (key != null) {
          request = this[_add$2](value, key);
        } else {
          request = this[_add$2](value);
        }
        return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.clear]() {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.delete](key_OR_keyRange) {
      try {
        return indexed_db._completeRequest(dart.dynamic)(this[_delete](key_OR_keyRange));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.count](key_OR_range) {
      if (key_OR_range === void 0) key_OR_range = null;
      try {
        let request = this[_count$0](key_OR_range);
        return indexed_db._completeRequest(core.int)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return FutureOfint().error(e, stacktrace);
      }

    }
    [dartx.put](value, key) {
      if (key === void 0) key = null;
      try {
        let request = null;
        if (key != null) {
          request = this[_put](value, key);
        } else {
          request = this[_put](value);
        }
        return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.getObject](key) {
      try {
        let request = this[_get$](key);
        return indexed_db._completeRequest(dart.dynamic)(request);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        return async.Future.error(e, stacktrace);
      }

    }
    [dartx.openCursor](opts) {
      let key = opts && 'key' in opts ? opts.key : null;
      let range = opts && 'range' in opts ? opts.range : null;
      let direction = opts && 'direction' in opts ? opts.direction : null;
      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
      let key_OR_range = null;
      if (key != null) {
        if (range != null) {
          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
        }
        key_OR_range = key;
      } else {
        key_OR_range = range;
      }
      let request = null;
      if (direction == null) {
        request = this[_openCursor](key_OR_range);
      } else {
        request = this[_openCursor](key_OR_range, direction);
      }
      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
    }
    [dartx.createIndex](name, keyPath, opts) {
      let unique = opts && 'unique' in opts ? opts.unique : null;
      let multiEntry = opts && 'multiEntry' in opts ? opts.multiEntry : null;
      let options = dart.map();
      if (unique != null) {
        options[dartx._set]('unique', unique);
      }
      if (multiEntry != null) {
        options[dartx._set]('multiEntry', multiEntry);
      }
      return this[_createIndex](name, keyPath, options);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.autoIncrement]() {
      return this.autoIncrement;
    }
    get [dartx.indexNames]() {
      return this.indexNames;
    }
    get [dartx.keyPath]() {
      return this.keyPath;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.transaction]() {
      return this.transaction;
    }
    [_add$2](value, key) {
      if (key === void 0) key = null;
      if (key != null) {
        let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
        let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
        return this[_add_1](value_1, key_2);
      }
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      return this[_add_2](value_1);
    }
    [_add_1](...args) {
      return this.add.apply(this, args);
    }
    [_add_2](...args) {
      return this.add.apply(this, args);
    }
    [_clear$0](...args) {
      return this.clear.apply(this, args);
    }
    [_count$0](...args) {
      return this.count.apply(this, args);
    }
    [_createIndex](name, keyPath, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_createIndex_1](name, keyPath, options_1);
      }
      return this[_createIndex_2](name, keyPath);
    }
    [_createIndex_1](...args) {
      return this.createIndex.apply(this, args);
    }
    [_createIndex_2](...args) {
      return this.createIndex.apply(this, args);
    }
    [_delete](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.deleteIndex](...args) {
      return this.deleteIndex.apply(this, args);
    }
    [_get$](...args) {
      return this.get.apply(this, args);
    }
    [dartx.getAll](...args) {
      return this.getAll.apply(this, args);
    }
    [dartx.getAllKeys](...args) {
      return this.getAllKeys.apply(this, args);
    }
    [dartx.index](...args) {
      return this.index.apply(this, args);
    }
    [_openCursor](...args) {
      return this.openCursor.apply(this, args);
    }
    [dartx.openKeyCursor](...args) {
      return this.openKeyCursor.apply(this, args);
    }
    [_put](value, key) {
      if (key === void 0) key = null;
      if (key != null) {
        let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
        let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
        return this[_put_1](value_1, key_2);
      }
      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
      return this[_put_2](value_1);
    }
    [_put_1](...args) {
      return this.put.apply(this, args);
    }
    [_put_2](...args) {
      return this.put.apply(this, args);
    }
    static _cursorStreamFromResult(T) {
      return (request, autoAdvance) => {
        let controller = async.StreamController$(T).new({sync: true});
        request[dartx.onError].listen(dart.bind(controller, 'addError'));
        request[dartx.onSuccess].listen(dart.fn(e => {
          let cursor = indexed_db._cast(T)(request[dartx.result]);
          if (cursor == null) {
            controller.close();
          } else {
            controller.add(cursor);
            if (autoAdvance == true && dart.test(controller.hasListener)) {
              cursor[dartx.next]();
            }
          }
        }, EventTovoid$()));
        return controller.stream;
      };
    }
  };
  dart.setSignature(indexed_db.ObjectStore, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.ObjectStore, [])}),
    fields: () => ({
      [dartx.autoIncrement]: core.bool,
      [dartx.indexNames]: ListOfString(),
      [dartx.keyPath]: core.Object,
      [dartx.name]: core.String,
      [dartx.transaction]: indexed_db.Transaction
    }),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
      [dartx.clear]: dart.definiteFunctionType(async.Future, []),
      [dartx.delete]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
      [dartx.put]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
      [dartx.getObject]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
      [dartx.createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, dart.dynamic], {unique: core.bool, multiEntry: core.bool}),
      [_add$2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
      [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
      [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
      [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
      [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
      [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [_createIndex_2]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic]),
      [_delete]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [dartx.deleteIndex]: dart.definiteFunctionType(dart.void, [core.String]),
      [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
      [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
      [dartx.index]: dart.definiteFunctionType(indexed_db.Index, [core.String]),
      [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
      [dartx.openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
      [_put]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
      [_put_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
      [_put_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
    }),
    statics: () => ({_cursorStreamFromResult: dart.definiteFunctionType(T => [async.Stream$(T), [indexed_db.Request, core.bool]])}),
    names: ['_cursorStreamFromResult']
  });
  dart.registerExtension(dart.global.IDBObjectStore, indexed_db.ObjectStore);
  indexed_db._cast = function(To) {
    return x => {
      return To._check(x);
    };
  };
  dart.fn(indexed_db._cast, dynamicToTo());
  const _get_result = Symbol('_get_result');
  dart.defineExtensionNames([
    'result',
    'onError',
    'onSuccess',
    'error',
    'readyState',
    'source',
    'transaction'
  ]);
  indexed_db.Request = class Request extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.result]() {
      return indexed_db._convertNativeToDart_IDBAny(this[_get_result]);
    }
    get [_get_result]() {
      return this.result;
    }
    get [dartx.source]() {
      return this.source;
    }
    get [dartx.transaction]() {
      return this.transaction;
    }
    get [dartx.onError]() {
      return indexed_db.Request.errorEvent.forTarget(this);
    }
    get [dartx.onSuccess]() {
      return indexed_db.Request.successEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.Request, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Request, [])}),
    fields: () => ({
      [dartx.error]: html$.DomError,
      [dartx.readyState]: core.String,
      [_get_result]: dart.dynamic,
      [dartx.source]: core.Object,
      [dartx.transaction]: indexed_db.Transaction
    }),
    getters: () => ({
      [dartx.result]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSuccess]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      successEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(indexed_db.Request, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get successEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('success'));
    }
  });
  dart.registerExtension(dart.global.IDBRequest, indexed_db.Request);
  dart.defineExtensionNames([
    'onBlocked',
    'onUpgradeNeeded'
  ]);
  indexed_db.OpenDBRequest = class OpenDBRequest extends indexed_db.Request {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.onBlocked]() {
      return indexed_db.OpenDBRequest.blockedEvent.forTarget(this);
    }
    get [dartx.onUpgradeNeeded]() {
      return indexed_db.OpenDBRequest.upgradeNeededEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.OpenDBRequest, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.OpenDBRequest, [])}),
    getters: () => ({
      [dartx.onBlocked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onUpgradeNeeded]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
    }),
    sfields: () => ({
      blockedEvent: EventStreamProviderOfEvent(),
      upgradeNeededEvent: EventStreamProviderOfVersionChangeEvent()
    })
  });
  dart.defineLazy(indexed_db.OpenDBRequest, {
    get blockedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blocked'));
    },
    get upgradeNeededEvent() {
      return dart.const(new (EventStreamProviderOfVersionChangeEvent())('upgradeneeded'));
    }
  });
  dart.registerExtension(dart.global.IDBOpenDBRequest, indexed_db.OpenDBRequest);
  dart.registerExtension(dart.global.IDBVersionChangeRequest, indexed_db.OpenDBRequest);
  dart.defineExtensionNames([
    'completed',
    'abort',
    'objectStore',
    'onAbort',
    'onComplete',
    'onError',
    'db',
    'error',
    'mode',
    'objectStoreNames'
  ]);
  indexed_db.Transaction = class Transaction extends html$.EventTarget {
    get [dartx.completed]() {
      let completer = CompleterOfDatabase().new();
      this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
        completer.complete(this[dartx.db]);
      }, EventTodynamic()));
      this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
        completer.completeError(e);
      }, EventTodynamic()));
      this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
        if (!dart.test(completer.isCompleted)) {
          completer.completeError(e);
        }
      }, EventTodynamic()));
      return completer.future;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.db]() {
      return this.db;
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    get [dartx.objectStoreNames]() {
      return this.objectStoreNames;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.objectStore](...args) {
      return this.objectStore.apply(this, args);
    }
    get [dartx.onAbort]() {
      return indexed_db.Transaction.abortEvent.forTarget(this);
    }
    get [dartx.onComplete]() {
      return indexed_db.Transaction.completeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return indexed_db.Transaction.errorEvent.forTarget(this);
    }
  };
  dart.setSignature(indexed_db.Transaction, {
    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Transaction, [])}),
    fields: () => ({
      [dartx.db]: indexed_db.Database,
      [dartx.error]: html$.DomError,
      [dartx.mode]: core.String,
      [dartx.objectStoreNames]: ListOfString()
    }),
    getters: () => ({
      [dartx.completed]: dart.definiteFunctionType(async.Future$(indexed_db.Database), []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.objectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfEvent(),
      completeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(indexed_db.Transaction, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get completeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('complete'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.registerExtension(dart.global.IDBTransaction, indexed_db.Transaction);
  const _createEvent = Symbol('_createEvent');
  const _initEvent = Symbol('_initEvent');
  const _selector = Symbol('_selector');
  const _get_currentTarget = Symbol('_get_currentTarget');
  const _get_target = Symbol('_get_target');
  dart.defineExtensionNames([
    'matchingTarget',
    'currentTarget',
    'target',
    'preventDefault',
    'stopImmediatePropagation',
    'stopPropagation',
    'bubbles',
    'cancelable',
    'defaultPrevented',
    'eventPhase',
    'path',
    'timeStamp',
    'type'
  ]);
  html$.Event = class Event extends _interceptors.Interceptor {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      return html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
    }
    static eventType(type, name, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let e = html$.document[_createEvent](type);
      e[_initEvent](name, canBubble, cancelable);
      return e;
    }
    get [_selector]() {
      return this._selector;
    }
    set [_selector](value) {
      this._selector = value;
    }
    get [dartx.matchingTarget]() {
      if (this[_selector] == null) {
        dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
      }
      let currentTarget = html$.Element._check(this[dartx.currentTarget]);
      let target = html$.Element._check(this[dartx.target]);
      let matchedTarget = null;
      do {
        if (dart.test(target[dartx.matches](this[_selector]))) return target;
        target = target[dartx.parent];
      } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
      dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.Event._create_1(type, eventInitDict_1);
      }
      return html$.Event._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new Event(type, eventInitDict);
    }
    static _create_2(type) {
      return new Event(type);
    }
    get [dartx.bubbles]() {
      return this.bubbles;
    }
    get [dartx.cancelable]() {
      return this.cancelable;
    }
    get [dartx.currentTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_currentTarget]);
    }
    get [_get_currentTarget]() {
      return this.currentTarget;
    }
    get [dartx.defaultPrevented]() {
      return this.defaultPrevented;
    }
    get [dartx.eventPhase]() {
      return this.eventPhase;
    }
    get [dartx.path]() {
      return this.path;
    }
    get [dartx.target]() {
      return html$._convertNativeToDart_EventTarget(this[_get_target]);
    }
    get [_get_target]() {
      return this.target;
    }
    get [dartx.timeStamp]() {
      return this.timeStamp;
    }
    get [dartx.type]() {
      return this.type;
    }
    [_initEvent](...args) {
      return this.initEvent.apply(this, args);
    }
    [dartx.preventDefault](...args) {
      return this.preventDefault.apply(this, args);
    }
    [dartx.stopImmediatePropagation](...args) {
      return this.stopImmediatePropagation.apply(this, args);
    }
    [dartx.stopPropagation](...args) {
      return this.stopPropagation.apply(this, args);
    }
  };
  dart.setSignature(html$.Event, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Event, [core.String], {canBubble: core.bool, cancelable: core.bool}),
      eventType: dart.definiteFunctionType(html$.Event, [core.String, core.String], {canBubble: core.bool, cancelable: core.bool}),
      _: dart.definiteFunctionType(html$.Event, [core.String], [core.Map])
    }),
    fields: () => ({
      [_selector]: core.String,
      [dartx.bubbles]: core.bool,
      [dartx.cancelable]: core.bool,
      [_get_currentTarget]: dart.dynamic,
      [dartx.defaultPrevented]: core.bool,
      [dartx.eventPhase]: core.int,
      [dartx.path]: ListOfEventTarget(),
      [_get_target]: dart.dynamic,
      [dartx.timeStamp]: core.int,
      [dartx.type]: core.String
    }),
    getters: () => ({
      [dartx.matchingTarget]: dart.definiteFunctionType(html$.Element, []),
      [dartx.currentTarget]: dart.definiteFunctionType(html$.EventTarget, []),
      [dartx.target]: dart.definiteFunctionType(html$.EventTarget, [])
    }),
    methods: () => ({
      [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
      [dartx.preventDefault]: dart.definiteFunctionType(dart.void, []),
      [dartx.stopImmediatePropagation]: dart.definiteFunctionType(dart.void, []),
      [dartx.stopPropagation]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      AT_TARGET: core.int,
      BUBBLING_PHASE: core.int,
      CAPTURING_PHASE: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.Event, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.Event, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.Event.AT_TARGET = 2;
  html$.Event.BUBBLING_PHASE = 3;
  html$.Event.CAPTURING_PHASE = 1;
  dart.registerExtension(dart.global.Event, html$.Event);
  dart.registerExtension(dart.global.InputEvent, html$.Event);
  dart.defineExtensionNames([
    'dataLoss',
    'dataLossMessage',
    'newVersion',
    'oldVersion'
  ]);
  indexed_db.VersionChangeEvent = class VersionChangeEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return indexed_db.VersionChangeEvent._create_1(type, eventInitDict_1);
      }
      return indexed_db.VersionChangeEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new IDBVersionChangeEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new IDBVersionChangeEvent(type);
    }
    get [dartx.dataLoss]() {
      return this.dataLoss;
    }
    get [dartx.dataLossMessage]() {
      return this.dataLossMessage;
    }
    get [dartx.newVersion]() {
      return this.newVersion;
    }
    get [dartx.oldVersion]() {
      return this.oldVersion;
    }
  };
  dart.setSignature(indexed_db.VersionChangeEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(indexed_db.VersionChangeEvent, []),
      new: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.dataLoss]: core.String,
      [dartx.dataLossMessage]: core.String,
      [dartx.newVersion]: core.int,
      [dartx.oldVersion]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.IDBVersionChangeEvent, indexed_db.VersionChangeEvent);
  dart.copyProperties(html$, {
    get window() {
      return window;
    }
  });
  dart.copyProperties(html$, {
    get document() {
      return document;
    }
  });
  const _xtag = Symbol('_xtag');
  const _attributes$ = Symbol('_attributes');
  const _innerHtml = Symbol('_innerHtml');
  const _scrollHeight = Symbol('_scrollHeight');
  const _scrollLeft = Symbol('_scrollLeft');
  const _scrollTop = Symbol('_scrollTop');
  const _scrollWidth = Symbol('_scrollWidth');
  const _childElementCount = Symbol('_childElementCount');
  const _children = Symbol('_children');
  const _firstElementChild = Symbol('_firstElementChild');
  const _lastElementChild = Symbol('_lastElementChild');
  const _querySelectorAll = Symbol('_querySelectorAll');
  const _getComputedStyle = Symbol('_getComputedStyle');
  const _animate = Symbol('_animate');
  const _localName = Symbol('_localName');
  const _namespaceUri = Symbol('_namespaceUri');
  const _scrollIntoView = Symbol('_scrollIntoView');
  const _scrollIntoViewIfNeeded = Symbol('_scrollIntoViewIfNeeded');
  const _insertAdjacentText = Symbol('_insertAdjacentText');
  const _insertAdjacentNode = Symbol('_insertAdjacentNode');
  const _insertAdjacentHtml = Symbol('_insertAdjacentHtml');
  const _insertAdjacentElement = Symbol('_insertAdjacentElement');
  const _canBeUsedToCreateContextualFragment = Symbol('_canBeUsedToCreateContextualFragment');
  const _cannotBeUsedToCreateContextualFragment = Symbol('_cannotBeUsedToCreateContextualFragment');
  const _getElementsByTagName = Symbol('_getElementsByTagName');
  const _hasAttribute = Symbol('_hasAttribute');
  const _hasAttributeNS = Symbol('_hasAttributeNS');
  const _removeAttribute = Symbol('_removeAttribute');
  const _removeAttributeNS = Symbol('_removeAttributeNS');
  const _scroll_1 = Symbol('_scroll_1');
  const _scroll_2 = Symbol('_scroll_2');
  const _scroll_3 = Symbol('_scroll_3');
  const _scrollBy_1 = Symbol('_scrollBy_1');
  const _scrollBy_2 = Symbol('_scrollBy_2');
  const _scrollBy_3 = Symbol('_scrollBy_3');
  const _scrollTo_1 = Symbol('_scrollTo_1');
  const _scrollTo_2 = Symbol('_scrollTo_2');
  const _scrollTo_3 = Symbol('_scrollTo_3');
  const _removeChild = Symbol('_removeChild');
  const _replaceChild = Symbol('_replaceChild');
  const _this = Symbol('_this');
  const _clearChildren = Symbol('_clearChildren');
  dart.defineExtensionNames([
    'nodes',
    'nodes',
    'remove',
    'replaceWith',
    'insertAllBefore',
    'toString',
    'append',
    'clone',
    'contains',
    'hasChildNodes',
    'insertBefore',
    'childNodes',
    'baseUri',
    'firstChild',
    'lastChild',
    'nextNode',
    'nodeName',
    'nodeType',
    'nodeValue',
    'ownerDocument',
    'parent',
    'parentNode',
    'previousNode',
    'text'
  ]);
  html$.Node = class Node extends html$.EventTarget {
    _created() {
      this[dartx.childNodes] = null;
      this[dartx.baseUri] = null;
      this[dartx.firstChild] = null;
      this[dartx.lastChild] = null;
      this[_localName] = null;
      this[_namespaceUri] = null;
      this[dartx.nextNode] = null;
      this[dartx.nodeName] = null;
      this[dartx.nodeType] = null;
      this[dartx.nodeValue] = null;
      this[dartx.ownerDocument] = null;
      this[dartx.parent] = null;
      this[dartx.parentNode] = null;
      this[dartx.previousNode] = null;
      this[dartx.text] = null;
      super._created();
    }
    get [dartx.nodes]() {
      return new html$._ChildNodeListLazy(this);
    }
    set [dartx.nodes](value) {
      let copy = value[dartx.toList]();
      this[dartx.text] = '';
      for (let node of copy) {
        this[dartx.append](node);
      }
    }
    [dartx.remove]() {
      if (this[dartx.parentNode] != null) {
        let parent = this[dartx.parentNode];
        this[dartx.parentNode][_removeChild](this);
      }
    }
    [dartx.replaceWith](otherNode) {
      try {
        let parent = this[dartx.parentNode];
        parent[_replaceChild](otherNode, this);
      } catch (e) {
      }

      ;
      return this;
    }
    [dartx.insertAllBefore](newNodes, refChild) {
      if (html$._ChildNodeListLazy.is(newNodes)) {
        let otherList = newNodes;
        if (core.identical(otherList[_this], this)) {
          dart.throw(new core.ArgumentError(newNodes));
        }
        for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
          this[dartx.insertBefore](otherList[_this][dartx.firstChild], refChild);
        }
      } else {
        for (let node of newNodes) {
          this[dartx.insertBefore](node, refChild);
        }
      }
    }
    [_clearChildren]() {
      while (this[dartx.firstChild] != null) {
        this[_removeChild](this[dartx.firstChild]);
      }
    }
    [dartx.toString]() {
      let value = this[dartx.nodeValue];
      return value == null ? super.toString() : value;
    }
    get [dartx.childNodes]() {
      return this.childNodes;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.baseUri]() {
      return this.baseURI;
    }
    get [dartx.firstChild]() {
      return this.firstChild;
    }
    get [dartx.lastChild]() {
      return this.lastChild;
    }
    get [_localName]() {
      return this.localName;
    }
    get [_namespaceUri]() {
      return this.namespaceURI;
    }
    get [dartx.nextNode]() {
      return this.nextSibling;
    }
    get [dartx.nodeName]() {
      return this.nodeName;
    }
    get [dartx.nodeType]() {
      return this.nodeType;
    }
    get [dartx.nodeValue]() {
      return this.nodeValue;
    }
    get [dartx.ownerDocument]() {
      return this.ownerDocument;
    }
    get [dartx.parent]() {
      return this.parentElement;
    }
    get [dartx.parentNode]() {
      return this.parentNode;
    }
    get [dartx.previousNode]() {
      return this.previousSibling;
    }
    get [dartx.text]() {
      return this.textContent;
    }
    set [dartx.text](value) {
      this.textContent = value;
    }
    [dartx.append](...args) {
      return this.appendChild.apply(this, args);
    }
    [dartx.clone](...args) {
      return this.cloneNode.apply(this, args);
    }
    [dartx.contains](...args) {
      return this.contains.apply(this, args);
    }
    [dartx.hasChildNodes](...args) {
      return this.hasChildNodes.apply(this, args);
    }
    [dartx.insertBefore](...args) {
      return this.insertBefore.apply(this, args);
    }
    [_removeChild](...args) {
      return this.removeChild.apply(this, args);
    }
    [_replaceChild](...args) {
      return this.replaceChild.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.Node, '_created');
  dart.setSignature(html$.Node, {
    constructors: () => ({
      _created: dart.definiteFunctionType(html$.Node, []),
      _: dart.definiteFunctionType(html$.Node, [])
    }),
    fields: () => ({
      [dartx.childNodes]: ListOfNode(),
      [dartx.baseUri]: core.String,
      [dartx.firstChild]: html$.Node,
      [dartx.lastChild]: html$.Node,
      [_localName]: core.String,
      [_namespaceUri]: core.String,
      [dartx.nextNode]: html$.Node,
      [dartx.nodeName]: core.String,
      [dartx.nodeType]: core.int,
      [dartx.nodeValue]: core.String,
      [dartx.ownerDocument]: html$.Document,
      [dartx.parent]: html$.Element,
      [dartx.parentNode]: html$.Node,
      [dartx.previousNode]: html$.Node,
      [dartx.text]: core.String
    }),
    getters: () => ({[dartx.nodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
    setters: () => ({[dartx.nodes]: dart.definiteFunctionType(dart.void, [IterableOfNode()])}),
    methods: () => ({
      [dartx.remove]: dart.definiteFunctionType(dart.void, []),
      [dartx.replaceWith]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [dartx.insertAllBefore]: dart.definiteFunctionType(html$.Node, [IterableOfNode(), html$.Node]),
      [_clearChildren]: dart.definiteFunctionType(dart.void, []),
      [dartx.append]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [dartx.clone]: dart.definiteFunctionType(html$.Node, [core.bool]),
      [dartx.contains]: dart.definiteFunctionType(core.bool, [html$.Node]),
      [dartx.hasChildNodes]: dart.definiteFunctionType(core.bool, []),
      [dartx.insertBefore]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node]),
      [_removeChild]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [_replaceChild]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node])
    }),
    sfields: () => ({
      ATTRIBUTE_NODE: core.int,
      CDATA_SECTION_NODE: core.int,
      COMMENT_NODE: core.int,
      DOCUMENT_FRAGMENT_NODE: core.int,
      DOCUMENT_NODE: core.int,
      DOCUMENT_TYPE_NODE: core.int,
      ELEMENT_NODE: core.int,
      ENTITY_NODE: core.int,
      ENTITY_REFERENCE_NODE: core.int,
      NOTATION_NODE: core.int,
      PROCESSING_INSTRUCTION_NODE: core.int,
      TEXT_NODE: core.int
    })
  });
  html$.Node.ATTRIBUTE_NODE = 2;
  html$.Node.CDATA_SECTION_NODE = 4;
  html$.Node.COMMENT_NODE = 8;
  html$.Node.DOCUMENT_FRAGMENT_NODE = 11;
  html$.Node.DOCUMENT_NODE = 9;
  html$.Node.DOCUMENT_TYPE_NODE = 10;
  html$.Node.ELEMENT_NODE = 1;
  html$.Node.ENTITY_NODE = 6;
  html$.Node.ENTITY_REFERENCE_NODE = 5;
  html$.Node.NOTATION_NODE = 12;
  html$.Node.PROCESSING_INSTRUCTION_NODE = 7;
  html$.Node.TEXT_NODE = 3;
  dart.registerExtension(dart.global.Node, html$.Node);
  dart.defineExtensionNames([
    'attributes',
    'attributes',
    'children',
    'children',
    'querySelectorAll',
    'query',
    'queryAll',
    'classes',
    'classes',
    'dataset',
    'dataset',
    'getNamespacedAttributes',
    'getComputedStyle',
    'client',
    'offset',
    'appendText',
    'appendHtml',
    'attached',
    'detached',
    'enteredView',
    'leftView',
    'animate',
    'attributeChanged',
    'xtag',
    'xtag',
    'localName',
    'namespaceUri',
    'toString',
    'scrollIntoView',
    'insertAdjacentText',
    'insertAdjacentHtml',
    'insertAdjacentElement',
    'matches',
    'matchesWithAncestors',
    'createShadowRoot',
    'shadowRoot',
    'contentEdge',
    'paddingEdge',
    'borderEdge',
    'marginEdge',
    'documentOffset',
    'offsetTo',
    'createFragment',
    'innerHtml',
    'setInnerHtml',
    'innerHtml',
    'on',
    'offsetHeight',
    'offsetLeft',
    'offsetTop',
    'offsetWidth',
    'scrollHeight',
    'scrollLeft',
    'scrollLeft',
    'scrollTop',
    'scrollTop',
    'scrollWidth',
    'isContentEditable',
    'blur',
    'click',
    'focus',
    'outerHtml',
    'closest',
    'getAnimations',
    'getAttribute',
    'getAttributeNS',
    'getBoundingClientRect',
    'getClientRects',
    'getDestinationInsertionPoints',
    'getElementsByClassName',
    'requestFullscreen',
    'requestPointerLock',
    'scroll',
    'scrollBy',
    'scrollTo',
    'setAttribute',
    'setAttributeNS',
    'after',
    'before',
    'querySelector',
    'onAbort',
    'onBeforeCopy',
    'onBeforeCut',
    'onBeforePaste',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onCopy',
    'onCut',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPaste',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSearch',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onSelectStart',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onTouchCancel',
    'onTouchEnd',
    'onTouchEnter',
    'onTouchLeave',
    'onTouchMove',
    'onTouchStart',
    'onTransitionEnd',
    'onVolumeChange',
    'onWaiting',
    'onFullscreenChange',
    'onFullscreenError',
    'offsetParent',
    'contentEditable',
    'contextMenu',
    'dir',
    'draggable',
    'hidden',
    'lang',
    'spellcheck',
    'style',
    'tabIndex',
    'title',
    'translate',
    'dropzone',
    'className',
    'clientHeight',
    'clientLeft',
    'clientTop',
    'clientWidth',
    'computedName',
    'computedRole',
    'id',
    'tagName',
    'nextElementSibling',
    'previousElementSibling'
  ]);
  html$.Element = class Element extends html$.Node {
    static html(html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      let fragment = html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      return html$.Element._check(fragment[dartx.nodes][dartx.where](dart.fn(e => html$.Element.is(e), NodeTobool$()))[dartx.single]);
    }
    created() {
      this[_xtag] = null;
      this[dartx.offsetParent] = null;
      this[dartx.contentEditable] = null;
      this[dartx.contextMenu] = null;
      this[dartx.dir] = null;
      this[dartx.draggable] = null;
      this[dartx.hidden] = null;
      this[dartx.lang] = null;
      this[dartx.spellcheck] = null;
      this[dartx.style] = null;
      this[dartx.tabIndex] = null;
      this[dartx.title] = null;
      this[dartx.translate] = null;
      this[dartx.dropzone] = null;
      this[_attributes$] = null;
      this[dartx.className] = null;
      this[dartx.clientHeight] = null;
      this[dartx.clientLeft] = null;
      this[dartx.clientTop] = null;
      this[dartx.clientWidth] = null;
      this[dartx.computedName] = null;
      this[dartx.computedRole] = null;
      this[dartx.id] = null;
      this[_innerHtml] = null;
      this[_scrollHeight] = null;
      this[_scrollLeft] = null;
      this[_scrollTop] = null;
      this[_scrollWidth] = null;
      this[dartx.tagName] = null;
      this[dartx.nextElementSibling] = null;
      this[dartx.previousElementSibling] = null;
      this[_childElementCount] = null;
      this[_children] = null;
      this[_firstElementChild] = null;
      this[_lastElementChild] = null;
      super._created();
    }
    static tag(tag, typeExtention) {
      if (typeExtention === void 0) typeExtention = null;
      return html$.Element._check(html$._ElementFactoryProvider.createElement_tag(tag, typeExtention));
    }
    static a() {
      return html$.Element.tag('a');
    }
    static article() {
      return html$.Element.tag('article');
    }
    static aside() {
      return html$.Element.tag('aside');
    }
    static audio() {
      return html$.Element.tag('audio');
    }
    static br() {
      return html$.Element.tag('br');
    }
    static canvas() {
      return html$.Element.tag('canvas');
    }
    static div() {
      return html$.Element.tag('div');
    }
    static footer() {
      return html$.Element.tag('footer');
    }
    static header() {
      return html$.Element.tag('header');
    }
    static hr() {
      return html$.Element.tag('hr');
    }
    static iframe() {
      return html$.Element.tag('iframe');
    }
    static img() {
      return html$.Element.tag('img');
    }
    static li() {
      return html$.Element.tag('li');
    }
    static nav() {
      return html$.Element.tag('nav');
    }
    static ol() {
      return html$.Element.tag('ol');
    }
    static option() {
      return html$.Element.tag('option');
    }
    static p() {
      return html$.Element.tag('p');
    }
    static pre() {
      return html$.Element.tag('pre');
    }
    static section() {
      return html$.Element.tag('section');
    }
    static select() {
      return html$.Element.tag('select');
    }
    static span() {
      return html$.Element.tag('span');
    }
    static svg() {
      return html$.Element.tag('svg');
    }
    static table() {
      return html$.Element.tag('table');
    }
    static td() {
      return html$.Element.tag('td');
    }
    static textarea() {
      return html$.Element.tag('textarea');
    }
    static th() {
      return html$.Element.tag('th');
    }
    static tr() {
      return html$.Element.tag('tr');
    }
    static ul() {
      return html$.Element.tag('ul');
    }
    static video() {
      return html$.Element.tag('video');
    }
    get [dartx.attributes]() {
      return new html$._ElementAttributeMap(this);
    }
    set [dartx.attributes](value) {
      let attributes = this[dartx.attributes];
      attributes[dartx.clear]();
      for (let key of value[dartx.keys]) {
        attributes[dartx._set](key, value[dartx._get](key));
      }
    }
    get [dartx.children]() {
      return new html$._ChildrenElementList._wrap(this);
    }
    set [dartx.children](value) {
      let copy = value[dartx.toList]();
      let children = this[dartx.children];
      children[dartx.clear]();
      children[dartx.addAll](copy);
    }
    [dartx.querySelectorAll](T) {
      return selectors => {
        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
      };
    }
    [dartx.query](relativeSelectors) {
      return this[dartx.querySelector](relativeSelectors);
    }
    [dartx.queryAll](T) {
      return relativeSelectors => {
        return this[dartx.querySelectorAll](T)(relativeSelectors);
      };
    }
    get [dartx.classes]() {
      return new html$._ElementCssClassSet(this);
    }
    set [dartx.classes](value) {
      let classSet = this[dartx.classes];
      classSet.clear();
      classSet.addAll(value);
    }
    get [dartx.dataset]() {
      return new html$._DataAttributeMap(this[dartx.attributes]);
    }
    set [dartx.dataset](value) {
      let data = this[dartx.dataset];
      data[dartx.clear]();
      for (let key of value[dartx.keys]) {
        data[dartx._set](key, value[dartx._get](key));
      }
    }
    [dartx.getNamespacedAttributes](namespace) {
      return new html$._NamespacedAttributeMap(this, namespace);
    }
    [dartx.getComputedStyle](pseudoElement) {
      if (pseudoElement === void 0) pseudoElement = null;
      if (pseudoElement == null) {
        pseudoElement = '';
      }
      return html$.window[_getComputedStyle](this, pseudoElement);
    }
    get [dartx.client]() {
      return new (RectangleOfint())(this[dartx.clientLeft], this[dartx.clientTop], this[dartx.clientWidth], this[dartx.clientHeight]);
    }
    get [dartx.offset]() {
      return new (RectangleOfint())(this[dartx.offsetLeft], this[dartx.offsetTop], this[dartx.offsetWidth], this[dartx.offsetHeight]);
    }
    [dartx.appendText](text) {
      this[dartx.append](html$.Text.new(text));
    }
    [dartx.appendHtml](text, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.insertAdjacentHtml]('beforeend', text, {validator: validator, treeSanitizer: treeSanitizer});
    }
    static isTagSupported(tag) {
      let e = html$._ElementFactoryProvider.createElement_tag(tag, null);
      return html$.Element.is(e) && !html$.UnknownElement.is(e);
    }
    [dartx.attached]() {
      this[dartx.enteredView]();
    }
    [dartx.detached]() {
      this[dartx.leftView]();
    }
    [dartx.enteredView]() {}
    [dartx.leftView]() {}
    [dartx.animate](frames, timing) {
      if (timing === void 0) timing = null;
      if (!core.Iterable.is(frames) || !dart.test(frames[dartx.every](dart.fn(x => core.Map.is(x), MapOfString$dynamicTobool())))) {
        dart.throw(new core.ArgumentError("The frames parameter should be a List of Maps " + "with frame information"));
      }
      let convertedFrames = null;
      if (core.Iterable.is(frames)) {
        convertedFrames = frames[dartx.map](dart.dynamic)(html_common.convertDartToNative_Dictionary)[dartx.toList]();
      } else {
        convertedFrames = frames;
      }
      let convertedTiming = core.Map.is(timing) ? html_common.convertDartToNative_Dictionary(timing) : timing;
      return convertedTiming == null ? this[_animate](convertedFrames) : this[_animate](convertedFrames, convertedTiming);
    }
    [_animate](...args) {
      return this.animate.apply(this, args);
    }
    [dartx.attributeChanged](name, oldValue, newValue) {}
    get [_xtag]() {
      return this._xtag;
    }
    set [_xtag](value) {
      this._xtag = value;
    }
    get [dartx.xtag]() {
      return this[_xtag] != null ? this[_xtag] : this;
    }
    set [dartx.xtag](value) {
      this[_xtag] = value;
    }
    get [dartx.localName]() {
      return this[_localName];
    }
    get [dartx.namespaceUri]() {
      return this[_namespaceUri];
    }
    [dartx.toString]() {
      return this[dartx.localName];
    }
    [dartx.scrollIntoView](alignment) {
      if (alignment === void 0) alignment = null;
      let hasScrollIntoViewIfNeeded = true;
      hasScrollIntoViewIfNeeded = !!this.scrollIntoViewIfNeeded;
      if (dart.equals(alignment, html$.ScrollAlignment.TOP)) {
        this[_scrollIntoView](true);
      } else if (dart.equals(alignment, html$.ScrollAlignment.BOTTOM)) {
        this[_scrollIntoView](false);
      } else if (hasScrollIntoViewIfNeeded) {
        if (dart.equals(alignment, html$.ScrollAlignment.CENTER)) {
          this[_scrollIntoViewIfNeeded](true);
        } else {
          this[_scrollIntoViewIfNeeded]();
        }
      } else {
        this[_scrollIntoView]();
      }
    }
    static _determineMouseWheelEventType(e) {
      return 'wheel';
    }
    static _determineTransitionEventType(e) {
      if (dart.test(html_common.Device.isWebKit)) {
        return 'webkitTransitionEnd';
      } else if (dart.test(html_common.Device.isOpera)) {
        return 'oTransitionEnd';
      }
      return 'transitionend';
    }
    [dartx.insertAdjacentText](where, text) {
      if (!!this.insertAdjacentText) {
        this[_insertAdjacentText](where, text);
      } else {
        this[_insertAdjacentNode](where, html$.Text.new(text));
      }
    }
    [_insertAdjacentText](...args) {
      return this.insertAdjacentText.apply(this, args);
    }
    [dartx.insertAdjacentHtml](where, html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
        this[_insertAdjacentHtml](where, html);
      } else {
        this[_insertAdjacentNode](where, this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
      }
    }
    [_insertAdjacentHtml](...args) {
      return this.insertAdjacentHTML.apply(this, args);
    }
    [dartx.insertAdjacentElement](where, element) {
      if (!!this.insertAdjacentElement) {
        this[_insertAdjacentElement](where, element);
      } else {
        this[_insertAdjacentNode](where, element);
      }
      return element;
    }
    [_insertAdjacentElement](...args) {
      return this.insertAdjacentElement.apply(this, args);
    }
    [_insertAdjacentNode](where, node) {
      switch (where[dartx.toLowerCase]()) {
        case 'beforebegin':
        {
          this[dartx.parentNode][dartx.insertBefore](node, this);
          break;
        }
        case 'afterbegin':
        {
          let first = dart.notNull(this[dartx.nodes][dartx.length]) > 0 ? this[dartx.nodes][dartx._get](0) : null;
          this[dartx.insertBefore](node, first);
          break;
        }
        case 'beforeend':
        {
          this[dartx.append](node);
          break;
        }
        case 'afterend':
        {
          this[dartx.parentNode][dartx.insertBefore](node, this[dartx.nextNode]);
          break;
        }
        default:
        {
          dart.throw(new core.ArgumentError(dart.str`Invalid position ${where}`));
        }
      }
    }
    [dartx.matches](selectors) {
      if (!!this.matches) {
        return this.matches(selectors);
      } else if (!!this.webkitMatchesSelector) {
        return this.webkitMatchesSelector(selectors);
      } else if (!!this.mozMatchesSelector) {
        return this.mozMatchesSelector(selectors);
      } else if (!!this.msMatchesSelector) {
        return this.msMatchesSelector(selectors);
      } else if (!!this.oMatchesSelector) {
        return this.oMatchesSelector(selectors);
      } else {
        dart.throw(new core.UnsupportedError("Not supported on this platform"));
      }
    }
    [dartx.matchesWithAncestors](selectors) {
      let elem = this;
      do {
        if (dart.test(elem[dartx.matches](selectors))) return true;
        elem = elem[dartx.parent];
      } while (elem != null);
      return false;
    }
    [dartx.createShadowRoot]() {
      return (this.createShadowRoot || this.webkitCreateShadowRoot).call(this);
    }
    get [dartx.shadowRoot]() {
      return this.shadowRoot || this.webkitShadowRoot;
    }
    get [dartx.contentEdge]() {
      return new html$._ContentCssRect(this);
    }
    get [dartx.paddingEdge]() {
      return new html$._PaddingCssRect(this);
    }
    get [dartx.borderEdge]() {
      return new html$._BorderCssRect(this);
    }
    get [dartx.marginEdge]() {
      return new html$._MarginCssRect(this);
    }
    get [dartx.documentOffset]() {
      return this[dartx.offsetTo](html$.document[dartx.documentElement]);
    }
    [dartx.offsetTo](parent) {
      return html$.Element._offsetToHelper(this, parent);
    }
    static _offsetToHelper(current, parent) {
      let sameAsParent = core.identical(current, parent);
      let foundAsParent = sameAsParent || parent[dartx.tagName] == 'HTML';
      if (current == null || sameAsParent) {
        if (foundAsParent) return new (PointOfnum())(0, 0);
        dart.throw(new core.ArgumentError("Specified element is not a transitive offset " + "parent of this element."));
      }
      let parentOffset = current[dartx.offsetParent];
      let p = html$.Element._offsetToHelper(parentOffset, parent);
      return new (PointOfnum())(dart.notNull(p.x) + dart.notNull(current[dartx.offsetLeft]), dart.notNull(p.y) + dart.notNull(current[dartx.offsetTop]));
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (treeSanitizer == null) {
        if (validator == null) {
          if (html$.Element._defaultValidator == null) {
            html$.Element._defaultValidator = new html$.NodeValidatorBuilder.common();
          }
          validator = html$.Element._defaultValidator;
        }
        if (html$.Element._defaultSanitizer == null) {
          html$.Element._defaultSanitizer = new html$._ValidatingTreeSanitizer(validator);
        } else {
          html$.Element._defaultSanitizer.validator = validator;
        }
        treeSanitizer = html$.Element._defaultSanitizer;
      } else if (validator != null) {
        dart.throw(new core.ArgumentError('validator can only be passed if treeSanitizer is null'));
      }
      if (html$.Element._parseDocument == null) {
        html$.Element._parseDocument = html$.document[dartx.implementation][dartx.createHtmlDocument]('');
        html$.Element._parseRange = html$.Element._parseDocument[dartx.createRange]();
        let base = html$.BaseElement._check(html$.Element._parseDocument[dartx.createElement]('base'));
        base[dartx.href] = html$.document[dartx.baseUri];
        html$.Element._parseDocument[dartx.head][dartx.append](base);
      }
      let contextElement = null;
      if (html$.BodyElement.is(this)) {
        contextElement = html$.Element._parseDocument[dartx.body];
      } else {
        contextElement = html$.Element._parseDocument[dartx.createElement](this[dartx.tagName]);
        html$.Element._parseDocument[dartx.body][dartx.append](html$.Node._check(contextElement));
      }
      let fragment = null;
      if (dart.test(html$.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
        html$.Element._parseRange[dartx.selectNodeContents](html$.Node._check(contextElement));
        fragment = html$.Element._parseRange[dartx.createContextualFragment](html);
      } else {
        dart.dput(contextElement, _innerHtml, html);
        fragment = html$.Element._parseDocument[dartx.createDocumentFragment]();
        while (dart.dload(contextElement, 'firstChild') != null) {
          dart.dsend(fragment, 'append', dart.dload(contextElement, 'firstChild'));
        }
      }
      if (!dart.equals(contextElement, html$.Element._parseDocument[dartx.body])) {
        dart.dsend(contextElement, 'remove');
      }
      treeSanitizer.sanitizeTree(html$.Node._check(fragment));
      html$.document[dartx.adoptNode](html$.Node._check(fragment));
      return html$.DocumentFragment._check(fragment);
    }
    get [_canBeUsedToCreateContextualFragment]() {
      return !dart.test(this[_cannotBeUsedToCreateContextualFragment]);
    }
    get [_cannotBeUsedToCreateContextualFragment]() {
      return html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported[dartx.contains](this[dartx.tagName]);
    }
    set [dartx.innerHtml](html) {
      this[dartx.setInnerHtml](html);
    }
    [dartx.setInnerHtml](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.text] = null;
      if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
        this[_innerHtml] = html;
      } else {
        this[dartx.append](this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
      }
    }
    get [dartx.innerHtml]() {
      return this[_innerHtml];
    }
    get [dartx.on]() {
      return new html$.ElementEvents(this);
    }
    static _hasCorruptedAttributes(element) {
      return (function(element) {
        if (!(element.attributes instanceof NamedNodeMap)) {
          return true;
        }
        var childNodes = element.childNodes;
        if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1]) {
          return true;
        }
        if (element.children) {
          if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList)) {
            return true;
          }
        }
        var length = 0;
        if (element.children) {
          length = element.children.length;
        }
        for (var i = 0; i < length; i++) {
          var child = element.children[i];
          if (child.id == 'attributes' || child.name == 'attributes' || child.id == 'lastChild' || child.name == 'lastChild' || child.id == 'children' || child.name == 'children') {
            return true;
          }
        }
        return false;
      })(element);
    }
    static _hasCorruptedAttributesAdditionalCheck(element) {
      return !(element.attributes instanceof NamedNodeMap);
    }
    static _safeTagName(element) {
      let result = 'element tag unavailable';
      try {
        if (typeof dart.dload(element, 'tagName') == 'string') {
          result = core.String._check(dart.dload(element, 'tagName'));
        }
      } catch (e) {
      }

      return result;
    }
    get [dartx.offsetParent]() {
      return this.offsetParent;
    }
    get [dartx.offsetHeight]() {
      return this.offsetHeight[dartx.round]();
    }
    get [dartx.offsetLeft]() {
      return this.offsetLeft[dartx.round]();
    }
    get [dartx.offsetTop]() {
      return this.offsetTop[dartx.round]();
    }
    get [dartx.offsetWidth]() {
      return this.offsetWidth[dartx.round]();
    }
    get [dartx.scrollHeight]() {
      return this.scrollHeight[dartx.round]();
    }
    get [dartx.scrollLeft]() {
      return this.scrollLeft[dartx.round]();
    }
    set [dartx.scrollLeft](value) {
      this.scrollLeft = value[dartx.round]();
    }
    get [dartx.scrollTop]() {
      return this.scrollTop[dartx.round]();
    }
    set [dartx.scrollTop](value) {
      this.scrollTop = value[dartx.round]();
    }
    get [dartx.scrollWidth]() {
      return this.scrollWidth[dartx.round]();
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.contentEditable]() {
      return this.contentEditable;
    }
    set [dartx.contentEditable](value) {
      this.contentEditable = value;
    }
    get [dartx.contextMenu]() {
      return this.contextMenu;
    }
    set [dartx.contextMenu](value) {
      this.contextMenu = value;
    }
    get [dartx.dir]() {
      return this.dir;
    }
    set [dartx.dir](value) {
      this.dir = value;
    }
    get [dartx.draggable]() {
      return this.draggable;
    }
    set [dartx.draggable](value) {
      this.draggable = value;
    }
    get [dartx.hidden]() {
      return this.hidden;
    }
    set [dartx.hidden](value) {
      this.hidden = value;
    }
    get [dartx.isContentEditable]() {
      return this.isContentEditable;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    set [dartx.lang](value) {
      this.lang = value;
    }
    get [dartx.spellcheck]() {
      return this.spellcheck;
    }
    set [dartx.spellcheck](value) {
      this.spellcheck = value;
    }
    get [dartx.style]() {
      return this.style;
    }
    get [dartx.tabIndex]() {
      return this.tabIndex;
    }
    set [dartx.tabIndex](value) {
      this.tabIndex = value;
    }
    get [dartx.title]() {
      return this.title;
    }
    set [dartx.title](value) {
      this.title = value;
    }
    get [dartx.translate]() {
      return this.translate;
    }
    set [dartx.translate](value) {
      this.translate = value;
    }
    get [dartx.dropzone]() {
      return this.webkitdropzone;
    }
    set [dartx.dropzone](value) {
      this.webkitdropzone = value;
    }
    [dartx.blur](...args) {
      return this.blur.apply(this, args);
    }
    [dartx.click](...args) {
      return this.click.apply(this, args);
    }
    [dartx.focus](...args) {
      return this.focus.apply(this, args);
    }
    get [_attributes$]() {
      return this.attributes;
    }
    get [dartx.className]() {
      return this.className;
    }
    set [dartx.className](value) {
      this.className = value;
    }
    get [dartx.clientHeight]() {
      return this.clientHeight;
    }
    get [dartx.clientLeft]() {
      return this.clientLeft;
    }
    get [dartx.clientTop]() {
      return this.clientTop;
    }
    get [dartx.clientWidth]() {
      return this.clientWidth;
    }
    get [dartx.computedName]() {
      return this.computedName;
    }
    get [dartx.computedRole]() {
      return this.computedRole;
    }
    get [dartx.id]() {
      return this.id;
    }
    set [dartx.id](value) {
      this.id = value;
    }
    get [_innerHtml]() {
      return this.innerHTML;
    }
    set [_innerHtml](value) {
      this.innerHTML = value;
    }
    get [dartx.outerHtml]() {
      return this.outerHTML;
    }
    get [_scrollHeight]() {
      return this.scrollHeight;
    }
    get [_scrollLeft]() {
      return this.scrollLeft;
    }
    set [_scrollLeft](value) {
      this.scrollLeft = value;
    }
    get [_scrollTop]() {
      return this.scrollTop;
    }
    set [_scrollTop](value) {
      this.scrollTop = value;
    }
    get [_scrollWidth]() {
      return this.scrollWidth;
    }
    get [dartx.tagName]() {
      return this.tagName;
    }
    [dartx.closest](...args) {
      return this.closest.apply(this, args);
    }
    [dartx.getAnimations](...args) {
      return this.getAnimations.apply(this, args);
    }
    [dartx.getAttribute](...args) {
      return this.getAttribute.apply(this, args);
    }
    [dartx.getAttributeNS](...args) {
      return this.getAttributeNS.apply(this, args);
    }
    [dartx.getBoundingClientRect](...args) {
      return this.getBoundingClientRect.apply(this, args);
    }
    [dartx.getClientRects](...args) {
      return this.getClientRects.apply(this, args);
    }
    [dartx.getDestinationInsertionPoints](...args) {
      return this.getDestinationInsertionPoints.apply(this, args);
    }
    [dartx.getElementsByClassName](...args) {
      return this.getElementsByClassName.apply(this, args);
    }
    [_getElementsByTagName](...args) {
      return this.getElementsByTagName.apply(this, args);
    }
    [_hasAttribute](...args) {
      return this.hasAttribute.apply(this, args);
    }
    [_hasAttributeNS](...args) {
      return this.hasAttributeNS.apply(this, args);
    }
    [_removeAttribute](...args) {
      return this.removeAttribute.apply(this, args);
    }
    [_removeAttributeNS](...args) {
      return this.removeAttributeNS.apply(this, args);
    }
    [dartx.requestFullscreen](...args) {
      return this.requestFullscreen.apply(this, args);
    }
    [dartx.requestPointerLock](...args) {
      return this.requestPointerLock.apply(this, args);
    }
    [dartx.scroll](options_OR_x, y) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (options_OR_x == null && y == null) {
        this[_scroll_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scroll_2](options_1);
        return;
      }
      if (y != null && typeof options_OR_x == 'number') {
        this[_scroll_3](options_OR_x, y);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scroll_1](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_2](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_3](...args) {
      return this.scroll.apply(this, args);
    }
    [dartx.scrollBy](options_OR_x, y) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (options_OR_x == null && y == null) {
        this[_scrollBy_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollBy_2](options_1);
        return;
      }
      if (y != null && typeof options_OR_x == 'number') {
        this[_scrollBy_3](options_OR_x, y);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollBy_1](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_2](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_3](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollIntoView](...args) {
      return this.scrollIntoView.apply(this, args);
    }
    [_scrollIntoViewIfNeeded](...args) {
      return this.scrollIntoViewIfNeeded.apply(this, args);
    }
    [dartx.scrollTo](options_OR_x, y) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (options_OR_x == null && y == null) {
        this[_scrollTo_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollTo_2](options_1);
        return;
      }
      if (y != null && typeof options_OR_x == 'number') {
        this[_scrollTo_3](options_OR_x, y);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollTo_1](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_2](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_3](...args) {
      return this.scrollTo.apply(this, args);
    }
    [dartx.setAttribute](...args) {
      return this.setAttribute.apply(this, args);
    }
    [dartx.setAttributeNS](...args) {
      return this.setAttributeNS.apply(this, args);
    }
    [dartx.after](...args) {
      return this.after.apply(this, args);
    }
    [dartx.before](...args) {
      return this.before.apply(this, args);
    }
    get [dartx.nextElementSibling]() {
      return this.nextElementSibling;
    }
    get [dartx.previousElementSibling]() {
      return this.previousElementSibling;
    }
    get [_childElementCount]() {
      return this.childElementCount;
    }
    get [_children]() {
      return this.children;
    }
    get [_firstElementChild]() {
      return this.firstElementChild;
    }
    get [_lastElementChild]() {
      return this.lastElementChild;
    }
    [dartx.querySelector](...args) {
      return this.querySelector.apply(this, args);
    }
    [_querySelectorAll](...args) {
      return this.querySelectorAll.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.Element.abortEvent.forElement(this);
    }
    get [dartx.onBeforeCopy]() {
      return html$.Element.beforeCopyEvent.forElement(this);
    }
    get [dartx.onBeforeCut]() {
      return html$.Element.beforeCutEvent.forElement(this);
    }
    get [dartx.onBeforePaste]() {
      return html$.Element.beforePasteEvent.forElement(this);
    }
    get [dartx.onBlur]() {
      return html$.Element.blurEvent.forElement(this);
    }
    get [dartx.onCanPlay]() {
      return html$.Element.canPlayEvent.forElement(this);
    }
    get [dartx.onCanPlayThrough]() {
      return html$.Element.canPlayThroughEvent.forElement(this);
    }
    get [dartx.onChange]() {
      return html$.Element.changeEvent.forElement(this);
    }
    get [dartx.onClick]() {
      return html$.Element.clickEvent.forElement(this);
    }
    get [dartx.onContextMenu]() {
      return html$.Element.contextMenuEvent.forElement(this);
    }
    get [dartx.onCopy]() {
      return html$.Element.copyEvent.forElement(this);
    }
    get [dartx.onCut]() {
      return html$.Element.cutEvent.forElement(this);
    }
    get [dartx.onDoubleClick]() {
      return html$.Element.doubleClickEvent.forElement(this);
    }
    get [dartx.onDrag]() {
      return html$.Element.dragEvent.forElement(this);
    }
    get [dartx.onDragEnd]() {
      return html$.Element.dragEndEvent.forElement(this);
    }
    get [dartx.onDragEnter]() {
      return html$.Element.dragEnterEvent.forElement(this);
    }
    get [dartx.onDragLeave]() {
      return html$.Element.dragLeaveEvent.forElement(this);
    }
    get [dartx.onDragOver]() {
      return html$.Element.dragOverEvent.forElement(this);
    }
    get [dartx.onDragStart]() {
      return html$.Element.dragStartEvent.forElement(this);
    }
    get [dartx.onDrop]() {
      return html$.Element.dropEvent.forElement(this);
    }
    get [dartx.onDurationChange]() {
      return html$.Element.durationChangeEvent.forElement(this);
    }
    get [dartx.onEmptied]() {
      return html$.Element.emptiedEvent.forElement(this);
    }
    get [dartx.onEnded]() {
      return html$.Element.endedEvent.forElement(this);
    }
    get [dartx.onError]() {
      return html$.Element.errorEvent.forElement(this);
    }
    get [dartx.onFocus]() {
      return html$.Element.focusEvent.forElement(this);
    }
    get [dartx.onInput]() {
      return html$.Element.inputEvent.forElement(this);
    }
    get [dartx.onInvalid]() {
      return html$.Element.invalidEvent.forElement(this);
    }
    get [dartx.onKeyDown]() {
      return html$.Element.keyDownEvent.forElement(this);
    }
    get [dartx.onKeyPress]() {
      return html$.Element.keyPressEvent.forElement(this);
    }
    get [dartx.onKeyUp]() {
      return html$.Element.keyUpEvent.forElement(this);
    }
    get [dartx.onLoad]() {
      return html$.Element.loadEvent.forElement(this);
    }
    get [dartx.onLoadedData]() {
      return html$.Element.loadedDataEvent.forElement(this);
    }
    get [dartx.onLoadedMetadata]() {
      return html$.Element.loadedMetadataEvent.forElement(this);
    }
    get [dartx.onMouseDown]() {
      return html$.Element.mouseDownEvent.forElement(this);
    }
    get [dartx.onMouseEnter]() {
      return html$.Element.mouseEnterEvent.forElement(this);
    }
    get [dartx.onMouseLeave]() {
      return html$.Element.mouseLeaveEvent.forElement(this);
    }
    get [dartx.onMouseMove]() {
      return html$.Element.mouseMoveEvent.forElement(this);
    }
    get [dartx.onMouseOut]() {
      return html$.Element.mouseOutEvent.forElement(this);
    }
    get [dartx.onMouseOver]() {
      return html$.Element.mouseOverEvent.forElement(this);
    }
    get [dartx.onMouseUp]() {
      return html$.Element.mouseUpEvent.forElement(this);
    }
    get [dartx.onMouseWheel]() {
      return html$.Element.mouseWheelEvent.forElement(this);
    }
    get [dartx.onPaste]() {
      return html$.Element.pasteEvent.forElement(this);
    }
    get [dartx.onPause]() {
      return html$.Element.pauseEvent.forElement(this);
    }
    get [dartx.onPlay]() {
      return html$.Element.playEvent.forElement(this);
    }
    get [dartx.onPlaying]() {
      return html$.Element.playingEvent.forElement(this);
    }
    get [dartx.onRateChange]() {
      return html$.Element.rateChangeEvent.forElement(this);
    }
    get [dartx.onReset]() {
      return html$.Element.resetEvent.forElement(this);
    }
    get [dartx.onResize]() {
      return html$.Element.resizeEvent.forElement(this);
    }
    get [dartx.onScroll]() {
      return html$.Element.scrollEvent.forElement(this);
    }
    get [dartx.onSearch]() {
      return html$.Element.searchEvent.forElement(this);
    }
    get [dartx.onSeeked]() {
      return html$.Element.seekedEvent.forElement(this);
    }
    get [dartx.onSeeking]() {
      return html$.Element.seekingEvent.forElement(this);
    }
    get [dartx.onSelect]() {
      return html$.Element.selectEvent.forElement(this);
    }
    get [dartx.onSelectStart]() {
      return html$.Element.selectStartEvent.forElement(this);
    }
    get [dartx.onStalled]() {
      return html$.Element.stalledEvent.forElement(this);
    }
    get [dartx.onSubmit]() {
      return html$.Element.submitEvent.forElement(this);
    }
    get [dartx.onSuspend]() {
      return html$.Element.suspendEvent.forElement(this);
    }
    get [dartx.onTimeUpdate]() {
      return html$.Element.timeUpdateEvent.forElement(this);
    }
    get [dartx.onTouchCancel]() {
      return html$.Element.touchCancelEvent.forElement(this);
    }
    get [dartx.onTouchEnd]() {
      return html$.Element.touchEndEvent.forElement(this);
    }
    get [dartx.onTouchEnter]() {
      return html$.Element.touchEnterEvent.forElement(this);
    }
    get [dartx.onTouchLeave]() {
      return html$.Element.touchLeaveEvent.forElement(this);
    }
    get [dartx.onTouchMove]() {
      return html$.Element.touchMoveEvent.forElement(this);
    }
    get [dartx.onTouchStart]() {
      return html$.Element.touchStartEvent.forElement(this);
    }
    get [dartx.onTransitionEnd]() {
      return html$.Element.transitionEndEvent.forElement(this);
    }
    get [dartx.onVolumeChange]() {
      return html$.Element.volumeChangeEvent.forElement(this);
    }
    get [dartx.onWaiting]() {
      return html$.Element.waitingEvent.forElement(this);
    }
    get [dartx.onFullscreenChange]() {
      return html$.Element.fullscreenChangeEvent.forElement(this);
    }
    get [dartx.onFullscreenError]() {
      return html$.Element.fullscreenErrorEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(html$.Element, 'created');
  html$.Element[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.GlobalEventHandlers, html$.ParentNode, html$.ChildNode];
  dart.setSignature(html$.Element, {
    constructors: () => ({
      html: dart.definiteFunctionType(html$.Element, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      created: dart.definiteFunctionType(html$.Element, []),
      tag: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
      a: dart.definiteFunctionType(html$.Element, []),
      article: dart.definiteFunctionType(html$.Element, []),
      aside: dart.definiteFunctionType(html$.Element, []),
      audio: dart.definiteFunctionType(html$.Element, []),
      br: dart.definiteFunctionType(html$.Element, []),
      canvas: dart.definiteFunctionType(html$.Element, []),
      div: dart.definiteFunctionType(html$.Element, []),
      footer: dart.definiteFunctionType(html$.Element, []),
      header: dart.definiteFunctionType(html$.Element, []),
      hr: dart.definiteFunctionType(html$.Element, []),
      iframe: dart.definiteFunctionType(html$.Element, []),
      img: dart.definiteFunctionType(html$.Element, []),
      li: dart.definiteFunctionType(html$.Element, []),
      nav: dart.definiteFunctionType(html$.Element, []),
      ol: dart.definiteFunctionType(html$.Element, []),
      option: dart.definiteFunctionType(html$.Element, []),
      p: dart.definiteFunctionType(html$.Element, []),
      pre: dart.definiteFunctionType(html$.Element, []),
      section: dart.definiteFunctionType(html$.Element, []),
      select: dart.definiteFunctionType(html$.Element, []),
      span: dart.definiteFunctionType(html$.Element, []),
      svg: dart.definiteFunctionType(html$.Element, []),
      table: dart.definiteFunctionType(html$.Element, []),
      td: dart.definiteFunctionType(html$.Element, []),
      textarea: dart.definiteFunctionType(html$.Element, []),
      th: dart.definiteFunctionType(html$.Element, []),
      tr: dart.definiteFunctionType(html$.Element, []),
      ul: dart.definiteFunctionType(html$.Element, []),
      video: dart.definiteFunctionType(html$.Element, []),
      _: dart.definiteFunctionType(html$.Element, [])
    }),
    fields: () => ({
      [_xtag]: html$.Element,
      [dartx.offsetParent]: html$.Element,
      [dartx.contentEditable]: core.String,
      [dartx.contextMenu]: html$.MenuElement,
      [dartx.dir]: core.String,
      [dartx.draggable]: core.bool,
      [dartx.hidden]: core.bool,
      [dartx.lang]: core.String,
      [dartx.spellcheck]: core.bool,
      [dartx.style]: html$.CssStyleDeclaration,
      [dartx.tabIndex]: core.int,
      [dartx.title]: core.String,
      [dartx.translate]: core.bool,
      [dartx.dropzone]: core.String,
      [_attributes$]: html$._NamedNodeMap,
      [dartx.className]: core.String,
      [dartx.clientHeight]: core.int,
      [dartx.clientLeft]: core.int,
      [dartx.clientTop]: core.int,
      [dartx.clientWidth]: core.int,
      [dartx.computedName]: core.String,
      [dartx.computedRole]: core.String,
      [dartx.id]: core.String,
      [_innerHtml]: core.String,
      [_scrollHeight]: core.int,
      [_scrollLeft]: core.num,
      [_scrollTop]: core.num,
      [_scrollWidth]: core.int,
      [dartx.tagName]: core.String,
      [dartx.nextElementSibling]: html$.Element,
      [dartx.previousElementSibling]: html$.Element,
      [_childElementCount]: core.int,
      [_children]: ListOfNode(),
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    }),
    getters: () => ({
      [dartx.attributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
      [dartx.classes]: dart.definiteFunctionType(html$.CssClassSet, []),
      [dartx.dataset]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      [dartx.client]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.offset]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.xtag]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.localName]: dart.definiteFunctionType(core.String, []),
      [dartx.namespaceUri]: dart.definiteFunctionType(core.String, []),
      [dartx.shadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
      [dartx.contentEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.paddingEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.borderEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.marginEdge]: dart.definiteFunctionType(html$.CssRect, []),
      [dartx.documentOffset]: dart.definiteFunctionType(math.Point$(core.num), []),
      [_canBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
      [_cannotBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
      [dartx.innerHtml]: dart.definiteFunctionType(core.String, []),
      [dartx.on]: dart.definiteFunctionType(html$.ElementEvents, []),
      [dartx.offsetHeight]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetLeft]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetTop]: dart.definiteFunctionType(core.int, []),
      [dartx.offsetWidth]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollHeight]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollLeft]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollTop]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollWidth]: dart.definiteFunctionType(core.int, []),
      [dartx.isContentEditable]: dart.definiteFunctionType(core.bool, []),
      [dartx.outerHtml]: dart.definiteFunctionType(core.String, []),
      [dartx.onAbort]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBeforeCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBeforeCut]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBeforePaste]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onBlur]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onCanPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onCanPlayThrough]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onClick]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onContextMenu]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      [dartx.onCut]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      [dartx.onDoubleClick]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onDrag]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDragStart]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDrop]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onDurationChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onEmptied]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onFocus]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onInput]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onInvalid]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onKeyDown]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      [dartx.onKeyPress]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      [dartx.onKeyUp]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onLoadedData]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onLoadedMetadata]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onMouseDown]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseMove]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseOut]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseUp]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
      [dartx.onMouseWheel]: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
      [dartx.onPaste]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
      [dartx.onPause]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onPlaying]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onRateChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onReset]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onResize]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onScroll]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSearch]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSeeked]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSeeking]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSelect]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSelectStart]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onStalled]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSubmit]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onSuspend]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onTimeUpdate]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onTouchCancel]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchMove]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTouchStart]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
      [dartx.onTransitionEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
      [dartx.onVolumeChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onWaiting]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onFullscreenChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onFullscreenError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
    }),
    setters: () => ({
      [dartx.attributes]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
      [dartx.classes]: dart.definiteFunctionType(dart.void, [IterableOfString()]),
      [dartx.dataset]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      [dartx.xtag]: dart.definiteFunctionType(dart.void, [html$.Element]),
      [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.scrollLeft]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.scrollTop]: dart.definiteFunctionType(dart.void, [core.int])
    }),
    methods: () => ({
      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.getNamespacedAttributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String]),
      [dartx.getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [], [core.String]),
      [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.attached]: dart.definiteFunctionType(dart.void, []),
      [dartx.detached]: dart.definiteFunctionType(dart.void, []),
      [dartx.enteredView]: dart.definiteFunctionType(dart.void, []),
      [dartx.leftView]: dart.definiteFunctionType(dart.void, []),
      [dartx.animate]: dart.definiteFunctionType(html$.Animation, [IterableOfMapOfString$dynamic()], [dart.dynamic]),
      [_animate]: dart.definiteFunctionType(html$.Animation, [core.Object], [dart.dynamic]),
      [dartx.attributeChanged]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.scrollIntoView]: dart.definiteFunctionType(dart.void, [], [html$.ScrollAlignment]),
      [dartx.insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [_insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [_insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.insertAdjacentElement]: dart.definiteFunctionType(html$.Element, [core.String, html$.Element]),
      [_insertAdjacentElement]: dart.definiteFunctionType(dart.void, [core.String, html$.Element]),
      [_insertAdjacentNode]: dart.definiteFunctionType(dart.void, [core.String, html$.Node]),
      [dartx.matches]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.matchesWithAncestors]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.createShadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
      [dartx.offsetTo]: dart.definiteFunctionType(math.Point$(core.num), [html$.Element]),
      [dartx.createFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.blur]: dart.definiteFunctionType(dart.void, []),
      [dartx.click]: dart.definiteFunctionType(dart.void, []),
      [dartx.focus]: dart.definiteFunctionType(dart.void, []),
      [dartx.closest]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
      [dartx.getAttribute]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.getAttributeNS]: dart.definiteFunctionType(core.String, [core.String, core.String]),
      [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
      [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
      [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [_getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [_hasAttribute]: dart.definiteFunctionType(core.bool, [core.String]),
      [_hasAttributeNS]: dart.definiteFunctionType(core.bool, [core.String, core.String]),
      [_removeAttribute]: dart.definiteFunctionType(dart.void, [core.String]),
      [_removeAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.requestFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.requestPointerLock]: dart.definiteFunctionType(dart.void, []),
      [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
      [_scroll_1]: dart.definiteFunctionType(dart.void, []),
      [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
      [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
      [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
      [_scrollIntoView]: dart.definiteFunctionType(dart.void, [], [core.bool]),
      [_scrollIntoViewIfNeeded]: dart.definiteFunctionType(dart.void, [], [core.bool]),
      [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
      [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
      [dartx.setAttribute]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.setAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
      [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object]),
      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
    }),
    sfields: () => ({
      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
      transitionEndEvent: EventStreamProviderOfTransitionEvent(),
      _parseDocument: html$.HtmlDocument,
      _parseRange: html$.Range,
      _defaultValidator: html$.NodeValidatorBuilder,
      _defaultSanitizer: html$._ValidatingTreeSanitizer,
      _tagsForWhichCreateContextualFragmentIsNotSupported: ListOfString(),
      abortEvent: EventStreamProviderOfEvent(),
      beforeCopyEvent: EventStreamProviderOfEvent(),
      beforeCutEvent: EventStreamProviderOfEvent(),
      beforePasteEvent: EventStreamProviderOfEvent(),
      blurEvent: EventStreamProviderOfEvent(),
      canPlayEvent: EventStreamProviderOfEvent(),
      canPlayThroughEvent: EventStreamProviderOfEvent(),
      changeEvent: EventStreamProviderOfEvent(),
      clickEvent: EventStreamProviderOfMouseEvent(),
      contextMenuEvent: EventStreamProviderOfMouseEvent(),
      copyEvent: EventStreamProviderOfClipboardEvent(),
      cutEvent: EventStreamProviderOfClipboardEvent(),
      doubleClickEvent: EventStreamProviderOfEvent(),
      dragEvent: EventStreamProviderOfMouseEvent(),
      dragEndEvent: EventStreamProviderOfMouseEvent(),
      dragEnterEvent: EventStreamProviderOfMouseEvent(),
      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
      dragOverEvent: EventStreamProviderOfMouseEvent(),
      dragStartEvent: EventStreamProviderOfMouseEvent(),
      dropEvent: EventStreamProviderOfMouseEvent(),
      durationChangeEvent: EventStreamProviderOfEvent(),
      emptiedEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      inputEvent: EventStreamProviderOfEvent(),
      invalidEvent: EventStreamProviderOfEvent(),
      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      loadedDataEvent: EventStreamProviderOfEvent(),
      loadedMetadataEvent: EventStreamProviderOfEvent(),
      mouseDownEvent: EventStreamProviderOfMouseEvent(),
      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
      mouseOutEvent: EventStreamProviderOfMouseEvent(),
      mouseOverEvent: EventStreamProviderOfMouseEvent(),
      mouseUpEvent: EventStreamProviderOfMouseEvent(),
      pasteEvent: EventStreamProviderOfClipboardEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      playEvent: EventStreamProviderOfEvent(),
      playingEvent: EventStreamProviderOfEvent(),
      rateChangeEvent: EventStreamProviderOfEvent(),
      resetEvent: EventStreamProviderOfEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      searchEvent: EventStreamProviderOfEvent(),
      seekedEvent: EventStreamProviderOfEvent(),
      seekingEvent: EventStreamProviderOfEvent(),
      selectEvent: EventStreamProviderOfEvent(),
      selectStartEvent: EventStreamProviderOfEvent(),
      stalledEvent: EventStreamProviderOfEvent(),
      submitEvent: EventStreamProviderOfEvent(),
      suspendEvent: EventStreamProviderOfEvent(),
      timeUpdateEvent: EventStreamProviderOfEvent(),
      touchCancelEvent: EventStreamProviderOfTouchEvent(),
      touchEndEvent: EventStreamProviderOfTouchEvent(),
      touchEnterEvent: EventStreamProviderOfTouchEvent(),
      touchLeaveEvent: EventStreamProviderOfTouchEvent(),
      touchMoveEvent: EventStreamProviderOfTouchEvent(),
      touchStartEvent: EventStreamProviderOfTouchEvent(),
      volumeChangeEvent: EventStreamProviderOfEvent(),
      waitingEvent: EventStreamProviderOfEvent(),
      fullscreenChangeEvent: EventStreamProviderOfEvent(),
      fullscreenErrorEvent: EventStreamProviderOfEvent()
    }),
    statics: () => ({
      isTagSupported: dart.definiteFunctionType(core.bool, [core.String]),
      _determineMouseWheelEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
      _determineTransitionEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
      _offsetToHelper: dart.definiteFunctionType(math.Point$(core.num), [html$.Element, html$.Element]),
      _hasCorruptedAttributes: dart.definiteFunctionType(core.bool, [html$.Element]),
      _hasCorruptedAttributesAdditionalCheck: dart.definiteFunctionType(core.bool, [html$.Element]),
      _safeTagName: dart.definiteFunctionType(core.String, [dart.dynamic])
    }),
    names: ['isTagSupported', '_determineMouseWheelEventType', '_determineTransitionEventType', '_offsetToHelper', '_hasCorruptedAttributes', '_hasCorruptedAttributesAdditionalCheck', '_safeTagName']
  });
  html$.Element._parseDocument = null;
  html$.Element._parseRange = null;
  html$.Element._defaultValidator = null;
  html$.Element._defaultSanitizer = null;
  html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported = dart.constList(['HEAD', 'AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET', 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM', 'SOURCE', 'STYLE', 'TITLE', 'WBR'], core.String);
  dart.defineLazy(html$.Element, {
    get mouseWheelEvent() {
      return dart.const(new (_CustomEventStreamProviderOfWheelEvent())(html$.Element._determineMouseWheelEventType));
    },
    get transitionEndEvent() {
      return dart.const(new (_CustomEventStreamProviderOfTransitionEvent())(html$.Element._determineTransitionEventType));
    },
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get beforeCopyEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('beforecopy'));
    },
    get beforeCutEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('beforecut'));
    },
    get beforePasteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('beforepaste'));
    },
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get canPlayEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
    },
    get canPlayThroughEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    },
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
    },
    get contextMenuEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
    },
    get copyEvent() {
      return dart.const(new (EventStreamProviderOfClipboardEvent())('copy'));
    },
    get cutEvent() {
      return dart.const(new (EventStreamProviderOfClipboardEvent())('cut'));
    },
    get doubleClickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
    },
    get dragEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
    },
    get dragEndEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
    },
    get dragEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
    },
    get dragLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
    },
    get dragOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
    },
    get dragStartEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
    },
    get dropEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
    },
    get durationChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
    },
    get emptiedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get inputEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('input'));
    },
    get invalidEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
    },
    get keyDownEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
    },
    get keyPressEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
    },
    get keyUpEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get loadedDataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
    },
    get loadedMetadataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
    },
    get mouseDownEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
    },
    get mouseEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
    },
    get mouseLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
    },
    get mouseMoveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
    },
    get mouseOutEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
    },
    get mouseOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
    },
    get mouseUpEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
    },
    get pasteEvent() {
      return dart.const(new (EventStreamProviderOfClipboardEvent())('paste'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get playEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('play'));
    },
    get playingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('playing'));
    },
    get rateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
    },
    get resetEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('reset'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get searchEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('search'));
    },
    get seekedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
    },
    get seekingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
    },
    get selectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('select'));
    },
    get selectStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('selectstart'));
    },
    get stalledEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
    },
    get submitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('submit'));
    },
    get suspendEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
    },
    get timeUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
    },
    get touchCancelEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchcancel'));
    },
    get touchEndEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchend'));
    },
    get touchEnterEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchenter'));
    },
    get touchLeaveEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchleave'));
    },
    get touchMoveEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchmove'));
    },
    get touchStartEvent() {
      return dart.const(new (EventStreamProviderOfTouchEvent())('touchstart'));
    },
    get volumeChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
    },
    get waitingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
    },
    get fullscreenChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenchange'));
    },
    get fullscreenErrorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenerror'));
    }
  });
  dart.registerExtension(dart.global.Element, html$.Element);
  html$.HtmlElement = class HtmlElement extends html$.Element {
    static new() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HtmlElement, 'created');
  dart.setSignature(html$.HtmlElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.HtmlElement, []),
      created: dart.definiteFunctionType(html$.HtmlElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLElement, html$.HtmlElement);
  html$._EntryArray = class _EntryArray extends core.Object {};
  html$._EntryArray[dart.implements] = () => [ListOfEntry()];
  dart.registerExtension(dart.global.EntryArray, html$._EntryArray);
  html$.spawnDomUri = function(uri, args, message) {
    dart.throw(new core.UnimplementedError());
  };
  dart.fn(html$.spawnDomUri, UriAndListOfStringAnddynamicToFutureOfIsolate());
  html$.createCustomUpgrader = function(customElementClass, $this) {
    return $this;
  };
  dart.fn(html$.createCustomUpgrader, TypeAnddynamicTodynamic());
  dart.defineExtensionNames([
    'onError'
  ]);
  html$.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onError() {
      return html$.AbstractWorker.errorEvent.forTarget(this);
    }
  };
  html$.AbstractWorker[dart.implements] = () => [html$.EventTarget];
  dart.setSignature(html$.AbstractWorker, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AbstractWorker, [])}),
    getters: () => ({onError: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({errorEvent: EventStreamProviderOfEvent()})
  });
  dart.defineExtensionMembers(html$.AbstractWorker, ['onError']);
  dart.defineLazy(html$.AbstractWorker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.defineExtensionNames([
    'toString',
    'download',
    'hreflang',
    'rel',
    'target',
    'type',
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.AnchorElement = class AnchorElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(opts) {
      let href = opts && 'href' in opts ? opts.href : null;
      let e = html$.AnchorElement._check(html$.document[dartx.createElement]("a"));
      if (href != null) e[dartx.href] = href;
      return e;
    }
    created() {
      this[dartx.download] = null;
      this[dartx.hreflang] = null;
      this[dartx.rel] = null;
      this[dartx.target] = null;
      this[dartx.type] = null;
      this[dartx.hash] = null;
      this[dartx.host] = null;
      this[dartx.hostname] = null;
      this[dartx.href] = null;
      this[dartx.origin] = null;
      this[dartx.password] = null;
      this[dartx.pathname] = null;
      this[dartx.port] = null;
      this[dartx.protocol] = null;
      this[dartx.search] = null;
      this[dartx.username] = null;
      super.created();
    }
    get [dartx.download]() {
      return this.download;
    }
    set [dartx.download](value) {
      this.download = value;
    }
    get [dartx.hreflang]() {
      return this.hreflang;
    }
    set [dartx.hreflang](value) {
      this.hreflang = value;
    }
    get [dartx.rel]() {
      return this.rel;
    }
    set [dartx.rel](value) {
      this.rel = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.password]() {
      return this.password;
    }
    set [dartx.password](value) {
      this.password = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    get [dartx.username]() {
      return this.username;
    }
    set [dartx.username](value) {
      this.username = value;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  dart.defineNamedConstructor(html$.AnchorElement, 'created');
  html$.AnchorElement[dart.implements] = () => [html$.UrlUtils];
  dart.setSignature(html$.AnchorElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AnchorElement, []),
      new: dart.definiteFunctionType(html$.AnchorElement, [], {href: core.String}),
      created: dart.definiteFunctionType(html$.AnchorElement, [])
    }),
    fields: () => ({
      [dartx.download]: core.String,
      [dartx.hreflang]: core.String,
      [dartx.rel]: core.String,
      [dartx.target]: core.String,
      [dartx.type]: core.String,
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.origin]: core.String,
      [dartx.password]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String,
      [dartx.username]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLAnchorElement, html$.AnchorElement);
  dart.defineExtensionNames([
    'cancel',
    'finish',
    'pause',
    'play',
    'reverse',
    'currentTime',
    'effect',
    'endClip',
    'finished',
    'playState',
    'playbackRate',
    'ready',
    'startClip',
    'startTime'
  ]);
  html$.Animation = class Animation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!document.body.animate;
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.effect]() {
      return this.effect;
    }
    set [dartx.effect](value) {
      this.effect = value;
    }
    get [dartx.endClip]() {
      return this.endClip;
    }
    set [dartx.endClip](value) {
      this.endClip = value;
    }
    get [dartx.finished]() {
      return this.finished;
    }
    get [dartx.playState]() {
      return this.playState;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    get [dartx.ready]() {
      return this.ready;
    }
    get [dartx.startClip]() {
      return this.startClip;
    }
    set [dartx.startClip](value) {
      this.startClip = value;
    }
    get [dartx.startTime]() {
      return this.startTime;
    }
    set [dartx.startTime](value) {
      this.startTime = value;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.finish](...args) {
      return this.finish.apply(this, args);
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
    [dartx.reverse](...args) {
      return this.reverse.apply(this, args);
    }
  };
  dart.setSignature(html$.Animation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Animation, [])}),
    fields: () => ({
      [dartx.currentTime]: core.num,
      [dartx.effect]: html$.AnimationEffectReadOnly,
      [dartx.endClip]: core.num,
      [dartx.finished]: async.Future,
      [dartx.playState]: core.String,
      [dartx.playbackRate]: core.num,
      [dartx.ready]: async.Future,
      [dartx.startClip]: core.num,
      [dartx.startTime]: core.num
    }),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
      [dartx.finish]: dart.definiteFunctionType(dart.void, []),
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.play]: dart.definiteFunctionType(dart.void, []),
      [dartx.reverse]: dart.definiteFunctionType(dart.void, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.Animation, html$.Animation);
  const _get_computedTiming = Symbol('_get_computedTiming');
  dart.defineExtensionNames([
    'computedTiming',
    'timing'
  ]);
  html$.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.computedTiming]() {
      return html_common.convertNativeToDart_Dictionary(this[_get_computedTiming]);
    }
    get [_get_computedTiming]() {
      return this.computedTiming;
    }
    get [dartx.timing]() {
      return this.timing;
    }
  };
  dart.setSignature(html$.AnimationEffectReadOnly, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectReadOnly, [])}),
    fields: () => ({
      [_get_computedTiming]: dart.dynamic,
      [dartx.timing]: html$.AnimationEffectTiming
    }),
    getters: () => ({[dartx.computedTiming]: dart.definiteFunctionType(core.Map, [])})
  });
  dart.registerExtension(dart.global.AnimationEffectReadOnly, html$.AnimationEffectReadOnly);
  dart.defineExtensionNames([
    'delay',
    'direction',
    'duration',
    'easing',
    'endDelay',
    'fill',
    'iterationStart',
    'iterations',
    'playbackRate'
  ]);
  html$.AnimationEffectTiming = class AnimationEffectTiming extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.delay]() {
      return this.delay;
    }
    set [dartx.delay](value) {
      this.delay = value;
    }
    get [dartx.direction]() {
      return this.direction;
    }
    set [dartx.direction](value) {
      this.direction = value;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    set [dartx.duration](value) {
      this.duration = value;
    }
    get [dartx.easing]() {
      return this.easing;
    }
    set [dartx.easing](value) {
      this.easing = value;
    }
    get [dartx.endDelay]() {
      return this.endDelay;
    }
    set [dartx.endDelay](value) {
      this.endDelay = value;
    }
    get [dartx.fill]() {
      return this.fill;
    }
    set [dartx.fill](value) {
      this.fill = value;
    }
    get [dartx.iterationStart]() {
      return this.iterationStart;
    }
    set [dartx.iterationStart](value) {
      this.iterationStart = value;
    }
    get [dartx.iterations]() {
      return this.iterations;
    }
    set [dartx.iterations](value) {
      this.iterations = value;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
  };
  dart.setSignature(html$.AnimationEffectTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectTiming, [])}),
    fields: () => ({
      [dartx.delay]: core.num,
      [dartx.direction]: core.String,
      [dartx.duration]: core.Object,
      [dartx.easing]: core.String,
      [dartx.endDelay]: core.num,
      [dartx.fill]: core.String,
      [dartx.iterationStart]: core.num,
      [dartx.iterations]: core.num,
      [dartx.playbackRate]: core.num
    })
  });
  dart.registerExtension(dart.global.AnimationEffectTiming, html$.AnimationEffectTiming);
  dart.defineExtensionNames([
    'animationName',
    'elapsedTime'
  ]);
  html$.AnimationEvent = class AnimationEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.AnimationEvent._create_1(type, eventInitDict_1);
      }
      return html$.AnimationEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new AnimationEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new AnimationEvent(type);
    }
    get [dartx.animationName]() {
      return this.animationName;
    }
    get [dartx.elapsedTime]() {
      return this.elapsedTime;
    }
  };
  dart.setSignature(html$.AnimationEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AnimationEvent, []),
      new: dart.definiteFunctionType(html$.AnimationEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.animationName]: core.String,
      [dartx.elapsedTime]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.AnimationEvent, html$.AnimationEvent);
  dart.defineExtensionNames([
    'currentTime',
    'timelineTime'
  ]);
  html$.AnimationPlayerEvent = class AnimationPlayerEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.AnimationPlayerEvent._create_1(type, eventInitDict_1);
      }
      return html$.AnimationPlayerEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new AnimationPlayerEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new AnimationPlayerEvent(type);
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    get [dartx.timelineTime]() {
      return this.timelineTime;
    }
  };
  dart.setSignature(html$.AnimationPlayerEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AnimationPlayerEvent, []),
      new: dart.definiteFunctionType(html$.AnimationPlayerEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.currentTime]: core.double,
      [dartx.timelineTime]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.AnimationPlayerEvent, html$.AnimationPlayerEvent);
  dart.defineExtensionNames([
    'getAnimations',
    'play',
    'currentTime',
    'playbackRate'
  ]);
  html$.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    [dartx.getAnimations](...args) {
      return this.getAnimations.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
  };
  dart.setSignature(html$.AnimationTimeline, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationTimeline, [])}),
    fields: () => ({
      [dartx.currentTime]: core.num,
      [dartx.playbackRate]: core.num
    }),
    methods: () => ({
      [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
      [dartx.play]: dart.definiteFunctionType(html$.Animation, [html$.AnimationEffectReadOnly])
    })
  });
  dart.registerExtension(dart.global.AnimationTimeline, html$.AnimationTimeline);
  dart.defineExtensionNames([
    'outcome',
    'platform'
  ]);
  html$.AppBannerPromptResult = class AppBannerPromptResult extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.outcome]() {
      return this.outcome;
    }
    get [dartx.platform]() {
      return this.platform;
    }
  };
  dart.setSignature(html$.AppBannerPromptResult, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AppBannerPromptResult, [])}),
    fields: () => ({
      [dartx.outcome]: core.String,
      [dartx.platform]: core.String
    })
  });
  dart.registerExtension(dart.global.AppBannerPromptResult, html$.AppBannerPromptResult);
  dart.defineExtensionNames([
    'abort',
    'swapCache',
    'update',
    'onCached',
    'onChecking',
    'onDownloading',
    'onError',
    'onNoUpdate',
    'onObsolete',
    'onProgress',
    'onUpdateReady',
    'status'
  ]);
  html$.ApplicationCache = class ApplicationCache extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.applicationCache;
    }
    get [dartx.status]() {
      return this.status;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.swapCache](...args) {
      return this.swapCache.apply(this, args);
    }
    [dartx.update](...args) {
      return this.update.apply(this, args);
    }
    get [dartx.onCached]() {
      return html$.ApplicationCache.cachedEvent.forTarget(this);
    }
    get [dartx.onChecking]() {
      return html$.ApplicationCache.checkingEvent.forTarget(this);
    }
    get [dartx.onDownloading]() {
      return html$.ApplicationCache.downloadingEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.ApplicationCache.errorEvent.forTarget(this);
    }
    get [dartx.onNoUpdate]() {
      return html$.ApplicationCache.noUpdateEvent.forTarget(this);
    }
    get [dartx.onObsolete]() {
      return html$.ApplicationCache.obsoleteEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.ApplicationCache.progressEvent.forTarget(this);
    }
    get [dartx.onUpdateReady]() {
      return html$.ApplicationCache.updateReadyEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ApplicationCache, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ApplicationCache, [])}),
    fields: () => ({[dartx.status]: core.int}),
    getters: () => ({
      [dartx.onCached]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onChecking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onDownloading]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onNoUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onObsolete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onUpdateReady]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.swapCache]: dart.definiteFunctionType(dart.void, []),
      [dartx.update]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      cachedEvent: EventStreamProviderOfEvent(),
      checkingEvent: EventStreamProviderOfEvent(),
      downloadingEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      noUpdateEvent: EventStreamProviderOfEvent(),
      obsoleteEvent: EventStreamProviderOfEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      updateReadyEvent: EventStreamProviderOfEvent(),
      CHECKING: core.int,
      DOWNLOADING: core.int,
      IDLE: core.int,
      OBSOLETE: core.int,
      UNCACHED: core.int,
      UPDATEREADY: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  html$.ApplicationCache.CHECKING = 2;
  html$.ApplicationCache.DOWNLOADING = 3;
  html$.ApplicationCache.IDLE = 1;
  html$.ApplicationCache.OBSOLETE = 5;
  html$.ApplicationCache.UNCACHED = 0;
  html$.ApplicationCache.UPDATEREADY = 4;
  dart.defineLazy(html$.ApplicationCache, {
    get cachedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('cached'));
    },
    get checkingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('checking'));
    },
    get downloadingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('downloading'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get noUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('noupdate'));
    },
    get obsoleteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('obsolete'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    },
    get updateReadyEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('updateready'));
    }
  });
  dart.registerExtension(dart.global.ApplicationCache, html$.ApplicationCache);
  dart.registerExtension(dart.global.DOMApplicationCache, html$.ApplicationCache);
  dart.registerExtension(dart.global.OfflineResourceList, html$.ApplicationCache);
  dart.defineExtensionNames([
    'message',
    'reason',
    'status',
    'url'
  ]);
  html$.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
      }
      return html$.ApplicationCacheErrorEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ApplicationCacheErrorEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ApplicationCacheErrorEvent(type);
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.reason]() {
      return this.reason;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.url]() {
      return this.url;
    }
  };
  dart.setSignature(html$.ApplicationCacheErrorEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, []),
      new: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.message]: core.String,
      [dartx.reason]: core.String,
      [dartx.status]: core.int,
      [dartx.url]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ApplicationCacheErrorEvent, html$.ApplicationCacheErrorEvent);
  dart.defineExtensionNames([
    'toString',
    'alt',
    'coords',
    'shape',
    'target',
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.AreaElement = class AreaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.AreaElement._check(html$.document[dartx.createElement]("area"));
    }
    created() {
      this[dartx.alt] = null;
      this[dartx.coords] = null;
      this[dartx.shape] = null;
      this[dartx.target] = null;
      this[dartx.hash] = null;
      this[dartx.host] = null;
      this[dartx.hostname] = null;
      this[dartx.href] = null;
      this[dartx.origin] = null;
      this[dartx.password] = null;
      this[dartx.pathname] = null;
      this[dartx.port] = null;
      this[dartx.protocol] = null;
      this[dartx.search] = null;
      this[dartx.username] = null;
      super.created();
    }
    get [dartx.alt]() {
      return this.alt;
    }
    set [dartx.alt](value) {
      this.alt = value;
    }
    get [dartx.coords]() {
      return this.coords;
    }
    set [dartx.coords](value) {
      this.coords = value;
    }
    get [dartx.shape]() {
      return this.shape;
    }
    set [dartx.shape](value) {
      this.shape = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.password]() {
      return this.password;
    }
    set [dartx.password](value) {
      this.password = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    get [dartx.username]() {
      return this.username;
    }
    set [dartx.username](value) {
      this.username = value;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  dart.defineNamedConstructor(html$.AreaElement, 'created');
  html$.AreaElement[dart.implements] = () => [html$.UrlUtils];
  dart.setSignature(html$.AreaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AreaElement, []),
      new: dart.definiteFunctionType(html$.AreaElement, []),
      created: dart.definiteFunctionType(html$.AreaElement, [])
    }),
    fields: () => ({
      [dartx.alt]: core.String,
      [dartx.coords]: core.String,
      [dartx.shape]: core.String,
      [dartx.target]: core.String,
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.origin]: core.String,
      [dartx.password]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String,
      [dartx.username]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLAreaElement, html$.AreaElement);
  dart.defineExtensionNames([
    'addTextTrack',
    'canPlayType',
    'load',
    'pause',
    'play',
    'setMediaKeys',
    'setSinkId',
    'addKey',
    'cancelKeyRequest',
    'generateKeyRequest',
    'onKeyAdded',
    'onKeyError',
    'onKeyMessage',
    'onNeedKey',
    'audioTracks',
    'autoplay',
    'buffered',
    'controller',
    'controls',
    'crossOrigin',
    'currentSrc',
    'currentTime',
    'defaultMuted',
    'defaultPlaybackRate',
    'duration',
    'ended',
    'error',
    'loop',
    'mediaGroup',
    'mediaKeys',
    'muted',
    'networkState',
    'paused',
    'playbackRate',
    'played',
    'preload',
    'readyState',
    'seekable',
    'seeking',
    'session',
    'sinkId',
    'src',
    'textTracks',
    'videoTracks',
    'volume',
    'audioDecodedByteCount',
    'videoDecodedByteCount'
  ]);
  html$.MediaElement = class MediaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.audioTracks] = null;
      this[dartx.autoplay] = null;
      this[dartx.buffered] = null;
      this[dartx.controller] = null;
      this[dartx.controls] = null;
      this[dartx.crossOrigin] = null;
      this[dartx.currentSrc] = null;
      this[dartx.currentTime] = null;
      this[dartx.defaultMuted] = null;
      this[dartx.defaultPlaybackRate] = null;
      this[dartx.duration] = null;
      this[dartx.ended] = null;
      this[dartx.error] = null;
      this[dartx.loop] = null;
      this[dartx.mediaGroup] = null;
      this[dartx.mediaKeys] = null;
      this[dartx.muted] = null;
      this[dartx.networkState] = null;
      this[dartx.paused] = null;
      this[dartx.playbackRate] = null;
      this[dartx.played] = null;
      this[dartx.preload] = null;
      this[dartx.readyState] = null;
      this[dartx.seekable] = null;
      this[dartx.seeking] = null;
      this[dartx.session] = null;
      this[dartx.sinkId] = null;
      this[dartx.src] = null;
      this[dartx.textTracks] = null;
      this[dartx.videoTracks] = null;
      this[dartx.volume] = null;
      this[dartx.audioDecodedByteCount] = null;
      this[dartx.videoDecodedByteCount] = null;
      super.created();
    }
    get [dartx.audioTracks]() {
      return this.audioTracks;
    }
    get [dartx.autoplay]() {
      return this.autoplay;
    }
    set [dartx.autoplay](value) {
      this.autoplay = value;
    }
    get [dartx.buffered]() {
      return this.buffered;
    }
    get [dartx.controller]() {
      return this.controller;
    }
    set [dartx.controller](value) {
      this.controller = value;
    }
    get [dartx.controls]() {
      return this.controls;
    }
    set [dartx.controls](value) {
      this.controls = value;
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.currentSrc]() {
      return this.currentSrc;
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.defaultMuted]() {
      return this.defaultMuted;
    }
    set [dartx.defaultMuted](value) {
      this.defaultMuted = value;
    }
    get [dartx.defaultPlaybackRate]() {
      return this.defaultPlaybackRate;
    }
    set [dartx.defaultPlaybackRate](value) {
      this.defaultPlaybackRate = value;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.ended]() {
      return this.ended;
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.loop]() {
      return this.loop;
    }
    set [dartx.loop](value) {
      this.loop = value;
    }
    get [dartx.mediaGroup]() {
      return this.mediaGroup;
    }
    set [dartx.mediaGroup](value) {
      this.mediaGroup = value;
    }
    get [dartx.mediaKeys]() {
      return this.mediaKeys;
    }
    get [dartx.muted]() {
      return this.muted;
    }
    set [dartx.muted](value) {
      this.muted = value;
    }
    get [dartx.networkState]() {
      return this.networkState;
    }
    get [dartx.paused]() {
      return this.paused;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    get [dartx.played]() {
      return this.played;
    }
    get [dartx.preload]() {
      return this.preload;
    }
    set [dartx.preload](value) {
      this.preload = value;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.seekable]() {
      return this.seekable;
    }
    get [dartx.seeking]() {
      return this.seeking;
    }
    get [dartx.session]() {
      return this.session;
    }
    set [dartx.session](value) {
      this.session = value;
    }
    get [dartx.sinkId]() {
      return this.sinkId;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.textTracks]() {
      return this.textTracks;
    }
    get [dartx.videoTracks]() {
      return this.videoTracks;
    }
    get [dartx.volume]() {
      return this.volume;
    }
    set [dartx.volume](value) {
      this.volume = value;
    }
    get [dartx.audioDecodedByteCount]() {
      return this.webkitAudioDecodedByteCount;
    }
    get [dartx.videoDecodedByteCount]() {
      return this.webkitVideoDecodedByteCount;
    }
    [dartx.addTextTrack](...args) {
      return this.addTextTrack.apply(this, args);
    }
    [dartx.canPlayType](...args) {
      return this.canPlayType.apply(this, args);
    }
    [dartx.load](...args) {
      return this.load.apply(this, args);
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
    [dartx.setMediaKeys](...args) {
      return this.setMediaKeys.apply(this, args);
    }
    [dartx.setSinkId](...args) {
      return this.setSinkId.apply(this, args);
    }
    [dartx.addKey](...args) {
      return this.webkitAddKey.apply(this, args);
    }
    [dartx.cancelKeyRequest](...args) {
      return this.webkitCancelKeyRequest.apply(this, args);
    }
    [dartx.generateKeyRequest](...args) {
      return this.webkitGenerateKeyRequest.apply(this, args);
    }
    get [dartx.onKeyAdded]() {
      return html$.MediaElement.keyAddedEvent.forElement(this);
    }
    get [dartx.onKeyError]() {
      return html$.MediaElement.keyErrorEvent.forElement(this);
    }
    get [dartx.onKeyMessage]() {
      return html$.MediaElement.keyMessageEvent.forElement(this);
    }
    get [dartx.onNeedKey]() {
      return html$.MediaElement.needKeyEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(html$.MediaElement, 'created');
  dart.setSignature(html$.MediaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaElement, []),
      created: dart.definiteFunctionType(html$.MediaElement, [])
    }),
    fields: () => ({
      [dartx.audioTracks]: html$.AudioTrackList,
      [dartx.autoplay]: core.bool,
      [dartx.buffered]: html$.TimeRanges,
      [dartx.controller]: html$.MediaController,
      [dartx.controls]: core.bool,
      [dartx.crossOrigin]: core.String,
      [dartx.currentSrc]: core.String,
      [dartx.currentTime]: core.num,
      [dartx.defaultMuted]: core.bool,
      [dartx.defaultPlaybackRate]: core.num,
      [dartx.duration]: core.double,
      [dartx.ended]: core.bool,
      [dartx.error]: html$.MediaError,
      [dartx.loop]: core.bool,
      [dartx.mediaGroup]: core.String,
      [dartx.mediaKeys]: html$.MediaKeys,
      [dartx.muted]: core.bool,
      [dartx.networkState]: core.int,
      [dartx.paused]: core.bool,
      [dartx.playbackRate]: core.num,
      [dartx.played]: html$.TimeRanges,
      [dartx.preload]: core.String,
      [dartx.readyState]: core.int,
      [dartx.seekable]: html$.TimeRanges,
      [dartx.seeking]: core.bool,
      [dartx.session]: html$.MediaSession,
      [dartx.sinkId]: core.String,
      [dartx.src]: core.String,
      [dartx.textTracks]: html$.TextTrackList,
      [dartx.videoTracks]: html$.VideoTrackList,
      [dartx.volume]: core.num,
      [dartx.audioDecodedByteCount]: core.int,
      [dartx.videoDecodedByteCount]: core.int
    }),
    getters: () => ({
      [dartx.onKeyAdded]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
      [dartx.onKeyError]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
      [dartx.onKeyMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
      [dartx.onNeedKey]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), [])
    }),
    methods: () => ({
      [dartx.addTextTrack]: dart.definiteFunctionType(html$.TextTrack, [core.String], [core.String, core.String]),
      [dartx.canPlayType]: dart.definiteFunctionType(core.String, [core.String], [core.String]),
      [dartx.load]: dart.definiteFunctionType(dart.void, []),
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.play]: dart.definiteFunctionType(dart.void, []),
      [dartx.setMediaKeys]: dart.definiteFunctionType(async.Future, [html$.MediaKeys]),
      [dartx.setSinkId]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.addKey]: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List], [typed_data.Uint8List, core.String]),
      [dartx.cancelKeyRequest]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.generateKeyRequest]: dart.definiteFunctionType(dart.void, [core.String], [typed_data.Uint8List])
    }),
    sfields: () => ({
      keyAddedEvent: EventStreamProviderOfMediaKeyEvent(),
      keyErrorEvent: EventStreamProviderOfMediaKeyEvent(),
      keyMessageEvent: EventStreamProviderOfMediaKeyEvent(),
      needKeyEvent: EventStreamProviderOfMediaKeyEvent(),
      HAVE_CURRENT_DATA: core.int,
      HAVE_ENOUGH_DATA: core.int,
      HAVE_FUTURE_DATA: core.int,
      HAVE_METADATA: core.int,
      HAVE_NOTHING: core.int,
      NETWORK_EMPTY: core.int,
      NETWORK_IDLE: core.int,
      NETWORK_LOADING: core.int,
      NETWORK_NO_SOURCE: core.int
    })
  });
  html$.MediaElement.HAVE_CURRENT_DATA = 2;
  html$.MediaElement.HAVE_ENOUGH_DATA = 4;
  html$.MediaElement.HAVE_FUTURE_DATA = 3;
  html$.MediaElement.HAVE_METADATA = 1;
  html$.MediaElement.HAVE_NOTHING = 0;
  html$.MediaElement.NETWORK_EMPTY = 0;
  html$.MediaElement.NETWORK_IDLE = 1;
  html$.MediaElement.NETWORK_LOADING = 2;
  html$.MediaElement.NETWORK_NO_SOURCE = 3;
  dart.defineLazy(html$.MediaElement, {
    get keyAddedEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyadded'));
    },
    get keyErrorEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyerror'));
    },
    get keyMessageEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeymessage'));
    },
    get needKeyEvent() {
      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitneedkey'));
    }
  });
  dart.registerExtension(dart.global.HTMLMediaElement, html$.MediaElement);
  html$.AudioElement = class AudioElement extends html$.MediaElement {
    static _(src) {
      if (src === void 0) src = null;
      if (src != null) {
        return html$.AudioElement._create_1(src);
      }
      return html$.AudioElement._create_2();
    }
    static _create_1(src) {
      return new Audio(src);
    }
    static _create_2() {
      return new Audio();
    }
    created() {
      super.created();
    }
    static new(src) {
      if (src === void 0) src = null;
      return html$.AudioElement._(src);
    }
  };
  dart.defineNamedConstructor(html$.AudioElement, 'created');
  dart.setSignature(html$.AudioElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AudioElement, [], [core.String]),
      created: dart.definiteFunctionType(html$.AudioElement, []),
      new: dart.definiteFunctionType(html$.AudioElement, [], [core.String])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AudioElement, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AudioElement, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.HTMLAudioElement, html$.AudioElement);
  dart.defineExtensionNames([
    'enabled',
    'id',
    'kind',
    'label',
    'language'
  ]);
  html$.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.enabled]() {
      return this.enabled;
    }
    set [dartx.enabled](value) {
      this.enabled = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
  };
  dart.setSignature(html$.AudioTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrack, [])}),
    fields: () => ({
      [dartx.enabled]: core.bool,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.language]: core.String
    })
  });
  dart.registerExtension(dart.global.AudioTrack, html$.AudioTrack);
  const __getter__ = Symbol('__getter__');
  dart.defineExtensionNames([
    'getTrackById',
    'onChange',
    'length'
  ]);
  html$.AudioTrackList = class AudioTrackList extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.AudioTrackList.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.AudioTrackList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrackList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(html$.AudioTrack, [core.int]),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.AudioTrack, [core.String])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.AudioTrackList, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.AudioTrackList, html$.AudioTrackList);
  dart.defineExtensionNames([
    'reason'
  ]);
  html$.AutocompleteErrorEvent = class AutocompleteErrorEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.AutocompleteErrorEvent._create_1(type, eventInitDict_1);
      }
      return html$.AutocompleteErrorEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new AutocompleteErrorEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new AutocompleteErrorEvent(type);
    }
    get [dartx.reason]() {
      return this.reason;
    }
  };
  dart.setSignature(html$.AutocompleteErrorEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.AutocompleteErrorEvent, []),
      new: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.reason]: core.String}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.AutocompleteErrorEvent, html$.AutocompleteErrorEvent);
  html$.BRElement = class BRElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.BRElement._check(html$.document[dartx.createElement]("br"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.BRElement, 'created');
  dart.setSignature(html$.BRElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BRElement, []),
      new: dart.definiteFunctionType(html$.BRElement, []),
      created: dart.definiteFunctionType(html$.BRElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLBRElement, html$.BRElement);
  dart.defineExtensionNames([
    'visible'
  ]);
  html$.BarProp = class BarProp extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.visible]() {
      return this.visible;
    }
  };
  dart.setSignature(html$.BarProp, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BarProp, [])}),
    fields: () => ({[dartx.visible]: core.bool})
  });
  dart.registerExtension(dart.global.BarProp, html$.BarProp);
  dart.defineExtensionNames([
    'href',
    'target'
  ]);
  html$.BaseElement = class BaseElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.BaseElement._check(html$.document[dartx.createElement]("base"));
    }
    created() {
      this[dartx.href] = null;
      this[dartx.target] = null;
      super.created();
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
  };
  dart.defineNamedConstructor(html$.BaseElement, 'created');
  dart.setSignature(html$.BaseElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BaseElement, []),
      new: dart.definiteFunctionType(html$.BaseElement, []),
      created: dart.definiteFunctionType(html$.BaseElement, [])
    }),
    fields: () => ({
      [dartx.href]: core.String,
      [dartx.target]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLBaseElement, html$.BaseElement);
  dart.defineExtensionNames([
    'charging',
    'chargingTime',
    'dischargingTime',
    'level'
  ]);
  html$.BatteryManager = class BatteryManager extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.charging]() {
      return this.charging;
    }
    get [dartx.chargingTime]() {
      return this.chargingTime;
    }
    get [dartx.dischargingTime]() {
      return this.dischargingTime;
    }
    get [dartx.level]() {
      return this.level;
    }
  };
  dart.setSignature(html$.BatteryManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BatteryManager, [])}),
    fields: () => ({
      [dartx.charging]: core.bool,
      [dartx.chargingTime]: core.double,
      [dartx.dischargingTime]: core.double,
      [dartx.level]: core.double
    })
  });
  dart.registerExtension(dart.global.BatteryManager, html$.BatteryManager);
  dart.defineExtensionNames([
    'platforms',
    'prompt',
    'userChoice'
  ]);
  html$.BeforeInstallPromptEvent = class BeforeInstallPromptEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
      }
      return html$.BeforeInstallPromptEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new BeforeInstallPromptEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new BeforeInstallPromptEvent(type);
    }
    get [dartx.platforms]() {
      return this.platforms;
    }
    get [dartx.userChoice]() {
      return this.userChoice;
    }
    [dartx.prompt](...args) {
      return this.prompt.apply(this, args);
    }
  };
  dart.setSignature(html$.BeforeInstallPromptEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, []),
      new: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.userChoice]: async.Future}),
    getters: () => ({[dartx.platforms]: dart.definiteFunctionType(core.List$(core.String), [])}),
    methods: () => ({[dartx.prompt]: dart.definiteFunctionType(async.Future, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.BeforeInstallPromptEvent, html$.BeforeInstallPromptEvent);
  dart.defineExtensionNames([
    'returnValue',
    'returnValue'
  ]);
  html$.BeforeUnloadEvent = class BeforeUnloadEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.returnValue]() {
      return this.returnValue;
    }
    set [dartx.returnValue](value) {
      this.returnValue = value;
    }
  };
  dart.setSignature(html$.BeforeUnloadEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BeforeUnloadEvent, [])}),
    getters: () => ({[dartx.returnValue]: dart.definiteFunctionType(core.String, [])}),
    setters: () => ({[dartx.returnValue]: dart.definiteFunctionType(dart.void, [core.String])})
  });
  dart.registerExtension(dart.global.BeforeUnloadEvent, html$.BeforeUnloadEvent);
  dart.defineExtensionNames([
    'close',
    'slice',
    'size',
    'type'
  ]);
  html$.Blob = class Blob extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.slice](...args) {
      return this.slice.apply(this, args);
    }
    static new(blobParts, type, endings) {
      if (type === void 0) type = null;
      if (endings === void 0) endings = null;
      if (type == null && endings == null) {
        return html$.Blob._check(html$.Blob._create_1(blobParts));
      }
      let bag = html$.Blob._create_bag();
      if (type != null) html$.Blob._bag_set(bag, 'type', type);
      if (endings != null) html$.Blob._bag_set(bag, 'endings', endings);
      return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
    }
    static _create_1(parts) {
      return new Blob(parts);
    }
    static _create_2(parts, bag) {
      return new Blob(parts, bag);
    }
    static _create_bag() {
      return {};
    }
    static _bag_set(bag, key, value) {
      bag[key] = value;
    }
  };
  dart.setSignature(html$.Blob, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Blob, []),
      new: dart.definiteFunctionType(html$.Blob, [core.List], [core.String, core.String])
    }),
    fields: () => ({
      [dartx.size]: core.int,
      [dartx.type]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.slice]: dart.definiteFunctionType(html$.Blob, [], [core.int, core.int, core.String])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
      _create_bag: dart.definiteFunctionType(dart.dynamic, []),
      _bag_set: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_bag', '_bag_set']
  });
  dart.registerExtension(dart.global.Blob, html$.Blob);
  const _requestDevice_1 = Symbol('_requestDevice_1');
  dart.defineExtensionNames([
    'requestDevice'
  ]);
  html$.Bluetooth = class Bluetooth extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.requestDevice](options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_requestDevice_1](options_1);
    }
    [_requestDevice_1](...args) {
      return this.requestDevice.apply(this, args);
    }
  };
  dart.setSignature(html$.Bluetooth, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Bluetooth, [])}),
    methods: () => ({
      [dartx.requestDevice]: dart.definiteFunctionType(async.Future, [core.Map]),
      [_requestDevice_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.Bluetooth, html$.Bluetooth);
  dart.defineExtensionNames([
    'connectGatt',
    'deviceClass',
    'instanceID',
    'name',
    'paired',
    'productID',
    'productVersion',
    'vendorID',
    'vendorIDSource'
  ]);
  html$.BluetoothDevice = class BluetoothDevice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.deviceClass]() {
      return this.deviceClass;
    }
    get [dartx.instanceID]() {
      return this.instanceID;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.paired]() {
      return this.paired;
    }
    get [dartx.productID]() {
      return this.productID;
    }
    get [dartx.productVersion]() {
      return this.productVersion;
    }
    get [dartx.vendorID]() {
      return this.vendorID;
    }
    get [dartx.vendorIDSource]() {
      return this.vendorIDSource;
    }
    [dartx.connectGatt](...args) {
      return this.connectGATT.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothDevice, [])}),
    fields: () => ({
      [dartx.deviceClass]: core.int,
      [dartx.instanceID]: core.String,
      [dartx.name]: core.String,
      [dartx.paired]: core.bool,
      [dartx.productID]: core.int,
      [dartx.productVersion]: core.int,
      [dartx.vendorID]: core.int,
      [dartx.vendorIDSource]: core.String
    }),
    methods: () => ({[dartx.connectGatt]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.BluetoothDevice, html$.BluetoothDevice);
  dart.defineExtensionNames([
    'readValue',
    'writeValue',
    'uuid'
  ]);
  html$.BluetoothGattCharacteristic = class BluetoothGattCharacteristic extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.uuid]() {
      return this.uuid;
    }
    [dartx.readValue](...args) {
      return this.readValue.apply(this, args);
    }
    [dartx.writeValue](...args) {
      return this.writeValue.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothGattCharacteristic, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattCharacteristic, [])}),
    fields: () => ({[dartx.uuid]: core.String}),
    methods: () => ({
      [dartx.readValue]: dart.definiteFunctionType(async.Future, []),
      [dartx.writeValue]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.BluetoothGATTCharacteristic, html$.BluetoothGattCharacteristic);
  dart.defineExtensionNames([
    'getPrimaryService',
    'connected'
  ]);
  html$.BluetoothGattRemoteServer = class BluetoothGattRemoteServer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connected]() {
      return this.connected;
    }
    [dartx.getPrimaryService](...args) {
      return this.getPrimaryService.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothGattRemoteServer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattRemoteServer, [])}),
    fields: () => ({[dartx.connected]: core.bool}),
    methods: () => ({[dartx.getPrimaryService]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
  });
  dart.registerExtension(dart.global.BluetoothGATTRemoteServer, html$.BluetoothGattRemoteServer);
  dart.defineExtensionNames([
    'getCharacteristic',
    'isPrimary',
    'uuid'
  ]);
  html$.BluetoothGattService = class BluetoothGattService extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.isPrimary]() {
      return this.isPrimary;
    }
    get [dartx.uuid]() {
      return this.uuid;
    }
    [dartx.getCharacteristic](...args) {
      return this.getCharacteristic.apply(this, args);
    }
  };
  dart.setSignature(html$.BluetoothGattService, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattService, [])}),
    fields: () => ({
      [dartx.isPrimary]: core.bool,
      [dartx.uuid]: core.String
    }),
    methods: () => ({[dartx.getCharacteristic]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
  });
  dart.registerExtension(dart.global.BluetoothGATTService, html$.BluetoothGattService);
  html$.BluetoothUuid = class BluetoothUuid extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.BluetoothUuid, {
    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothUuid, [])}),
    statics: () => ({
      canonicalUuid: dart.definiteFunctionType(core.String, [core.int]),
      getCharacteristic: dart.definiteFunctionType(core.String, [core.Object]),
      getDescriptor: dart.definiteFunctionType(core.String, [core.Object]),
      getService: dart.definiteFunctionType(core.String, [core.Object])
    }),
    names: ['canonicalUuid', 'getCharacteristic', 'getDescriptor', 'getService']
  });
  dart.registerExtension(dart.global.BluetoothUUID, html$.BluetoothUuid);
  dart.defineExtensionNames([
    'arrayBuffer',
    'blob',
    'json',
    'text',
    'bodyUsed'
  ]);
  html$.Body = class Body extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bodyUsed]() {
      return this.bodyUsed;
    }
    [dartx.arrayBuffer](...args) {
      return this.arrayBuffer.apply(this, args);
    }
    [dartx.blob](...args) {
      return this.blob.apply(this, args);
    }
    [dartx.json](...args) {
      return this.json.apply(this, args);
    }
    [dartx.text](...args) {
      return this.text.apply(this, args);
    }
  };
  dart.setSignature(html$.Body, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Body, [])}),
    fields: () => ({[dartx.bodyUsed]: core.bool}),
    methods: () => ({
      [dartx.arrayBuffer]: dart.definiteFunctionType(async.Future, []),
      [dartx.blob]: dart.definiteFunctionType(async.Future, []),
      [dartx.json]: dart.definiteFunctionType(async.Future, []),
      [dartx.text]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.Body, html$.Body);
  dart.defineExtensionNames([
    'onBlur',
    'onError',
    'onFocus',
    'onHashChange',
    'onLoad',
    'onMessage',
    'onOffline',
    'onOnline',
    'onPopState',
    'onResize',
    'onScroll',
    'onStorage',
    'onUnload'
  ]);
  html$.BodyElement = class BodyElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.BodyElement._check(html$.document[dartx.createElement]("body"));
    }
    created() {
      super.created();
    }
    get [dartx.onBlur]() {
      return html$.BodyElement.blurEvent.forElement(this);
    }
    get [dartx.onError]() {
      return html$.BodyElement.errorEvent.forElement(this);
    }
    get [dartx.onFocus]() {
      return html$.BodyElement.focusEvent.forElement(this);
    }
    get [dartx.onHashChange]() {
      return html$.BodyElement.hashChangeEvent.forElement(this);
    }
    get [dartx.onLoad]() {
      return html$.BodyElement.loadEvent.forElement(this);
    }
    get [dartx.onMessage]() {
      return html$.BodyElement.messageEvent.forElement(this);
    }
    get [dartx.onOffline]() {
      return html$.BodyElement.offlineEvent.forElement(this);
    }
    get [dartx.onOnline]() {
      return html$.BodyElement.onlineEvent.forElement(this);
    }
    get [dartx.onPopState]() {
      return html$.BodyElement.popStateEvent.forElement(this);
    }
    get [dartx.onResize]() {
      return html$.BodyElement.resizeEvent.forElement(this);
    }
    get [dartx.onScroll]() {
      return html$.BodyElement.scrollEvent.forElement(this);
    }
    get [dartx.onStorage]() {
      return html$.BodyElement.storageEvent.forElement(this);
    }
    get [dartx.onUnload]() {
      return html$.BodyElement.unloadEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(html$.BodyElement, 'created');
  html$.BodyElement[dart.implements] = () => [html$.WindowEventHandlers];
  dart.setSignature(html$.BodyElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.BodyElement, []),
      new: dart.definiteFunctionType(html$.BodyElement, []),
      created: dart.definiteFunctionType(html$.BodyElement, [])
    }),
    getters: () => ({
      [dartx.onHashChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MessageEvent), []),
      [dartx.onOffline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onOnline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
      [dartx.onPopState]: dart.definiteFunctionType(html$.ElementStream$(html$.PopStateEvent), []),
      [dartx.onStorage]: dart.definiteFunctionType(html$.ElementStream$(html$.StorageEvent), []),
      [dartx.onUnload]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
    }),
    sfields: () => ({
      blurEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      hashChangeEvent: EventStreamProviderOfEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      offlineEvent: EventStreamProviderOfEvent(),
      onlineEvent: EventStreamProviderOfEvent(),
      popStateEvent: EventStreamProviderOfPopStateEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      storageEvent: EventStreamProviderOfStorageEvent(),
      unloadEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.BodyElement, {
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get hashChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get offlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('offline'));
    },
    get onlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('online'));
    },
    get popStateEvent() {
      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get storageEvent() {
      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
    },
    get unloadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unload'));
    }
  });
  dart.registerExtension(dart.global.HTMLBodyElement, html$.BodyElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'autofocus',
    'disabled',
    'form',
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget',
    'labels',
    'name',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate'
  ]);
  html$.ButtonElement = class ButtonElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ButtonElement._check(html$.document[dartx.createElement]("button"));
    }
    created() {
      this[dartx.autofocus] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.formAction] = null;
      this[dartx.formEnctype] = null;
      this[dartx.formMethod] = null;
      this[dartx.formNoValidate] = null;
      this[dartx.formTarget] = null;
      this[dartx.labels] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.formAction]() {
      return this.formAction;
    }
    set [dartx.formAction](value) {
      this.formAction = value;
    }
    get [dartx.formEnctype]() {
      return this.formEnctype;
    }
    set [dartx.formEnctype](value) {
      this.formEnctype = value;
    }
    get [dartx.formMethod]() {
      return this.formMethod;
    }
    set [dartx.formMethod](value) {
      this.formMethod = value;
    }
    get [dartx.formNoValidate]() {
      return this.formNoValidate;
    }
    set [dartx.formNoValidate](value) {
      this.formNoValidate = value;
    }
    get [dartx.formTarget]() {
      return this.formTarget;
    }
    set [dartx.formTarget](value) {
      this.formTarget = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ButtonElement, 'created');
  dart.setSignature(html$.ButtonElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ButtonElement, []),
      new: dart.definiteFunctionType(html$.ButtonElement, []),
      created: dart.definiteFunctionType(html$.ButtonElement, [])
    }),
    fields: () => ({
      [dartx.autofocus]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.formAction]: core.String,
      [dartx.formEnctype]: core.String,
      [dartx.formMethod]: core.String,
      [dartx.formNoValidate]: core.bool,
      [dartx.formTarget]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLButtonElement, html$.ButtonElement);
  const _createTextNode = Symbol('_createTextNode');
  dart.defineExtensionNames([
    'appendData',
    'deleteData',
    'insertData',
    'replaceData',
    'substringData',
    'after',
    'before',
    'data',
    'length',
    'nextElementSibling',
    'previousElementSibling'
  ]);
  html$.CharacterData = class CharacterData extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.data]() {
      return this.data;
    }
    set [dartx.data](value) {
      this.data = value;
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.appendData](...args) {
      return this.appendData.apply(this, args);
    }
    [dartx.deleteData](...args) {
      return this.deleteData.apply(this, args);
    }
    [dartx.insertData](...args) {
      return this.insertData.apply(this, args);
    }
    [dartx.replaceData](...args) {
      return this.replaceData.apply(this, args);
    }
    [dartx.substringData](...args) {
      return this.substringData.apply(this, args);
    }
    [dartx.after](...args) {
      return this.after.apply(this, args);
    }
    [dartx.before](...args) {
      return this.before.apply(this, args);
    }
    get [dartx.nextElementSibling]() {
      return this.nextElementSibling;
    }
    get [dartx.previousElementSibling]() {
      return this.previousElementSibling;
    }
  };
  html$.CharacterData[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.ChildNode];
  dart.setSignature(html$.CharacterData, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CharacterData, [])}),
    fields: () => ({
      [dartx.data]: core.String,
      [dartx.length]: core.int,
      [dartx.nextElementSibling]: html$.Element,
      [dartx.previousElementSibling]: html$.Element
    }),
    methods: () => ({
      [dartx.appendData]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.deleteData]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.insertData]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.replaceData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
      [dartx.substringData]: dart.definiteFunctionType(core.String, [core.int, core.int]),
      [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
      [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object])
    })
  });
  dart.registerExtension(dart.global.CharacterData, html$.CharacterData);
  dart.defineExtensionNames([
    'getDestinationInsertionPoints',
    'splitText',
    'wholeText'
  ]);
  html$.Text = class Text extends html$.CharacterData {
    static new(data) {
      return html$.document[_createTextNode](data);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.wholeText]() {
      return this.wholeText;
    }
    [dartx.getDestinationInsertionPoints](...args) {
      return this.getDestinationInsertionPoints.apply(this, args);
    }
    [dartx.splitText](...args) {
      return this.splitText.apply(this, args);
    }
  };
  dart.setSignature(html$.Text, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Text, [core.String]),
      _: dart.definiteFunctionType(html$.Text, [])
    }),
    fields: () => ({[dartx.wholeText]: core.String}),
    methods: () => ({
      [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
      [dartx.splitText]: dart.definiteFunctionType(html$.Text, [core.int])
    })
  });
  dart.registerExtension(dart.global.Text, html$.Text);
  html$.CDataSection = class CDataSection extends html$.Text {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.CDataSection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CDataSection, [])})
  });
  dart.registerExtension(dart.global.CDATASection, html$.CDataSection);
  const _match_1 = Symbol('_match_1');
  const _match_2 = Symbol('_match_2');
  dart.defineExtensionNames([
    'delete',
    'has',
    'keys',
    'match',
    'open'
  ]);
  html$.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.delete](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.has](...args) {
      return this.has.apply(this, args);
    }
    [dartx.keys](...args) {
      return this.keys.apply(this, args);
    }
    [dartx.match](request, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_match_1](request, options_1);
      }
      return this[_match_2](request);
    }
    [_match_1](...args) {
      return this.match.apply(this, args);
    }
    [_match_2](...args) {
      return this.match.apply(this, args);
    }
    [dartx.open](...args) {
      return this.open.apply(this, args);
    }
  };
  dart.setSignature(html$.CacheStorage, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CacheStorage, [])}),
    methods: () => ({
      [dartx.delete]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.has]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.keys]: dart.definiteFunctionType(async.Future, []),
      [dartx.match]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
      [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_match_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.open]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.CacheStorage, html$.CacheStorage);
  const _getContext_1 = Symbol('_getContext_1');
  const _getContext_2 = Symbol('_getContext_2');
  const _toDataUrl = Symbol('_toDataUrl');
  dart.defineExtensionNames([
    'getContext',
    'onWebGlContextLost',
    'onWebGlContextRestored',
    'context2D',
    'getContext3d',
    'toDataUrl',
    'height',
    'width'
  ]);
  html$.CanvasElement = class CanvasElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(opts) {
      let width = opts && 'width' in opts ? opts.width : null;
      let height = opts && 'height' in opts ? opts.height : null;
      let e = html$.CanvasElement._check(html$.document[dartx.createElement]("canvas"));
      if (width != null) e[dartx.width] = width;
      if (height != null) e[dartx.height] = height;
      return e;
    }
    created() {
      this[dartx.height] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    [dartx.getContext](contextId, attributes) {
      if (attributes === void 0) attributes = null;
      if (attributes != null) {
        let attributes_1 = html_common.convertDartToNative_Dictionary(attributes);
        return this[_getContext_1](contextId, attributes_1);
      }
      return this[_getContext_2](contextId);
    }
    [_getContext_1](...args) {
      return this.getContext.apply(this, args);
    }
    [_getContext_2](...args) {
      return this.getContext.apply(this, args);
    }
    [_toDataUrl](...args) {
      return this.toDataURL.apply(this, args);
    }
    get [dartx.onWebGlContextLost]() {
      return html$.CanvasElement.webGlContextLostEvent.forElement(this);
    }
    get [dartx.onWebGlContextRestored]() {
      return html$.CanvasElement.webGlContextRestoredEvent.forElement(this);
    }
    get [dartx.context2D]() {
      return this.getContext('2d');
    }
    [dartx.getContext3d](opts) {
      let alpha = opts && 'alpha' in opts ? opts.alpha : true;
      let depth = opts && 'depth' in opts ? opts.depth : true;
      let stencil = opts && 'stencil' in opts ? opts.stencil : false;
      let antialias = opts && 'antialias' in opts ? opts.antialias : true;
      let premultipliedAlpha = opts && 'premultipliedAlpha' in opts ? opts.premultipliedAlpha : true;
      let preserveDrawingBuffer = opts && 'preserveDrawingBuffer' in opts ? opts.preserveDrawingBuffer : false;
      let options = dart.map({alpha: alpha, depth: depth, stencil: stencil, antialias: antialias, premultipliedAlpha: premultipliedAlpha, preserveDrawingBuffer: preserveDrawingBuffer}, core.String, dart.dynamic);
      let context = this[dartx.getContext]('webgl', options);
      if (context == null) {
        context = this[dartx.getContext]('experimental-webgl', options);
      }
      return web_gl.RenderingContext._check(context);
    }
    [dartx.toDataUrl](type, quality) {
      if (type === void 0) type = 'image/png';
      if (quality === void 0) quality = null;
      return this[_toDataUrl](type, quality);
    }
  };
  dart.defineNamedConstructor(html$.CanvasElement, 'created');
  html$.CanvasElement[dart.implements] = () => [html$.CanvasImageSource];
  dart.setSignature(html$.CanvasElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CanvasElement, []),
      new: dart.definiteFunctionType(html$.CanvasElement, [], {width: core.int, height: core.int}),
      created: dart.definiteFunctionType(html$.CanvasElement, [])
    }),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.width]: core.int
    }),
    getters: () => ({
      [dartx.onWebGlContextLost]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
      [dartx.onWebGlContextRestored]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
      [dartx.context2D]: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])
    }),
    methods: () => ({
      [dartx.getContext]: dart.definiteFunctionType(core.Object, [core.String], [core.Map]),
      [_getContext_1]: dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic]),
      [_getContext_2]: dart.definiteFunctionType(core.Object, [dart.dynamic]),
      [_toDataUrl]: dart.definiteFunctionType(core.String, [core.String], [dart.dynamic]),
      [dartx.getContext3d]: dart.definiteFunctionType(web_gl.RenderingContext, [], {alpha: dart.dynamic, depth: dart.dynamic, stencil: dart.dynamic, antialias: dart.dynamic, premultipliedAlpha: dart.dynamic, preserveDrawingBuffer: dart.dynamic}),
      [dartx.toDataUrl]: dart.definiteFunctionType(core.String, [], [core.String, core.num])
    }),
    sfields: () => ({
      webGlContextLostEvent: EventStreamProviderOfContextEvent(),
      webGlContextRestoredEvent: EventStreamProviderOfContextEvent()
    })
  });
  dart.defineLazy(html$.CanvasElement, {
    get webGlContextLostEvent() {
      return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextlost'));
    },
    get webGlContextRestoredEvent() {
      return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextrestored'));
    }
  });
  dart.registerExtension(dart.global.HTMLCanvasElement, html$.CanvasElement);
  dart.defineExtensionNames([
    'addColorStop'
  ]);
  html$.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.addColorStop](...args) {
      return this.addColorStop.apply(this, args);
    }
  };
  dart.setSignature(html$.CanvasGradient, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasGradient, [])}),
    methods: () => ({[dartx.addColorStop]: dart.definiteFunctionType(dart.void, [core.num, core.String])})
  });
  dart.registerExtension(dart.global.CanvasGradient, html$.CanvasGradient);
  dart.defineExtensionNames([
    'setTransform'
  ]);
  html$.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.setTransform](...args) {
      return this.setTransform.apply(this, args);
    }
  };
  dart.setSignature(html$.CanvasPattern, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasPattern, [])}),
    methods: () => ({[dartx.setTransform]: dart.definiteFunctionType(dart.void, [svg$.Matrix])})
  });
  dart.registerExtension(dart.global.CanvasPattern, html$.CanvasPattern);
  html$.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
  const _addHitRegion_1 = Symbol('_addHitRegion_1');
  const _addHitRegion_2 = Symbol('_addHitRegion_2');
  const _createImageData_1 = Symbol('_createImageData_1');
  const _createImageData_2 = Symbol('_createImageData_2');
  const _getContextAttributes_1 = Symbol('_getContextAttributes_1');
  const _getImageData_1 = Symbol('_getImageData_1');
  const _getLineDash = Symbol('_getLineDash');
  const _putImageData_1 = Symbol('_putImageData_1');
  const _putImageData_2 = Symbol('_putImageData_2');
  const _arc = Symbol('_arc');
  dart.defineExtensionNames([
    'addHitRegion',
    'beginPath',
    'clearHitRegions',
    'clearRect',
    'clip',
    'createImageData',
    'createLinearGradient',
    'createPattern',
    'createRadialGradient',
    'drawFocusIfNeeded',
    'fillRect',
    'getContextAttributes',
    'getImageData',
    'isContextLost',
    'isPointInPath',
    'isPointInStroke',
    'measureText',
    'putImageData',
    'removeHitRegion',
    'resetTransform',
    'restore',
    'rotate',
    'save',
    'scale',
    'scrollPathIntoView',
    'setTransform',
    'stroke',
    'strokeRect',
    'strokeText',
    'transform',
    'translate',
    'arcTo',
    'bezierCurveTo',
    'closePath',
    'ellipse',
    'lineTo',
    'moveTo',
    'quadraticCurveTo',
    'rect',
    'createImageDataFromImageData',
    'setFillColorRgb',
    'setFillColorHsl',
    'setStrokeColorRgb',
    'setStrokeColorHsl',
    'arc',
    'createPatternFromImage',
    'drawImageToRect',
    'drawImage',
    'drawImageScaled',
    'drawImageScaledFromSource',
    'lineDashOffset',
    'lineDashOffset',
    'getLineDash',
    'setLineDash',
    'fillText',
    'fill',
    'backingStorePixelRatio',
    'canvas',
    'currentTransform',
    'direction',
    'fillStyle',
    'filter',
    'font',
    'globalAlpha',
    'globalCompositeOperation',
    'imageSmoothingEnabled',
    'lineCap',
    'lineJoin',
    'lineWidth',
    'miterLimit',
    'shadowBlur',
    'shadowColor',
    'shadowOffsetX',
    'shadowOffsetY',
    'strokeStyle',
    'textAlign',
    'textBaseline'
  ]);
  html$.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.canvas]() {
      return this.canvas;
    }
    get [dartx.currentTransform]() {
      return this.currentTransform;
    }
    set [dartx.currentTransform](value) {
      this.currentTransform = value;
    }
    get [dartx.direction]() {
      return this.direction;
    }
    set [dartx.direction](value) {
      this.direction = value;
    }
    get [dartx.fillStyle]() {
      return this.fillStyle;
    }
    set [dartx.fillStyle](value) {
      this.fillStyle = value;
    }
    get [dartx.filter]() {
      return this.filter;
    }
    set [dartx.filter](value) {
      this.filter = value;
    }
    get [dartx.font]() {
      return this.font;
    }
    set [dartx.font](value) {
      this.font = value;
    }
    get [dartx.globalAlpha]() {
      return this.globalAlpha;
    }
    set [dartx.globalAlpha](value) {
      this.globalAlpha = value;
    }
    get [dartx.globalCompositeOperation]() {
      return this.globalCompositeOperation;
    }
    set [dartx.globalCompositeOperation](value) {
      this.globalCompositeOperation = value;
    }
    get [dartx.imageSmoothingEnabled]() {
      return this.imageSmoothingEnabled;
    }
    set [dartx.imageSmoothingEnabled](value) {
      this.imageSmoothingEnabled = value;
    }
    get [dartx.lineCap]() {
      return this.lineCap;
    }
    set [dartx.lineCap](value) {
      this.lineCap = value;
    }
    get [dartx.lineJoin]() {
      return this.lineJoin;
    }
    set [dartx.lineJoin](value) {
      this.lineJoin = value;
    }
    get [dartx.lineWidth]() {
      return this.lineWidth;
    }
    set [dartx.lineWidth](value) {
      this.lineWidth = value;
    }
    get [dartx.miterLimit]() {
      return this.miterLimit;
    }
    set [dartx.miterLimit](value) {
      this.miterLimit = value;
    }
    get [dartx.shadowBlur]() {
      return this.shadowBlur;
    }
    set [dartx.shadowBlur](value) {
      this.shadowBlur = value;
    }
    get [dartx.shadowColor]() {
      return this.shadowColor;
    }
    set [dartx.shadowColor](value) {
      this.shadowColor = value;
    }
    get [dartx.shadowOffsetX]() {
      return this.shadowOffsetX;
    }
    set [dartx.shadowOffsetX](value) {
      this.shadowOffsetX = value;
    }
    get [dartx.shadowOffsetY]() {
      return this.shadowOffsetY;
    }
    set [dartx.shadowOffsetY](value) {
      this.shadowOffsetY = value;
    }
    get [dartx.strokeStyle]() {
      return this.strokeStyle;
    }
    set [dartx.strokeStyle](value) {
      this.strokeStyle = value;
    }
    get [dartx.textAlign]() {
      return this.textAlign;
    }
    set [dartx.textAlign](value) {
      this.textAlign = value;
    }
    get [dartx.textBaseline]() {
      return this.textBaseline;
    }
    set [dartx.textBaseline](value) {
      this.textBaseline = value;
    }
    [dartx.addHitRegion](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[_addHitRegion_1](options_1);
        return;
      }
      this[_addHitRegion_2]();
      return;
    }
    [_addHitRegion_1](...args) {
      return this.addHitRegion.apply(this, args);
    }
    [_addHitRegion_2](...args) {
      return this.addHitRegion.apply(this, args);
    }
    [dartx.beginPath](...args) {
      return this.beginPath.apply(this, args);
    }
    [dartx.clearHitRegions](...args) {
      return this.clearHitRegions.apply(this, args);
    }
    [dartx.clearRect](...args) {
      return this.clearRect.apply(this, args);
    }
    [dartx.clip](...args) {
      return this.clip.apply(this, args);
    }
    [dartx.createImageData](imagedata_OR_sw, sh) {
      if (sh === void 0) sh = null;
      if (html$.ImageData.is(imagedata_OR_sw) && sh == null) {
        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata_OR_sw);
        return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
      }
      if (sh != null && typeof imagedata_OR_sw == 'number') {
        return html_common.convertNativeToDart_ImageData(this[_createImageData_2](imagedata_OR_sw, sh));
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_createImageData_1](...args) {
      return this.createImageData.apply(this, args);
    }
    [_createImageData_2](...args) {
      return this.createImageData.apply(this, args);
    }
    [dartx.createLinearGradient](...args) {
      return this.createLinearGradient.apply(this, args);
    }
    [dartx.createPattern](...args) {
      return this.createPattern.apply(this, args);
    }
    [dartx.createRadialGradient](...args) {
      return this.createRadialGradient.apply(this, args);
    }
    [dartx.drawFocusIfNeeded](...args) {
      return this.drawFocusIfNeeded.apply(this, args);
    }
    [dartx.fillRect](...args) {
      return this.fillRect.apply(this, args);
    }
    [dartx.getContextAttributes]() {
      return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1]());
    }
    [_getContextAttributes_1](...args) {
      return this.getContextAttributes.apply(this, args);
    }
    [dartx.getImageData](sx, sy, sw, sh) {
      return html_common.convertNativeToDart_ImageData(this[_getImageData_1](sx, sy, sw, sh));
    }
    [_getImageData_1](...args) {
      return this.getImageData.apply(this, args);
    }
    [_getLineDash](...args) {
      return this.getLineDash.apply(this, args);
    }
    [dartx.isContextLost](...args) {
      return this.isContextLost.apply(this, args);
    }
    [dartx.isPointInPath](...args) {
      return this.isPointInPath.apply(this, args);
    }
    [dartx.isPointInStroke](...args) {
      return this.isPointInStroke.apply(this, args);
    }
    [dartx.measureText](...args) {
      return this.measureText.apply(this, args);
    }
    [dartx.putImageData](imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
      if (dirtyX === void 0) dirtyX = null;
      if (dirtyY === void 0) dirtyY = null;
      if (dirtyWidth === void 0) dirtyWidth = null;
      if (dirtyHeight === void 0) dirtyHeight = null;
      if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
        this[_putImageData_1](imagedata_1, dx, dy);
        return;
      }
      if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
        this[_putImageData_2](imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_putImageData_1](...args) {
      return this.putImageData.apply(this, args);
    }
    [_putImageData_2](...args) {
      return this.putImageData.apply(this, args);
    }
    [dartx.removeHitRegion](...args) {
      return this.removeHitRegion.apply(this, args);
    }
    [dartx.resetTransform](...args) {
      return this.resetTransform.apply(this, args);
    }
    [dartx.restore](...args) {
      return this.restore.apply(this, args);
    }
    [dartx.rotate](...args) {
      return this.rotate.apply(this, args);
    }
    [dartx.save](...args) {
      return this.save.apply(this, args);
    }
    [dartx.scale](...args) {
      return this.scale.apply(this, args);
    }
    [dartx.scrollPathIntoView](...args) {
      return this.scrollPathIntoView.apply(this, args);
    }
    [dartx.setTransform](...args) {
      return this.setTransform.apply(this, args);
    }
    [dartx.stroke](...args) {
      return this.stroke.apply(this, args);
    }
    [dartx.strokeRect](...args) {
      return this.strokeRect.apply(this, args);
    }
    [dartx.strokeText](...args) {
      return this.strokeText.apply(this, args);
    }
    [dartx.transform](...args) {
      return this.transform.apply(this, args);
    }
    [dartx.translate](...args) {
      return this.translate.apply(this, args);
    }
    [_arc](...args) {
      return this.arc.apply(this, args);
    }
    [dartx.arcTo](...args) {
      return this.arcTo.apply(this, args);
    }
    [dartx.bezierCurveTo](...args) {
      return this.bezierCurveTo.apply(this, args);
    }
    [dartx.closePath](...args) {
      return this.closePath.apply(this, args);
    }
    [dartx.ellipse](...args) {
      return this.ellipse.apply(this, args);
    }
    [dartx.lineTo](...args) {
      return this.lineTo.apply(this, args);
    }
    [dartx.moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.quadraticCurveTo](...args) {
      return this.quadraticCurveTo.apply(this, args);
    }
    [dartx.rect](...args) {
      return this.rect.apply(this, args);
    }
    [dartx.createImageDataFromImageData](imagedata) {
      return this.createImageData(imagedata);
    }
    [dartx.setFillColorRgb](r, g, b, a) {
      if (a === void 0) a = 1;
      this[dartx.fillStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
    }
    [dartx.setFillColorHsl](h, s, l, a) {
      if (a === void 0) a = 1;
      this[dartx.fillStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
    }
    [dartx.setStrokeColorRgb](r, g, b, a) {
      if (a === void 0) a = 1;
      this[dartx.strokeStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
    }
    [dartx.setStrokeColorHsl](h, s, l, a) {
      if (a === void 0) a = 1;
      this[dartx.strokeStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
    }
    [dartx.arc](x, y, radius, startAngle, endAngle, anticlockwise) {
      if (anticlockwise === void 0) anticlockwise = false;
      this.arc(x, y, radius, startAngle, endAngle, anticlockwise);
    }
    [dartx.createPatternFromImage](image, repetitionType) {
      return this.createPattern(image, repetitionType);
    }
    [dartx.drawImageToRect](source, destRect, opts) {
      let sourceRect = opts && 'sourceRect' in opts ? opts.sourceRect : null;
      if (sourceRect == null) {
        this[dartx.drawImageScaled](source, destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
      } else {
        this[dartx.drawImageScaledFromSource](source, sourceRect[dartx.left], sourceRect[dartx.top], sourceRect[dartx.width], sourceRect[dartx.height], destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
      }
    }
    [dartx.drawImage](...args) {
      return this.drawImage.apply(this, args);
    }
    [dartx.drawImageScaled](...args) {
      return this.drawImage.apply(this, args);
    }
    [dartx.drawImageScaledFromSource](...args) {
      return this.drawImage.apply(this, args);
    }
    get [dartx.lineDashOffset]() {
      return this.lineDashOffset || this.webkitLineDashOffset;
    }
    set [dartx.lineDashOffset](value) {
      typeof this.lineDashOffset != "undefined" ? this.lineDashOffset = value : this.webkitLineDashOffset = value;
    }
    [dartx.getLineDash]() {
      if (!!this.getLineDash) {
        return this.getLineDash();
      } else if (!!this.webkitLineDash) {
        return this.webkitLineDash;
      }
    }
    [dartx.setLineDash](dash) {
      if (!!this.setLineDash) {
        this.setLineDash(dash);
      } else if (!!this.webkitLineDash) {
        this.webkitLineDash = dash;
      }
    }
    [dartx.fillText](text, x, y, maxWidth) {
      if (maxWidth === void 0) maxWidth = null;
      if (maxWidth != null) {
        this.fillText(text, x, y, maxWidth);
      } else {
        this.fillText(text, x, y);
      }
    }
    [dartx.fill](winding) {
      if (winding === void 0) winding = 'nonzero';
      this.fill(winding);
    }
    get [dartx.backingStorePixelRatio]() {
      return 1.0;
    }
  };
  html$.CanvasRenderingContext2D[dart.implements] = () => [html$.CanvasRenderingContext];
  dart.setSignature(html$.CanvasRenderingContext2D, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])}),
    fields: () => ({
      [dartx.canvas]: html$.CanvasElement,
      [dartx.currentTransform]: svg$.Matrix,
      [dartx.direction]: core.String,
      [dartx.fillStyle]: core.Object,
      [dartx.filter]: core.String,
      [dartx.font]: core.String,
      [dartx.globalAlpha]: core.num,
      [dartx.globalCompositeOperation]: core.String,
      [dartx.imageSmoothingEnabled]: core.bool,
      [dartx.lineCap]: core.String,
      [dartx.lineJoin]: core.String,
      [dartx.lineWidth]: core.num,
      [dartx.miterLimit]: core.num,
      [dartx.shadowBlur]: core.num,
      [dartx.shadowColor]: core.String,
      [dartx.shadowOffsetX]: core.num,
      [dartx.shadowOffsetY]: core.num,
      [dartx.strokeStyle]: core.Object,
      [dartx.textAlign]: core.String,
      [dartx.textBaseline]: core.String
    }),
    getters: () => ({
      [dartx.lineDashOffset]: dart.definiteFunctionType(core.num, []),
      [dartx.backingStorePixelRatio]: dart.definiteFunctionType(core.double, [])
    }),
    setters: () => ({[dartx.lineDashOffset]: dart.definiteFunctionType(dart.void, [core.num])}),
    methods: () => ({
      [dartx.addHitRegion]: dart.definiteFunctionType(dart.void, [], [core.Map]),
      [_addHitRegion_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_addHitRegion_2]: dart.definiteFunctionType(dart.void, []),
      [dartx.beginPath]: dart.definiteFunctionType(dart.void, []),
      [dartx.clearHitRegions]: dart.definiteFunctionType(dart.void, []),
      [dartx.clearRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.clip]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.String]),
      [dartx.createImageData]: dart.definiteFunctionType(html$.ImageData, [dart.dynamic], [core.num]),
      [_createImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      [_createImageData_2]: dart.definiteFunctionType(dart.dynamic, [core.num, dart.dynamic]),
      [dartx.createLinearGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
      [dartx.createPattern]: dart.definiteFunctionType(html$.CanvasPattern, [core.Object, core.String]),
      [dartx.createRadialGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.drawFocusIfNeeded]: dart.definiteFunctionType(dart.void, [dart.dynamic], [html$.Element]),
      [dartx.fillRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.getContextAttributes]: dart.definiteFunctionType(core.Map, []),
      [_getContextAttributes_1]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.getImageData]: dart.definiteFunctionType(html$.ImageData, [core.num, core.num, core.num, core.num]),
      [_getImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
      [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
      [dartx.isPointInPath]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
      [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [core.num]),
      [dartx.measureText]: dart.definiteFunctionType(html$.TextMetrics, [core.String]),
      [dartx.putImageData]: dart.definiteFunctionType(dart.void, [html$.ImageData, core.num, core.num], [core.num, core.num, core.num, core.num]),
      [_putImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [_putImageData_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.removeHitRegion]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.resetTransform]: dart.definiteFunctionType(dart.void, []),
      [dartx.restore]: dart.definiteFunctionType(dart.void, []),
      [dartx.rotate]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.save]: dart.definiteFunctionType(dart.void, []),
      [dartx.scale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.scrollPathIntoView]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
      [dartx.setTransform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.stroke]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
      [dartx.strokeRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.strokeText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
      [dartx.transform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.translate]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
      [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
      [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.createImageDataFromImageData]: dart.definiteFunctionType(html$.ImageData, [html$.ImageData]),
      [dartx.setFillColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
      [dartx.setFillColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
      [dartx.setStrokeColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
      [dartx.setStrokeColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
      [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num], [core.bool]),
      [dartx.createPatternFromImage]: dart.definiteFunctionType(html$.CanvasPattern, [html$.ImageElement, core.String]),
      [dartx.drawImageToRect]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, RectangleOfnum()], {sourceRect: RectangleOfnum()}),
      [dartx.drawImage]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num]),
      [dartx.drawImageScaled]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num]),
      [dartx.drawImageScaledFromSource]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
      [dartx.setLineDash]: dart.definiteFunctionType(dart.void, [ListOfnum()]),
      [dartx.fillText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
      [dartx.fill]: dart.definiteFunctionType(dart.void, [], [core.String])
    })
  });
  dart.registerExtension(dart.global.CanvasRenderingContext2D, html$.CanvasRenderingContext2D);
  html$.ChildNode = class ChildNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.ChildNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ChildNode, [])})
  });
  html$.ChromiumValuebuffer = class ChromiumValuebuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.ChromiumValuebuffer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ChromiumValuebuffer, [])})
  });
  dart.registerExtension(dart.global.CHROMIUMValuebuffer, html$.ChromiumValuebuffer);
  dart.defineExtensionNames([
    'id'
  ]);
  html$.GeofencingRegion = class GeofencingRegion extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
  };
  dart.setSignature(html$.GeofencingRegion, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingRegion, [])}),
    fields: () => ({[dartx.id]: core.String})
  });
  dart.registerExtension(dart.global.GeofencingRegion, html$.GeofencingRegion);
  dart.defineExtensionNames([
    'latitude',
    'longitude',
    'radius'
  ]);
  html$.CircularGeofencingRegion = class CircularGeofencingRegion extends html$.GeofencingRegion {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(init) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return html$.CircularGeofencingRegion._create_1(init_1);
    }
    static _create_1(init) {
      return new CircularGeofencingRegion(init);
    }
    get [dartx.latitude]() {
      return this.latitude;
    }
    get [dartx.longitude]() {
      return this.longitude;
    }
    get [dartx.radius]() {
      return this.radius;
    }
  };
  dart.setSignature(html$.CircularGeofencingRegion, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CircularGeofencingRegion, []),
      new: dart.definiteFunctionType(html$.CircularGeofencingRegion, [core.Map])
    }),
    fields: () => ({
      [dartx.latitude]: core.double,
      [dartx.longitude]: core.double,
      [dartx.radius]: core.double
    }),
    sfields: () => ({
      MAX_RADIUS: core.num,
      MIN_RADIUS: core.num
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.CircularGeofencingRegion, [dart.dynamic])}),
    names: ['_create_1']
  });
  html$.CircularGeofencingRegion.MAX_RADIUS = 100.0;
  html$.CircularGeofencingRegion.MIN_RADIUS = 1.0;
  dart.registerExtension(dart.global.CircularGeofencingRegion, html$.CircularGeofencingRegion);
  const _postMessage_1 = Symbol('_postMessage_1');
  const _postMessage_2 = Symbol('_postMessage_2');
  dart.defineExtensionNames([
    'postMessage',
    'frameType',
    'id',
    'url'
  ]);
  html$.Client = class Client extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.frameType]() {
      return this.frameType;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.url]() {
      return this.url;
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
  };
  dart.setSignature(html$.Client, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Client, [])}),
    fields: () => ({
      [dartx.frameType]: core.String,
      [dartx.id]: core.String,
      [dartx.url]: core.String
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.Client, html$.Client);
  const _matchAll_1 = Symbol('_matchAll_1');
  const _matchAll_2 = Symbol('_matchAll_2');
  dart.defineExtensionNames([
    'claim',
    'matchAll',
    'openWindow'
  ]);
  html$.Clients = class Clients extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.claim](...args) {
      return this.claim.apply(this, args);
    }
    [dartx.matchAll](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_matchAll_1](options_1);
      }
      return this[_matchAll_2]();
    }
    [_matchAll_1](...args) {
      return this.matchAll.apply(this, args);
    }
    [_matchAll_2](...args) {
      return this.matchAll.apply(this, args);
    }
    [dartx.openWindow](...args) {
      return this.openWindow.apply(this, args);
    }
  };
  dart.setSignature(html$.Clients, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Clients, [])}),
    methods: () => ({
      [dartx.claim]: dart.definiteFunctionType(async.Future, []),
      [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_matchAll_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.openWindow]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.Clients, html$.Clients);
  dart.defineExtensionNames([
    'clipboardData'
  ]);
  html$.ClipboardEvent = class ClipboardEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.clipboardData]() {
      return this.clipboardData;
    }
  };
  dart.setSignature(html$.ClipboardEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ClipboardEvent, [])}),
    fields: () => ({[dartx.clipboardData]: html$.DataTransfer})
  });
  dart.registerExtension(dart.global.ClipboardEvent, html$.ClipboardEvent);
  dart.defineExtensionNames([
    'code',
    'reason',
    'wasClean'
  ]);
  html$.CloseEvent = class CloseEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.CloseEvent._create_1(type, eventInitDict_1);
      }
      return html$.CloseEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new CloseEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new CloseEvent(type);
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.reason]() {
      return this.reason;
    }
    get [dartx.wasClean]() {
      return this.wasClean;
    }
  };
  dart.setSignature(html$.CloseEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CloseEvent, []),
      new: dart.definiteFunctionType(html$.CloseEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.reason]: core.String,
      [dartx.wasClean]: core.bool
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.CloseEvent, html$.CloseEvent);
  html$.Comment = class Comment extends html$.CharacterData {
    static new(data) {
      if (data === void 0) data = null;
      if (data != null) {
        return html$.document.createComment(data);
      }
      return html$.document.createComment("");
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.Comment, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Comment, [], [core.String]),
      _: dart.definiteFunctionType(html$.Comment, [])
    })
  });
  dart.registerExtension(dart.global.Comment, html$.Comment);
  const _initCompositionEvent = Symbol('_initCompositionEvent');
  const _initUIEvent = Symbol('_initUIEvent');
  const _charCode = Symbol('_charCode');
  const _keyCode = Symbol('_keyCode');
  const _get_view = Symbol('_get_view');
  const _which = Symbol('_which');
  dart.defineExtensionNames([
    'view',
    'detail',
    'sourceDevice'
  ]);
  html$.UIEvent = class UIEvent extends html$.Event {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let detail = opts && 'detail' in opts ? opts.detail : 0;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.UIEvent._check(html$.document[_createEvent]("UIEvent"));
      e[_initUIEvent](type, canBubble, cancelable, view, detail);
      return e;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.UIEvent._create_1(type, eventInitDict_1);
      }
      return html$.UIEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new UIEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new UIEvent(type);
    }
    get [_charCode]() {
      return this.charCode;
    }
    get [dartx.detail]() {
      return this.detail;
    }
    get [_keyCode]() {
      return this.keyCode;
    }
    get [dartx.sourceDevice]() {
      return this.sourceDevice;
    }
    get [dartx.view]() {
      return html$._convertNativeToDart_Window(this[_get_view]);
    }
    get [_get_view]() {
      return this.view;
    }
    get [_which]() {
      return this.which;
    }
    [_initUIEvent](...args) {
      return this.initUIEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.UIEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.UIEvent, [core.String], {view: html$.Window, detail: core.int, canBubble: core.bool, cancelable: core.bool}),
      _: dart.definiteFunctionType(html$.UIEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_charCode]: core.int,
      [dartx.detail]: core.int,
      [_keyCode]: core.int,
      [dartx.sourceDevice]: html$.InputDevice,
      [_get_view]: dart.dynamic,
      [_which]: core.int
    }),
    getters: () => ({[dartx.view]: dart.definiteFunctionType(html$.WindowBase, [])}),
    methods: () => ({[_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.UIEvent, html$.UIEvent);
  dart.defineExtensionNames([
    'data'
  ]);
  html$.CompositionEvent = class CompositionEvent extends html$.UIEvent {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let view = opts && 'view' in opts ? opts.view : null;
      let data = opts && 'data' in opts ? opts.data : null;
      let locale = opts && 'locale' in opts ? opts.locale : null;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.CompositionEvent._check(html$.document[_createEvent]("CompositionEvent"));
      if (dart.test(html_common.Device.isFirefox)) {
        e.initCompositionEvent(type, canBubble, cancelable, view, data, locale);
      } else {
        e[_initCompositionEvent](type, canBubble, cancelable, view, data);
      }
      return e;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.CompositionEvent._create_1(type, eventInitDict_1);
      }
      return html$.CompositionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new CompositionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new CompositionEvent(type);
    }
    get [dartx.data]() {
      return this.data;
    }
    [_initCompositionEvent](...args) {
      return this.initCompositionEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.CompositionEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.CompositionEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String, locale: core.String}),
      _: dart.definiteFunctionType(html$.CompositionEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.data]: core.String}),
    methods: () => ({[_initCompositionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.CompositionEvent, html$.CompositionEvent);
  dart.defineExtensionNames([
    'disconnect',
    'supports',
    'opacity',
    'scrollLeft',
    'scrollTop',
    'transform'
  ]);
  html$.CompositorProxy = class CompositorProxy extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(element, attributeArray) {
      return html$.CompositorProxy._create_1(element, attributeArray);
    }
    static _create_1(element, attributeArray) {
      return new CompositorProxy(element, attributeArray);
    }
    get [dartx.opacity]() {
      return this.opacity;
    }
    set [dartx.opacity](value) {
      this.opacity = value;
    }
    get [dartx.scrollLeft]() {
      return this.scrollLeft;
    }
    set [dartx.scrollLeft](value) {
      this.scrollLeft = value;
    }
    get [dartx.scrollTop]() {
      return this.scrollTop;
    }
    set [dartx.scrollTop](value) {
      this.scrollTop = value;
    }
    get [dartx.transform]() {
      return this.transform;
    }
    set [dartx.transform](value) {
      this.transform = value;
    }
    [dartx.disconnect](...args) {
      return this.disconnect.apply(this, args);
    }
    [dartx.supports](...args) {
      return this.supports.apply(this, args);
    }
  };
  dart.setSignature(html$.CompositorProxy, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CompositorProxy, []),
      new: dart.definiteFunctionType(html$.CompositorProxy, [html$.Element, ListOfString()])
    }),
    fields: () => ({
      [dartx.opacity]: core.num,
      [dartx.scrollLeft]: core.num,
      [dartx.scrollTop]: core.num,
      [dartx.transform]: html$.DomMatrix
    }),
    methods: () => ({
      [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
      [dartx.supports]: dart.definiteFunctionType(core.bool, [core.String])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorProxy, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.CompositorProxy, html$.CompositorProxy);
  dart.defineExtensionNames([
    'postMessage',
    'terminate',
    'onError',
    'onMessage'
  ]);
  html$.CompositorWorker = class CompositorWorker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(scriptUrl) {
      return html$.CompositorWorker._create_1(scriptUrl);
    }
    static _create_1(scriptUrl) {
      return new CompositorWorker(scriptUrl);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.terminate](...args) {
      return this.terminate.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.CompositorWorker.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.CompositorWorker.messageEvent.forTarget(this);
    }
  };
  html$.CompositorWorker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$.CompositorWorker, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.CompositorWorker, []),
      new: dart.definiteFunctionType(html$.CompositorWorker, [core.String])
    }),
    getters: () => ({
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent()
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorWorker, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.defineLazy(html$.CompositorWorker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.CompositorWorker, html$.CompositorWorker);
  const _fetch_1 = Symbol('_fetch_1');
  const _fetch_2 = Symbol('_fetch_2');
  const _webkitRequestFileSystem = Symbol('_webkitRequestFileSystem');
  const _webkitResolveLocalFileSystemUrl = Symbol('_webkitResolveLocalFileSystemUrl');
  const _setInterval_String = Symbol('_setInterval_String');
  const _setTimeout_String = Symbol('_setTimeout_String');
  const _clearInterval = Symbol('_clearInterval');
  const _clearTimeout = Symbol('_clearTimeout');
  const _setInterval = Symbol('_setInterval');
  const _setTimeout = Symbol('_setTimeout');
  dart.defineExtensionNames([
    'close',
    'fetch',
    'importScripts',
    'webkitRequestFileSystem',
    'requestFileSystemSync',
    'resolveLocalFileSystemSyncUrl',
    'webkitResolveLocalFileSystemUrl',
    'atob',
    'btoa',
    'onError',
    'caches',
    'console',
    'crypto',
    'indexedDB',
    'location',
    'navigator',
    'performance',
    'self'
  ]);
  html$.WorkerGlobalScope = class WorkerGlobalScope extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.caches]() {
      return this.caches;
    }
    get [dartx.console]() {
      return this.console;
    }
    get [dartx.crypto]() {
      return this.crypto;
    }
    get [dartx.indexedDB]() {
      return this.indexedDB;
    }
    get [dartx.location]() {
      return this.location;
    }
    get [dartx.navigator]() {
      return this.navigator;
    }
    get [dartx.performance]() {
      return this.performance;
    }
    get [dartx.self]() {
      return this.self;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.fetch](input, init) {
      if (init === void 0) init = null;
      if (init != null) {
        let init_1 = html_common.convertDartToNative_Dictionary(init);
        return this[_fetch_1](input, init_1);
      }
      return this[_fetch_2](input);
    }
    [_fetch_1](...args) {
      return this.fetch.apply(this, args);
    }
    [_fetch_2](...args) {
      return this.fetch.apply(this, args);
    }
    [dartx.importScripts](...args) {
      return this.importScripts.apply(this, args);
    }
    [_webkitRequestFileSystem](...args) {
      return this.webkitRequestFileSystem.apply(this, args);
    }
    [dartx.webkitRequestFileSystem](type, size) {
      let completer = CompleterOfFileSystem().new();
      this[_webkitRequestFileSystem](type, size, dart.fn(value => {
        completer.complete(value);
      }, FileSystemTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.requestFileSystemSync](...args) {
      return this.webkitRequestFileSystemSync.apply(this, args);
    }
    [dartx.resolveLocalFileSystemSyncUrl](...args) {
      return this.webkitResolveLocalFileSystemSyncURL.apply(this, args);
    }
    [_webkitResolveLocalFileSystemUrl](...args) {
      return this.webkitResolveLocalFileSystemURL.apply(this, args);
    }
    [dartx.webkitResolveLocalFileSystemUrl](url) {
      let completer = CompleterOfEntry().new();
      this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
        completer.complete(value);
      }, EntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.atob](...args) {
      return this.atob.apply(this, args);
    }
    [dartx.btoa](...args) {
      return this.btoa.apply(this, args);
    }
    [_setInterval_String](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout_String](...args) {
      return this.setTimeout.apply(this, args);
    }
    [_clearInterval](...args) {
      return this.clearInterval.apply(this, args);
    }
    [_clearTimeout](...args) {
      return this.clearTimeout.apply(this, args);
    }
    [_setInterval](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout](...args) {
      return this.setTimeout.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.WorkerGlobalScope.errorEvent.forTarget(this);
    }
  };
  html$.WorkerGlobalScope[dart.implements] = () => [html$._WindowTimers, html$.WindowBase64];
  dart.setSignature(html$.WorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerGlobalScope, [])}),
    fields: () => ({
      [dartx.caches]: html$.CacheStorage,
      [dartx.console]: html$.WorkerConsole,
      [dartx.crypto]: html$.Crypto,
      [dartx.indexedDB]: indexed_db.IdbFactory,
      [dartx.location]: html$._WorkerLocation,
      [dartx.navigator]: html$._WorkerNavigator,
      [dartx.performance]: html$.WorkerPerformance,
      [dartx.self]: html$.WorkerGlobalScope
    }),
    getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
      [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.importScripts]: dart.definiteFunctionType(dart.void, [core.String]),
      [_webkitRequestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$._FileSystemCallback, html$._ErrorCallback]),
      [dartx.webkitRequestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
      [dartx.requestFileSystemSync]: dart.definiteFunctionType(html$._DOMFileSystemSync, [core.int, core.int]),
      [dartx.resolveLocalFileSystemSyncUrl]: dart.definiteFunctionType(html$._EntrySync, [core.String]),
      [_webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
      [dartx.webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
      [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      PERSISTENT: core.int,
      TEMPORARY: core.int
    })
  });
  html$.WorkerGlobalScope.PERSISTENT = 1;
  html$.WorkerGlobalScope.TEMPORARY = 0;
  dart.defineLazy(html$.WorkerGlobalScope, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.registerExtension(dart.global.WorkerGlobalScope, html$.WorkerGlobalScope);
  dart.defineExtensionNames([
    'cancelAnimationFrame',
    'postMessage',
    'requestAnimationFrame',
    'onMessage'
  ]);
  html$.CompositorWorkerGlobalScope = class CompositorWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cancelAnimationFrame](...args) {
      return this.cancelAnimationFrame.apply(this, args);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.requestAnimationFrame](...args) {
      return this.requestAnimationFrame.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.CompositorWorkerGlobalScope.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.CompositorWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CompositorWorkerGlobalScope, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.CompositorWorkerGlobalScope, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.CompositorWorkerGlobalScope, html$.CompositorWorkerGlobalScope);
  const _isConsoleDefined = Symbol('_isConsoleDefined');
  html$.Console = class Console extends core.Object {
    _safe() {
    }
    get [_isConsoleDefined]() {
      return typeof console != "undefined";
    }
    get memory() {
      return html$.MemoryInfo._check(dart.test(this[_isConsoleDefined]) ? console.memory : null);
    }
    assertCondition(condition, arg) {
      return dart.test(this[_isConsoleDefined]) ? console.assertCondition(condition, arg) : null;
    }
    clear(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.clear(arg) : null;
    }
    count(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.count(arg) : null;
    }
    debug(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.debug(arg) : null;
    }
    dir(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.dir(arg) : null;
    }
    dirxml(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.dirxml(arg) : null;
    }
    error(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.error(arg) : null;
    }
    group(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.group(arg) : null;
    }
    groupCollapsed(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.groupCollapsed(arg) : null;
    }
    groupEnd() {
      return dart.test(this[_isConsoleDefined]) ? console.groupEnd() : null;
    }
    info(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.info(arg) : null;
    }
    log(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.log(arg) : null;
    }
    markTimeline(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.markTimeline(arg) : null;
    }
    profile(title) {
      return dart.test(this[_isConsoleDefined]) ? console.profile(title) : null;
    }
    profileEnd(title) {
      return dart.test(this[_isConsoleDefined]) ? console.profileEnd(title) : null;
    }
    table(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.table(arg) : null;
    }
    time(title) {
      return dart.test(this[_isConsoleDefined]) ? console.time(title) : null;
    }
    timeEnd(title) {
      return dart.test(this[_isConsoleDefined]) ? console.timeEnd(title) : null;
    }
    timeStamp(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.timeStamp(arg) : null;
    }
    trace(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.trace(arg) : null;
    }
    warn(arg) {
      return dart.test(this[_isConsoleDefined]) ? console.warn(arg) : null;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.defineNamedConstructor(html$.Console, '_safe');
  dart.setSignature(html$.Console, {
    constructors: () => ({
      _safe: dart.definiteFunctionType(html$.Console, []),
      _: dart.definiteFunctionType(html$.Console, [])
    }),
    getters: () => ({
      [_isConsoleDefined]: dart.definiteFunctionType(core.bool, []),
      memory: dart.definiteFunctionType(html$.MemoryInfo, [])
    }),
    methods: () => ({
      assertCondition: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
      clear: dart.definiteFunctionType(dart.void, [core.Object]),
      count: dart.definiteFunctionType(dart.void, [core.Object]),
      debug: dart.definiteFunctionType(dart.void, [core.Object]),
      dir: dart.definiteFunctionType(dart.void, [core.Object]),
      dirxml: dart.definiteFunctionType(dart.void, [core.Object]),
      error: dart.definiteFunctionType(dart.void, [core.Object]),
      group: dart.definiteFunctionType(dart.void, [core.Object]),
      groupCollapsed: dart.definiteFunctionType(dart.void, [core.Object]),
      groupEnd: dart.definiteFunctionType(dart.void, []),
      info: dart.definiteFunctionType(dart.void, [core.Object]),
      log: dart.definiteFunctionType(dart.void, [core.Object]),
      markTimeline: dart.definiteFunctionType(dart.void, [core.Object]),
      profile: dart.definiteFunctionType(dart.void, [core.String]),
      profileEnd: dart.definiteFunctionType(dart.void, [core.String]),
      table: dart.definiteFunctionType(dart.void, [core.Object]),
      time: dart.definiteFunctionType(dart.void, [core.String]),
      timeEnd: dart.definiteFunctionType(dart.void, [core.String]),
      timeStamp: dart.definiteFunctionType(dart.void, [core.Object]),
      trace: dart.definiteFunctionType(dart.void, [core.Object]),
      warn: dart.definiteFunctionType(dart.void, [core.Object])
    }),
    sfields: () => ({_safeConsole: html$.Console})
  });
  dart.defineLazy(html$.Console, {
    get _safeConsole() {
      return dart.const(new html$.Console._safe());
    }
  });
  dart.defineExtensionNames([
    'assertCondition',
    'timeline',
    'timelineEnd'
  ]);
  html$.ConsoleBase = class ConsoleBase extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.assertCondition](...args) {
      return this.assert.apply(this, args);
    }
    [dartx.timeline](...args) {
      return this.timeline.apply(this, args);
    }
    [dartx.timelineEnd](...args) {
      return this.timelineEnd.apply(this, args);
    }
  };
  dart.setSignature(html$.ConsoleBase, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ConsoleBase, [])}),
    methods: () => ({
      [dartx.assertCondition]: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
      [dartx.timeline]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.timelineEnd]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.ConsoleBase, html$.ConsoleBase);
  dart.defineExtensionNames([
    'getDistributedNodes',
    'select'
  ]);
  html$.ContentElement = class ContentElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ContentElement._check(html$.document[dartx.createElement]("content"));
    }
    created() {
      this[dartx.select] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('content');
    }
    get [dartx.select]() {
      return this.select;
    }
    set [dartx.select](value) {
      this.select = value;
    }
    [dartx.getDistributedNodes](...args) {
      return this.getDistributedNodes.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ContentElement, 'created');
  dart.setSignature(html$.ContentElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ContentElement, []),
      new: dart.definiteFunctionType(html$.ContentElement, []),
      created: dart.definiteFunctionType(html$.ContentElement, [])
    }),
    fields: () => ({[dartx.select]: core.String}),
    methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLContentElement, html$.ContentElement);
  dart.defineExtensionNames([
    'accuracy',
    'altitude',
    'altitudeAccuracy',
    'heading',
    'latitude',
    'longitude',
    'speed'
  ]);
  html$.Coordinates = class Coordinates extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.accuracy]() {
      return this.accuracy;
    }
    get [dartx.altitude]() {
      return this.altitude;
    }
    get [dartx.altitudeAccuracy]() {
      return this.altitudeAccuracy;
    }
    get [dartx.heading]() {
      return this.heading;
    }
    get [dartx.latitude]() {
      return this.latitude;
    }
    get [dartx.longitude]() {
      return this.longitude;
    }
    get [dartx.speed]() {
      return this.speed;
    }
  };
  dart.setSignature(html$.Coordinates, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Coordinates, [])}),
    fields: () => ({
      [dartx.accuracy]: core.double,
      [dartx.altitude]: core.double,
      [dartx.altitudeAccuracy]: core.double,
      [dartx.heading]: core.double,
      [dartx.latitude]: core.double,
      [dartx.longitude]: core.double,
      [dartx.speed]: core.double
    })
  });
  dart.registerExtension(dart.global.Coordinates, html$.Coordinates);
  dart.defineExtensionNames([
    'iconUrl',
    'id',
    'name',
    'type'
  ]);
  html$.Credential = class Credential extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.iconUrl]() {
      return this.iconURL;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.Credential, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Credential, [])}),
    fields: () => ({
      [dartx.iconUrl]: core.String,
      [dartx.id]: core.String,
      [dartx.name]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.Credential, html$.Credential);
  const _request_1 = Symbol('_request_1');
  const _request_2 = Symbol('_request_2');
  dart.defineExtensionNames([
    'notifySignedIn',
    'request',
    'requireUserMediation'
  ]);
  html$.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.notifySignedIn](...args) {
      return this.notifySignedIn.apply(this, args);
    }
    [dartx.request](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_request_1](options_1);
      }
      return this[_request_2]();
    }
    [_request_1](...args) {
      return this.request.apply(this, args);
    }
    [_request_2](...args) {
      return this.request.apply(this, args);
    }
    [dartx.requireUserMediation](...args) {
      return this.requireUserMediation.apply(this, args);
    }
  };
  dart.setSignature(html$.CredentialsContainer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CredentialsContainer, [])}),
    methods: () => ({
      [dartx.notifySignedIn]: dart.definiteFunctionType(async.Future, [html$.Credential]),
      [dartx.request]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_request_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_request_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.requireUserMediation]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.CredentialsContainer, html$.CredentialsContainer);
  dart.defineExtensionNames([
    'acceptConnection',
    'client'
  ]);
  html$.CrossOriginConnectEvent = class CrossOriginConnectEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.client]() {
      return this.client;
    }
    [dartx.acceptConnection](...args) {
      return this.acceptConnection.apply(this, args);
    }
  };
  dart.setSignature(html$.CrossOriginConnectEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginConnectEvent, [])}),
    fields: () => ({[dartx.client]: html$.CrossOriginServiceWorkerClient}),
    methods: () => ({[dartx.acceptConnection]: dart.definiteFunctionType(dart.void, [async.Future])})
  });
  dart.registerExtension(dart.global.CrossOriginConnectEvent, html$.CrossOriginConnectEvent);
  dart.defineExtensionNames([
    'postMessage',
    'origin',
    'targetUrl'
  ]);
  html$.CrossOriginServiceWorkerClient = class CrossOriginServiceWorkerClient extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.targetUrl]() {
      return this.targetUrl;
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
  };
  dart.setSignature(html$.CrossOriginServiceWorkerClient, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginServiceWorkerClient, [])}),
    fields: () => ({
      [dartx.origin]: core.String,
      [dartx.targetUrl]: core.String
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.CrossOriginServiceWorkerClient, html$.CrossOriginServiceWorkerClient);
  const _getRandomValues = Symbol('_getRandomValues');
  dart.defineExtensionNames([
    'getRandomValues',
    'subtle'
  ]);
  html$.Crypto = class Crypto extends _interceptors.Interceptor {
    [dartx.getRandomValues](array) {
      return this[_getRandomValues](array);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!(window.crypto && window.crypto.getRandomValues);
    }
    get [dartx.subtle]() {
      return this.subtle;
    }
    [_getRandomValues](...args) {
      return this.getRandomValues.apply(this, args);
    }
  };
  dart.setSignature(html$.Crypto, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Crypto, [])}),
    fields: () => ({[dartx.subtle]: html$._SubtleCrypto}),
    methods: () => ({
      [dartx.getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData]),
      [_getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.Crypto, html$.Crypto);
  dart.defineExtensionNames([
    'algorithm',
    'extractable',
    'type',
    'usages'
  ]);
  html$.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.algorithm]() {
      return this.algorithm;
    }
    get [dartx.extractable]() {
      return this.extractable;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.usages]() {
      return this.usages;
    }
  };
  dart.setSignature(html$.CryptoKey, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CryptoKey, [])}),
    fields: () => ({
      [dartx.algorithm]: core.Object,
      [dartx.extractable]: core.bool,
      [dartx.type]: core.String,
      [dartx.usages]: ListOfString()
    })
  });
  dart.registerExtension(dart.global.CryptoKey, html$.CryptoKey);
  html$.Css = class Css extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.Css, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Css, [])}),
    statics: () => ({
      supports: dart.definiteFunctionType(core.bool, [core.String, core.String]),
      supportsCondition: dart.definiteFunctionType(core.bool, [core.String])
    }),
    names: ['supports', 'supportsCondition']
  });
  dart.registerExtension(dart.global.CSS, html$.Css);
  dart.defineExtensionNames([
    'cssText',
    'parentRule',
    'parentStyleSheet',
    'type'
  ]);
  html$.CssRule = class CssRule extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssText]() {
      return this.cssText;
    }
    set [dartx.cssText](value) {
      this.cssText = value;
    }
    get [dartx.parentRule]() {
      return this.parentRule;
    }
    get [dartx.parentStyleSheet]() {
      return this.parentStyleSheet;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.CssRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssRule, [])}),
    fields: () => ({
      [dartx.cssText]: core.String,
      [dartx.parentRule]: html$.CssRule,
      [dartx.parentStyleSheet]: html$.CssStyleSheet,
      [dartx.type]: core.int
    }),
    sfields: () => ({
      CHARSET_RULE: core.int,
      FONT_FACE_RULE: core.int,
      IMPORT_RULE: core.int,
      KEYFRAMES_RULE: core.int,
      KEYFRAME_RULE: core.int,
      MEDIA_RULE: core.int,
      PAGE_RULE: core.int,
      STYLE_RULE: core.int,
      SUPPORTS_RULE: core.int,
      VIEWPORT_RULE: core.int,
      WEBKIT_KEYFRAMES_RULE: core.int,
      WEBKIT_KEYFRAME_RULE: core.int
    })
  });
  html$.CssRule.CHARSET_RULE = 2;
  html$.CssRule.FONT_FACE_RULE = 5;
  html$.CssRule.IMPORT_RULE = 3;
  html$.CssRule.KEYFRAMES_RULE = 7;
  html$.CssRule.KEYFRAME_RULE = 8;
  html$.CssRule.MEDIA_RULE = 4;
  html$.CssRule.PAGE_RULE = 6;
  html$.CssRule.STYLE_RULE = 1;
  html$.CssRule.SUPPORTS_RULE = 12;
  html$.CssRule.VIEWPORT_RULE = 15;
  html$.CssRule.WEBKIT_KEYFRAMES_RULE = 7;
  html$.CssRule.WEBKIT_KEYFRAME_RULE = 8;
  dart.registerExtension(dart.global.CSSRule, html$.CssRule);
  dart.defineExtensionNames([
    'encoding'
  ]);
  html$.CssCharsetRule = class CssCharsetRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.encoding]() {
      return this.encoding;
    }
    set [dartx.encoding](value) {
      this.encoding = value;
    }
  };
  dart.setSignature(html$.CssCharsetRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssCharsetRule, [])}),
    fields: () => ({[dartx.encoding]: core.String})
  });
  dart.registerExtension(dart.global.CSSCharsetRule, html$.CssCharsetRule);
  dart.defineExtensionNames([
    'style'
  ]);
  html$.CssFontFaceRule = class CssFontFaceRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssFontFaceRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssFontFaceRule, [])}),
    fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
  });
  dart.registerExtension(dart.global.CSSFontFaceRule, html$.CssFontFaceRule);
  dart.defineExtensionNames([
    'deleteRule',
    'insertRule',
    'cssRules'
  ]);
  html$.CssGroupingRule = class CssGroupingRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.insertRule](...args) {
      return this.insertRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssGroupingRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssGroupingRule, [])}),
    fields: () => ({[dartx.cssRules]: ListOfCssRule()}),
    methods: () => ({
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
    })
  });
  dart.registerExtension(dart.global.CSSGroupingRule, html$.CssGroupingRule);
  dart.defineExtensionNames([
    'href',
    'media',
    'styleSheet'
  ]);
  html$.CssImportRule = class CssImportRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.href]() {
      return this.href;
    }
    get [dartx.media]() {
      return this.media;
    }
    get [dartx.styleSheet]() {
      return this.styleSheet;
    }
  };
  dart.setSignature(html$.CssImportRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssImportRule, [])}),
    fields: () => ({
      [dartx.href]: core.String,
      [dartx.media]: html$.MediaList,
      [dartx.styleSheet]: html$.CssStyleSheet
    })
  });
  dart.registerExtension(dart.global.CSSImportRule, html$.CssImportRule);
  dart.defineExtensionNames([
    'keyText',
    'style'
  ]);
  html$.CssKeyframeRule = class CssKeyframeRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.keyText]() {
      return this.keyText;
    }
    set [dartx.keyText](value) {
      this.keyText = value;
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssKeyframeRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframeRule, [])}),
    fields: () => ({
      [dartx.keyText]: core.String,
      [dartx.style]: html$.CssStyleDeclaration
    })
  });
  dart.registerExtension(dart.global.CSSKeyframeRule, html$.CssKeyframeRule);
  dart.registerExtension(dart.global.MozCSSKeyframeRule, html$.CssKeyframeRule);
  dart.registerExtension(dart.global.WebKitCSSKeyframeRule, html$.CssKeyframeRule);
  dart.defineExtensionNames([
    'appendRule',
    'deleteRule',
    'findRule',
    'cssRules',
    'name'
  ]);
  html$.CssKeyframesRule = class CssKeyframesRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.appendRule](...args) {
      return this.appendRule.apply(this, args);
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.findRule](...args) {
      return this.findRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssKeyframesRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframesRule, [])}),
    fields: () => ({
      [dartx.cssRules]: ListOfCssRule(),
      [dartx.name]: core.String
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.int]),
      [dartx.appendRule]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.findRule]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.String])
    })
  });
  dart.registerExtension(dart.global.CSSKeyframesRule, html$.CssKeyframesRule);
  dart.registerExtension(dart.global.MozCSSKeyframesRule, html$.CssKeyframesRule);
  dart.registerExtension(dart.global.WebKitCSSKeyframesRule, html$.CssKeyframesRule);
  dart.defineExtensionNames([
    'media'
  ]);
  html$.CssMediaRule = class CssMediaRule extends html$.CssGroupingRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.media]() {
      return this.media;
    }
  };
  dart.setSignature(html$.CssMediaRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssMediaRule, [])}),
    fields: () => ({[dartx.media]: html$.MediaList})
  });
  dart.registerExtension(dart.global.CSSMediaRule, html$.CssMediaRule);
  dart.defineExtensionNames([
    'selectorText',
    'style'
  ]);
  html$.CssPageRule = class CssPageRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.selectorText]() {
      return this.selectorText;
    }
    set [dartx.selectorText](value) {
      this.selectorText = value;
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssPageRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssPageRule, [])}),
    fields: () => ({
      [dartx.selectorText]: core.String,
      [dartx.style]: html$.CssStyleDeclaration
    })
  });
  dart.registerExtension(dart.global.CSSPageRule, html$.CssPageRule);
  const _getPropertyValueHelper = Symbol('_getPropertyValueHelper');
  const _supportsProperty = Symbol('_supportsProperty');
  const _getPropertyValue = Symbol('_getPropertyValue');
  const _setPropertyHelper = Symbol('_setPropertyHelper');
  const _browserPropertyName = Symbol('_browserPropertyName');
  const _background = Symbol('_background');
  const _backgroundAttachment = Symbol('_backgroundAttachment');
  const _backgroundColor = Symbol('_backgroundColor');
  const _backgroundImage = Symbol('_backgroundImage');
  const _backgroundPosition = Symbol('_backgroundPosition');
  const _backgroundRepeat = Symbol('_backgroundRepeat');
  const _border = Symbol('_border');
  const _borderBottom = Symbol('_borderBottom');
  const _borderBottomColor = Symbol('_borderBottomColor');
  const _borderBottomStyle = Symbol('_borderBottomStyle');
  const _borderBottomWidth = Symbol('_borderBottomWidth');
  const _borderCollapse = Symbol('_borderCollapse');
  const _borderColor = Symbol('_borderColor');
  const _borderLeft = Symbol('_borderLeft');
  const _borderLeftColor = Symbol('_borderLeftColor');
  const _borderLeftStyle = Symbol('_borderLeftStyle');
  const _borderLeftWidth = Symbol('_borderLeftWidth');
  const _borderRight = Symbol('_borderRight');
  const _borderRightColor = Symbol('_borderRightColor');
  const _borderRightStyle = Symbol('_borderRightStyle');
  const _borderRightWidth = Symbol('_borderRightWidth');
  const _borderSpacing = Symbol('_borderSpacing');
  const _borderStyle = Symbol('_borderStyle');
  const _borderTop = Symbol('_borderTop');
  const _borderTopColor = Symbol('_borderTopColor');
  const _borderTopStyle = Symbol('_borderTopStyle');
  const _borderTopWidth = Symbol('_borderTopWidth');
  const _borderWidth = Symbol('_borderWidth');
  const _bottom = Symbol('_bottom');
  const _captionSide = Symbol('_captionSide');
  const _clear$1 = Symbol('_clear');
  const _clip = Symbol('_clip');
  const _color = Symbol('_color');
  const _content = Symbol('_content');
  const _cursor = Symbol('_cursor');
  const _direction = Symbol('_direction');
  const _display = Symbol('_display');
  const _emptyCells = Symbol('_emptyCells');
  const _font = Symbol('_font');
  const _fontFamily = Symbol('_fontFamily');
  const _fontSize = Symbol('_fontSize');
  const _fontStyle = Symbol('_fontStyle');
  const _fontVariant = Symbol('_fontVariant');
  const _fontWeight = Symbol('_fontWeight');
  const _height$ = Symbol('_height');
  const _left = Symbol('_left');
  const _letterSpacing = Symbol('_letterSpacing');
  const _lineHeight = Symbol('_lineHeight');
  const _listStyle = Symbol('_listStyle');
  const _listStyleImage = Symbol('_listStyleImage');
  const _listStylePosition = Symbol('_listStylePosition');
  const _listStyleType = Symbol('_listStyleType');
  const _margin = Symbol('_margin');
  const _marginBottom = Symbol('_marginBottom');
  const _marginLeft = Symbol('_marginLeft');
  const _marginRight = Symbol('_marginRight');
  const _marginTop = Symbol('_marginTop');
  const _maxHeight = Symbol('_maxHeight');
  const _maxWidth = Symbol('_maxWidth');
  const _minHeight = Symbol('_minHeight');
  const _minWidth = Symbol('_minWidth');
  const _outline = Symbol('_outline');
  const _outlineColor = Symbol('_outlineColor');
  const _outlineStyle = Symbol('_outlineStyle');
  const _outlineWidth = Symbol('_outlineWidth');
  const _overflow = Symbol('_overflow');
  const _padding = Symbol('_padding');
  const _paddingBottom = Symbol('_paddingBottom');
  const _paddingLeft = Symbol('_paddingLeft');
  const _paddingRight = Symbol('_paddingRight');
  const _paddingTop = Symbol('_paddingTop');
  const _pageBreakAfter = Symbol('_pageBreakAfter');
  const _pageBreakBefore = Symbol('_pageBreakBefore');
  const _pageBreakInside = Symbol('_pageBreakInside');
  const _position$0 = Symbol('_position');
  const _quotes = Symbol('_quotes');
  const _right = Symbol('_right');
  const _tableLayout = Symbol('_tableLayout');
  const _textAlign = Symbol('_textAlign');
  const _textDecoration = Symbol('_textDecoration');
  const _textIndent = Symbol('_textIndent');
  const _textTransform = Symbol('_textTransform');
  const _top = Symbol('_top');
  const _unicodeBidi = Symbol('_unicodeBidi');
  const _verticalAlign = Symbol('_verticalAlign');
  const _visibility = Symbol('_visibility');
  const _whiteSpace = Symbol('_whiteSpace');
  const _width$ = Symbol('_width');
  const _wordSpacing = Symbol('_wordSpacing');
  const _zIndex = Symbol('_zIndex');
  dart.defineExtensionNames([
    'alignContent',
    'alignContent',
    'alignItems',
    'alignItems',
    'alignSelf',
    'alignSelf',
    'animation',
    'animation',
    'animationDelay',
    'animationDelay',
    'animationDirection',
    'animationDirection',
    'animationDuration',
    'animationDuration',
    'animationFillMode',
    'animationFillMode',
    'animationIterationCount',
    'animationIterationCount',
    'animationName',
    'animationName',
    'animationPlayState',
    'animationPlayState',
    'animationTimingFunction',
    'animationTimingFunction',
    'appRegion',
    'appRegion',
    'appearance',
    'appearance',
    'aspectRatio',
    'aspectRatio',
    'backfaceVisibility',
    'backfaceVisibility',
    'background',
    'background',
    'backgroundAttachment',
    'backgroundAttachment',
    'backgroundBlendMode',
    'backgroundBlendMode',
    'backgroundClip',
    'backgroundClip',
    'backgroundColor',
    'backgroundColor',
    'backgroundComposite',
    'backgroundComposite',
    'backgroundImage',
    'backgroundImage',
    'backgroundOrigin',
    'backgroundOrigin',
    'backgroundPosition',
    'backgroundPosition',
    'backgroundPositionX',
    'backgroundPositionX',
    'backgroundPositionY',
    'backgroundPositionY',
    'backgroundRepeat',
    'backgroundRepeat',
    'backgroundRepeatX',
    'backgroundRepeatX',
    'backgroundRepeatY',
    'backgroundRepeatY',
    'backgroundSize',
    'backgroundSize',
    'border',
    'border',
    'borderAfter',
    'borderAfter',
    'borderAfterColor',
    'borderAfterColor',
    'borderAfterStyle',
    'borderAfterStyle',
    'borderAfterWidth',
    'borderAfterWidth',
    'borderBefore',
    'borderBefore',
    'borderBeforeColor',
    'borderBeforeColor',
    'borderBeforeStyle',
    'borderBeforeStyle',
    'borderBeforeWidth',
    'borderBeforeWidth',
    'borderBottom',
    'borderBottom',
    'borderBottomColor',
    'borderBottomColor',
    'borderBottomLeftRadius',
    'borderBottomLeftRadius',
    'borderBottomRightRadius',
    'borderBottomRightRadius',
    'borderBottomStyle',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderBottomWidth',
    'borderCollapse',
    'borderCollapse',
    'borderColor',
    'borderColor',
    'borderEnd',
    'borderEnd',
    'borderEndColor',
    'borderEndColor',
    'borderEndStyle',
    'borderEndStyle',
    'borderEndWidth',
    'borderEndWidth',
    'borderFit',
    'borderFit',
    'borderHorizontalSpacing',
    'borderHorizontalSpacing',
    'borderImage',
    'borderImage',
    'borderImageOutset',
    'borderImageOutset',
    'borderImageRepeat',
    'borderImageRepeat',
    'borderImageSlice',
    'borderImageSlice',
    'borderImageSource',
    'borderImageSource',
    'borderImageWidth',
    'borderImageWidth',
    'borderLeft',
    'borderLeft',
    'borderLeftColor',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderLeftWidth',
    'borderRadius',
    'borderRadius',
    'borderRight',
    'borderRight',
    'borderRightColor',
    'borderRightColor',
    'borderRightStyle',
    'borderRightStyle',
    'borderRightWidth',
    'borderRightWidth',
    'borderSpacing',
    'borderSpacing',
    'borderStart',
    'borderStart',
    'borderStartColor',
    'borderStartColor',
    'borderStartStyle',
    'borderStartStyle',
    'borderStartWidth',
    'borderStartWidth',
    'borderStyle',
    'borderStyle',
    'borderTop',
    'borderTop',
    'borderTopColor',
    'borderTopColor',
    'borderTopLeftRadius',
    'borderTopLeftRadius',
    'borderTopRightRadius',
    'borderTopRightRadius',
    'borderTopStyle',
    'borderTopStyle',
    'borderTopWidth',
    'borderTopWidth',
    'borderVerticalSpacing',
    'borderVerticalSpacing',
    'borderWidth',
    'borderWidth',
    'bottom',
    'bottom',
    'boxAlign',
    'boxAlign',
    'boxDecorationBreak',
    'boxDecorationBreak',
    'boxDirection',
    'boxDirection',
    'boxFlex',
    'boxFlex',
    'boxFlexGroup',
    'boxFlexGroup',
    'boxLines',
    'boxLines',
    'boxOrdinalGroup',
    'boxOrdinalGroup',
    'boxOrient',
    'boxOrient',
    'boxPack',
    'boxPack',
    'boxReflect',
    'boxReflect',
    'boxShadow',
    'boxShadow',
    'boxSizing',
    'boxSizing',
    'captionSide',
    'captionSide',
    'clear',
    'clear',
    'clip',
    'clip',
    'clipPath',
    'clipPath',
    'color',
    'color',
    'columnBreakAfter',
    'columnBreakAfter',
    'columnBreakBefore',
    'columnBreakBefore',
    'columnBreakInside',
    'columnBreakInside',
    'columnCount',
    'columnCount',
    'columnFill',
    'columnFill',
    'columnGap',
    'columnGap',
    'columnRule',
    'columnRule',
    'columnRuleColor',
    'columnRuleColor',
    'columnRuleStyle',
    'columnRuleStyle',
    'columnRuleWidth',
    'columnRuleWidth',
    'columnSpan',
    'columnSpan',
    'columnWidth',
    'columnWidth',
    'columns',
    'columns',
    'content',
    'content',
    'counterIncrement',
    'counterIncrement',
    'counterReset',
    'counterReset',
    'cursor',
    'cursor',
    'direction',
    'direction',
    'display',
    'display',
    'emptyCells',
    'emptyCells',
    'filter',
    'filter',
    'flex',
    'flex',
    'flexBasis',
    'flexBasis',
    'flexDirection',
    'flexDirection',
    'flexFlow',
    'flexFlow',
    'flexGrow',
    'flexGrow',
    'flexShrink',
    'flexShrink',
    'flexWrap',
    'flexWrap',
    'float',
    'float',
    'font',
    'font',
    'fontFamily',
    'fontFamily',
    'fontFeatureSettings',
    'fontFeatureSettings',
    'fontKerning',
    'fontKerning',
    'fontSize',
    'fontSize',
    'fontSizeDelta',
    'fontSizeDelta',
    'fontSmoothing',
    'fontSmoothing',
    'fontStretch',
    'fontStretch',
    'fontStyle',
    'fontStyle',
    'fontVariant',
    'fontVariant',
    'fontVariantLigatures',
    'fontVariantLigatures',
    'fontWeight',
    'fontWeight',
    'grid',
    'grid',
    'gridArea',
    'gridArea',
    'gridAutoColumns',
    'gridAutoColumns',
    'gridAutoFlow',
    'gridAutoFlow',
    'gridAutoRows',
    'gridAutoRows',
    'gridColumn',
    'gridColumn',
    'gridColumnEnd',
    'gridColumnEnd',
    'gridColumnStart',
    'gridColumnStart',
    'gridRow',
    'gridRow',
    'gridRowEnd',
    'gridRowEnd',
    'gridRowStart',
    'gridRowStart',
    'gridTemplate',
    'gridTemplate',
    'gridTemplateAreas',
    'gridTemplateAreas',
    'gridTemplateColumns',
    'gridTemplateColumns',
    'gridTemplateRows',
    'gridTemplateRows',
    'height',
    'height',
    'highlight',
    'highlight',
    'hyphenateCharacter',
    'hyphenateCharacter',
    'imageRendering',
    'imageRendering',
    'isolation',
    'isolation',
    'justifyContent',
    'justifyContent',
    'justifySelf',
    'justifySelf',
    'left',
    'left',
    'letterSpacing',
    'letterSpacing',
    'lineBoxContain',
    'lineBoxContain',
    'lineBreak',
    'lineBreak',
    'lineClamp',
    'lineClamp',
    'lineHeight',
    'lineHeight',
    'listStyle',
    'listStyle',
    'listStyleImage',
    'listStyleImage',
    'listStylePosition',
    'listStylePosition',
    'listStyleType',
    'listStyleType',
    'locale',
    'locale',
    'logicalHeight',
    'logicalHeight',
    'logicalWidth',
    'logicalWidth',
    'margin',
    'margin',
    'marginAfter',
    'marginAfter',
    'marginAfterCollapse',
    'marginAfterCollapse',
    'marginBefore',
    'marginBefore',
    'marginBeforeCollapse',
    'marginBeforeCollapse',
    'marginBottom',
    'marginBottom',
    'marginBottomCollapse',
    'marginBottomCollapse',
    'marginCollapse',
    'marginCollapse',
    'marginEnd',
    'marginEnd',
    'marginLeft',
    'marginLeft',
    'marginRight',
    'marginRight',
    'marginStart',
    'marginStart',
    'marginTop',
    'marginTop',
    'marginTopCollapse',
    'marginTopCollapse',
    'mask',
    'mask',
    'maskBoxImage',
    'maskBoxImage',
    'maskBoxImageOutset',
    'maskBoxImageOutset',
    'maskBoxImageRepeat',
    'maskBoxImageRepeat',
    'maskBoxImageSlice',
    'maskBoxImageSlice',
    'maskBoxImageSource',
    'maskBoxImageSource',
    'maskBoxImageWidth',
    'maskBoxImageWidth',
    'maskClip',
    'maskClip',
    'maskComposite',
    'maskComposite',
    'maskImage',
    'maskImage',
    'maskOrigin',
    'maskOrigin',
    'maskPosition',
    'maskPosition',
    'maskPositionX',
    'maskPositionX',
    'maskPositionY',
    'maskPositionY',
    'maskRepeat',
    'maskRepeat',
    'maskRepeatX',
    'maskRepeatX',
    'maskRepeatY',
    'maskRepeatY',
    'maskSize',
    'maskSize',
    'maskSourceType',
    'maskSourceType',
    'maxHeight',
    'maxHeight',
    'maxLogicalHeight',
    'maxLogicalHeight',
    'maxLogicalWidth',
    'maxLogicalWidth',
    'maxWidth',
    'maxWidth',
    'maxZoom',
    'maxZoom',
    'minHeight',
    'minHeight',
    'minLogicalHeight',
    'minLogicalHeight',
    'minLogicalWidth',
    'minLogicalWidth',
    'minWidth',
    'minWidth',
    'minZoom',
    'minZoom',
    'mixBlendMode',
    'mixBlendMode',
    'objectFit',
    'objectFit',
    'objectPosition',
    'objectPosition',
    'opacity',
    'opacity',
    'order',
    'order',
    'orientation',
    'orientation',
    'orphans',
    'orphans',
    'outline',
    'outline',
    'outlineColor',
    'outlineColor',
    'outlineOffset',
    'outlineOffset',
    'outlineStyle',
    'outlineStyle',
    'outlineWidth',
    'outlineWidth',
    'overflow',
    'overflow',
    'overflowWrap',
    'overflowWrap',
    'overflowX',
    'overflowX',
    'overflowY',
    'overflowY',
    'padding',
    'padding',
    'paddingAfter',
    'paddingAfter',
    'paddingBefore',
    'paddingBefore',
    'paddingBottom',
    'paddingBottom',
    'paddingEnd',
    'paddingEnd',
    'paddingLeft',
    'paddingLeft',
    'paddingRight',
    'paddingRight',
    'paddingStart',
    'paddingStart',
    'paddingTop',
    'paddingTop',
    'page',
    'page',
    'pageBreakAfter',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakBefore',
    'pageBreakInside',
    'pageBreakInside',
    'perspective',
    'perspective',
    'perspectiveOrigin',
    'perspectiveOrigin',
    'perspectiveOriginX',
    'perspectiveOriginX',
    'perspectiveOriginY',
    'perspectiveOriginY',
    'pointerEvents',
    'pointerEvents',
    'position',
    'position',
    'printColorAdjust',
    'printColorAdjust',
    'quotes',
    'quotes',
    'resize',
    'resize',
    'right',
    'right',
    'rtlOrdering',
    'rtlOrdering',
    'rubyPosition',
    'rubyPosition',
    'scrollBehavior',
    'scrollBehavior',
    'shapeImageThreshold',
    'shapeImageThreshold',
    'shapeMargin',
    'shapeMargin',
    'shapeOutside',
    'shapeOutside',
    'size',
    'size',
    'speak',
    'speak',
    'src',
    'src',
    'tabSize',
    'tabSize',
    'tableLayout',
    'tableLayout',
    'tapHighlightColor',
    'tapHighlightColor',
    'textAlign',
    'textAlign',
    'textAlignLast',
    'textAlignLast',
    'textCombine',
    'textCombine',
    'textDecoration',
    'textDecoration',
    'textDecorationColor',
    'textDecorationColor',
    'textDecorationLine',
    'textDecorationLine',
    'textDecorationStyle',
    'textDecorationStyle',
    'textDecorationsInEffect',
    'textDecorationsInEffect',
    'textEmphasis',
    'textEmphasis',
    'textEmphasisColor',
    'textEmphasisColor',
    'textEmphasisPosition',
    'textEmphasisPosition',
    'textEmphasisStyle',
    'textEmphasisStyle',
    'textFillColor',
    'textFillColor',
    'textIndent',
    'textIndent',
    'textJustify',
    'textJustify',
    'textLineThroughColor',
    'textLineThroughColor',
    'textLineThroughMode',
    'textLineThroughMode',
    'textLineThroughStyle',
    'textLineThroughStyle',
    'textLineThroughWidth',
    'textLineThroughWidth',
    'textOrientation',
    'textOrientation',
    'textOverflow',
    'textOverflow',
    'textOverlineColor',
    'textOverlineColor',
    'textOverlineMode',
    'textOverlineMode',
    'textOverlineStyle',
    'textOverlineStyle',
    'textOverlineWidth',
    'textOverlineWidth',
    'textRendering',
    'textRendering',
    'textSecurity',
    'textSecurity',
    'textShadow',
    'textShadow',
    'textStroke',
    'textStroke',
    'textStrokeColor',
    'textStrokeColor',
    'textStrokeWidth',
    'textStrokeWidth',
    'textTransform',
    'textTransform',
    'textUnderlineColor',
    'textUnderlineColor',
    'textUnderlineMode',
    'textUnderlineMode',
    'textUnderlinePosition',
    'textUnderlinePosition',
    'textUnderlineStyle',
    'textUnderlineStyle',
    'textUnderlineWidth',
    'textUnderlineWidth',
    'top',
    'top',
    'touchAction',
    'touchAction',
    'touchActionDelay',
    'touchActionDelay',
    'transform',
    'transform',
    'transformOrigin',
    'transformOrigin',
    'transformOriginX',
    'transformOriginX',
    'transformOriginY',
    'transformOriginY',
    'transformOriginZ',
    'transformOriginZ',
    'transformStyle',
    'transformStyle',
    'transition',
    'transition',
    'transitionDelay',
    'transitionDelay',
    'transitionDuration',
    'transitionDuration',
    'transitionProperty',
    'transitionProperty',
    'transitionTimingFunction',
    'transitionTimingFunction',
    'unicodeBidi',
    'unicodeBidi',
    'unicodeRange',
    'unicodeRange',
    'userDrag',
    'userDrag',
    'userModify',
    'userModify',
    'userSelect',
    'userSelect',
    'userZoom',
    'userZoom',
    'verticalAlign',
    'verticalAlign',
    'visibility',
    'visibility',
    'whiteSpace',
    'whiteSpace',
    'widows',
    'widows',
    'width',
    'width',
    'willChange',
    'willChange',
    'wordBreak',
    'wordBreak',
    'wordSpacing',
    'wordSpacing',
    'wordWrap',
    'wordWrap',
    'wrapFlow',
    'wrapFlow',
    'wrapThrough',
    'wrapThrough',
    'writingMode',
    'writingMode',
    'zIndex',
    'zIndex',
    'zoom',
    'zoom'
  ]);
  html$.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
    get alignContent() {
      return this[dartx.getPropertyValue]('align-content');
    }
    set alignContent(value) {
      this[dartx.setProperty]('align-content', value, '');
    }
    get alignItems() {
      return this[dartx.getPropertyValue]('align-items');
    }
    set alignItems(value) {
      this[dartx.setProperty]('align-items', value, '');
    }
    get alignSelf() {
      return this[dartx.getPropertyValue]('align-self');
    }
    set alignSelf(value) {
      this[dartx.setProperty]('align-self', value, '');
    }
    get animation() {
      return this[dartx.getPropertyValue]('animation');
    }
    set animation(value) {
      this[dartx.setProperty]('animation', value, '');
    }
    get animationDelay() {
      return this[dartx.getPropertyValue]('animation-delay');
    }
    set animationDelay(value) {
      this[dartx.setProperty]('animation-delay', value, '');
    }
    get animationDirection() {
      return this[dartx.getPropertyValue]('animation-direction');
    }
    set animationDirection(value) {
      this[dartx.setProperty]('animation-direction', value, '');
    }
    get animationDuration() {
      return this[dartx.getPropertyValue]('animation-duration');
    }
    set animationDuration(value) {
      this[dartx.setProperty]('animation-duration', value, '');
    }
    get animationFillMode() {
      return this[dartx.getPropertyValue]('animation-fill-mode');
    }
    set animationFillMode(value) {
      this[dartx.setProperty]('animation-fill-mode', value, '');
    }
    get animationIterationCount() {
      return this[dartx.getPropertyValue]('animation-iteration-count');
    }
    set animationIterationCount(value) {
      this[dartx.setProperty]('animation-iteration-count', value, '');
    }
    get animationName() {
      return this[dartx.getPropertyValue]('animation-name');
    }
    set animationName(value) {
      this[dartx.setProperty]('animation-name', value, '');
    }
    get animationPlayState() {
      return this[dartx.getPropertyValue]('animation-play-state');
    }
    set animationPlayState(value) {
      this[dartx.setProperty]('animation-play-state', value, '');
    }
    get animationTimingFunction() {
      return this[dartx.getPropertyValue]('animation-timing-function');
    }
    set animationTimingFunction(value) {
      this[dartx.setProperty]('animation-timing-function', value, '');
    }
    get appRegion() {
      return this[dartx.getPropertyValue]('app-region');
    }
    set appRegion(value) {
      this[dartx.setProperty]('app-region', value, '');
    }
    get appearance() {
      return this[dartx.getPropertyValue]('appearance');
    }
    set appearance(value) {
      this[dartx.setProperty]('appearance', value, '');
    }
    get aspectRatio() {
      return this[dartx.getPropertyValue]('aspect-ratio');
    }
    set aspectRatio(value) {
      this[dartx.setProperty]('aspect-ratio', value, '');
    }
    get backfaceVisibility() {
      return this[dartx.getPropertyValue]('backface-visibility');
    }
    set backfaceVisibility(value) {
      this[dartx.setProperty]('backface-visibility', value, '');
    }
    get background() {
      return this[dartx.getPropertyValue]('background');
    }
    set background(value) {
      this[dartx.setProperty]('background', value, '');
    }
    get backgroundAttachment() {
      return this[dartx.getPropertyValue]('background-attachment');
    }
    set backgroundAttachment(value) {
      this[dartx.setProperty]('background-attachment', value, '');
    }
    get backgroundBlendMode() {
      return this[dartx.getPropertyValue]('background-blend-mode');
    }
    set backgroundBlendMode(value) {
      this[dartx.setProperty]('background-blend-mode', value, '');
    }
    get backgroundClip() {
      return this[dartx.getPropertyValue]('background-clip');
    }
    set backgroundClip(value) {
      this[dartx.setProperty]('background-clip', value, '');
    }
    get backgroundColor() {
      return this[dartx.getPropertyValue]('background-color');
    }
    set backgroundColor(value) {
      this[dartx.setProperty]('background-color', value, '');
    }
    get backgroundComposite() {
      return this[dartx.getPropertyValue]('background-composite');
    }
    set backgroundComposite(value) {
      this[dartx.setProperty]('background-composite', value, '');
    }
    get backgroundImage() {
      return this[dartx.getPropertyValue]('background-image');
    }
    set backgroundImage(value) {
      this[dartx.setProperty]('background-image', value, '');
    }
    get backgroundOrigin() {
      return this[dartx.getPropertyValue]('background-origin');
    }
    set backgroundOrigin(value) {
      this[dartx.setProperty]('background-origin', value, '');
    }
    get backgroundPosition() {
      return this[dartx.getPropertyValue]('background-position');
    }
    set backgroundPosition(value) {
      this[dartx.setProperty]('background-position', value, '');
    }
    get backgroundPositionX() {
      return this[dartx.getPropertyValue]('background-position-x');
    }
    set backgroundPositionX(value) {
      this[dartx.setProperty]('background-position-x', value, '');
    }
    get backgroundPositionY() {
      return this[dartx.getPropertyValue]('background-position-y');
    }
    set backgroundPositionY(value) {
      this[dartx.setProperty]('background-position-y', value, '');
    }
    get backgroundRepeat() {
      return this[dartx.getPropertyValue]('background-repeat');
    }
    set backgroundRepeat(value) {
      this[dartx.setProperty]('background-repeat', value, '');
    }
    get backgroundRepeatX() {
      return this[dartx.getPropertyValue]('background-repeat-x');
    }
    set backgroundRepeatX(value) {
      this[dartx.setProperty]('background-repeat-x', value, '');
    }
    get backgroundRepeatY() {
      return this[dartx.getPropertyValue]('background-repeat-y');
    }
    set backgroundRepeatY(value) {
      this[dartx.setProperty]('background-repeat-y', value, '');
    }
    get backgroundSize() {
      return this[dartx.getPropertyValue]('background-size');
    }
    set backgroundSize(value) {
      this[dartx.setProperty]('background-size', value, '');
    }
    get border() {
      return this[dartx.getPropertyValue]('border');
    }
    set border(value) {
      this[dartx.setProperty]('border', value, '');
    }
    get borderAfter() {
      return this[dartx.getPropertyValue]('border-after');
    }
    set borderAfter(value) {
      this[dartx.setProperty]('border-after', value, '');
    }
    get borderAfterColor() {
      return this[dartx.getPropertyValue]('border-after-color');
    }
    set borderAfterColor(value) {
      this[dartx.setProperty]('border-after-color', value, '');
    }
    get borderAfterStyle() {
      return this[dartx.getPropertyValue]('border-after-style');
    }
    set borderAfterStyle(value) {
      this[dartx.setProperty]('border-after-style', value, '');
    }
    get borderAfterWidth() {
      return this[dartx.getPropertyValue]('border-after-width');
    }
    set borderAfterWidth(value) {
      this[dartx.setProperty]('border-after-width', value, '');
    }
    get borderBefore() {
      return this[dartx.getPropertyValue]('border-before');
    }
    set borderBefore(value) {
      this[dartx.setProperty]('border-before', value, '');
    }
    get borderBeforeColor() {
      return this[dartx.getPropertyValue]('border-before-color');
    }
    set borderBeforeColor(value) {
      this[dartx.setProperty]('border-before-color', value, '');
    }
    get borderBeforeStyle() {
      return this[dartx.getPropertyValue]('border-before-style');
    }
    set borderBeforeStyle(value) {
      this[dartx.setProperty]('border-before-style', value, '');
    }
    get borderBeforeWidth() {
      return this[dartx.getPropertyValue]('border-before-width');
    }
    set borderBeforeWidth(value) {
      this[dartx.setProperty]('border-before-width', value, '');
    }
    get borderBottom() {
      return this[dartx.getPropertyValue]('border-bottom');
    }
    set borderBottom(value) {
      this[dartx.setProperty]('border-bottom', value, '');
    }
    get borderBottomColor() {
      return this[dartx.getPropertyValue]('border-bottom-color');
    }
    set borderBottomColor(value) {
      this[dartx.setProperty]('border-bottom-color', value, '');
    }
    get borderBottomLeftRadius() {
      return this[dartx.getPropertyValue]('border-bottom-left-radius');
    }
    set borderBottomLeftRadius(value) {
      this[dartx.setProperty]('border-bottom-left-radius', value, '');
    }
    get borderBottomRightRadius() {
      return this[dartx.getPropertyValue]('border-bottom-right-radius');
    }
    set borderBottomRightRadius(value) {
      this[dartx.setProperty]('border-bottom-right-radius', value, '');
    }
    get borderBottomStyle() {
      return this[dartx.getPropertyValue]('border-bottom-style');
    }
    set borderBottomStyle(value) {
      this[dartx.setProperty]('border-bottom-style', value, '');
    }
    get borderBottomWidth() {
      return this[dartx.getPropertyValue]('border-bottom-width');
    }
    set borderBottomWidth(value) {
      this[dartx.setProperty]('border-bottom-width', value, '');
    }
    get borderCollapse() {
      return this[dartx.getPropertyValue]('border-collapse');
    }
    set borderCollapse(value) {
      this[dartx.setProperty]('border-collapse', value, '');
    }
    get borderColor() {
      return this[dartx.getPropertyValue]('border-color');
    }
    set borderColor(value) {
      this[dartx.setProperty]('border-color', value, '');
    }
    get borderEnd() {
      return this[dartx.getPropertyValue]('border-end');
    }
    set borderEnd(value) {
      this[dartx.setProperty]('border-end', value, '');
    }
    get borderEndColor() {
      return this[dartx.getPropertyValue]('border-end-color');
    }
    set borderEndColor(value) {
      this[dartx.setProperty]('border-end-color', value, '');
    }
    get borderEndStyle() {
      return this[dartx.getPropertyValue]('border-end-style');
    }
    set borderEndStyle(value) {
      this[dartx.setProperty]('border-end-style', value, '');
    }
    get borderEndWidth() {
      return this[dartx.getPropertyValue]('border-end-width');
    }
    set borderEndWidth(value) {
      this[dartx.setProperty]('border-end-width', value, '');
    }
    get borderFit() {
      return this[dartx.getPropertyValue]('border-fit');
    }
    set borderFit(value) {
      this[dartx.setProperty]('border-fit', value, '');
    }
    get borderHorizontalSpacing() {
      return this[dartx.getPropertyValue]('border-horizontal-spacing');
    }
    set borderHorizontalSpacing(value) {
      this[dartx.setProperty]('border-horizontal-spacing', value, '');
    }
    get borderImage() {
      return this[dartx.getPropertyValue]('border-image');
    }
    set borderImage(value) {
      this[dartx.setProperty]('border-image', value, '');
    }
    get borderImageOutset() {
      return this[dartx.getPropertyValue]('border-image-outset');
    }
    set borderImageOutset(value) {
      this[dartx.setProperty]('border-image-outset', value, '');
    }
    get borderImageRepeat() {
      return this[dartx.getPropertyValue]('border-image-repeat');
    }
    set borderImageRepeat(value) {
      this[dartx.setProperty]('border-image-repeat', value, '');
    }
    get borderImageSlice() {
      return this[dartx.getPropertyValue]('border-image-slice');
    }
    set borderImageSlice(value) {
      this[dartx.setProperty]('border-image-slice', value, '');
    }
    get borderImageSource() {
      return this[dartx.getPropertyValue]('border-image-source');
    }
    set borderImageSource(value) {
      this[dartx.setProperty]('border-image-source', value, '');
    }
    get borderImageWidth() {
      return this[dartx.getPropertyValue]('border-image-width');
    }
    set borderImageWidth(value) {
      this[dartx.setProperty]('border-image-width', value, '');
    }
    get borderLeft() {
      return this[dartx.getPropertyValue]('border-left');
    }
    set borderLeft(value) {
      this[dartx.setProperty]('border-left', value, '');
    }
    get borderLeftColor() {
      return this[dartx.getPropertyValue]('border-left-color');
    }
    set borderLeftColor(value) {
      this[dartx.setProperty]('border-left-color', value, '');
    }
    get borderLeftStyle() {
      return this[dartx.getPropertyValue]('border-left-style');
    }
    set borderLeftStyle(value) {
      this[dartx.setProperty]('border-left-style', value, '');
    }
    get borderLeftWidth() {
      return this[dartx.getPropertyValue]('border-left-width');
    }
    set borderLeftWidth(value) {
      this[dartx.setProperty]('border-left-width', value, '');
    }
    get borderRadius() {
      return this[dartx.getPropertyValue]('border-radius');
    }
    set borderRadius(value) {
      this[dartx.setProperty]('border-radius', value, '');
    }
    get borderRight() {
      return this[dartx.getPropertyValue]('border-right');
    }
    set borderRight(value) {
      this[dartx.setProperty]('border-right', value, '');
    }
    get borderRightColor() {
      return this[dartx.getPropertyValue]('border-right-color');
    }
    set borderRightColor(value) {
      this[dartx.setProperty]('border-right-color', value, '');
    }
    get borderRightStyle() {
      return this[dartx.getPropertyValue]('border-right-style');
    }
    set borderRightStyle(value) {
      this[dartx.setProperty]('border-right-style', value, '');
    }
    get borderRightWidth() {
      return this[dartx.getPropertyValue]('border-right-width');
    }
    set borderRightWidth(value) {
      this[dartx.setProperty]('border-right-width', value, '');
    }
    get borderSpacing() {
      return this[dartx.getPropertyValue]('border-spacing');
    }
    set borderSpacing(value) {
      this[dartx.setProperty]('border-spacing', value, '');
    }
    get borderStart() {
      return this[dartx.getPropertyValue]('border-start');
    }
    set borderStart(value) {
      this[dartx.setProperty]('border-start', value, '');
    }
    get borderStartColor() {
      return this[dartx.getPropertyValue]('border-start-color');
    }
    set borderStartColor(value) {
      this[dartx.setProperty]('border-start-color', value, '');
    }
    get borderStartStyle() {
      return this[dartx.getPropertyValue]('border-start-style');
    }
    set borderStartStyle(value) {
      this[dartx.setProperty]('border-start-style', value, '');
    }
    get borderStartWidth() {
      return this[dartx.getPropertyValue]('border-start-width');
    }
    set borderStartWidth(value) {
      this[dartx.setProperty]('border-start-width', value, '');
    }
    get borderStyle() {
      return this[dartx.getPropertyValue]('border-style');
    }
    set borderStyle(value) {
      this[dartx.setProperty]('border-style', value, '');
    }
    get borderTop() {
      return this[dartx.getPropertyValue]('border-top');
    }
    set borderTop(value) {
      this[dartx.setProperty]('border-top', value, '');
    }
    get borderTopColor() {
      return this[dartx.getPropertyValue]('border-top-color');
    }
    set borderTopColor(value) {
      this[dartx.setProperty]('border-top-color', value, '');
    }
    get borderTopLeftRadius() {
      return this[dartx.getPropertyValue]('border-top-left-radius');
    }
    set borderTopLeftRadius(value) {
      this[dartx.setProperty]('border-top-left-radius', value, '');
    }
    get borderTopRightRadius() {
      return this[dartx.getPropertyValue]('border-top-right-radius');
    }
    set borderTopRightRadius(value) {
      this[dartx.setProperty]('border-top-right-radius', value, '');
    }
    get borderTopStyle() {
      return this[dartx.getPropertyValue]('border-top-style');
    }
    set borderTopStyle(value) {
      this[dartx.setProperty]('border-top-style', value, '');
    }
    get borderTopWidth() {
      return this[dartx.getPropertyValue]('border-top-width');
    }
    set borderTopWidth(value) {
      this[dartx.setProperty]('border-top-width', value, '');
    }
    get borderVerticalSpacing() {
      return this[dartx.getPropertyValue]('border-vertical-spacing');
    }
    set borderVerticalSpacing(value) {
      this[dartx.setProperty]('border-vertical-spacing', value, '');
    }
    get borderWidth() {
      return this[dartx.getPropertyValue]('border-width');
    }
    set borderWidth(value) {
      this[dartx.setProperty]('border-width', value, '');
    }
    get bottom() {
      return this[dartx.getPropertyValue]('bottom');
    }
    set bottom(value) {
      this[dartx.setProperty]('bottom', value, '');
    }
    get boxAlign() {
      return this[dartx.getPropertyValue]('box-align');
    }
    set boxAlign(value) {
      this[dartx.setProperty]('box-align', value, '');
    }
    get boxDecorationBreak() {
      return this[dartx.getPropertyValue]('box-decoration-break');
    }
    set boxDecorationBreak(value) {
      this[dartx.setProperty]('box-decoration-break', value, '');
    }
    get boxDirection() {
      return this[dartx.getPropertyValue]('box-direction');
    }
    set boxDirection(value) {
      this[dartx.setProperty]('box-direction', value, '');
    }
    get boxFlex() {
      return this[dartx.getPropertyValue]('box-flex');
    }
    set boxFlex(value) {
      this[dartx.setProperty]('box-flex', value, '');
    }
    get boxFlexGroup() {
      return this[dartx.getPropertyValue]('box-flex-group');
    }
    set boxFlexGroup(value) {
      this[dartx.setProperty]('box-flex-group', value, '');
    }
    get boxLines() {
      return this[dartx.getPropertyValue]('box-lines');
    }
    set boxLines(value) {
      this[dartx.setProperty]('box-lines', value, '');
    }
    get boxOrdinalGroup() {
      return this[dartx.getPropertyValue]('box-ordinal-group');
    }
    set boxOrdinalGroup(value) {
      this[dartx.setProperty]('box-ordinal-group', value, '');
    }
    get boxOrient() {
      return this[dartx.getPropertyValue]('box-orient');
    }
    set boxOrient(value) {
      this[dartx.setProperty]('box-orient', value, '');
    }
    get boxPack() {
      return this[dartx.getPropertyValue]('box-pack');
    }
    set boxPack(value) {
      this[dartx.setProperty]('box-pack', value, '');
    }
    get boxReflect() {
      return this[dartx.getPropertyValue]('box-reflect');
    }
    set boxReflect(value) {
      this[dartx.setProperty]('box-reflect', value, '');
    }
    get boxShadow() {
      return this[dartx.getPropertyValue]('box-shadow');
    }
    set boxShadow(value) {
      this[dartx.setProperty]('box-shadow', value, '');
    }
    get boxSizing() {
      return this[dartx.getPropertyValue]('box-sizing');
    }
    set boxSizing(value) {
      this[dartx.setProperty]('box-sizing', value, '');
    }
    get captionSide() {
      return this[dartx.getPropertyValue]('caption-side');
    }
    set captionSide(value) {
      this[dartx.setProperty]('caption-side', value, '');
    }
    get clear() {
      return this[dartx.getPropertyValue]('clear');
    }
    set clear(value) {
      this[dartx.setProperty]('clear', value, '');
    }
    get clip() {
      return this[dartx.getPropertyValue]('clip');
    }
    set clip(value) {
      this[dartx.setProperty]('clip', value, '');
    }
    get clipPath() {
      return this[dartx.getPropertyValue]('clip-path');
    }
    set clipPath(value) {
      this[dartx.setProperty]('clip-path', value, '');
    }
    get color() {
      return this[dartx.getPropertyValue]('color');
    }
    set color(value) {
      this[dartx.setProperty]('color', value, '');
    }
    get columnBreakAfter() {
      return this[dartx.getPropertyValue]('column-break-after');
    }
    set columnBreakAfter(value) {
      this[dartx.setProperty]('column-break-after', value, '');
    }
    get columnBreakBefore() {
      return this[dartx.getPropertyValue]('column-break-before');
    }
    set columnBreakBefore(value) {
      this[dartx.setProperty]('column-break-before', value, '');
    }
    get columnBreakInside() {
      return this[dartx.getPropertyValue]('column-break-inside');
    }
    set columnBreakInside(value) {
      this[dartx.setProperty]('column-break-inside', value, '');
    }
    get columnCount() {
      return this[dartx.getPropertyValue]('column-count');
    }
    set columnCount(value) {
      this[dartx.setProperty]('column-count', value, '');
    }
    get columnFill() {
      return this[dartx.getPropertyValue]('column-fill');
    }
    set columnFill(value) {
      this[dartx.setProperty]('column-fill', value, '');
    }
    get columnGap() {
      return this[dartx.getPropertyValue]('column-gap');
    }
    set columnGap(value) {
      this[dartx.setProperty]('column-gap', value, '');
    }
    get columnRule() {
      return this[dartx.getPropertyValue]('column-rule');
    }
    set columnRule(value) {
      this[dartx.setProperty]('column-rule', value, '');
    }
    get columnRuleColor() {
      return this[dartx.getPropertyValue]('column-rule-color');
    }
    set columnRuleColor(value) {
      this[dartx.setProperty]('column-rule-color', value, '');
    }
    get columnRuleStyle() {
      return this[dartx.getPropertyValue]('column-rule-style');
    }
    set columnRuleStyle(value) {
      this[dartx.setProperty]('column-rule-style', value, '');
    }
    get columnRuleWidth() {
      return this[dartx.getPropertyValue]('column-rule-width');
    }
    set columnRuleWidth(value) {
      this[dartx.setProperty]('column-rule-width', value, '');
    }
    get columnSpan() {
      return this[dartx.getPropertyValue]('column-span');
    }
    set columnSpan(value) {
      this[dartx.setProperty]('column-span', value, '');
    }
    get columnWidth() {
      return this[dartx.getPropertyValue]('column-width');
    }
    set columnWidth(value) {
      this[dartx.setProperty]('column-width', value, '');
    }
    get columns() {
      return this[dartx.getPropertyValue]('columns');
    }
    set columns(value) {
      this[dartx.setProperty]('columns', value, '');
    }
    get content() {
      return this[dartx.getPropertyValue]('content');
    }
    set content(value) {
      this[dartx.setProperty]('content', value, '');
    }
    get counterIncrement() {
      return this[dartx.getPropertyValue]('counter-increment');
    }
    set counterIncrement(value) {
      this[dartx.setProperty]('counter-increment', value, '');
    }
    get counterReset() {
      return this[dartx.getPropertyValue]('counter-reset');
    }
    set counterReset(value) {
      this[dartx.setProperty]('counter-reset', value, '');
    }
    get cursor() {
      return this[dartx.getPropertyValue]('cursor');
    }
    set cursor(value) {
      this[dartx.setProperty]('cursor', value, '');
    }
    get direction() {
      return this[dartx.getPropertyValue]('direction');
    }
    set direction(value) {
      this[dartx.setProperty]('direction', value, '');
    }
    get display() {
      return this[dartx.getPropertyValue]('display');
    }
    set display(value) {
      this[dartx.setProperty]('display', value, '');
    }
    get emptyCells() {
      return this[dartx.getPropertyValue]('empty-cells');
    }
    set emptyCells(value) {
      this[dartx.setProperty]('empty-cells', value, '');
    }
    get filter() {
      return this[dartx.getPropertyValue]('filter');
    }
    set filter(value) {
      this[dartx.setProperty]('filter', value, '');
    }
    get flex() {
      return this[dartx.getPropertyValue]('flex');
    }
    set flex(value) {
      this[dartx.setProperty]('flex', value, '');
    }
    get flexBasis() {
      return this[dartx.getPropertyValue]('flex-basis');
    }
    set flexBasis(value) {
      this[dartx.setProperty]('flex-basis', value, '');
    }
    get flexDirection() {
      return this[dartx.getPropertyValue]('flex-direction');
    }
    set flexDirection(value) {
      this[dartx.setProperty]('flex-direction', value, '');
    }
    get flexFlow() {
      return this[dartx.getPropertyValue]('flex-flow');
    }
    set flexFlow(value) {
      this[dartx.setProperty]('flex-flow', value, '');
    }
    get flexGrow() {
      return this[dartx.getPropertyValue]('flex-grow');
    }
    set flexGrow(value) {
      this[dartx.setProperty]('flex-grow', value, '');
    }
    get flexShrink() {
      return this[dartx.getPropertyValue]('flex-shrink');
    }
    set flexShrink(value) {
      this[dartx.setProperty]('flex-shrink', value, '');
    }
    get flexWrap() {
      return this[dartx.getPropertyValue]('flex-wrap');
    }
    set flexWrap(value) {
      this[dartx.setProperty]('flex-wrap', value, '');
    }
    get float() {
      return this[dartx.getPropertyValue]('float');
    }
    set float(value) {
      this[dartx.setProperty]('float', value, '');
    }
    get font() {
      return this[dartx.getPropertyValue]('font');
    }
    set font(value) {
      this[dartx.setProperty]('font', value, '');
    }
    get fontFamily() {
      return this[dartx.getPropertyValue]('font-family');
    }
    set fontFamily(value) {
      this[dartx.setProperty]('font-family', value, '');
    }
    get fontFeatureSettings() {
      return this[dartx.getPropertyValue]('font-feature-settings');
    }
    set fontFeatureSettings(value) {
      this[dartx.setProperty]('font-feature-settings', value, '');
    }
    get fontKerning() {
      return this[dartx.getPropertyValue]('font-kerning');
    }
    set fontKerning(value) {
      this[dartx.setProperty]('font-kerning', value, '');
    }
    get fontSize() {
      return this[dartx.getPropertyValue]('font-size');
    }
    set fontSize(value) {
      this[dartx.setProperty]('font-size', value, '');
    }
    get fontSizeDelta() {
      return this[dartx.getPropertyValue]('font-size-delta');
    }
    set fontSizeDelta(value) {
      this[dartx.setProperty]('font-size-delta', value, '');
    }
    get fontSmoothing() {
      return this[dartx.getPropertyValue]('font-smoothing');
    }
    set fontSmoothing(value) {
      this[dartx.setProperty]('font-smoothing', value, '');
    }
    get fontStretch() {
      return this[dartx.getPropertyValue]('font-stretch');
    }
    set fontStretch(value) {
      this[dartx.setProperty]('font-stretch', value, '');
    }
    get fontStyle() {
      return this[dartx.getPropertyValue]('font-style');
    }
    set fontStyle(value) {
      this[dartx.setProperty]('font-style', value, '');
    }
    get fontVariant() {
      return this[dartx.getPropertyValue]('font-variant');
    }
    set fontVariant(value) {
      this[dartx.setProperty]('font-variant', value, '');
    }
    get fontVariantLigatures() {
      return this[dartx.getPropertyValue]('font-variant-ligatures');
    }
    set fontVariantLigatures(value) {
      this[dartx.setProperty]('font-variant-ligatures', value, '');
    }
    get fontWeight() {
      return this[dartx.getPropertyValue]('font-weight');
    }
    set fontWeight(value) {
      this[dartx.setProperty]('font-weight', value, '');
    }
    get grid() {
      return this[dartx.getPropertyValue]('grid');
    }
    set grid(value) {
      this[dartx.setProperty]('grid', value, '');
    }
    get gridArea() {
      return this[dartx.getPropertyValue]('grid-area');
    }
    set gridArea(value) {
      this[dartx.setProperty]('grid-area', value, '');
    }
    get gridAutoColumns() {
      return this[dartx.getPropertyValue]('grid-auto-columns');
    }
    set gridAutoColumns(value) {
      this[dartx.setProperty]('grid-auto-columns', value, '');
    }
    get gridAutoFlow() {
      return this[dartx.getPropertyValue]('grid-auto-flow');
    }
    set gridAutoFlow(value) {
      this[dartx.setProperty]('grid-auto-flow', value, '');
    }
    get gridAutoRows() {
      return this[dartx.getPropertyValue]('grid-auto-rows');
    }
    set gridAutoRows(value) {
      this[dartx.setProperty]('grid-auto-rows', value, '');
    }
    get gridColumn() {
      return this[dartx.getPropertyValue]('grid-column');
    }
    set gridColumn(value) {
      this[dartx.setProperty]('grid-column', value, '');
    }
    get gridColumnEnd() {
      return this[dartx.getPropertyValue]('grid-column-end');
    }
    set gridColumnEnd(value) {
      this[dartx.setProperty]('grid-column-end', value, '');
    }
    get gridColumnStart() {
      return this[dartx.getPropertyValue]('grid-column-start');
    }
    set gridColumnStart(value) {
      this[dartx.setProperty]('grid-column-start', value, '');
    }
    get gridRow() {
      return this[dartx.getPropertyValue]('grid-row');
    }
    set gridRow(value) {
      this[dartx.setProperty]('grid-row', value, '');
    }
    get gridRowEnd() {
      return this[dartx.getPropertyValue]('grid-row-end');
    }
    set gridRowEnd(value) {
      this[dartx.setProperty]('grid-row-end', value, '');
    }
    get gridRowStart() {
      return this[dartx.getPropertyValue]('grid-row-start');
    }
    set gridRowStart(value) {
      this[dartx.setProperty]('grid-row-start', value, '');
    }
    get gridTemplate() {
      return this[dartx.getPropertyValue]('grid-template');
    }
    set gridTemplate(value) {
      this[dartx.setProperty]('grid-template', value, '');
    }
    get gridTemplateAreas() {
      return this[dartx.getPropertyValue]('grid-template-areas');
    }
    set gridTemplateAreas(value) {
      this[dartx.setProperty]('grid-template-areas', value, '');
    }
    get gridTemplateColumns() {
      return this[dartx.getPropertyValue]('grid-template-columns');
    }
    set gridTemplateColumns(value) {
      this[dartx.setProperty]('grid-template-columns', value, '');
    }
    get gridTemplateRows() {
      return this[dartx.getPropertyValue]('grid-template-rows');
    }
    set gridTemplateRows(value) {
      this[dartx.setProperty]('grid-template-rows', value, '');
    }
    get height() {
      return this[dartx.getPropertyValue]('height');
    }
    set height(value) {
      this[dartx.setProperty]('height', value, '');
    }
    get highlight() {
      return this[dartx.getPropertyValue]('highlight');
    }
    set highlight(value) {
      this[dartx.setProperty]('highlight', value, '');
    }
    get hyphenateCharacter() {
      return this[dartx.getPropertyValue]('hyphenate-character');
    }
    set hyphenateCharacter(value) {
      this[dartx.setProperty]('hyphenate-character', value, '');
    }
    get imageRendering() {
      return this[dartx.getPropertyValue]('image-rendering');
    }
    set imageRendering(value) {
      this[dartx.setProperty]('image-rendering', value, '');
    }
    get isolation() {
      return this[dartx.getPropertyValue]('isolation');
    }
    set isolation(value) {
      this[dartx.setProperty]('isolation', value, '');
    }
    get justifyContent() {
      return this[dartx.getPropertyValue]('justify-content');
    }
    set justifyContent(value) {
      this[dartx.setProperty]('justify-content', value, '');
    }
    get justifySelf() {
      return this[dartx.getPropertyValue]('justify-self');
    }
    set justifySelf(value) {
      this[dartx.setProperty]('justify-self', value, '');
    }
    get left() {
      return this[dartx.getPropertyValue]('left');
    }
    set left(value) {
      this[dartx.setProperty]('left', value, '');
    }
    get letterSpacing() {
      return this[dartx.getPropertyValue]('letter-spacing');
    }
    set letterSpacing(value) {
      this[dartx.setProperty]('letter-spacing', value, '');
    }
    get lineBoxContain() {
      return this[dartx.getPropertyValue]('line-box-contain');
    }
    set lineBoxContain(value) {
      this[dartx.setProperty]('line-box-contain', value, '');
    }
    get lineBreak() {
      return this[dartx.getPropertyValue]('line-break');
    }
    set lineBreak(value) {
      this[dartx.setProperty]('line-break', value, '');
    }
    get lineClamp() {
      return this[dartx.getPropertyValue]('line-clamp');
    }
    set lineClamp(value) {
      this[dartx.setProperty]('line-clamp', value, '');
    }
    get lineHeight() {
      return this[dartx.getPropertyValue]('line-height');
    }
    set lineHeight(value) {
      this[dartx.setProperty]('line-height', value, '');
    }
    get listStyle() {
      return this[dartx.getPropertyValue]('list-style');
    }
    set listStyle(value) {
      this[dartx.setProperty]('list-style', value, '');
    }
    get listStyleImage() {
      return this[dartx.getPropertyValue]('list-style-image');
    }
    set listStyleImage(value) {
      this[dartx.setProperty]('list-style-image', value, '');
    }
    get listStylePosition() {
      return this[dartx.getPropertyValue]('list-style-position');
    }
    set listStylePosition(value) {
      this[dartx.setProperty]('list-style-position', value, '');
    }
    get listStyleType() {
      return this[dartx.getPropertyValue]('list-style-type');
    }
    set listStyleType(value) {
      this[dartx.setProperty]('list-style-type', value, '');
    }
    get locale() {
      return this[dartx.getPropertyValue]('locale');
    }
    set locale(value) {
      this[dartx.setProperty]('locale', value, '');
    }
    get logicalHeight() {
      return this[dartx.getPropertyValue]('logical-height');
    }
    set logicalHeight(value) {
      this[dartx.setProperty]('logical-height', value, '');
    }
    get logicalWidth() {
      return this[dartx.getPropertyValue]('logical-width');
    }
    set logicalWidth(value) {
      this[dartx.setProperty]('logical-width', value, '');
    }
    get margin() {
      return this[dartx.getPropertyValue]('margin');
    }
    set margin(value) {
      this[dartx.setProperty]('margin', value, '');
    }
    get marginAfter() {
      return this[dartx.getPropertyValue]('margin-after');
    }
    set marginAfter(value) {
      this[dartx.setProperty]('margin-after', value, '');
    }
    get marginAfterCollapse() {
      return this[dartx.getPropertyValue]('margin-after-collapse');
    }
    set marginAfterCollapse(value) {
      this[dartx.setProperty]('margin-after-collapse', value, '');
    }
    get marginBefore() {
      return this[dartx.getPropertyValue]('margin-before');
    }
    set marginBefore(value) {
      this[dartx.setProperty]('margin-before', value, '');
    }
    get marginBeforeCollapse() {
      return this[dartx.getPropertyValue]('margin-before-collapse');
    }
    set marginBeforeCollapse(value) {
      this[dartx.setProperty]('margin-before-collapse', value, '');
    }
    get marginBottom() {
      return this[dartx.getPropertyValue]('margin-bottom');
    }
    set marginBottom(value) {
      this[dartx.setProperty]('margin-bottom', value, '');
    }
    get marginBottomCollapse() {
      return this[dartx.getPropertyValue]('margin-bottom-collapse');
    }
    set marginBottomCollapse(value) {
      this[dartx.setProperty]('margin-bottom-collapse', value, '');
    }
    get marginCollapse() {
      return this[dartx.getPropertyValue]('margin-collapse');
    }
    set marginCollapse(value) {
      this[dartx.setProperty]('margin-collapse', value, '');
    }
    get marginEnd() {
      return this[dartx.getPropertyValue]('margin-end');
    }
    set marginEnd(value) {
      this[dartx.setProperty]('margin-end', value, '');
    }
    get marginLeft() {
      return this[dartx.getPropertyValue]('margin-left');
    }
    set marginLeft(value) {
      this[dartx.setProperty]('margin-left', value, '');
    }
    get marginRight() {
      return this[dartx.getPropertyValue]('margin-right');
    }
    set marginRight(value) {
      this[dartx.setProperty]('margin-right', value, '');
    }
    get marginStart() {
      return this[dartx.getPropertyValue]('margin-start');
    }
    set marginStart(value) {
      this[dartx.setProperty]('margin-start', value, '');
    }
    get marginTop() {
      return this[dartx.getPropertyValue]('margin-top');
    }
    set marginTop(value) {
      this[dartx.setProperty]('margin-top', value, '');
    }
    get marginTopCollapse() {
      return this[dartx.getPropertyValue]('margin-top-collapse');
    }
    set marginTopCollapse(value) {
      this[dartx.setProperty]('margin-top-collapse', value, '');
    }
    get mask() {
      return this[dartx.getPropertyValue]('mask');
    }
    set mask(value) {
      this[dartx.setProperty]('mask', value, '');
    }
    get maskBoxImage() {
      return this[dartx.getPropertyValue]('mask-box-image');
    }
    set maskBoxImage(value) {
      this[dartx.setProperty]('mask-box-image', value, '');
    }
    get maskBoxImageOutset() {
      return this[dartx.getPropertyValue]('mask-box-image-outset');
    }
    set maskBoxImageOutset(value) {
      this[dartx.setProperty]('mask-box-image-outset', value, '');
    }
    get maskBoxImageRepeat() {
      return this[dartx.getPropertyValue]('mask-box-image-repeat');
    }
    set maskBoxImageRepeat(value) {
      this[dartx.setProperty]('mask-box-image-repeat', value, '');
    }
    get maskBoxImageSlice() {
      return this[dartx.getPropertyValue]('mask-box-image-slice');
    }
    set maskBoxImageSlice(value) {
      this[dartx.setProperty]('mask-box-image-slice', value, '');
    }
    get maskBoxImageSource() {
      return this[dartx.getPropertyValue]('mask-box-image-source');
    }
    set maskBoxImageSource(value) {
      this[dartx.setProperty]('mask-box-image-source', value, '');
    }
    get maskBoxImageWidth() {
      return this[dartx.getPropertyValue]('mask-box-image-width');
    }
    set maskBoxImageWidth(value) {
      this[dartx.setProperty]('mask-box-image-width', value, '');
    }
    get maskClip() {
      return this[dartx.getPropertyValue]('mask-clip');
    }
    set maskClip(value) {
      this[dartx.setProperty]('mask-clip', value, '');
    }
    get maskComposite() {
      return this[dartx.getPropertyValue]('mask-composite');
    }
    set maskComposite(value) {
      this[dartx.setProperty]('mask-composite', value, '');
    }
    get maskImage() {
      return this[dartx.getPropertyValue]('mask-image');
    }
    set maskImage(value) {
      this[dartx.setProperty]('mask-image', value, '');
    }
    get maskOrigin() {
      return this[dartx.getPropertyValue]('mask-origin');
    }
    set maskOrigin(value) {
      this[dartx.setProperty]('mask-origin', value, '');
    }
    get maskPosition() {
      return this[dartx.getPropertyValue]('mask-position');
    }
    set maskPosition(value) {
      this[dartx.setProperty]('mask-position', value, '');
    }
    get maskPositionX() {
      return this[dartx.getPropertyValue]('mask-position-x');
    }
    set maskPositionX(value) {
      this[dartx.setProperty]('mask-position-x', value, '');
    }
    get maskPositionY() {
      return this[dartx.getPropertyValue]('mask-position-y');
    }
    set maskPositionY(value) {
      this[dartx.setProperty]('mask-position-y', value, '');
    }
    get maskRepeat() {
      return this[dartx.getPropertyValue]('mask-repeat');
    }
    set maskRepeat(value) {
      this[dartx.setProperty]('mask-repeat', value, '');
    }
    get maskRepeatX() {
      return this[dartx.getPropertyValue]('mask-repeat-x');
    }
    set maskRepeatX(value) {
      this[dartx.setProperty]('mask-repeat-x', value, '');
    }
    get maskRepeatY() {
      return this[dartx.getPropertyValue]('mask-repeat-y');
    }
    set maskRepeatY(value) {
      this[dartx.setProperty]('mask-repeat-y', value, '');
    }
    get maskSize() {
      return this[dartx.getPropertyValue]('mask-size');
    }
    set maskSize(value) {
      this[dartx.setProperty]('mask-size', value, '');
    }
    get maskSourceType() {
      return this[dartx.getPropertyValue]('mask-source-type');
    }
    set maskSourceType(value) {
      this[dartx.setProperty]('mask-source-type', value, '');
    }
    get maxHeight() {
      return this[dartx.getPropertyValue]('max-height');
    }
    set maxHeight(value) {
      this[dartx.setProperty]('max-height', value, '');
    }
    get maxLogicalHeight() {
      return this[dartx.getPropertyValue]('max-logical-height');
    }
    set maxLogicalHeight(value) {
      this[dartx.setProperty]('max-logical-height', value, '');
    }
    get maxLogicalWidth() {
      return this[dartx.getPropertyValue]('max-logical-width');
    }
    set maxLogicalWidth(value) {
      this[dartx.setProperty]('max-logical-width', value, '');
    }
    get maxWidth() {
      return this[dartx.getPropertyValue]('max-width');
    }
    set maxWidth(value) {
      this[dartx.setProperty]('max-width', value, '');
    }
    get maxZoom() {
      return this[dartx.getPropertyValue]('max-zoom');
    }
    set maxZoom(value) {
      this[dartx.setProperty]('max-zoom', value, '');
    }
    get minHeight() {
      return this[dartx.getPropertyValue]('min-height');
    }
    set minHeight(value) {
      this[dartx.setProperty]('min-height', value, '');
    }
    get minLogicalHeight() {
      return this[dartx.getPropertyValue]('min-logical-height');
    }
    set minLogicalHeight(value) {
      this[dartx.setProperty]('min-logical-height', value, '');
    }
    get minLogicalWidth() {
      return this[dartx.getPropertyValue]('min-logical-width');
    }
    set minLogicalWidth(value) {
      this[dartx.setProperty]('min-logical-width', value, '');
    }
    get minWidth() {
      return this[dartx.getPropertyValue]('min-width');
    }
    set minWidth(value) {
      this[dartx.setProperty]('min-width', value, '');
    }
    get minZoom() {
      return this[dartx.getPropertyValue]('min-zoom');
    }
    set minZoom(value) {
      this[dartx.setProperty]('min-zoom', value, '');
    }
    get mixBlendMode() {
      return this[dartx.getPropertyValue]('mix-blend-mode');
    }
    set mixBlendMode(value) {
      this[dartx.setProperty]('mix-blend-mode', value, '');
    }
    get objectFit() {
      return this[dartx.getPropertyValue]('object-fit');
    }
    set objectFit(value) {
      this[dartx.setProperty]('object-fit', value, '');
    }
    get objectPosition() {
      return this[dartx.getPropertyValue]('object-position');
    }
    set objectPosition(value) {
      this[dartx.setProperty]('object-position', value, '');
    }
    get opacity() {
      return this[dartx.getPropertyValue]('opacity');
    }
    set opacity(value) {
      this[dartx.setProperty]('opacity', value, '');
    }
    get order() {
      return this[dartx.getPropertyValue]('order');
    }
    set order(value) {
      this[dartx.setProperty]('order', value, '');
    }
    get orientation() {
      return this[dartx.getPropertyValue]('orientation');
    }
    set orientation(value) {
      this[dartx.setProperty]('orientation', value, '');
    }
    get orphans() {
      return this[dartx.getPropertyValue]('orphans');
    }
    set orphans(value) {
      this[dartx.setProperty]('orphans', value, '');
    }
    get outline() {
      return this[dartx.getPropertyValue]('outline');
    }
    set outline(value) {
      this[dartx.setProperty]('outline', value, '');
    }
    get outlineColor() {
      return this[dartx.getPropertyValue]('outline-color');
    }
    set outlineColor(value) {
      this[dartx.setProperty]('outline-color', value, '');
    }
    get outlineOffset() {
      return this[dartx.getPropertyValue]('outline-offset');
    }
    set outlineOffset(value) {
      this[dartx.setProperty]('outline-offset', value, '');
    }
    get outlineStyle() {
      return this[dartx.getPropertyValue]('outline-style');
    }
    set outlineStyle(value) {
      this[dartx.setProperty]('outline-style', value, '');
    }
    get outlineWidth() {
      return this[dartx.getPropertyValue]('outline-width');
    }
    set outlineWidth(value) {
      this[dartx.setProperty]('outline-width', value, '');
    }
    get overflow() {
      return this[dartx.getPropertyValue]('overflow');
    }
    set overflow(value) {
      this[dartx.setProperty]('overflow', value, '');
    }
    get overflowWrap() {
      return this[dartx.getPropertyValue]('overflow-wrap');
    }
    set overflowWrap(value) {
      this[dartx.setProperty]('overflow-wrap', value, '');
    }
    get overflowX() {
      return this[dartx.getPropertyValue]('overflow-x');
    }
    set overflowX(value) {
      this[dartx.setProperty]('overflow-x', value, '');
    }
    get overflowY() {
      return this[dartx.getPropertyValue]('overflow-y');
    }
    set overflowY(value) {
      this[dartx.setProperty]('overflow-y', value, '');
    }
    get padding() {
      return this[dartx.getPropertyValue]('padding');
    }
    set padding(value) {
      this[dartx.setProperty]('padding', value, '');
    }
    get paddingAfter() {
      return this[dartx.getPropertyValue]('padding-after');
    }
    set paddingAfter(value) {
      this[dartx.setProperty]('padding-after', value, '');
    }
    get paddingBefore() {
      return this[dartx.getPropertyValue]('padding-before');
    }
    set paddingBefore(value) {
      this[dartx.setProperty]('padding-before', value, '');
    }
    get paddingBottom() {
      return this[dartx.getPropertyValue]('padding-bottom');
    }
    set paddingBottom(value) {
      this[dartx.setProperty]('padding-bottom', value, '');
    }
    get paddingEnd() {
      return this[dartx.getPropertyValue]('padding-end');
    }
    set paddingEnd(value) {
      this[dartx.setProperty]('padding-end', value, '');
    }
    get paddingLeft() {
      return this[dartx.getPropertyValue]('padding-left');
    }
    set paddingLeft(value) {
      this[dartx.setProperty]('padding-left', value, '');
    }
    get paddingRight() {
      return this[dartx.getPropertyValue]('padding-right');
    }
    set paddingRight(value) {
      this[dartx.setProperty]('padding-right', value, '');
    }
    get paddingStart() {
      return this[dartx.getPropertyValue]('padding-start');
    }
    set paddingStart(value) {
      this[dartx.setProperty]('padding-start', value, '');
    }
    get paddingTop() {
      return this[dartx.getPropertyValue]('padding-top');
    }
    set paddingTop(value) {
      this[dartx.setProperty]('padding-top', value, '');
    }
    get page() {
      return this[dartx.getPropertyValue]('page');
    }
    set page(value) {
      this[dartx.setProperty]('page', value, '');
    }
    get pageBreakAfter() {
      return this[dartx.getPropertyValue]('page-break-after');
    }
    set pageBreakAfter(value) {
      this[dartx.setProperty]('page-break-after', value, '');
    }
    get pageBreakBefore() {
      return this[dartx.getPropertyValue]('page-break-before');
    }
    set pageBreakBefore(value) {
      this[dartx.setProperty]('page-break-before', value, '');
    }
    get pageBreakInside() {
      return this[dartx.getPropertyValue]('page-break-inside');
    }
    set pageBreakInside(value) {
      this[dartx.setProperty]('page-break-inside', value, '');
    }
    get perspective() {
      return this[dartx.getPropertyValue]('perspective');
    }
    set perspective(value) {
      this[dartx.setProperty]('perspective', value, '');
    }
    get perspectiveOrigin() {
      return this[dartx.getPropertyValue]('perspective-origin');
    }
    set perspectiveOrigin(value) {
      this[dartx.setProperty]('perspective-origin', value, '');
    }
    get perspectiveOriginX() {
      return this[dartx.getPropertyValue]('perspective-origin-x');
    }
    set perspectiveOriginX(value) {
      this[dartx.setProperty]('perspective-origin-x', value, '');
    }
    get perspectiveOriginY() {
      return this[dartx.getPropertyValue]('perspective-origin-y');
    }
    set perspectiveOriginY(value) {
      this[dartx.setProperty]('perspective-origin-y', value, '');
    }
    get pointerEvents() {
      return this[dartx.getPropertyValue]('pointer-events');
    }
    set pointerEvents(value) {
      this[dartx.setProperty]('pointer-events', value, '');
    }
    get position() {
      return this[dartx.getPropertyValue]('position');
    }
    set position(value) {
      this[dartx.setProperty]('position', value, '');
    }
    get printColorAdjust() {
      return this[dartx.getPropertyValue]('print-color-adjust');
    }
    set printColorAdjust(value) {
      this[dartx.setProperty]('print-color-adjust', value, '');
    }
    get quotes() {
      return this[dartx.getPropertyValue]('quotes');
    }
    set quotes(value) {
      this[dartx.setProperty]('quotes', value, '');
    }
    get resize() {
      return this[dartx.getPropertyValue]('resize');
    }
    set resize(value) {
      this[dartx.setProperty]('resize', value, '');
    }
    get right() {
      return this[dartx.getPropertyValue]('right');
    }
    set right(value) {
      this[dartx.setProperty]('right', value, '');
    }
    get rtlOrdering() {
      return this[dartx.getPropertyValue]('rtl-ordering');
    }
    set rtlOrdering(value) {
      this[dartx.setProperty]('rtl-ordering', value, '');
    }
    get rubyPosition() {
      return this[dartx.getPropertyValue]('ruby-position');
    }
    set rubyPosition(value) {
      this[dartx.setProperty]('ruby-position', value, '');
    }
    get scrollBehavior() {
      return this[dartx.getPropertyValue]('scroll-behavior');
    }
    set scrollBehavior(value) {
      this[dartx.setProperty]('scroll-behavior', value, '');
    }
    get shapeImageThreshold() {
      return this[dartx.getPropertyValue]('shape-image-threshold');
    }
    set shapeImageThreshold(value) {
      this[dartx.setProperty]('shape-image-threshold', value, '');
    }
    get shapeMargin() {
      return this[dartx.getPropertyValue]('shape-margin');
    }
    set shapeMargin(value) {
      this[dartx.setProperty]('shape-margin', value, '');
    }
    get shapeOutside() {
      return this[dartx.getPropertyValue]('shape-outside');
    }
    set shapeOutside(value) {
      this[dartx.setProperty]('shape-outside', value, '');
    }
    get size() {
      return this[dartx.getPropertyValue]('size');
    }
    set size(value) {
      this[dartx.setProperty]('size', value, '');
    }
    get speak() {
      return this[dartx.getPropertyValue]('speak');
    }
    set speak(value) {
      this[dartx.setProperty]('speak', value, '');
    }
    get src() {
      return this[dartx.getPropertyValue]('src');
    }
    set src(value) {
      this[dartx.setProperty]('src', value, '');
    }
    get tabSize() {
      return this[dartx.getPropertyValue]('tab-size');
    }
    set tabSize(value) {
      this[dartx.setProperty]('tab-size', value, '');
    }
    get tableLayout() {
      return this[dartx.getPropertyValue]('table-layout');
    }
    set tableLayout(value) {
      this[dartx.setProperty]('table-layout', value, '');
    }
    get tapHighlightColor() {
      return this[dartx.getPropertyValue]('tap-highlight-color');
    }
    set tapHighlightColor(value) {
      this[dartx.setProperty]('tap-highlight-color', value, '');
    }
    get textAlign() {
      return this[dartx.getPropertyValue]('text-align');
    }
    set textAlign(value) {
      this[dartx.setProperty]('text-align', value, '');
    }
    get textAlignLast() {
      return this[dartx.getPropertyValue]('text-align-last');
    }
    set textAlignLast(value) {
      this[dartx.setProperty]('text-align-last', value, '');
    }
    get textCombine() {
      return this[dartx.getPropertyValue]('text-combine');
    }
    set textCombine(value) {
      this[dartx.setProperty]('text-combine', value, '');
    }
    get textDecoration() {
      return this[dartx.getPropertyValue]('text-decoration');
    }
    set textDecoration(value) {
      this[dartx.setProperty]('text-decoration', value, '');
    }
    get textDecorationColor() {
      return this[dartx.getPropertyValue]('text-decoration-color');
    }
    set textDecorationColor(value) {
      this[dartx.setProperty]('text-decoration-color', value, '');
    }
    get textDecorationLine() {
      return this[dartx.getPropertyValue]('text-decoration-line');
    }
    set textDecorationLine(value) {
      this[dartx.setProperty]('text-decoration-line', value, '');
    }
    get textDecorationStyle() {
      return this[dartx.getPropertyValue]('text-decoration-style');
    }
    set textDecorationStyle(value) {
      this[dartx.setProperty]('text-decoration-style', value, '');
    }
    get textDecorationsInEffect() {
      return this[dartx.getPropertyValue]('text-decorations-in-effect');
    }
    set textDecorationsInEffect(value) {
      this[dartx.setProperty]('text-decorations-in-effect', value, '');
    }
    get textEmphasis() {
      return this[dartx.getPropertyValue]('text-emphasis');
    }
    set textEmphasis(value) {
      this[dartx.setProperty]('text-emphasis', value, '');
    }
    get textEmphasisColor() {
      return this[dartx.getPropertyValue]('text-emphasis-color');
    }
    set textEmphasisColor(value) {
      this[dartx.setProperty]('text-emphasis-color', value, '');
    }
    get textEmphasisPosition() {
      return this[dartx.getPropertyValue]('text-emphasis-position');
    }
    set textEmphasisPosition(value) {
      this[dartx.setProperty]('text-emphasis-position', value, '');
    }
    get textEmphasisStyle() {
      return this[dartx.getPropertyValue]('text-emphasis-style');
    }
    set textEmphasisStyle(value) {
      this[dartx.setProperty]('text-emphasis-style', value, '');
    }
    get textFillColor() {
      return this[dartx.getPropertyValue]('text-fill-color');
    }
    set textFillColor(value) {
      this[dartx.setProperty]('text-fill-color', value, '');
    }
    get textIndent() {
      return this[dartx.getPropertyValue]('text-indent');
    }
    set textIndent(value) {
      this[dartx.setProperty]('text-indent', value, '');
    }
    get textJustify() {
      return this[dartx.getPropertyValue]('text-justify');
    }
    set textJustify(value) {
      this[dartx.setProperty]('text-justify', value, '');
    }
    get textLineThroughColor() {
      return this[dartx.getPropertyValue]('text-line-through-color');
    }
    set textLineThroughColor(value) {
      this[dartx.setProperty]('text-line-through-color', value, '');
    }
    get textLineThroughMode() {
      return this[dartx.getPropertyValue]('text-line-through-mode');
    }
    set textLineThroughMode(value) {
      this[dartx.setProperty]('text-line-through-mode', value, '');
    }
    get textLineThroughStyle() {
      return this[dartx.getPropertyValue]('text-line-through-style');
    }
    set textLineThroughStyle(value) {
      this[dartx.setProperty]('text-line-through-style', value, '');
    }
    get textLineThroughWidth() {
      return this[dartx.getPropertyValue]('text-line-through-width');
    }
    set textLineThroughWidth(value) {
      this[dartx.setProperty]('text-line-through-width', value, '');
    }
    get textOrientation() {
      return this[dartx.getPropertyValue]('text-orientation');
    }
    set textOrientation(value) {
      this[dartx.setProperty]('text-orientation', value, '');
    }
    get textOverflow() {
      return this[dartx.getPropertyValue]('text-overflow');
    }
    set textOverflow(value) {
      this[dartx.setProperty]('text-overflow', value, '');
    }
    get textOverlineColor() {
      return this[dartx.getPropertyValue]('text-overline-color');
    }
    set textOverlineColor(value) {
      this[dartx.setProperty]('text-overline-color', value, '');
    }
    get textOverlineMode() {
      return this[dartx.getPropertyValue]('text-overline-mode');
    }
    set textOverlineMode(value) {
      this[dartx.setProperty]('text-overline-mode', value, '');
    }
    get textOverlineStyle() {
      return this[dartx.getPropertyValue]('text-overline-style');
    }
    set textOverlineStyle(value) {
      this[dartx.setProperty]('text-overline-style', value, '');
    }
    get textOverlineWidth() {
      return this[dartx.getPropertyValue]('text-overline-width');
    }
    set textOverlineWidth(value) {
      this[dartx.setProperty]('text-overline-width', value, '');
    }
    get textRendering() {
      return this[dartx.getPropertyValue]('text-rendering');
    }
    set textRendering(value) {
      this[dartx.setProperty]('text-rendering', value, '');
    }
    get textSecurity() {
      return this[dartx.getPropertyValue]('text-security');
    }
    set textSecurity(value) {
      this[dartx.setProperty]('text-security', value, '');
    }
    get textShadow() {
      return this[dartx.getPropertyValue]('text-shadow');
    }
    set textShadow(value) {
      this[dartx.setProperty]('text-shadow', value, '');
    }
    get textStroke() {
      return this[dartx.getPropertyValue]('text-stroke');
    }
    set textStroke(value) {
      this[dartx.setProperty]('text-stroke', value, '');
    }
    get textStrokeColor() {
      return this[dartx.getPropertyValue]('text-stroke-color');
    }
    set textStrokeColor(value) {
      this[dartx.setProperty]('text-stroke-color', value, '');
    }
    get textStrokeWidth() {
      return this[dartx.getPropertyValue]('text-stroke-width');
    }
    set textStrokeWidth(value) {
      this[dartx.setProperty]('text-stroke-width', value, '');
    }
    get textTransform() {
      return this[dartx.getPropertyValue]('text-transform');
    }
    set textTransform(value) {
      this[dartx.setProperty]('text-transform', value, '');
    }
    get textUnderlineColor() {
      return this[dartx.getPropertyValue]('text-underline-color');
    }
    set textUnderlineColor(value) {
      this[dartx.setProperty]('text-underline-color', value, '');
    }
    get textUnderlineMode() {
      return this[dartx.getPropertyValue]('text-underline-mode');
    }
    set textUnderlineMode(value) {
      this[dartx.setProperty]('text-underline-mode', value, '');
    }
    get textUnderlinePosition() {
      return this[dartx.getPropertyValue]('text-underline-position');
    }
    set textUnderlinePosition(value) {
      this[dartx.setProperty]('text-underline-position', value, '');
    }
    get textUnderlineStyle() {
      return this[dartx.getPropertyValue]('text-underline-style');
    }
    set textUnderlineStyle(value) {
      this[dartx.setProperty]('text-underline-style', value, '');
    }
    get textUnderlineWidth() {
      return this[dartx.getPropertyValue]('text-underline-width');
    }
    set textUnderlineWidth(value) {
      this[dartx.setProperty]('text-underline-width', value, '');
    }
    get top() {
      return this[dartx.getPropertyValue]('top');
    }
    set top(value) {
      this[dartx.setProperty]('top', value, '');
    }
    get touchAction() {
      return this[dartx.getPropertyValue]('touch-action');
    }
    set touchAction(value) {
      this[dartx.setProperty]('touch-action', value, '');
    }
    get touchActionDelay() {
      return this[dartx.getPropertyValue]('touch-action-delay');
    }
    set touchActionDelay(value) {
      this[dartx.setProperty]('touch-action-delay', value, '');
    }
    get transform() {
      return this[dartx.getPropertyValue]('transform');
    }
    set transform(value) {
      this[dartx.setProperty]('transform', value, '');
    }
    get transformOrigin() {
      return this[dartx.getPropertyValue]('transform-origin');
    }
    set transformOrigin(value) {
      this[dartx.setProperty]('transform-origin', value, '');
    }
    get transformOriginX() {
      return this[dartx.getPropertyValue]('transform-origin-x');
    }
    set transformOriginX(value) {
      this[dartx.setProperty]('transform-origin-x', value, '');
    }
    get transformOriginY() {
      return this[dartx.getPropertyValue]('transform-origin-y');
    }
    set transformOriginY(value) {
      this[dartx.setProperty]('transform-origin-y', value, '');
    }
    get transformOriginZ() {
      return this[dartx.getPropertyValue]('transform-origin-z');
    }
    set transformOriginZ(value) {
      this[dartx.setProperty]('transform-origin-z', value, '');
    }
    get transformStyle() {
      return this[dartx.getPropertyValue]('transform-style');
    }
    set transformStyle(value) {
      this[dartx.setProperty]('transform-style', value, '');
    }
    get transition() {
      return this[dartx.getPropertyValue]('transition');
    }
    set transition(value) {
      this[dartx.setProperty]('transition', value, '');
    }
    get transitionDelay() {
      return this[dartx.getPropertyValue]('transition-delay');
    }
    set transitionDelay(value) {
      this[dartx.setProperty]('transition-delay', value, '');
    }
    get transitionDuration() {
      return this[dartx.getPropertyValue]('transition-duration');
    }
    set transitionDuration(value) {
      this[dartx.setProperty]('transition-duration', value, '');
    }
    get transitionProperty() {
      return this[dartx.getPropertyValue]('transition-property');
    }
    set transitionProperty(value) {
      this[dartx.setProperty]('transition-property', value, '');
    }
    get transitionTimingFunction() {
      return this[dartx.getPropertyValue]('transition-timing-function');
    }
    set transitionTimingFunction(value) {
      this[dartx.setProperty]('transition-timing-function', value, '');
    }
    get unicodeBidi() {
      return this[dartx.getPropertyValue]('unicode-bidi');
    }
    set unicodeBidi(value) {
      this[dartx.setProperty]('unicode-bidi', value, '');
    }
    get unicodeRange() {
      return this[dartx.getPropertyValue]('unicode-range');
    }
    set unicodeRange(value) {
      this[dartx.setProperty]('unicode-range', value, '');
    }
    get userDrag() {
      return this[dartx.getPropertyValue]('user-drag');
    }
    set userDrag(value) {
      this[dartx.setProperty]('user-drag', value, '');
    }
    get userModify() {
      return this[dartx.getPropertyValue]('user-modify');
    }
    set userModify(value) {
      this[dartx.setProperty]('user-modify', value, '');
    }
    get userSelect() {
      return this[dartx.getPropertyValue]('user-select');
    }
    set userSelect(value) {
      this[dartx.setProperty]('user-select', value, '');
    }
    get userZoom() {
      return this[dartx.getPropertyValue]('user-zoom');
    }
    set userZoom(value) {
      this[dartx.setProperty]('user-zoom', value, '');
    }
    get verticalAlign() {
      return this[dartx.getPropertyValue]('vertical-align');
    }
    set verticalAlign(value) {
      this[dartx.setProperty]('vertical-align', value, '');
    }
    get visibility() {
      return this[dartx.getPropertyValue]('visibility');
    }
    set visibility(value) {
      this[dartx.setProperty]('visibility', value, '');
    }
    get whiteSpace() {
      return this[dartx.getPropertyValue]('white-space');
    }
    set whiteSpace(value) {
      this[dartx.setProperty]('white-space', value, '');
    }
    get widows() {
      return this[dartx.getPropertyValue]('widows');
    }
    set widows(value) {
      this[dartx.setProperty]('widows', value, '');
    }
    get width() {
      return this[dartx.getPropertyValue]('width');
    }
    set width(value) {
      this[dartx.setProperty]('width', value, '');
    }
    get willChange() {
      return this[dartx.getPropertyValue]('will-change');
    }
    set willChange(value) {
      this[dartx.setProperty]('will-change', value, '');
    }
    get wordBreak() {
      return this[dartx.getPropertyValue]('word-break');
    }
    set wordBreak(value) {
      this[dartx.setProperty]('word-break', value, '');
    }
    get wordSpacing() {
      return this[dartx.getPropertyValue]('word-spacing');
    }
    set wordSpacing(value) {
      this[dartx.setProperty]('word-spacing', value, '');
    }
    get wordWrap() {
      return this[dartx.getPropertyValue]('word-wrap');
    }
    set wordWrap(value) {
      this[dartx.setProperty]('word-wrap', value, '');
    }
    get wrapFlow() {
      return this[dartx.getPropertyValue]('wrap-flow');
    }
    set wrapFlow(value) {
      this[dartx.setProperty]('wrap-flow', value, '');
    }
    get wrapThrough() {
      return this[dartx.getPropertyValue]('wrap-through');
    }
    set wrapThrough(value) {
      this[dartx.setProperty]('wrap-through', value, '');
    }
    get writingMode() {
      return this[dartx.getPropertyValue]('writing-mode');
    }
    set writingMode(value) {
      this[dartx.setProperty]('writing-mode', value, '');
    }
    get zIndex() {
      return this[dartx.getPropertyValue]('z-index');
    }
    set zIndex(value) {
      this[dartx.setProperty]('z-index', value, '');
    }
    get zoom() {
      return this[dartx.getPropertyValue]('zoom');
    }
    set zoom(value) {
      this[dartx.setProperty]('zoom', value, '');
    }
  };
  dart.setSignature(html$.CssStyleDeclarationBase, {
    getters: () => ({
      alignContent: dart.definiteFunctionType(core.String, []),
      alignItems: dart.definiteFunctionType(core.String, []),
      alignSelf: dart.definiteFunctionType(core.String, []),
      animation: dart.definiteFunctionType(core.String, []),
      animationDelay: dart.definiteFunctionType(core.String, []),
      animationDirection: dart.definiteFunctionType(core.String, []),
      animationDuration: dart.definiteFunctionType(core.String, []),
      animationFillMode: dart.definiteFunctionType(core.String, []),
      animationIterationCount: dart.definiteFunctionType(core.String, []),
      animationName: dart.definiteFunctionType(core.String, []),
      animationPlayState: dart.definiteFunctionType(core.String, []),
      animationTimingFunction: dart.definiteFunctionType(core.String, []),
      appRegion: dart.definiteFunctionType(core.String, []),
      appearance: dart.definiteFunctionType(core.String, []),
      aspectRatio: dart.definiteFunctionType(core.String, []),
      backfaceVisibility: dart.definiteFunctionType(core.String, []),
      background: dart.definiteFunctionType(core.String, []),
      backgroundAttachment: dart.definiteFunctionType(core.String, []),
      backgroundBlendMode: dart.definiteFunctionType(core.String, []),
      backgroundClip: dart.definiteFunctionType(core.String, []),
      backgroundColor: dart.definiteFunctionType(core.String, []),
      backgroundComposite: dart.definiteFunctionType(core.String, []),
      backgroundImage: dart.definiteFunctionType(core.String, []),
      backgroundOrigin: dart.definiteFunctionType(core.String, []),
      backgroundPosition: dart.definiteFunctionType(core.String, []),
      backgroundPositionX: dart.definiteFunctionType(core.String, []),
      backgroundPositionY: dart.definiteFunctionType(core.String, []),
      backgroundRepeat: dart.definiteFunctionType(core.String, []),
      backgroundRepeatX: dart.definiteFunctionType(core.String, []),
      backgroundRepeatY: dart.definiteFunctionType(core.String, []),
      backgroundSize: dart.definiteFunctionType(core.String, []),
      border: dart.definiteFunctionType(core.String, []),
      borderAfter: dart.definiteFunctionType(core.String, []),
      borderAfterColor: dart.definiteFunctionType(core.String, []),
      borderAfterStyle: dart.definiteFunctionType(core.String, []),
      borderAfterWidth: dart.definiteFunctionType(core.String, []),
      borderBefore: dart.definiteFunctionType(core.String, []),
      borderBeforeColor: dart.definiteFunctionType(core.String, []),
      borderBeforeStyle: dart.definiteFunctionType(core.String, []),
      borderBeforeWidth: dart.definiteFunctionType(core.String, []),
      borderBottom: dart.definiteFunctionType(core.String, []),
      borderBottomColor: dart.definiteFunctionType(core.String, []),
      borderBottomLeftRadius: dart.definiteFunctionType(core.String, []),
      borderBottomRightRadius: dart.definiteFunctionType(core.String, []),
      borderBottomStyle: dart.definiteFunctionType(core.String, []),
      borderBottomWidth: dart.definiteFunctionType(core.String, []),
      borderCollapse: dart.definiteFunctionType(core.String, []),
      borderColor: dart.definiteFunctionType(core.String, []),
      borderEnd: dart.definiteFunctionType(core.String, []),
      borderEndColor: dart.definiteFunctionType(core.String, []),
      borderEndStyle: dart.definiteFunctionType(core.String, []),
      borderEndWidth: dart.definiteFunctionType(core.String, []),
      borderFit: dart.definiteFunctionType(core.String, []),
      borderHorizontalSpacing: dart.definiteFunctionType(core.String, []),
      borderImage: dart.definiteFunctionType(core.String, []),
      borderImageOutset: dart.definiteFunctionType(core.String, []),
      borderImageRepeat: dart.definiteFunctionType(core.String, []),
      borderImageSlice: dart.definiteFunctionType(core.String, []),
      borderImageSource: dart.definiteFunctionType(core.String, []),
      borderImageWidth: dart.definiteFunctionType(core.String, []),
      borderLeft: dart.definiteFunctionType(core.String, []),
      borderLeftColor: dart.definiteFunctionType(core.String, []),
      borderLeftStyle: dart.definiteFunctionType(core.String, []),
      borderLeftWidth: dart.definiteFunctionType(core.String, []),
      borderRadius: dart.definiteFunctionType(core.String, []),
      borderRight: dart.definiteFunctionType(core.String, []),
      borderRightColor: dart.definiteFunctionType(core.String, []),
      borderRightStyle: dart.definiteFunctionType(core.String, []),
      borderRightWidth: dart.definiteFunctionType(core.String, []),
      borderSpacing: dart.definiteFunctionType(core.String, []),
      borderStart: dart.definiteFunctionType(core.String, []),
      borderStartColor: dart.definiteFunctionType(core.String, []),
      borderStartStyle: dart.definiteFunctionType(core.String, []),
      borderStartWidth: dart.definiteFunctionType(core.String, []),
      borderStyle: dart.definiteFunctionType(core.String, []),
      borderTop: dart.definiteFunctionType(core.String, []),
      borderTopColor: dart.definiteFunctionType(core.String, []),
      borderTopLeftRadius: dart.definiteFunctionType(core.String, []),
      borderTopRightRadius: dart.definiteFunctionType(core.String, []),
      borderTopStyle: dart.definiteFunctionType(core.String, []),
      borderTopWidth: dart.definiteFunctionType(core.String, []),
      borderVerticalSpacing: dart.definiteFunctionType(core.String, []),
      borderWidth: dart.definiteFunctionType(core.String, []),
      bottom: dart.definiteFunctionType(core.String, []),
      boxAlign: dart.definiteFunctionType(core.String, []),
      boxDecorationBreak: dart.definiteFunctionType(core.String, []),
      boxDirection: dart.definiteFunctionType(core.String, []),
      boxFlex: dart.definiteFunctionType(core.String, []),
      boxFlexGroup: dart.definiteFunctionType(core.String, []),
      boxLines: dart.definiteFunctionType(core.String, []),
      boxOrdinalGroup: dart.definiteFunctionType(core.String, []),
      boxOrient: dart.definiteFunctionType(core.String, []),
      boxPack: dart.definiteFunctionType(core.String, []),
      boxReflect: dart.definiteFunctionType(core.String, []),
      boxShadow: dart.definiteFunctionType(core.String, []),
      boxSizing: dart.definiteFunctionType(core.String, []),
      captionSide: dart.definiteFunctionType(core.String, []),
      clear: dart.definiteFunctionType(core.String, []),
      clip: dart.definiteFunctionType(core.String, []),
      clipPath: dart.definiteFunctionType(core.String, []),
      color: dart.definiteFunctionType(core.String, []),
      columnBreakAfter: dart.definiteFunctionType(core.String, []),
      columnBreakBefore: dart.definiteFunctionType(core.String, []),
      columnBreakInside: dart.definiteFunctionType(core.String, []),
      columnCount: dart.definiteFunctionType(core.String, []),
      columnFill: dart.definiteFunctionType(core.String, []),
      columnGap: dart.definiteFunctionType(core.String, []),
      columnRule: dart.definiteFunctionType(core.String, []),
      columnRuleColor: dart.definiteFunctionType(core.String, []),
      columnRuleStyle: dart.definiteFunctionType(core.String, []),
      columnRuleWidth: dart.definiteFunctionType(core.String, []),
      columnSpan: dart.definiteFunctionType(core.String, []),
      columnWidth: dart.definiteFunctionType(core.String, []),
      columns: dart.definiteFunctionType(core.String, []),
      content: dart.definiteFunctionType(core.String, []),
      counterIncrement: dart.definiteFunctionType(core.String, []),
      counterReset: dart.definiteFunctionType(core.String, []),
      cursor: dart.definiteFunctionType(core.String, []),
      direction: dart.definiteFunctionType(core.String, []),
      display: dart.definiteFunctionType(core.String, []),
      emptyCells: dart.definiteFunctionType(core.String, []),
      filter: dart.definiteFunctionType(core.String, []),
      flex: dart.definiteFunctionType(core.String, []),
      flexBasis: dart.definiteFunctionType(core.String, []),
      flexDirection: dart.definiteFunctionType(core.String, []),
      flexFlow: dart.definiteFunctionType(core.String, []),
      flexGrow: dart.definiteFunctionType(core.String, []),
      flexShrink: dart.definiteFunctionType(core.String, []),
      flexWrap: dart.definiteFunctionType(core.String, []),
      float: dart.definiteFunctionType(core.String, []),
      font: dart.definiteFunctionType(core.String, []),
      fontFamily: dart.definiteFunctionType(core.String, []),
      fontFeatureSettings: dart.definiteFunctionType(core.String, []),
      fontKerning: dart.definiteFunctionType(core.String, []),
      fontSize: dart.definiteFunctionType(core.String, []),
      fontSizeDelta: dart.definiteFunctionType(core.String, []),
      fontSmoothing: dart.definiteFunctionType(core.String, []),
      fontStretch: dart.definiteFunctionType(core.String, []),
      fontStyle: dart.definiteFunctionType(core.String, []),
      fontVariant: dart.definiteFunctionType(core.String, []),
      fontVariantLigatures: dart.definiteFunctionType(core.String, []),
      fontWeight: dart.definiteFunctionType(core.String, []),
      grid: dart.definiteFunctionType(core.String, []),
      gridArea: dart.definiteFunctionType(core.String, []),
      gridAutoColumns: dart.definiteFunctionType(core.String, []),
      gridAutoFlow: dart.definiteFunctionType(core.String, []),
      gridAutoRows: dart.definiteFunctionType(core.String, []),
      gridColumn: dart.definiteFunctionType(core.String, []),
      gridColumnEnd: dart.definiteFunctionType(core.String, []),
      gridColumnStart: dart.definiteFunctionType(core.String, []),
      gridRow: dart.definiteFunctionType(core.String, []),
      gridRowEnd: dart.definiteFunctionType(core.String, []),
      gridRowStart: dart.definiteFunctionType(core.String, []),
      gridTemplate: dart.definiteFunctionType(core.String, []),
      gridTemplateAreas: dart.definiteFunctionType(core.String, []),
      gridTemplateColumns: dart.definiteFunctionType(core.String, []),
      gridTemplateRows: dart.definiteFunctionType(core.String, []),
      height: dart.definiteFunctionType(core.String, []),
      highlight: dart.definiteFunctionType(core.String, []),
      hyphenateCharacter: dart.definiteFunctionType(core.String, []),
      imageRendering: dart.definiteFunctionType(core.String, []),
      isolation: dart.definiteFunctionType(core.String, []),
      justifyContent: dart.definiteFunctionType(core.String, []),
      justifySelf: dart.definiteFunctionType(core.String, []),
      left: dart.definiteFunctionType(core.String, []),
      letterSpacing: dart.definiteFunctionType(core.String, []),
      lineBoxContain: dart.definiteFunctionType(core.String, []),
      lineBreak: dart.definiteFunctionType(core.String, []),
      lineClamp: dart.definiteFunctionType(core.String, []),
      lineHeight: dart.definiteFunctionType(core.String, []),
      listStyle: dart.definiteFunctionType(core.String, []),
      listStyleImage: dart.definiteFunctionType(core.String, []),
      listStylePosition: dart.definiteFunctionType(core.String, []),
      listStyleType: dart.definiteFunctionType(core.String, []),
      locale: dart.definiteFunctionType(core.String, []),
      logicalHeight: dart.definiteFunctionType(core.String, []),
      logicalWidth: dart.definiteFunctionType(core.String, []),
      margin: dart.definiteFunctionType(core.String, []),
      marginAfter: dart.definiteFunctionType(core.String, []),
      marginAfterCollapse: dart.definiteFunctionType(core.String, []),
      marginBefore: dart.definiteFunctionType(core.String, []),
      marginBeforeCollapse: dart.definiteFunctionType(core.String, []),
      marginBottom: dart.definiteFunctionType(core.String, []),
      marginBottomCollapse: dart.definiteFunctionType(core.String, []),
      marginCollapse: dart.definiteFunctionType(core.String, []),
      marginEnd: dart.definiteFunctionType(core.String, []),
      marginLeft: dart.definiteFunctionType(core.String, []),
      marginRight: dart.definiteFunctionType(core.String, []),
      marginStart: dart.definiteFunctionType(core.String, []),
      marginTop: dart.definiteFunctionType(core.String, []),
      marginTopCollapse: dart.definiteFunctionType(core.String, []),
      mask: dart.definiteFunctionType(core.String, []),
      maskBoxImage: dart.definiteFunctionType(core.String, []),
      maskBoxImageOutset: dart.definiteFunctionType(core.String, []),
      maskBoxImageRepeat: dart.definiteFunctionType(core.String, []),
      maskBoxImageSlice: dart.definiteFunctionType(core.String, []),
      maskBoxImageSource: dart.definiteFunctionType(core.String, []),
      maskBoxImageWidth: dart.definiteFunctionType(core.String, []),
      maskClip: dart.definiteFunctionType(core.String, []),
      maskComposite: dart.definiteFunctionType(core.String, []),
      maskImage: dart.definiteFunctionType(core.String, []),
      maskOrigin: dart.definiteFunctionType(core.String, []),
      maskPosition: dart.definiteFunctionType(core.String, []),
      maskPositionX: dart.definiteFunctionType(core.String, []),
      maskPositionY: dart.definiteFunctionType(core.String, []),
      maskRepeat: dart.definiteFunctionType(core.String, []),
      maskRepeatX: dart.definiteFunctionType(core.String, []),
      maskRepeatY: dart.definiteFunctionType(core.String, []),
      maskSize: dart.definiteFunctionType(core.String, []),
      maskSourceType: dart.definiteFunctionType(core.String, []),
      maxHeight: dart.definiteFunctionType(core.String, []),
      maxLogicalHeight: dart.definiteFunctionType(core.String, []),
      maxLogicalWidth: dart.definiteFunctionType(core.String, []),
      maxWidth: dart.definiteFunctionType(core.String, []),
      maxZoom: dart.definiteFunctionType(core.String, []),
      minHeight: dart.definiteFunctionType(core.String, []),
      minLogicalHeight: dart.definiteFunctionType(core.String, []),
      minLogicalWidth: dart.definiteFunctionType(core.String, []),
      minWidth: dart.definiteFunctionType(core.String, []),
      minZoom: dart.definiteFunctionType(core.String, []),
      mixBlendMode: dart.definiteFunctionType(core.String, []),
      objectFit: dart.definiteFunctionType(core.String, []),
      objectPosition: dart.definiteFunctionType(core.String, []),
      opacity: dart.definiteFunctionType(core.String, []),
      order: dart.definiteFunctionType(core.String, []),
      orientation: dart.definiteFunctionType(core.String, []),
      orphans: dart.definiteFunctionType(core.String, []),
      outline: dart.definiteFunctionType(core.String, []),
      outlineColor: dart.definiteFunctionType(core.String, []),
      outlineOffset: dart.definiteFunctionType(core.String, []),
      outlineStyle: dart.definiteFunctionType(core.String, []),
      outlineWidth: dart.definiteFunctionType(core.String, []),
      overflow: dart.definiteFunctionType(core.String, []),
      overflowWrap: dart.definiteFunctionType(core.String, []),
      overflowX: dart.definiteFunctionType(core.String, []),
      overflowY: dart.definiteFunctionType(core.String, []),
      padding: dart.definiteFunctionType(core.String, []),
      paddingAfter: dart.definiteFunctionType(core.String, []),
      paddingBefore: dart.definiteFunctionType(core.String, []),
      paddingBottom: dart.definiteFunctionType(core.String, []),
      paddingEnd: dart.definiteFunctionType(core.String, []),
      paddingLeft: dart.definiteFunctionType(core.String, []),
      paddingRight: dart.definiteFunctionType(core.String, []),
      paddingStart: dart.definiteFunctionType(core.String, []),
      paddingTop: dart.definiteFunctionType(core.String, []),
      page: dart.definiteFunctionType(core.String, []),
      pageBreakAfter: dart.definiteFunctionType(core.String, []),
      pageBreakBefore: dart.definiteFunctionType(core.String, []),
      pageBreakInside: dart.definiteFunctionType(core.String, []),
      perspective: dart.definiteFunctionType(core.String, []),
      perspectiveOrigin: dart.definiteFunctionType(core.String, []),
      perspectiveOriginX: dart.definiteFunctionType(core.String, []),
      perspectiveOriginY: dart.definiteFunctionType(core.String, []),
      pointerEvents: dart.definiteFunctionType(core.String, []),
      position: dart.definiteFunctionType(core.String, []),
      printColorAdjust: dart.definiteFunctionType(core.String, []),
      quotes: dart.definiteFunctionType(core.String, []),
      resize: dart.definiteFunctionType(core.String, []),
      right: dart.definiteFunctionType(core.String, []),
      rtlOrdering: dart.definiteFunctionType(core.String, []),
      rubyPosition: dart.definiteFunctionType(core.String, []),
      scrollBehavior: dart.definiteFunctionType(core.String, []),
      shapeImageThreshold: dart.definiteFunctionType(core.String, []),
      shapeMargin: dart.definiteFunctionType(core.String, []),
      shapeOutside: dart.definiteFunctionType(core.String, []),
      size: dart.definiteFunctionType(core.String, []),
      speak: dart.definiteFunctionType(core.String, []),
      src: dart.definiteFunctionType(core.String, []),
      tabSize: dart.definiteFunctionType(core.String, []),
      tableLayout: dart.definiteFunctionType(core.String, []),
      tapHighlightColor: dart.definiteFunctionType(core.String, []),
      textAlign: dart.definiteFunctionType(core.String, []),
      textAlignLast: dart.definiteFunctionType(core.String, []),
      textCombine: dart.definiteFunctionType(core.String, []),
      textDecoration: dart.definiteFunctionType(core.String, []),
      textDecorationColor: dart.definiteFunctionType(core.String, []),
      textDecorationLine: dart.definiteFunctionType(core.String, []),
      textDecorationStyle: dart.definiteFunctionType(core.String, []),
      textDecorationsInEffect: dart.definiteFunctionType(core.String, []),
      textEmphasis: dart.definiteFunctionType(core.String, []),
      textEmphasisColor: dart.definiteFunctionType(core.String, []),
      textEmphasisPosition: dart.definiteFunctionType(core.String, []),
      textEmphasisStyle: dart.definiteFunctionType(core.String, []),
      textFillColor: dart.definiteFunctionType(core.String, []),
      textIndent: dart.definiteFunctionType(core.String, []),
      textJustify: dart.definiteFunctionType(core.String, []),
      textLineThroughColor: dart.definiteFunctionType(core.String, []),
      textLineThroughMode: dart.definiteFunctionType(core.String, []),
      textLineThroughStyle: dart.definiteFunctionType(core.String, []),
      textLineThroughWidth: dart.definiteFunctionType(core.String, []),
      textOrientation: dart.definiteFunctionType(core.String, []),
      textOverflow: dart.definiteFunctionType(core.String, []),
      textOverlineColor: dart.definiteFunctionType(core.String, []),
      textOverlineMode: dart.definiteFunctionType(core.String, []),
      textOverlineStyle: dart.definiteFunctionType(core.String, []),
      textOverlineWidth: dart.definiteFunctionType(core.String, []),
      textRendering: dart.definiteFunctionType(core.String, []),
      textSecurity: dart.definiteFunctionType(core.String, []),
      textShadow: dart.definiteFunctionType(core.String, []),
      textStroke: dart.definiteFunctionType(core.String, []),
      textStrokeColor: dart.definiteFunctionType(core.String, []),
      textStrokeWidth: dart.definiteFunctionType(core.String, []),
      textTransform: dart.definiteFunctionType(core.String, []),
      textUnderlineColor: dart.definiteFunctionType(core.String, []),
      textUnderlineMode: dart.definiteFunctionType(core.String, []),
      textUnderlinePosition: dart.definiteFunctionType(core.String, []),
      textUnderlineStyle: dart.definiteFunctionType(core.String, []),
      textUnderlineWidth: dart.definiteFunctionType(core.String, []),
      top: dart.definiteFunctionType(core.String, []),
      touchAction: dart.definiteFunctionType(core.String, []),
      touchActionDelay: dart.definiteFunctionType(core.String, []),
      transform: dart.definiteFunctionType(core.String, []),
      transformOrigin: dart.definiteFunctionType(core.String, []),
      transformOriginX: dart.definiteFunctionType(core.String, []),
      transformOriginY: dart.definiteFunctionType(core.String, []),
      transformOriginZ: dart.definiteFunctionType(core.String, []),
      transformStyle: dart.definiteFunctionType(core.String, []),
      transition: dart.definiteFunctionType(core.String, []),
      transitionDelay: dart.definiteFunctionType(core.String, []),
      transitionDuration: dart.definiteFunctionType(core.String, []),
      transitionProperty: dart.definiteFunctionType(core.String, []),
      transitionTimingFunction: dart.definiteFunctionType(core.String, []),
      unicodeBidi: dart.definiteFunctionType(core.String, []),
      unicodeRange: dart.definiteFunctionType(core.String, []),
      userDrag: dart.definiteFunctionType(core.String, []),
      userModify: dart.definiteFunctionType(core.String, []),
      userSelect: dart.definiteFunctionType(core.String, []),
      userZoom: dart.definiteFunctionType(core.String, []),
      verticalAlign: dart.definiteFunctionType(core.String, []),
      visibility: dart.definiteFunctionType(core.String, []),
      whiteSpace: dart.definiteFunctionType(core.String, []),
      widows: dart.definiteFunctionType(core.String, []),
      width: dart.definiteFunctionType(core.String, []),
      willChange: dart.definiteFunctionType(core.String, []),
      wordBreak: dart.definiteFunctionType(core.String, []),
      wordSpacing: dart.definiteFunctionType(core.String, []),
      wordWrap: dart.definiteFunctionType(core.String, []),
      wrapFlow: dart.definiteFunctionType(core.String, []),
      wrapThrough: dart.definiteFunctionType(core.String, []),
      writingMode: dart.definiteFunctionType(core.String, []),
      zIndex: dart.definiteFunctionType(core.String, []),
      zoom: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({
      alignContent: dart.definiteFunctionType(dart.void, [core.String]),
      alignItems: dart.definiteFunctionType(dart.void, [core.String]),
      alignSelf: dart.definiteFunctionType(dart.void, [core.String]),
      animation: dart.definiteFunctionType(dart.void, [core.String]),
      animationDelay: dart.definiteFunctionType(dart.void, [core.String]),
      animationDirection: dart.definiteFunctionType(dart.void, [core.String]),
      animationDuration: dart.definiteFunctionType(dart.void, [core.String]),
      animationFillMode: dart.definiteFunctionType(dart.void, [core.String]),
      animationIterationCount: dart.definiteFunctionType(dart.void, [core.String]),
      animationName: dart.definiteFunctionType(dart.void, [core.String]),
      animationPlayState: dart.definiteFunctionType(dart.void, [core.String]),
      animationTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
      appRegion: dart.definiteFunctionType(dart.void, [core.String]),
      appearance: dart.definiteFunctionType(dart.void, [core.String]),
      aspectRatio: dart.definiteFunctionType(dart.void, [core.String]),
      backfaceVisibility: dart.definiteFunctionType(dart.void, [core.String]),
      background: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundAttachment: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundClip: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundColor: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundComposite: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundImage: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundPosition: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundPositionX: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundPositionY: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
      backgroundSize: dart.definiteFunctionType(dart.void, [core.String]),
      border: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfter: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfterColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfterStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderAfterWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderBefore: dart.definiteFunctionType(dart.void, [core.String]),
      borderBeforeColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderBeforeStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderBeforeWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottom: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderBottomWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      borderColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderEnd: dart.definiteFunctionType(dart.void, [core.String]),
      borderEndColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderEndStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderEndWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderFit: dart.definiteFunctionType(dart.void, [core.String]),
      borderHorizontalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      borderImage: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageSource: dart.definiteFunctionType(dart.void, [core.String]),
      borderImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeft: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeftColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeftStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderLeftWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderRight: dart.definiteFunctionType(dart.void, [core.String]),
      borderRightColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderRightStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderRightWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      borderStart: dart.definiteFunctionType(dart.void, [core.String]),
      borderStartColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderStartStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderStartWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderTop: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopColor: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopStyle: dart.definiteFunctionType(dart.void, [core.String]),
      borderTopWidth: dart.definiteFunctionType(dart.void, [core.String]),
      borderVerticalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      borderWidth: dart.definiteFunctionType(dart.void, [core.String]),
      bottom: dart.definiteFunctionType(dart.void, [core.String]),
      boxAlign: dart.definiteFunctionType(dart.void, [core.String]),
      boxDecorationBreak: dart.definiteFunctionType(dart.void, [core.String]),
      boxDirection: dart.definiteFunctionType(dart.void, [core.String]),
      boxFlex: dart.definiteFunctionType(dart.void, [core.String]),
      boxFlexGroup: dart.definiteFunctionType(dart.void, [core.String]),
      boxLines: dart.definiteFunctionType(dart.void, [core.String]),
      boxOrdinalGroup: dart.definiteFunctionType(dart.void, [core.String]),
      boxOrient: dart.definiteFunctionType(dart.void, [core.String]),
      boxPack: dart.definiteFunctionType(dart.void, [core.String]),
      boxReflect: dart.definiteFunctionType(dart.void, [core.String]),
      boxShadow: dart.definiteFunctionType(dart.void, [core.String]),
      boxSizing: dart.definiteFunctionType(dart.void, [core.String]),
      captionSide: dart.definiteFunctionType(dart.void, [core.String]),
      clear: dart.definiteFunctionType(dart.void, [core.String]),
      clip: dart.definiteFunctionType(dart.void, [core.String]),
      clipPath: dart.definiteFunctionType(dart.void, [core.String]),
      color: dart.definiteFunctionType(dart.void, [core.String]),
      columnBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
      columnBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
      columnBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
      columnCount: dart.definiteFunctionType(dart.void, [core.String]),
      columnFill: dart.definiteFunctionType(dart.void, [core.String]),
      columnGap: dart.definiteFunctionType(dart.void, [core.String]),
      columnRule: dart.definiteFunctionType(dart.void, [core.String]),
      columnRuleColor: dart.definiteFunctionType(dart.void, [core.String]),
      columnRuleStyle: dart.definiteFunctionType(dart.void, [core.String]),
      columnRuleWidth: dart.definiteFunctionType(dart.void, [core.String]),
      columnSpan: dart.definiteFunctionType(dart.void, [core.String]),
      columnWidth: dart.definiteFunctionType(dart.void, [core.String]),
      columns: dart.definiteFunctionType(dart.void, [core.String]),
      content: dart.definiteFunctionType(dart.void, [core.String]),
      counterIncrement: dart.definiteFunctionType(dart.void, [core.String]),
      counterReset: dart.definiteFunctionType(dart.void, [core.String]),
      cursor: dart.definiteFunctionType(dart.void, [core.String]),
      direction: dart.definiteFunctionType(dart.void, [core.String]),
      display: dart.definiteFunctionType(dart.void, [core.String]),
      emptyCells: dart.definiteFunctionType(dart.void, [core.String]),
      filter: dart.definiteFunctionType(dart.void, [core.String]),
      flex: dart.definiteFunctionType(dart.void, [core.String]),
      flexBasis: dart.definiteFunctionType(dart.void, [core.String]),
      flexDirection: dart.definiteFunctionType(dart.void, [core.String]),
      flexFlow: dart.definiteFunctionType(dart.void, [core.String]),
      flexGrow: dart.definiteFunctionType(dart.void, [core.String]),
      flexShrink: dart.definiteFunctionType(dart.void, [core.String]),
      flexWrap: dart.definiteFunctionType(dart.void, [core.String]),
      float: dart.definiteFunctionType(dart.void, [core.String]),
      font: dart.definiteFunctionType(dart.void, [core.String]),
      fontFamily: dart.definiteFunctionType(dart.void, [core.String]),
      fontFeatureSettings: dart.definiteFunctionType(dart.void, [core.String]),
      fontKerning: dart.definiteFunctionType(dart.void, [core.String]),
      fontSize: dart.definiteFunctionType(dart.void, [core.String]),
      fontSizeDelta: dart.definiteFunctionType(dart.void, [core.String]),
      fontSmoothing: dart.definiteFunctionType(dart.void, [core.String]),
      fontStretch: dart.definiteFunctionType(dart.void, [core.String]),
      fontStyle: dart.definiteFunctionType(dart.void, [core.String]),
      fontVariant: dart.definiteFunctionType(dart.void, [core.String]),
      fontVariantLigatures: dart.definiteFunctionType(dart.void, [core.String]),
      fontWeight: dart.definiteFunctionType(dart.void, [core.String]),
      grid: dart.definiteFunctionType(dart.void, [core.String]),
      gridArea: dart.definiteFunctionType(dart.void, [core.String]),
      gridAutoColumns: dart.definiteFunctionType(dart.void, [core.String]),
      gridAutoFlow: dart.definiteFunctionType(dart.void, [core.String]),
      gridAutoRows: dart.definiteFunctionType(dart.void, [core.String]),
      gridColumn: dart.definiteFunctionType(dart.void, [core.String]),
      gridColumnEnd: dart.definiteFunctionType(dart.void, [core.String]),
      gridColumnStart: dart.definiteFunctionType(dart.void, [core.String]),
      gridRow: dart.definiteFunctionType(dart.void, [core.String]),
      gridRowEnd: dart.definiteFunctionType(dart.void, [core.String]),
      gridRowStart: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplate: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplateAreas: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplateColumns: dart.definiteFunctionType(dart.void, [core.String]),
      gridTemplateRows: dart.definiteFunctionType(dart.void, [core.String]),
      height: dart.definiteFunctionType(dart.void, [core.String]),
      highlight: dart.definiteFunctionType(dart.void, [core.String]),
      hyphenateCharacter: dart.definiteFunctionType(dart.void, [core.String]),
      imageRendering: dart.definiteFunctionType(dart.void, [core.String]),
      isolation: dart.definiteFunctionType(dart.void, [core.String]),
      justifyContent: dart.definiteFunctionType(dart.void, [core.String]),
      justifySelf: dart.definiteFunctionType(dart.void, [core.String]),
      left: dart.definiteFunctionType(dart.void, [core.String]),
      letterSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      lineBoxContain: dart.definiteFunctionType(dart.void, [core.String]),
      lineBreak: dart.definiteFunctionType(dart.void, [core.String]),
      lineClamp: dart.definiteFunctionType(dart.void, [core.String]),
      lineHeight: dart.definiteFunctionType(dart.void, [core.String]),
      listStyle: dart.definiteFunctionType(dart.void, [core.String]),
      listStyleImage: dart.definiteFunctionType(dart.void, [core.String]),
      listStylePosition: dart.definiteFunctionType(dart.void, [core.String]),
      listStyleType: dart.definiteFunctionType(dart.void, [core.String]),
      locale: dart.definiteFunctionType(dart.void, [core.String]),
      logicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
      logicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
      margin: dart.definiteFunctionType(dart.void, [core.String]),
      marginAfter: dart.definiteFunctionType(dart.void, [core.String]),
      marginAfterCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginBefore: dart.definiteFunctionType(dart.void, [core.String]),
      marginBeforeCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginBottom: dart.definiteFunctionType(dart.void, [core.String]),
      marginBottomCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      marginEnd: dart.definiteFunctionType(dart.void, [core.String]),
      marginLeft: dart.definiteFunctionType(dart.void, [core.String]),
      marginRight: dart.definiteFunctionType(dart.void, [core.String]),
      marginStart: dart.definiteFunctionType(dart.void, [core.String]),
      marginTop: dart.definiteFunctionType(dart.void, [core.String]),
      marginTopCollapse: dart.definiteFunctionType(dart.void, [core.String]),
      mask: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImage: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageSource: dart.definiteFunctionType(dart.void, [core.String]),
      maskBoxImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
      maskClip: dart.definiteFunctionType(dart.void, [core.String]),
      maskComposite: dart.definiteFunctionType(dart.void, [core.String]),
      maskImage: dart.definiteFunctionType(dart.void, [core.String]),
      maskOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      maskPosition: dart.definiteFunctionType(dart.void, [core.String]),
      maskPositionX: dart.definiteFunctionType(dart.void, [core.String]),
      maskPositionY: dart.definiteFunctionType(dart.void, [core.String]),
      maskRepeat: dart.definiteFunctionType(dart.void, [core.String]),
      maskRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
      maskRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
      maskSize: dart.definiteFunctionType(dart.void, [core.String]),
      maskSourceType: dart.definiteFunctionType(dart.void, [core.String]),
      maxHeight: dart.definiteFunctionType(dart.void, [core.String]),
      maxLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
      maxLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
      maxWidth: dart.definiteFunctionType(dart.void, [core.String]),
      maxZoom: dart.definiteFunctionType(dart.void, [core.String]),
      minHeight: dart.definiteFunctionType(dart.void, [core.String]),
      minLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
      minLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
      minWidth: dart.definiteFunctionType(dart.void, [core.String]),
      minZoom: dart.definiteFunctionType(dart.void, [core.String]),
      mixBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
      objectFit: dart.definiteFunctionType(dart.void, [core.String]),
      objectPosition: dart.definiteFunctionType(dart.void, [core.String]),
      opacity: dart.definiteFunctionType(dart.void, [core.String]),
      order: dart.definiteFunctionType(dart.void, [core.String]),
      orientation: dart.definiteFunctionType(dart.void, [core.String]),
      orphans: dart.definiteFunctionType(dart.void, [core.String]),
      outline: dart.definiteFunctionType(dart.void, [core.String]),
      outlineColor: dart.definiteFunctionType(dart.void, [core.String]),
      outlineOffset: dart.definiteFunctionType(dart.void, [core.String]),
      outlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
      outlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
      overflow: dart.definiteFunctionType(dart.void, [core.String]),
      overflowWrap: dart.definiteFunctionType(dart.void, [core.String]),
      overflowX: dart.definiteFunctionType(dart.void, [core.String]),
      overflowY: dart.definiteFunctionType(dart.void, [core.String]),
      padding: dart.definiteFunctionType(dart.void, [core.String]),
      paddingAfter: dart.definiteFunctionType(dart.void, [core.String]),
      paddingBefore: dart.definiteFunctionType(dart.void, [core.String]),
      paddingBottom: dart.definiteFunctionType(dart.void, [core.String]),
      paddingEnd: dart.definiteFunctionType(dart.void, [core.String]),
      paddingLeft: dart.definiteFunctionType(dart.void, [core.String]),
      paddingRight: dart.definiteFunctionType(dart.void, [core.String]),
      paddingStart: dart.definiteFunctionType(dart.void, [core.String]),
      paddingTop: dart.definiteFunctionType(dart.void, [core.String]),
      page: dart.definiteFunctionType(dart.void, [core.String]),
      pageBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
      pageBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
      pageBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
      perspective: dart.definiteFunctionType(dart.void, [core.String]),
      perspectiveOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      perspectiveOriginX: dart.definiteFunctionType(dart.void, [core.String]),
      perspectiveOriginY: dart.definiteFunctionType(dart.void, [core.String]),
      pointerEvents: dart.definiteFunctionType(dart.void, [core.String]),
      position: dart.definiteFunctionType(dart.void, [core.String]),
      printColorAdjust: dart.definiteFunctionType(dart.void, [core.String]),
      quotes: dart.definiteFunctionType(dart.void, [core.String]),
      resize: dart.definiteFunctionType(dart.void, [core.String]),
      right: dart.definiteFunctionType(dart.void, [core.String]),
      rtlOrdering: dart.definiteFunctionType(dart.void, [core.String]),
      rubyPosition: dart.definiteFunctionType(dart.void, [core.String]),
      scrollBehavior: dart.definiteFunctionType(dart.void, [core.String]),
      shapeImageThreshold: dart.definiteFunctionType(dart.void, [core.String]),
      shapeMargin: dart.definiteFunctionType(dart.void, [core.String]),
      shapeOutside: dart.definiteFunctionType(dart.void, [core.String]),
      size: dart.definiteFunctionType(dart.void, [core.String]),
      speak: dart.definiteFunctionType(dart.void, [core.String]),
      src: dart.definiteFunctionType(dart.void, [core.String]),
      tabSize: dart.definiteFunctionType(dart.void, [core.String]),
      tableLayout: dart.definiteFunctionType(dart.void, [core.String]),
      tapHighlightColor: dart.definiteFunctionType(dart.void, [core.String]),
      textAlign: dart.definiteFunctionType(dart.void, [core.String]),
      textAlignLast: dart.definiteFunctionType(dart.void, [core.String]),
      textCombine: dart.definiteFunctionType(dart.void, [core.String]),
      textDecoration: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationColor: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationLine: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textDecorationsInEffect: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasis: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasisColor: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasisPosition: dart.definiteFunctionType(dart.void, [core.String]),
      textEmphasisStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textFillColor: dart.definiteFunctionType(dart.void, [core.String]),
      textIndent: dart.definiteFunctionType(dart.void, [core.String]),
      textJustify: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughColor: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughMode: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textLineThroughWidth: dart.definiteFunctionType(dart.void, [core.String]),
      textOrientation: dart.definiteFunctionType(dart.void, [core.String]),
      textOverflow: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineColor: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineMode: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textOverlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
      textRendering: dart.definiteFunctionType(dart.void, [core.String]),
      textSecurity: dart.definiteFunctionType(dart.void, [core.String]),
      textShadow: dart.definiteFunctionType(dart.void, [core.String]),
      textStroke: dart.definiteFunctionType(dart.void, [core.String]),
      textStrokeColor: dart.definiteFunctionType(dart.void, [core.String]),
      textStrokeWidth: dart.definiteFunctionType(dart.void, [core.String]),
      textTransform: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineColor: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineMode: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlinePosition: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
      textUnderlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
      top: dart.definiteFunctionType(dart.void, [core.String]),
      touchAction: dart.definiteFunctionType(dart.void, [core.String]),
      touchActionDelay: dart.definiteFunctionType(dart.void, [core.String]),
      transform: dart.definiteFunctionType(dart.void, [core.String]),
      transformOrigin: dart.definiteFunctionType(dart.void, [core.String]),
      transformOriginX: dart.definiteFunctionType(dart.void, [core.String]),
      transformOriginY: dart.definiteFunctionType(dart.void, [core.String]),
      transformOriginZ: dart.definiteFunctionType(dart.void, [core.String]),
      transformStyle: dart.definiteFunctionType(dart.void, [core.String]),
      transition: dart.definiteFunctionType(dart.void, [core.String]),
      transitionDelay: dart.definiteFunctionType(dart.void, [core.String]),
      transitionDuration: dart.definiteFunctionType(dart.void, [core.String]),
      transitionProperty: dart.definiteFunctionType(dart.void, [core.String]),
      transitionTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
      unicodeBidi: dart.definiteFunctionType(dart.void, [core.String]),
      unicodeRange: dart.definiteFunctionType(dart.void, [core.String]),
      userDrag: dart.definiteFunctionType(dart.void, [core.String]),
      userModify: dart.definiteFunctionType(dart.void, [core.String]),
      userSelect: dart.definiteFunctionType(dart.void, [core.String]),
      userZoom: dart.definiteFunctionType(dart.void, [core.String]),
      verticalAlign: dart.definiteFunctionType(dart.void, [core.String]),
      visibility: dart.definiteFunctionType(dart.void, [core.String]),
      whiteSpace: dart.definiteFunctionType(dart.void, [core.String]),
      widows: dart.definiteFunctionType(dart.void, [core.String]),
      width: dart.definiteFunctionType(dart.void, [core.String]),
      willChange: dart.definiteFunctionType(dart.void, [core.String]),
      wordBreak: dart.definiteFunctionType(dart.void, [core.String]),
      wordSpacing: dart.definiteFunctionType(dart.void, [core.String]),
      wordWrap: dart.definiteFunctionType(dart.void, [core.String]),
      wrapFlow: dart.definiteFunctionType(dart.void, [core.String]),
      wrapThrough: dart.definiteFunctionType(dart.void, [core.String]),
      writingMode: dart.definiteFunctionType(dart.void, [core.String]),
      zIndex: dart.definiteFunctionType(dart.void, [core.String]),
      zoom: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.defineExtensionMembers(html$.CssStyleDeclarationBase, [
    'alignContent',
    'alignContent',
    'alignItems',
    'alignItems',
    'alignSelf',
    'alignSelf',
    'animation',
    'animation',
    'animationDelay',
    'animationDelay',
    'animationDirection',
    'animationDirection',
    'animationDuration',
    'animationDuration',
    'animationFillMode',
    'animationFillMode',
    'animationIterationCount',
    'animationIterationCount',
    'animationName',
    'animationName',
    'animationPlayState',
    'animationPlayState',
    'animationTimingFunction',
    'animationTimingFunction',
    'appRegion',
    'appRegion',
    'appearance',
    'appearance',
    'aspectRatio',
    'aspectRatio',
    'backfaceVisibility',
    'backfaceVisibility',
    'background',
    'background',
    'backgroundAttachment',
    'backgroundAttachment',
    'backgroundBlendMode',
    'backgroundBlendMode',
    'backgroundClip',
    'backgroundClip',
    'backgroundColor',
    'backgroundColor',
    'backgroundComposite',
    'backgroundComposite',
    'backgroundImage',
    'backgroundImage',
    'backgroundOrigin',
    'backgroundOrigin',
    'backgroundPosition',
    'backgroundPosition',
    'backgroundPositionX',
    'backgroundPositionX',
    'backgroundPositionY',
    'backgroundPositionY',
    'backgroundRepeat',
    'backgroundRepeat',
    'backgroundRepeatX',
    'backgroundRepeatX',
    'backgroundRepeatY',
    'backgroundRepeatY',
    'backgroundSize',
    'backgroundSize',
    'border',
    'border',
    'borderAfter',
    'borderAfter',
    'borderAfterColor',
    'borderAfterColor',
    'borderAfterStyle',
    'borderAfterStyle',
    'borderAfterWidth',
    'borderAfterWidth',
    'borderBefore',
    'borderBefore',
    'borderBeforeColor',
    'borderBeforeColor',
    'borderBeforeStyle',
    'borderBeforeStyle',
    'borderBeforeWidth',
    'borderBeforeWidth',
    'borderBottom',
    'borderBottom',
    'borderBottomColor',
    'borderBottomColor',
    'borderBottomLeftRadius',
    'borderBottomLeftRadius',
    'borderBottomRightRadius',
    'borderBottomRightRadius',
    'borderBottomStyle',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderBottomWidth',
    'borderCollapse',
    'borderCollapse',
    'borderColor',
    'borderColor',
    'borderEnd',
    'borderEnd',
    'borderEndColor',
    'borderEndColor',
    'borderEndStyle',
    'borderEndStyle',
    'borderEndWidth',
    'borderEndWidth',
    'borderFit',
    'borderFit',
    'borderHorizontalSpacing',
    'borderHorizontalSpacing',
    'borderImage',
    'borderImage',
    'borderImageOutset',
    'borderImageOutset',
    'borderImageRepeat',
    'borderImageRepeat',
    'borderImageSlice',
    'borderImageSlice',
    'borderImageSource',
    'borderImageSource',
    'borderImageWidth',
    'borderImageWidth',
    'borderLeft',
    'borderLeft',
    'borderLeftColor',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderLeftWidth',
    'borderRadius',
    'borderRadius',
    'borderRight',
    'borderRight',
    'borderRightColor',
    'borderRightColor',
    'borderRightStyle',
    'borderRightStyle',
    'borderRightWidth',
    'borderRightWidth',
    'borderSpacing',
    'borderSpacing',
    'borderStart',
    'borderStart',
    'borderStartColor',
    'borderStartColor',
    'borderStartStyle',
    'borderStartStyle',
    'borderStartWidth',
    'borderStartWidth',
    'borderStyle',
    'borderStyle',
    'borderTop',
    'borderTop',
    'borderTopColor',
    'borderTopColor',
    'borderTopLeftRadius',
    'borderTopLeftRadius',
    'borderTopRightRadius',
    'borderTopRightRadius',
    'borderTopStyle',
    'borderTopStyle',
    'borderTopWidth',
    'borderTopWidth',
    'borderVerticalSpacing',
    'borderVerticalSpacing',
    'borderWidth',
    'borderWidth',
    'bottom',
    'bottom',
    'boxAlign',
    'boxAlign',
    'boxDecorationBreak',
    'boxDecorationBreak',
    'boxDirection',
    'boxDirection',
    'boxFlex',
    'boxFlex',
    'boxFlexGroup',
    'boxFlexGroup',
    'boxLines',
    'boxLines',
    'boxOrdinalGroup',
    'boxOrdinalGroup',
    'boxOrient',
    'boxOrient',
    'boxPack',
    'boxPack',
    'boxReflect',
    'boxReflect',
    'boxShadow',
    'boxShadow',
    'boxSizing',
    'boxSizing',
    'captionSide',
    'captionSide',
    'clear',
    'clear',
    'clip',
    'clip',
    'clipPath',
    'clipPath',
    'color',
    'color',
    'columnBreakAfter',
    'columnBreakAfter',
    'columnBreakBefore',
    'columnBreakBefore',
    'columnBreakInside',
    'columnBreakInside',
    'columnCount',
    'columnCount',
    'columnFill',
    'columnFill',
    'columnGap',
    'columnGap',
    'columnRule',
    'columnRule',
    'columnRuleColor',
    'columnRuleColor',
    'columnRuleStyle',
    'columnRuleStyle',
    'columnRuleWidth',
    'columnRuleWidth',
    'columnSpan',
    'columnSpan',
    'columnWidth',
    'columnWidth',
    'columns',
    'columns',
    'content',
    'content',
    'counterIncrement',
    'counterIncrement',
    'counterReset',
    'counterReset',
    'cursor',
    'cursor',
    'direction',
    'direction',
    'display',
    'display',
    'emptyCells',
    'emptyCells',
    'filter',
    'filter',
    'flex',
    'flex',
    'flexBasis',
    'flexBasis',
    'flexDirection',
    'flexDirection',
    'flexFlow',
    'flexFlow',
    'flexGrow',
    'flexGrow',
    'flexShrink',
    'flexShrink',
    'flexWrap',
    'flexWrap',
    'float',
    'float',
    'font',
    'font',
    'fontFamily',
    'fontFamily',
    'fontFeatureSettings',
    'fontFeatureSettings',
    'fontKerning',
    'fontKerning',
    'fontSize',
    'fontSize',
    'fontSizeDelta',
    'fontSizeDelta',
    'fontSmoothing',
    'fontSmoothing',
    'fontStretch',
    'fontStretch',
    'fontStyle',
    'fontStyle',
    'fontVariant',
    'fontVariant',
    'fontVariantLigatures',
    'fontVariantLigatures',
    'fontWeight',
    'fontWeight',
    'grid',
    'grid',
    'gridArea',
    'gridArea',
    'gridAutoColumns',
    'gridAutoColumns',
    'gridAutoFlow',
    'gridAutoFlow',
    'gridAutoRows',
    'gridAutoRows',
    'gridColumn',
    'gridColumn',
    'gridColumnEnd',
    'gridColumnEnd',
    'gridColumnStart',
    'gridColumnStart',
    'gridRow',
    'gridRow',
    'gridRowEnd',
    'gridRowEnd',
    'gridRowStart',
    'gridRowStart',
    'gridTemplate',
    'gridTemplate',
    'gridTemplateAreas',
    'gridTemplateAreas',
    'gridTemplateColumns',
    'gridTemplateColumns',
    'gridTemplateRows',
    'gridTemplateRows',
    'height',
    'height',
    'highlight',
    'highlight',
    'hyphenateCharacter',
    'hyphenateCharacter',
    'imageRendering',
    'imageRendering',
    'isolation',
    'isolation',
    'justifyContent',
    'justifyContent',
    'justifySelf',
    'justifySelf',
    'left',
    'left',
    'letterSpacing',
    'letterSpacing',
    'lineBoxContain',
    'lineBoxContain',
    'lineBreak',
    'lineBreak',
    'lineClamp',
    'lineClamp',
    'lineHeight',
    'lineHeight',
    'listStyle',
    'listStyle',
    'listStyleImage',
    'listStyleImage',
    'listStylePosition',
    'listStylePosition',
    'listStyleType',
    'listStyleType',
    'locale',
    'locale',
    'logicalHeight',
    'logicalHeight',
    'logicalWidth',
    'logicalWidth',
    'margin',
    'margin',
    'marginAfter',
    'marginAfter',
    'marginAfterCollapse',
    'marginAfterCollapse',
    'marginBefore',
    'marginBefore',
    'marginBeforeCollapse',
    'marginBeforeCollapse',
    'marginBottom',
    'marginBottom',
    'marginBottomCollapse',
    'marginBottomCollapse',
    'marginCollapse',
    'marginCollapse',
    'marginEnd',
    'marginEnd',
    'marginLeft',
    'marginLeft',
    'marginRight',
    'marginRight',
    'marginStart',
    'marginStart',
    'marginTop',
    'marginTop',
    'marginTopCollapse',
    'marginTopCollapse',
    'mask',
    'mask',
    'maskBoxImage',
    'maskBoxImage',
    'maskBoxImageOutset',
    'maskBoxImageOutset',
    'maskBoxImageRepeat',
    'maskBoxImageRepeat',
    'maskBoxImageSlice',
    'maskBoxImageSlice',
    'maskBoxImageSource',
    'maskBoxImageSource',
    'maskBoxImageWidth',
    'maskBoxImageWidth',
    'maskClip',
    'maskClip',
    'maskComposite',
    'maskComposite',
    'maskImage',
    'maskImage',
    'maskOrigin',
    'maskOrigin',
    'maskPosition',
    'maskPosition',
    'maskPositionX',
    'maskPositionX',
    'maskPositionY',
    'maskPositionY',
    'maskRepeat',
    'maskRepeat',
    'maskRepeatX',
    'maskRepeatX',
    'maskRepeatY',
    'maskRepeatY',
    'maskSize',
    'maskSize',
    'maskSourceType',
    'maskSourceType',
    'maxHeight',
    'maxHeight',
    'maxLogicalHeight',
    'maxLogicalHeight',
    'maxLogicalWidth',
    'maxLogicalWidth',
    'maxWidth',
    'maxWidth',
    'maxZoom',
    'maxZoom',
    'minHeight',
    'minHeight',
    'minLogicalHeight',
    'minLogicalHeight',
    'minLogicalWidth',
    'minLogicalWidth',
    'minWidth',
    'minWidth',
    'minZoom',
    'minZoom',
    'mixBlendMode',
    'mixBlendMode',
    'objectFit',
    'objectFit',
    'objectPosition',
    'objectPosition',
    'opacity',
    'opacity',
    'order',
    'order',
    'orientation',
    'orientation',
    'orphans',
    'orphans',
    'outline',
    'outline',
    'outlineColor',
    'outlineColor',
    'outlineOffset',
    'outlineOffset',
    'outlineStyle',
    'outlineStyle',
    'outlineWidth',
    'outlineWidth',
    'overflow',
    'overflow',
    'overflowWrap',
    'overflowWrap',
    'overflowX',
    'overflowX',
    'overflowY',
    'overflowY',
    'padding',
    'padding',
    'paddingAfter',
    'paddingAfter',
    'paddingBefore',
    'paddingBefore',
    'paddingBottom',
    'paddingBottom',
    'paddingEnd',
    'paddingEnd',
    'paddingLeft',
    'paddingLeft',
    'paddingRight',
    'paddingRight',
    'paddingStart',
    'paddingStart',
    'paddingTop',
    'paddingTop',
    'page',
    'page',
    'pageBreakAfter',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakBefore',
    'pageBreakInside',
    'pageBreakInside',
    'perspective',
    'perspective',
    'perspectiveOrigin',
    'perspectiveOrigin',
    'perspectiveOriginX',
    'perspectiveOriginX',
    'perspectiveOriginY',
    'perspectiveOriginY',
    'pointerEvents',
    'pointerEvents',
    'position',
    'position',
    'printColorAdjust',
    'printColorAdjust',
    'quotes',
    'quotes',
    'resize',
    'resize',
    'right',
    'right',
    'rtlOrdering',
    'rtlOrdering',
    'rubyPosition',
    'rubyPosition',
    'scrollBehavior',
    'scrollBehavior',
    'shapeImageThreshold',
    'shapeImageThreshold',
    'shapeMargin',
    'shapeMargin',
    'shapeOutside',
    'shapeOutside',
    'size',
    'size',
    'speak',
    'speak',
    'src',
    'src',
    'tabSize',
    'tabSize',
    'tableLayout',
    'tableLayout',
    'tapHighlightColor',
    'tapHighlightColor',
    'textAlign',
    'textAlign',
    'textAlignLast',
    'textAlignLast',
    'textCombine',
    'textCombine',
    'textDecoration',
    'textDecoration',
    'textDecorationColor',
    'textDecorationColor',
    'textDecorationLine',
    'textDecorationLine',
    'textDecorationStyle',
    'textDecorationStyle',
    'textDecorationsInEffect',
    'textDecorationsInEffect',
    'textEmphasis',
    'textEmphasis',
    'textEmphasisColor',
    'textEmphasisColor',
    'textEmphasisPosition',
    'textEmphasisPosition',
    'textEmphasisStyle',
    'textEmphasisStyle',
    'textFillColor',
    'textFillColor',
    'textIndent',
    'textIndent',
    'textJustify',
    'textJustify',
    'textLineThroughColor',
    'textLineThroughColor',
    'textLineThroughMode',
    'textLineThroughMode',
    'textLineThroughStyle',
    'textLineThroughStyle',
    'textLineThroughWidth',
    'textLineThroughWidth',
    'textOrientation',
    'textOrientation',
    'textOverflow',
    'textOverflow',
    'textOverlineColor',
    'textOverlineColor',
    'textOverlineMode',
    'textOverlineMode',
    'textOverlineStyle',
    'textOverlineStyle',
    'textOverlineWidth',
    'textOverlineWidth',
    'textRendering',
    'textRendering',
    'textSecurity',
    'textSecurity',
    'textShadow',
    'textShadow',
    'textStroke',
    'textStroke',
    'textStrokeColor',
    'textStrokeColor',
    'textStrokeWidth',
    'textStrokeWidth',
    'textTransform',
    'textTransform',
    'textUnderlineColor',
    'textUnderlineColor',
    'textUnderlineMode',
    'textUnderlineMode',
    'textUnderlinePosition',
    'textUnderlinePosition',
    'textUnderlineStyle',
    'textUnderlineStyle',
    'textUnderlineWidth',
    'textUnderlineWidth',
    'top',
    'top',
    'touchAction',
    'touchAction',
    'touchActionDelay',
    'touchActionDelay',
    'transform',
    'transform',
    'transformOrigin',
    'transformOrigin',
    'transformOriginX',
    'transformOriginX',
    'transformOriginY',
    'transformOriginY',
    'transformOriginZ',
    'transformOriginZ',
    'transformStyle',
    'transformStyle',
    'transition',
    'transition',
    'transitionDelay',
    'transitionDelay',
    'transitionDuration',
    'transitionDuration',
    'transitionProperty',
    'transitionProperty',
    'transitionTimingFunction',
    'transitionTimingFunction',
    'unicodeBidi',
    'unicodeBidi',
    'unicodeRange',
    'unicodeRange',
    'userDrag',
    'userDrag',
    'userModify',
    'userModify',
    'userSelect',
    'userSelect',
    'userZoom',
    'userZoom',
    'verticalAlign',
    'verticalAlign',
    'visibility',
    'visibility',
    'whiteSpace',
    'whiteSpace',
    'widows',
    'widows',
    'width',
    'width',
    'willChange',
    'willChange',
    'wordBreak',
    'wordBreak',
    'wordSpacing',
    'wordSpacing',
    'wordWrap',
    'wordWrap',
    'wrapFlow',
    'wrapFlow',
    'wrapThrough',
    'wrapThrough',
    'writingMode',
    'writingMode',
    'zIndex',
    'zIndex',
    'zoom',
    'zoom'
  ]);
  dart.defineExtensionNames([
    'getPropertyValue',
    'supportsProperty',
    'setProperty',
    'getPropertyPriority',
    'item',
    'removeProperty',
    'background',
    'background',
    'backgroundAttachment',
    'backgroundAttachment',
    'backgroundColor',
    'backgroundColor',
    'backgroundImage',
    'backgroundImage',
    'backgroundPosition',
    'backgroundPosition',
    'backgroundRepeat',
    'backgroundRepeat',
    'border',
    'border',
    'borderBottom',
    'borderBottom',
    'borderBottomColor',
    'borderBottomColor',
    'borderBottomStyle',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderBottomWidth',
    'borderCollapse',
    'borderCollapse',
    'borderColor',
    'borderColor',
    'borderLeft',
    'borderLeft',
    'borderLeftColor',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderLeftWidth',
    'borderRight',
    'borderRight',
    'borderRightColor',
    'borderRightColor',
    'borderRightStyle',
    'borderRightStyle',
    'borderRightWidth',
    'borderRightWidth',
    'borderSpacing',
    'borderSpacing',
    'borderStyle',
    'borderStyle',
    'borderTop',
    'borderTop',
    'borderTopColor',
    'borderTopColor',
    'borderTopStyle',
    'borderTopStyle',
    'borderTopWidth',
    'borderTopWidth',
    'borderWidth',
    'borderWidth',
    'bottom',
    'bottom',
    'captionSide',
    'captionSide',
    'clear',
    'clear',
    'clip',
    'clip',
    'color',
    'color',
    'content',
    'content',
    'cursor',
    'cursor',
    'direction',
    'direction',
    'display',
    'display',
    'emptyCells',
    'emptyCells',
    'font',
    'font',
    'fontFamily',
    'fontFamily',
    'fontSize',
    'fontSize',
    'fontStyle',
    'fontStyle',
    'fontVariant',
    'fontVariant',
    'fontWeight',
    'fontWeight',
    'height',
    'height',
    'left',
    'left',
    'letterSpacing',
    'letterSpacing',
    'lineHeight',
    'lineHeight',
    'listStyle',
    'listStyle',
    'listStyleImage',
    'listStyleImage',
    'listStylePosition',
    'listStylePosition',
    'listStyleType',
    'listStyleType',
    'margin',
    'margin',
    'marginBottom',
    'marginBottom',
    'marginLeft',
    'marginLeft',
    'marginRight',
    'marginRight',
    'marginTop',
    'marginTop',
    'maxHeight',
    'maxHeight',
    'maxWidth',
    'maxWidth',
    'minHeight',
    'minHeight',
    'minWidth',
    'minWidth',
    'outline',
    'outline',
    'outlineColor',
    'outlineColor',
    'outlineStyle',
    'outlineStyle',
    'outlineWidth',
    'outlineWidth',
    'overflow',
    'overflow',
    'padding',
    'padding',
    'paddingBottom',
    'paddingBottom',
    'paddingLeft',
    'paddingLeft',
    'paddingRight',
    'paddingRight',
    'paddingTop',
    'paddingTop',
    'pageBreakAfter',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakBefore',
    'pageBreakInside',
    'pageBreakInside',
    'position',
    'position',
    'quotes',
    'quotes',
    'right',
    'right',
    'tableLayout',
    'tableLayout',
    'textAlign',
    'textAlign',
    'textDecoration',
    'textDecoration',
    'textIndent',
    'textIndent',
    'textTransform',
    'textTransform',
    'top',
    'top',
    'unicodeBidi',
    'unicodeBidi',
    'verticalAlign',
    'verticalAlign',
    'visibility',
    'visibility',
    'whiteSpace',
    'whiteSpace',
    'width',
    'width',
    'wordSpacing',
    'wordSpacing',
    'zIndex',
    'zIndex',
    'cssText',
    'length',
    'parentRule'
  ]);
  html$.CssStyleDeclaration = class CssStyleDeclaration extends dart.mixin(_interceptors.Interceptor, html$.CssStyleDeclarationBase) {
    static new() {
      return html$.CssStyleDeclaration.css('');
    }
    static css(css) {
      let style = html$.Element.tag('div')[dartx.style];
      style[dartx.cssText] = css;
      return style;
    }
    [dartx.getPropertyValue](propertyName) {
      let propValue = this[_getPropertyValueHelper](propertyName);
      return propValue != null ? propValue : '';
    }
    [_getPropertyValueHelper](propertyName) {
      if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
        return this[_getPropertyValue](propertyName);
      } else {
        return this[_getPropertyValue](dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName));
      }
    }
    [dartx.supportsProperty](propertyName) {
      return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName))));
    }
    [_supportsProperty](propertyName) {
      return propertyName in this;
    }
    [dartx.setProperty](propertyName, value, priority) {
      if (priority === void 0) priority = null;
      return this[_setPropertyHelper](this[_browserPropertyName](propertyName), value, priority);
    }
    [_browserPropertyName](propertyName) {
      let name = html$.CssStyleDeclaration._readCache(propertyName);
      if (typeof name == 'string') return name;
      if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
        name = propertyName;
      } else {
        name = dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName);
      }
      html$.CssStyleDeclaration._writeCache(propertyName, name);
      return name;
    }
    static _readCache(key) {
      return html$.CssStyleDeclaration._propertyCache[key];
    }
    static _writeCache(key, value) {
      html$.CssStyleDeclaration._propertyCache[key] = value;
    }
    static _camelCase(hyphenated) {
      let replacedMs = hyphenated.replace(/^-ms-/, "ms-");
      return replacedMs.replace(/-([\da-z])/ig, (_, letter) => letter.toUpperCase());
    }
    [_setPropertyHelper](propertyName, value, priority) {
      if (priority === void 0) priority = null;
      if (value == null) value = '';
      if (priority == null) priority = '';
      this.setProperty(propertyName, value, priority);
    }
    static get supportsTransitions() {
      return html$.document[dartx.body][dartx.style][dartx.supportsProperty]('transition');
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssText]() {
      return this.cssText;
    }
    set [dartx.cssText](value) {
      this.cssText = value;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.parentRule]() {
      return this.parentRule;
    }
    [dartx.getPropertyPriority](...args) {
      return this.getPropertyPriority.apply(this, args);
    }
    [_getPropertyValue](...args) {
      return this.getPropertyValue.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.removeProperty](...args) {
      return this.removeProperty.apply(this, args);
    }
    get [dartx.background]() {
      return this[_background];
    }
    set [dartx.background](value) {
      this[_background] = value == null ? '' : value;
    }
    get [_background]() {
      return this.background;
    }
    set [_background](value) {
      this.background = value;
    }
    get [dartx.backgroundAttachment]() {
      return this[_backgroundAttachment];
    }
    set [dartx.backgroundAttachment](value) {
      this[_backgroundAttachment] = value == null ? '' : value;
    }
    get [_backgroundAttachment]() {
      return this.backgroundAttachment;
    }
    set [_backgroundAttachment](value) {
      this.backgroundAttachment = value;
    }
    get [dartx.backgroundColor]() {
      return this[_backgroundColor];
    }
    set [dartx.backgroundColor](value) {
      this[_backgroundColor] = value == null ? '' : value;
    }
    get [_backgroundColor]() {
      return this.backgroundColor;
    }
    set [_backgroundColor](value) {
      this.backgroundColor = value;
    }
    get [dartx.backgroundImage]() {
      return this[_backgroundImage];
    }
    set [dartx.backgroundImage](value) {
      this[_backgroundImage] = value == null ? '' : value;
    }
    get [_backgroundImage]() {
      return this.backgroundImage;
    }
    set [_backgroundImage](value) {
      this.backgroundImage = value;
    }
    get [dartx.backgroundPosition]() {
      return this[_backgroundPosition];
    }
    set [dartx.backgroundPosition](value) {
      this[_backgroundPosition] = value == null ? '' : value;
    }
    get [_backgroundPosition]() {
      return this.backgroundPosition;
    }
    set [_backgroundPosition](value) {
      this.backgroundPosition = value;
    }
    get [dartx.backgroundRepeat]() {
      return this[_backgroundRepeat];
    }
    set [dartx.backgroundRepeat](value) {
      this[_backgroundRepeat] = value == null ? '' : value;
    }
    get [_backgroundRepeat]() {
      return this.backgroundRepeat;
    }
    set [_backgroundRepeat](value) {
      this.backgroundRepeat = value;
    }
    get [dartx.border]() {
      return this[_border];
    }
    set [dartx.border](value) {
      this[_border] = value == null ? '' : value;
    }
    get [_border]() {
      return this.border;
    }
    set [_border](value) {
      this.border = value;
    }
    get [dartx.borderBottom]() {
      return this[_borderBottom];
    }
    set [dartx.borderBottom](value) {
      this[_borderBottom] = value == null ? '' : value;
    }
    get [_borderBottom]() {
      return this.borderBottom;
    }
    set [_borderBottom](value) {
      this.borderBottom = value;
    }
    get [dartx.borderBottomColor]() {
      return this[_borderBottomColor];
    }
    set [dartx.borderBottomColor](value) {
      this[_borderBottomColor] = value == null ? '' : value;
    }
    get [_borderBottomColor]() {
      return this.borderBottomColor;
    }
    set [_borderBottomColor](value) {
      this.borderBottomColor = value;
    }
    get [dartx.borderBottomStyle]() {
      return this[_borderBottomStyle];
    }
    set [dartx.borderBottomStyle](value) {
      this[_borderBottomStyle] = value == null ? '' : value;
    }
    get [_borderBottomStyle]() {
      return this.borderBottomStyle;
    }
    set [_borderBottomStyle](value) {
      this.borderBottomStyle = value;
    }
    get [dartx.borderBottomWidth]() {
      return this[_borderBottomWidth];
    }
    set [dartx.borderBottomWidth](value) {
      this[_borderBottomWidth] = value == null ? '' : value;
    }
    get [_borderBottomWidth]() {
      return this.borderBottomWidth;
    }
    set [_borderBottomWidth](value) {
      this.borderBottomWidth = value;
    }
    get [dartx.borderCollapse]() {
      return this[_borderCollapse];
    }
    set [dartx.borderCollapse](value) {
      this[_borderCollapse] = value == null ? '' : value;
    }
    get [_borderCollapse]() {
      return this.borderCollapse;
    }
    set [_borderCollapse](value) {
      this.borderCollapse = value;
    }
    get [dartx.borderColor]() {
      return this[_borderColor];
    }
    set [dartx.borderColor](value) {
      this[_borderColor] = value == null ? '' : value;
    }
    get [_borderColor]() {
      return this.borderColor;
    }
    set [_borderColor](value) {
      this.borderColor = value;
    }
    get [dartx.borderLeft]() {
      return this[_borderLeft];
    }
    set [dartx.borderLeft](value) {
      this[_borderLeft] = value == null ? '' : value;
    }
    get [_borderLeft]() {
      return this.borderLeft;
    }
    set [_borderLeft](value) {
      this.borderLeft = value;
    }
    get [dartx.borderLeftColor]() {
      return this[_borderLeftColor];
    }
    set [dartx.borderLeftColor](value) {
      this[_borderLeftColor] = value == null ? '' : value;
    }
    get [_borderLeftColor]() {
      return this.borderLeftColor;
    }
    set [_borderLeftColor](value) {
      this.borderLeftColor = value;
    }
    get [dartx.borderLeftStyle]() {
      return this[_borderLeftStyle];
    }
    set [dartx.borderLeftStyle](value) {
      this[_borderLeftStyle] = value == null ? '' : value;
    }
    get [_borderLeftStyle]() {
      return this.borderLeftStyle;
    }
    set [_borderLeftStyle](value) {
      this.borderLeftStyle = value;
    }
    get [dartx.borderLeftWidth]() {
      return this[_borderLeftWidth];
    }
    set [dartx.borderLeftWidth](value) {
      this[_borderLeftWidth] = value == null ? '' : value;
    }
    get [_borderLeftWidth]() {
      return this.borderLeftWidth;
    }
    set [_borderLeftWidth](value) {
      this.borderLeftWidth = value;
    }
    get [dartx.borderRight]() {
      return this[_borderRight];
    }
    set [dartx.borderRight](value) {
      this[_borderRight] = value == null ? '' : value;
    }
    get [_borderRight]() {
      return this.borderRight;
    }
    set [_borderRight](value) {
      this.borderRight = value;
    }
    get [dartx.borderRightColor]() {
      return this[_borderRightColor];
    }
    set [dartx.borderRightColor](value) {
      this[_borderRightColor] = value == null ? '' : value;
    }
    get [_borderRightColor]() {
      return this.borderRightColor;
    }
    set [_borderRightColor](value) {
      this.borderRightColor = value;
    }
    get [dartx.borderRightStyle]() {
      return this[_borderRightStyle];
    }
    set [dartx.borderRightStyle](value) {
      this[_borderRightStyle] = value == null ? '' : value;
    }
    get [_borderRightStyle]() {
      return this.borderRightStyle;
    }
    set [_borderRightStyle](value) {
      this.borderRightStyle = value;
    }
    get [dartx.borderRightWidth]() {
      return this[_borderRightWidth];
    }
    set [dartx.borderRightWidth](value) {
      this[_borderRightWidth] = value == null ? '' : value;
    }
    get [_borderRightWidth]() {
      return this.borderRightWidth;
    }
    set [_borderRightWidth](value) {
      this.borderRightWidth = value;
    }
    get [dartx.borderSpacing]() {
      return this[_borderSpacing];
    }
    set [dartx.borderSpacing](value) {
      this[_borderSpacing] = value == null ? '' : value;
    }
    get [_borderSpacing]() {
      return this.borderSpacing;
    }
    set [_borderSpacing](value) {
      this.borderSpacing = value;
    }
    get [dartx.borderStyle]() {
      return this[_borderStyle];
    }
    set [dartx.borderStyle](value) {
      this[_borderStyle] = value == null ? '' : value;
    }
    get [_borderStyle]() {
      return this.borderStyle;
    }
    set [_borderStyle](value) {
      this.borderStyle = value;
    }
    get [dartx.borderTop]() {
      return this[_borderTop];
    }
    set [dartx.borderTop](value) {
      this[_borderTop] = value == null ? '' : value;
    }
    get [_borderTop]() {
      return this.borderTop;
    }
    set [_borderTop](value) {
      this.borderTop = value;
    }
    get [dartx.borderTopColor]() {
      return this[_borderTopColor];
    }
    set [dartx.borderTopColor](value) {
      this[_borderTopColor] = value == null ? '' : value;
    }
    get [_borderTopColor]() {
      return this.borderTopColor;
    }
    set [_borderTopColor](value) {
      this.borderTopColor = value;
    }
    get [dartx.borderTopStyle]() {
      return this[_borderTopStyle];
    }
    set [dartx.borderTopStyle](value) {
      this[_borderTopStyle] = value == null ? '' : value;
    }
    get [_borderTopStyle]() {
      return this.borderTopStyle;
    }
    set [_borderTopStyle](value) {
      this.borderTopStyle = value;
    }
    get [dartx.borderTopWidth]() {
      return this[_borderTopWidth];
    }
    set [dartx.borderTopWidth](value) {
      this[_borderTopWidth] = value == null ? '' : value;
    }
    get [_borderTopWidth]() {
      return this.borderTopWidth;
    }
    set [_borderTopWidth](value) {
      this.borderTopWidth = value;
    }
    get [dartx.borderWidth]() {
      return this[_borderWidth];
    }
    set [dartx.borderWidth](value) {
      this[_borderWidth] = value == null ? '' : value;
    }
    get [_borderWidth]() {
      return this.borderWidth;
    }
    set [_borderWidth](value) {
      this.borderWidth = value;
    }
    get [dartx.bottom]() {
      return this[_bottom];
    }
    set [dartx.bottom](value) {
      this[_bottom] = value == null ? '' : value;
    }
    get [_bottom]() {
      return this.bottom;
    }
    set [_bottom](value) {
      this.bottom = value;
    }
    get [dartx.captionSide]() {
      return this[_captionSide];
    }
    set [dartx.captionSide](value) {
      this[_captionSide] = value == null ? '' : value;
    }
    get [_captionSide]() {
      return this.captionSide;
    }
    set [_captionSide](value) {
      this.captionSide = value;
    }
    get [dartx.clear]() {
      return this[_clear$1];
    }
    set [dartx.clear](value) {
      this[_clear$1] = value == null ? '' : value;
    }
    get [_clear$1]() {
      return this.clear;
    }
    set [_clear$1](value) {
      this.clear = value;
    }
    get [dartx.clip]() {
      return this[_clip];
    }
    set [dartx.clip](value) {
      this[_clip] = value == null ? '' : value;
    }
    get [_clip]() {
      return this.clip;
    }
    set [_clip](value) {
      this.clip = value;
    }
    get [dartx.color]() {
      return this[_color];
    }
    set [dartx.color](value) {
      this[_color] = value == null ? '' : value;
    }
    get [_color]() {
      return this.color;
    }
    set [_color](value) {
      this.color = value;
    }
    get [dartx.content]() {
      return this[_content];
    }
    set [dartx.content](value) {
      this[_content] = value == null ? '' : value;
    }
    get [_content]() {
      return this.content;
    }
    set [_content](value) {
      this.content = value;
    }
    get [dartx.cursor]() {
      return this[_cursor];
    }
    set [dartx.cursor](value) {
      this[_cursor] = value == null ? '' : value;
    }
    get [_cursor]() {
      return this.cursor;
    }
    set [_cursor](value) {
      this.cursor = value;
    }
    get [dartx.direction]() {
      return this[_direction];
    }
    set [dartx.direction](value) {
      this[_direction] = value == null ? '' : value;
    }
    get [_direction]() {
      return this.direction;
    }
    set [_direction](value) {
      this.direction = value;
    }
    get [dartx.display]() {
      return this[_display];
    }
    set [dartx.display](value) {
      this[_display] = value == null ? '' : value;
    }
    get [_display]() {
      return this.display;
    }
    set [_display](value) {
      this.display = value;
    }
    get [dartx.emptyCells]() {
      return this[_emptyCells];
    }
    set [dartx.emptyCells](value) {
      this[_emptyCells] = value == null ? '' : value;
    }
    get [_emptyCells]() {
      return this.emptyCells;
    }
    set [_emptyCells](value) {
      this.emptyCells = value;
    }
    get [dartx.font]() {
      return this[_font];
    }
    set [dartx.font](value) {
      this[_font] = value == null ? '' : value;
    }
    get [_font]() {
      return this.font;
    }
    set [_font](value) {
      this.font = value;
    }
    get [dartx.fontFamily]() {
      return this[_fontFamily];
    }
    set [dartx.fontFamily](value) {
      this[_fontFamily] = value == null ? '' : value;
    }
    get [_fontFamily]() {
      return this.fontFamily;
    }
    set [_fontFamily](value) {
      this.fontFamily = value;
    }
    get [dartx.fontSize]() {
      return this[_fontSize];
    }
    set [dartx.fontSize](value) {
      this[_fontSize] = value == null ? '' : value;
    }
    get [_fontSize]() {
      return this.fontSize;
    }
    set [_fontSize](value) {
      this.fontSize = value;
    }
    get [dartx.fontStyle]() {
      return this[_fontStyle];
    }
    set [dartx.fontStyle](value) {
      this[_fontStyle] = value == null ? '' : value;
    }
    get [_fontStyle]() {
      return this.fontStyle;
    }
    set [_fontStyle](value) {
      this.fontStyle = value;
    }
    get [dartx.fontVariant]() {
      return this[_fontVariant];
    }
    set [dartx.fontVariant](value) {
      this[_fontVariant] = value == null ? '' : value;
    }
    get [_fontVariant]() {
      return this.fontVariant;
    }
    set [_fontVariant](value) {
      this.fontVariant = value;
    }
    get [dartx.fontWeight]() {
      return this[_fontWeight];
    }
    set [dartx.fontWeight](value) {
      this[_fontWeight] = value == null ? '' : value;
    }
    get [_fontWeight]() {
      return this.fontWeight;
    }
    set [_fontWeight](value) {
      this.fontWeight = value;
    }
    get [dartx.height]() {
      return this[_height$];
    }
    set [dartx.height](value) {
      this[_height$] = value == null ? '' : value;
    }
    get [_height$]() {
      return this.height;
    }
    set [_height$](value) {
      this.height = value;
    }
    get [dartx.left]() {
      return this[_left];
    }
    set [dartx.left](value) {
      this[_left] = value == null ? '' : value;
    }
    get [_left]() {
      return this.left;
    }
    set [_left](value) {
      this.left = value;
    }
    get [dartx.letterSpacing]() {
      return this[_letterSpacing];
    }
    set [dartx.letterSpacing](value) {
      this[_letterSpacing] = value == null ? '' : value;
    }
    get [_letterSpacing]() {
      return this.letterSpacing;
    }
    set [_letterSpacing](value) {
      this.letterSpacing = value;
    }
    get [dartx.lineHeight]() {
      return this[_lineHeight];
    }
    set [dartx.lineHeight](value) {
      this[_lineHeight] = value == null ? '' : value;
    }
    get [_lineHeight]() {
      return this.lineHeight;
    }
    set [_lineHeight](value) {
      this.lineHeight = value;
    }
    get [dartx.listStyle]() {
      return this[_listStyle];
    }
    set [dartx.listStyle](value) {
      this[_listStyle] = value == null ? '' : value;
    }
    get [_listStyle]() {
      return this.listStyle;
    }
    set [_listStyle](value) {
      this.listStyle = value;
    }
    get [dartx.listStyleImage]() {
      return this[_listStyleImage];
    }
    set [dartx.listStyleImage](value) {
      this[_listStyleImage] = value == null ? '' : value;
    }
    get [_listStyleImage]() {
      return this.listStyleImage;
    }
    set [_listStyleImage](value) {
      this.listStyleImage = value;
    }
    get [dartx.listStylePosition]() {
      return this[_listStylePosition];
    }
    set [dartx.listStylePosition](value) {
      this[_listStylePosition] = value == null ? '' : value;
    }
    get [_listStylePosition]() {
      return this.listStylePosition;
    }
    set [_listStylePosition](value) {
      this.listStylePosition = value;
    }
    get [dartx.listStyleType]() {
      return this[_listStyleType];
    }
    set [dartx.listStyleType](value) {
      this[_listStyleType] = value == null ? '' : value;
    }
    get [_listStyleType]() {
      return this.listStyleType;
    }
    set [_listStyleType](value) {
      this.listStyleType = value;
    }
    get [dartx.margin]() {
      return this[_margin];
    }
    set [dartx.margin](value) {
      this[_margin] = value == null ? '' : value;
    }
    get [_margin]() {
      return this.margin;
    }
    set [_margin](value) {
      this.margin = value;
    }
    get [dartx.marginBottom]() {
      return this[_marginBottom];
    }
    set [dartx.marginBottom](value) {
      this[_marginBottom] = value == null ? '' : value;
    }
    get [_marginBottom]() {
      return this.marginBottom;
    }
    set [_marginBottom](value) {
      this.marginBottom = value;
    }
    get [dartx.marginLeft]() {
      return this[_marginLeft];
    }
    set [dartx.marginLeft](value) {
      this[_marginLeft] = value == null ? '' : value;
    }
    get [_marginLeft]() {
      return this.marginLeft;
    }
    set [_marginLeft](value) {
      this.marginLeft = value;
    }
    get [dartx.marginRight]() {
      return this[_marginRight];
    }
    set [dartx.marginRight](value) {
      this[_marginRight] = value == null ? '' : value;
    }
    get [_marginRight]() {
      return this.marginRight;
    }
    set [_marginRight](value) {
      this.marginRight = value;
    }
    get [dartx.marginTop]() {
      return this[_marginTop];
    }
    set [dartx.marginTop](value) {
      this[_marginTop] = value == null ? '' : value;
    }
    get [_marginTop]() {
      return this.marginTop;
    }
    set [_marginTop](value) {
      this.marginTop = value;
    }
    get [dartx.maxHeight]() {
      return this[_maxHeight];
    }
    set [dartx.maxHeight](value) {
      this[_maxHeight] = value == null ? '' : value;
    }
    get [_maxHeight]() {
      return this.maxHeight;
    }
    set [_maxHeight](value) {
      this.maxHeight = value;
    }
    get [dartx.maxWidth]() {
      return this[_maxWidth];
    }
    set [dartx.maxWidth](value) {
      this[_maxWidth] = value == null ? '' : value;
    }
    get [_maxWidth]() {
      return this.maxWidth;
    }
    set [_maxWidth](value) {
      this.maxWidth = value;
    }
    get [dartx.minHeight]() {
      return this[_minHeight];
    }
    set [dartx.minHeight](value) {
      this[_minHeight] = value == null ? '' : value;
    }
    get [_minHeight]() {
      return this.minHeight;
    }
    set [_minHeight](value) {
      this.minHeight = value;
    }
    get [dartx.minWidth]() {
      return this[_minWidth];
    }
    set [dartx.minWidth](value) {
      this[_minWidth] = value == null ? '' : value;
    }
    get [_minWidth]() {
      return this.minWidth;
    }
    set [_minWidth](value) {
      this.minWidth = value;
    }
    get [dartx.outline]() {
      return this[_outline];
    }
    set [dartx.outline](value) {
      this[_outline] = value == null ? '' : value;
    }
    get [_outline]() {
      return this.outline;
    }
    set [_outline](value) {
      this.outline = value;
    }
    get [dartx.outlineColor]() {
      return this[_outlineColor];
    }
    set [dartx.outlineColor](value) {
      this[_outlineColor] = value == null ? '' : value;
    }
    get [_outlineColor]() {
      return this.outlineColor;
    }
    set [_outlineColor](value) {
      this.outlineColor = value;
    }
    get [dartx.outlineStyle]() {
      return this[_outlineStyle];
    }
    set [dartx.outlineStyle](value) {
      this[_outlineStyle] = value == null ? '' : value;
    }
    get [_outlineStyle]() {
      return this.outlineStyle;
    }
    set [_outlineStyle](value) {
      this.outlineStyle = value;
    }
    get [dartx.outlineWidth]() {
      return this[_outlineWidth];
    }
    set [dartx.outlineWidth](value) {
      this[_outlineWidth] = value == null ? '' : value;
    }
    get [_outlineWidth]() {
      return this.outlineWidth;
    }
    set [_outlineWidth](value) {
      this.outlineWidth = value;
    }
    get [dartx.overflow]() {
      return this[_overflow];
    }
    set [dartx.overflow](value) {
      this[_overflow] = value == null ? '' : value;
    }
    get [_overflow]() {
      return this.overflow;
    }
    set [_overflow](value) {
      this.overflow = value;
    }
    get [dartx.padding]() {
      return this[_padding];
    }
    set [dartx.padding](value) {
      this[_padding] = value == null ? '' : value;
    }
    get [_padding]() {
      return this.padding;
    }
    set [_padding](value) {
      this.padding = value;
    }
    get [dartx.paddingBottom]() {
      return this[_paddingBottom];
    }
    set [dartx.paddingBottom](value) {
      this[_paddingBottom] = value == null ? '' : value;
    }
    get [_paddingBottom]() {
      return this.paddingBottom;
    }
    set [_paddingBottom](value) {
      this.paddingBottom = value;
    }
    get [dartx.paddingLeft]() {
      return this[_paddingLeft];
    }
    set [dartx.paddingLeft](value) {
      this[_paddingLeft] = value == null ? '' : value;
    }
    get [_paddingLeft]() {
      return this.paddingLeft;
    }
    set [_paddingLeft](value) {
      this.paddingLeft = value;
    }
    get [dartx.paddingRight]() {
      return this[_paddingRight];
    }
    set [dartx.paddingRight](value) {
      this[_paddingRight] = value == null ? '' : value;
    }
    get [_paddingRight]() {
      return this.paddingRight;
    }
    set [_paddingRight](value) {
      this.paddingRight = value;
    }
    get [dartx.paddingTop]() {
      return this[_paddingTop];
    }
    set [dartx.paddingTop](value) {
      this[_paddingTop] = value == null ? '' : value;
    }
    get [_paddingTop]() {
      return this.paddingTop;
    }
    set [_paddingTop](value) {
      this.paddingTop = value;
    }
    get [dartx.pageBreakAfter]() {
      return this[_pageBreakAfter];
    }
    set [dartx.pageBreakAfter](value) {
      this[_pageBreakAfter] = value == null ? '' : value;
    }
    get [_pageBreakAfter]() {
      return this.pageBreakAfter;
    }
    set [_pageBreakAfter](value) {
      this.pageBreakAfter = value;
    }
    get [dartx.pageBreakBefore]() {
      return this[_pageBreakBefore];
    }
    set [dartx.pageBreakBefore](value) {
      this[_pageBreakBefore] = value == null ? '' : value;
    }
    get [_pageBreakBefore]() {
      return this.pageBreakBefore;
    }
    set [_pageBreakBefore](value) {
      this.pageBreakBefore = value;
    }
    get [dartx.pageBreakInside]() {
      return this[_pageBreakInside];
    }
    set [dartx.pageBreakInside](value) {
      this[_pageBreakInside] = value == null ? '' : value;
    }
    get [_pageBreakInside]() {
      return this.pageBreakInside;
    }
    set [_pageBreakInside](value) {
      this.pageBreakInside = value;
    }
    get [dartx.position]() {
      return this[_position$0];
    }
    set [dartx.position](value) {
      this[_position$0] = value == null ? '' : value;
    }
    get [_position$0]() {
      return this.position;
    }
    set [_position$0](value) {
      this.position = value;
    }
    get [dartx.quotes]() {
      return this[_quotes];
    }
    set [dartx.quotes](value) {
      this[_quotes] = value == null ? '' : value;
    }
    get [_quotes]() {
      return this.quotes;
    }
    set [_quotes](value) {
      this.quotes = value;
    }
    get [dartx.right]() {
      return this[_right];
    }
    set [dartx.right](value) {
      this[_right] = value == null ? '' : value;
    }
    get [_right]() {
      return this.right;
    }
    set [_right](value) {
      this.right = value;
    }
    get [dartx.tableLayout]() {
      return this[_tableLayout];
    }
    set [dartx.tableLayout](value) {
      this[_tableLayout] = value == null ? '' : value;
    }
    get [_tableLayout]() {
      return this.tableLayout;
    }
    set [_tableLayout](value) {
      this.tableLayout = value;
    }
    get [dartx.textAlign]() {
      return this[_textAlign];
    }
    set [dartx.textAlign](value) {
      this[_textAlign] = value == null ? '' : value;
    }
    get [_textAlign]() {
      return this.textAlign;
    }
    set [_textAlign](value) {
      this.textAlign = value;
    }
    get [dartx.textDecoration]() {
      return this[_textDecoration];
    }
    set [dartx.textDecoration](value) {
      this[_textDecoration] = value == null ? '' : value;
    }
    get [_textDecoration]() {
      return this.textDecoration;
    }
    set [_textDecoration](value) {
      this.textDecoration = value;
    }
    get [dartx.textIndent]() {
      return this[_textIndent];
    }
    set [dartx.textIndent](value) {
      this[_textIndent] = value == null ? '' : value;
    }
    get [_textIndent]() {
      return this.textIndent;
    }
    set [_textIndent](value) {
      this.textIndent = value;
    }
    get [dartx.textTransform]() {
      return this[_textTransform];
    }
    set [dartx.textTransform](value) {
      this[_textTransform] = value == null ? '' : value;
    }
    get [_textTransform]() {
      return this.textTransform;
    }
    set [_textTransform](value) {
      this.textTransform = value;
    }
    get [dartx.top]() {
      return this[_top];
    }
    set [dartx.top](value) {
      this[_top] = value == null ? '' : value;
    }
    get [_top]() {
      return this.top;
    }
    set [_top](value) {
      this.top = value;
    }
    get [dartx.unicodeBidi]() {
      return this[_unicodeBidi];
    }
    set [dartx.unicodeBidi](value) {
      this[_unicodeBidi] = value == null ? '' : value;
    }
    get [_unicodeBidi]() {
      return this.unicodeBidi;
    }
    set [_unicodeBidi](value) {
      this.unicodeBidi = value;
    }
    get [dartx.verticalAlign]() {
      return this[_verticalAlign];
    }
    set [dartx.verticalAlign](value) {
      this[_verticalAlign] = value == null ? '' : value;
    }
    get [_verticalAlign]() {
      return this.verticalAlign;
    }
    set [_verticalAlign](value) {
      this.verticalAlign = value;
    }
    get [dartx.visibility]() {
      return this[_visibility];
    }
    set [dartx.visibility](value) {
      this[_visibility] = value == null ? '' : value;
    }
    get [_visibility]() {
      return this.visibility;
    }
    set [_visibility](value) {
      this.visibility = value;
    }
    get [dartx.whiteSpace]() {
      return this[_whiteSpace];
    }
    set [dartx.whiteSpace](value) {
      this[_whiteSpace] = value == null ? '' : value;
    }
    get [_whiteSpace]() {
      return this.whiteSpace;
    }
    set [_whiteSpace](value) {
      this.whiteSpace = value;
    }
    get [dartx.width]() {
      return this[_width$];
    }
    set [dartx.width](value) {
      this[_width$] = value == null ? '' : value;
    }
    get [_width$]() {
      return this.width;
    }
    set [_width$](value) {
      this.width = value;
    }
    get [dartx.wordSpacing]() {
      return this[_wordSpacing];
    }
    set [dartx.wordSpacing](value) {
      this[_wordSpacing] = value == null ? '' : value;
    }
    get [_wordSpacing]() {
      return this.wordSpacing;
    }
    set [_wordSpacing](value) {
      this.wordSpacing = value;
    }
    get [dartx.zIndex]() {
      return this[_zIndex];
    }
    set [dartx.zIndex](value) {
      this[_zIndex] = value == null ? '' : value;
    }
    get [_zIndex]() {
      return this.zIndex;
    }
    set [_zIndex](value) {
      this.zIndex = value;
    }
  };
  dart.setSignature(html$.CssStyleDeclaration, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.CssStyleDeclaration, []),
      css: dart.definiteFunctionType(html$.CssStyleDeclaration, [core.String]),
      _: dart.definiteFunctionType(html$.CssStyleDeclaration, [])
    }),
    fields: () => ({
      [dartx.cssText]: core.String,
      [dartx.length]: core.int,
      [dartx.parentRule]: html$.CssRule,
      [_background]: core.String,
      [_backgroundAttachment]: core.String,
      [_backgroundColor]: core.String,
      [_backgroundImage]: core.String,
      [_backgroundPosition]: core.String,
      [_backgroundRepeat]: core.String,
      [_border]: core.String,
      [_borderBottom]: core.String,
      [_borderBottomColor]: core.String,
      [_borderBottomStyle]: core.String,
      [_borderBottomWidth]: core.String,
      [_borderCollapse]: core.String,
      [_borderColor]: core.String,
      [_borderLeft]: core.String,
      [_borderLeftColor]: core.String,
      [_borderLeftStyle]: core.String,
      [_borderLeftWidth]: core.String,
      [_borderRight]: core.String,
      [_borderRightColor]: core.String,
      [_borderRightStyle]: core.String,
      [_borderRightWidth]: core.String,
      [_borderSpacing]: core.String,
      [_borderStyle]: core.String,
      [_borderTop]: core.String,
      [_borderTopColor]: core.String,
      [_borderTopStyle]: core.String,
      [_borderTopWidth]: core.String,
      [_borderWidth]: core.String,
      [_bottom]: core.String,
      [_captionSide]: core.String,
      [_clear$1]: core.String,
      [_clip]: core.String,
      [_color]: core.String,
      [_content]: core.String,
      [_cursor]: core.String,
      [_direction]: core.String,
      [_display]: core.String,
      [_emptyCells]: core.String,
      [_font]: core.String,
      [_fontFamily]: core.String,
      [_fontSize]: core.String,
      [_fontStyle]: core.String,
      [_fontVariant]: core.String,
      [_fontWeight]: core.String,
      [_height$]: core.String,
      [_left]: core.String,
      [_letterSpacing]: core.String,
      [_lineHeight]: core.String,
      [_listStyle]: core.String,
      [_listStyleImage]: core.String,
      [_listStylePosition]: core.String,
      [_listStyleType]: core.String,
      [_margin]: core.String,
      [_marginBottom]: core.String,
      [_marginLeft]: core.String,
      [_marginRight]: core.String,
      [_marginTop]: core.String,
      [_maxHeight]: core.String,
      [_maxWidth]: core.String,
      [_minHeight]: core.String,
      [_minWidth]: core.String,
      [_outline]: core.String,
      [_outlineColor]: core.String,
      [_outlineStyle]: core.String,
      [_outlineWidth]: core.String,
      [_overflow]: core.String,
      [_padding]: core.String,
      [_paddingBottom]: core.String,
      [_paddingLeft]: core.String,
      [_paddingRight]: core.String,
      [_paddingTop]: core.String,
      [_pageBreakAfter]: core.String,
      [_pageBreakBefore]: core.String,
      [_pageBreakInside]: core.String,
      [_position$0]: core.String,
      [_quotes]: core.String,
      [_right]: core.String,
      [_tableLayout]: core.String,
      [_textAlign]: core.String,
      [_textDecoration]: core.String,
      [_textIndent]: core.String,
      [_textTransform]: core.String,
      [_top]: core.String,
      [_unicodeBidi]: core.String,
      [_verticalAlign]: core.String,
      [_visibility]: core.String,
      [_whiteSpace]: core.String,
      [_width$]: core.String,
      [_wordSpacing]: core.String,
      [_zIndex]: core.String
    }),
    methods: () => ({
      [dartx.getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
      [_getPropertyValueHelper]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
      [_supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.setProperty]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
      [_browserPropertyName]: dart.definiteFunctionType(core.String, [core.String]),
      [_setPropertyHelper]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
      [dartx.getPropertyPriority]: dart.definiteFunctionType(core.String, [core.String]),
      [_getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.removeProperty]: dart.definiteFunctionType(core.String, [core.String])
    }),
    sfields: () => ({_propertyCache: dart.dynamic}),
    sgetters: () => ({supportsTransitions: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _readCache: dart.definiteFunctionType(core.String, [core.String]),
      _writeCache: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      _camelCase: dart.definiteFunctionType(core.String, [core.String])
    }),
    names: ['_readCache', '_writeCache', '_camelCase']
  });
  dart.defineLazy(html$.CssStyleDeclaration, {
    get _propertyCache() {
      return {};
    }
  });
  dart.registerExtension(dart.global.CSSStyleDeclaration, html$.CssStyleDeclaration);
  dart.registerExtension(dart.global.MSStyleCSSProperties, html$.CssStyleDeclaration);
  dart.registerExtension(dart.global.CSS2Properties, html$.CssStyleDeclaration);
  const _elementIterable = Symbol('_elementIterable');
  const _elementCssStyleDeclarationSetIterable = Symbol('_elementCssStyleDeclarationSetIterable');
  const _setAll = Symbol('_setAll');
  html$._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends dart.mixin(core.Object, html$.CssStyleDeclarationBase) {
    new(elementIterable) {
      this[_elementIterable] = elementIterable;
      this[_elementCssStyleDeclarationSetIterable] = null;
      this[_elementCssStyleDeclarationSetIterable] = core.List.from(this[_elementIterable])[dartx.map](html$.CssStyleDeclaration)(dart.fn(e => html$.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration()));
    }
    getPropertyValue(propertyName) {
      return this[_elementCssStyleDeclarationSetIterable][dartx.first][dartx.getPropertyValue](propertyName);
    }
    setProperty(propertyName, value, priority) {
      if (priority === void 0) priority = null;
      this[_elementCssStyleDeclarationSetIterable][dartx.forEach](dart.fn(e => e[dartx.setProperty](propertyName, value, priority), CssStyleDeclarationTovoid()));
    }
    [_setAll](propertyName, value) {
      value = value == null ? '' : value;
      for (let element of this[_elementIterable]) {
        element.style[propertyName] = value;
      }
    }
    set background(value) {
      this[_setAll]('background', value);
    }
    get background() {
      return super.background;
    }
    set backgroundAttachment(value) {
      this[_setAll]('backgroundAttachment', value);
    }
    get backgroundAttachment() {
      return super.backgroundAttachment;
    }
    set backgroundColor(value) {
      this[_setAll]('backgroundColor', value);
    }
    get backgroundColor() {
      return super.backgroundColor;
    }
    set backgroundImage(value) {
      this[_setAll]('backgroundImage', value);
    }
    get backgroundImage() {
      return super.backgroundImage;
    }
    set backgroundPosition(value) {
      this[_setAll]('backgroundPosition', value);
    }
    get backgroundPosition() {
      return super.backgroundPosition;
    }
    set backgroundRepeat(value) {
      this[_setAll]('backgroundRepeat', value);
    }
    get backgroundRepeat() {
      return super.backgroundRepeat;
    }
    set border(value) {
      this[_setAll]('border', value);
    }
    get border() {
      return super.border;
    }
    set borderBottom(value) {
      this[_setAll]('borderBottom', value);
    }
    get borderBottom() {
      return super.borderBottom;
    }
    set borderBottomColor(value) {
      this[_setAll]('borderBottomColor', value);
    }
    get borderBottomColor() {
      return super.borderBottomColor;
    }
    set borderBottomStyle(value) {
      this[_setAll]('borderBottomStyle', value);
    }
    get borderBottomStyle() {
      return super.borderBottomStyle;
    }
    set borderBottomWidth(value) {
      this[_setAll]('borderBottomWidth', value);
    }
    get borderBottomWidth() {
      return super.borderBottomWidth;
    }
    set borderCollapse(value) {
      this[_setAll]('borderCollapse', value);
    }
    get borderCollapse() {
      return super.borderCollapse;
    }
    set borderColor(value) {
      this[_setAll]('borderColor', value);
    }
    get borderColor() {
      return super.borderColor;
    }
    set borderLeft(value) {
      this[_setAll]('borderLeft', value);
    }
    get borderLeft() {
      return super.borderLeft;
    }
    set borderLeftColor(value) {
      this[_setAll]('borderLeftColor', value);
    }
    get borderLeftColor() {
      return super.borderLeftColor;
    }
    set borderLeftStyle(value) {
      this[_setAll]('borderLeftStyle', value);
    }
    get borderLeftStyle() {
      return super.borderLeftStyle;
    }
    set borderLeftWidth(value) {
      this[_setAll]('borderLeftWidth', value);
    }
    get borderLeftWidth() {
      return super.borderLeftWidth;
    }
    set borderRight(value) {
      this[_setAll]('borderRight', value);
    }
    get borderRight() {
      return super.borderRight;
    }
    set borderRightColor(value) {
      this[_setAll]('borderRightColor', value);
    }
    get borderRightColor() {
      return super.borderRightColor;
    }
    set borderRightStyle(value) {
      this[_setAll]('borderRightStyle', value);
    }
    get borderRightStyle() {
      return super.borderRightStyle;
    }
    set borderRightWidth(value) {
      this[_setAll]('borderRightWidth', value);
    }
    get borderRightWidth() {
      return super.borderRightWidth;
    }
    set borderSpacing(value) {
      this[_setAll]('borderSpacing', value);
    }
    get borderSpacing() {
      return super.borderSpacing;
    }
    set borderStyle(value) {
      this[_setAll]('borderStyle', value);
    }
    get borderStyle() {
      return super.borderStyle;
    }
    set borderTop(value) {
      this[_setAll]('borderTop', value);
    }
    get borderTop() {
      return super.borderTop;
    }
    set borderTopColor(value) {
      this[_setAll]('borderTopColor', value);
    }
    get borderTopColor() {
      return super.borderTopColor;
    }
    set borderTopStyle(value) {
      this[_setAll]('borderTopStyle', value);
    }
    get borderTopStyle() {
      return super.borderTopStyle;
    }
    set borderTopWidth(value) {
      this[_setAll]('borderTopWidth', value);
    }
    get borderTopWidth() {
      return super.borderTopWidth;
    }
    set borderWidth(value) {
      this[_setAll]('borderWidth', value);
    }
    get borderWidth() {
      return super.borderWidth;
    }
    set bottom(value) {
      this[_setAll]('bottom', value);
    }
    get bottom() {
      return super.bottom;
    }
    set captionSide(value) {
      this[_setAll]('captionSide', value);
    }
    get captionSide() {
      return super.captionSide;
    }
    set clear(value) {
      this[_setAll]('clear', value);
    }
    get clear() {
      return super.clear;
    }
    set clip(value) {
      this[_setAll]('clip', value);
    }
    get clip() {
      return super.clip;
    }
    set color(value) {
      this[_setAll]('color', value);
    }
    get color() {
      return super.color;
    }
    set content(value) {
      this[_setAll]('content', value);
    }
    get content() {
      return super.content;
    }
    set cursor(value) {
      this[_setAll]('cursor', value);
    }
    get cursor() {
      return super.cursor;
    }
    set direction(value) {
      this[_setAll]('direction', value);
    }
    get direction() {
      return super.direction;
    }
    set display(value) {
      this[_setAll]('display', value);
    }
    get display() {
      return super.display;
    }
    set emptyCells(value) {
      this[_setAll]('emptyCells', value);
    }
    get emptyCells() {
      return super.emptyCells;
    }
    set font(value) {
      this[_setAll]('font', value);
    }
    get font() {
      return super.font;
    }
    set fontFamily(value) {
      this[_setAll]('fontFamily', value);
    }
    get fontFamily() {
      return super.fontFamily;
    }
    set fontSize(value) {
      this[_setAll]('fontSize', value);
    }
    get fontSize() {
      return super.fontSize;
    }
    set fontStyle(value) {
      this[_setAll]('fontStyle', value);
    }
    get fontStyle() {
      return super.fontStyle;
    }
    set fontVariant(value) {
      this[_setAll]('fontVariant', value);
    }
    get fontVariant() {
      return super.fontVariant;
    }
    set fontWeight(value) {
      this[_setAll]('fontWeight', value);
    }
    get fontWeight() {
      return super.fontWeight;
    }
    set height(value) {
      this[_setAll]('height', value);
    }
    get height() {
      return super.height;
    }
    set left(value) {
      this[_setAll]('left', value);
    }
    get left() {
      return super.left;
    }
    set letterSpacing(value) {
      this[_setAll]('letterSpacing', value);
    }
    get letterSpacing() {
      return super.letterSpacing;
    }
    set lineHeight(value) {
      this[_setAll]('lineHeight', value);
    }
    get lineHeight() {
      return super.lineHeight;
    }
    set listStyle(value) {
      this[_setAll]('listStyle', value);
    }
    get listStyle() {
      return super.listStyle;
    }
    set listStyleImage(value) {
      this[_setAll]('listStyleImage', value);
    }
    get listStyleImage() {
      return super.listStyleImage;
    }
    set listStylePosition(value) {
      this[_setAll]('listStylePosition', value);
    }
    get listStylePosition() {
      return super.listStylePosition;
    }
    set listStyleType(value) {
      this[_setAll]('listStyleType', value);
    }
    get listStyleType() {
      return super.listStyleType;
    }
    set margin(value) {
      this[_setAll]('margin', value);
    }
    get margin() {
      return super.margin;
    }
    set marginBottom(value) {
      this[_setAll]('marginBottom', value);
    }
    get marginBottom() {
      return super.marginBottom;
    }
    set marginLeft(value) {
      this[_setAll]('marginLeft', value);
    }
    get marginLeft() {
      return super.marginLeft;
    }
    set marginRight(value) {
      this[_setAll]('marginRight', value);
    }
    get marginRight() {
      return super.marginRight;
    }
    set marginTop(value) {
      this[_setAll]('marginTop', value);
    }
    get marginTop() {
      return super.marginTop;
    }
    set maxHeight(value) {
      this[_setAll]('maxHeight', value);
    }
    get maxHeight() {
      return super.maxHeight;
    }
    set maxWidth(value) {
      this[_setAll]('maxWidth', value);
    }
    get maxWidth() {
      return super.maxWidth;
    }
    set minHeight(value) {
      this[_setAll]('minHeight', value);
    }
    get minHeight() {
      return super.minHeight;
    }
    set minWidth(value) {
      this[_setAll]('minWidth', value);
    }
    get minWidth() {
      return super.minWidth;
    }
    set outline(value) {
      this[_setAll]('outline', value);
    }
    get outline() {
      return super.outline;
    }
    set outlineColor(value) {
      this[_setAll]('outlineColor', value);
    }
    get outlineColor() {
      return super.outlineColor;
    }
    set outlineStyle(value) {
      this[_setAll]('outlineStyle', value);
    }
    get outlineStyle() {
      return super.outlineStyle;
    }
    set outlineWidth(value) {
      this[_setAll]('outlineWidth', value);
    }
    get outlineWidth() {
      return super.outlineWidth;
    }
    set overflow(value) {
      this[_setAll]('overflow', value);
    }
    get overflow() {
      return super.overflow;
    }
    set padding(value) {
      this[_setAll]('padding', value);
    }
    get padding() {
      return super.padding;
    }
    set paddingBottom(value) {
      this[_setAll]('paddingBottom', value);
    }
    get paddingBottom() {
      return super.paddingBottom;
    }
    set paddingLeft(value) {
      this[_setAll]('paddingLeft', value);
    }
    get paddingLeft() {
      return super.paddingLeft;
    }
    set paddingRight(value) {
      this[_setAll]('paddingRight', value);
    }
    get paddingRight() {
      return super.paddingRight;
    }
    set paddingTop(value) {
      this[_setAll]('paddingTop', value);
    }
    get paddingTop() {
      return super.paddingTop;
    }
    set pageBreakAfter(value) {
      this[_setAll]('pageBreakAfter', value);
    }
    get pageBreakAfter() {
      return super.pageBreakAfter;
    }
    set pageBreakBefore(value) {
      this[_setAll]('pageBreakBefore', value);
    }
    get pageBreakBefore() {
      return super.pageBreakBefore;
    }
    set pageBreakInside(value) {
      this[_setAll]('pageBreakInside', value);
    }
    get pageBreakInside() {
      return super.pageBreakInside;
    }
    set position(value) {
      this[_setAll]('position', value);
    }
    get position() {
      return super.position;
    }
    set quotes(value) {
      this[_setAll]('quotes', value);
    }
    get quotes() {
      return super.quotes;
    }
    set right(value) {
      this[_setAll]('right', value);
    }
    get right() {
      return super.right;
    }
    set tableLayout(value) {
      this[_setAll]('tableLayout', value);
    }
    get tableLayout() {
      return super.tableLayout;
    }
    set textAlign(value) {
      this[_setAll]('textAlign', value);
    }
    get textAlign() {
      return super.textAlign;
    }
    set textDecoration(value) {
      this[_setAll]('textDecoration', value);
    }
    get textDecoration() {
      return super.textDecoration;
    }
    set textIndent(value) {
      this[_setAll]('textIndent', value);
    }
    get textIndent() {
      return super.textIndent;
    }
    set textTransform(value) {
      this[_setAll]('textTransform', value);
    }
    get textTransform() {
      return super.textTransform;
    }
    set top(value) {
      this[_setAll]('top', value);
    }
    get top() {
      return super.top;
    }
    set unicodeBidi(value) {
      this[_setAll]('unicodeBidi', value);
    }
    get unicodeBidi() {
      return super.unicodeBidi;
    }
    set verticalAlign(value) {
      this[_setAll]('verticalAlign', value);
    }
    get verticalAlign() {
      return super.verticalAlign;
    }
    set visibility(value) {
      this[_setAll]('visibility', value);
    }
    get visibility() {
      return super.visibility;
    }
    set whiteSpace(value) {
      this[_setAll]('whiteSpace', value);
    }
    get whiteSpace() {
      return super.whiteSpace;
    }
    set width(value) {
      this[_setAll]('width', value);
    }
    get width() {
      return super.width;
    }
    set wordSpacing(value) {
      this[_setAll]('wordSpacing', value);
    }
    get wordSpacing() {
      return super.wordSpacing;
    }
    set zIndex(value) {
      this[_setAll]('zIndex', value);
    }
    get zIndex() {
      return super.zIndex;
    }
  };
  dart.setSignature(html$._CssStyleDeclarationSet, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CssStyleDeclarationSet, [IterableOfElement()])}),
    fields: () => ({
      [_elementIterable]: IterableOfElement(),
      [_elementCssStyleDeclarationSetIterable]: IterableOfCssStyleDeclaration()
    }),
    methods: () => ({
      getPropertyValue: dart.definiteFunctionType(core.String, [core.String]),
      setProperty: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
      [_setAll]: dart.definiteFunctionType(dart.void, [core.String, core.String])
    })
  });
  dart.defineExtensionMembers(html$._CssStyleDeclarationSet, [
    'getPropertyValue',
    'setProperty',
    'background',
    'backgroundAttachment',
    'backgroundColor',
    'backgroundImage',
    'backgroundPosition',
    'backgroundRepeat',
    'border',
    'borderBottom',
    'borderBottomColor',
    'borderBottomStyle',
    'borderBottomWidth',
    'borderCollapse',
    'borderColor',
    'borderLeft',
    'borderLeftColor',
    'borderLeftStyle',
    'borderLeftWidth',
    'borderRight',
    'borderRightColor',
    'borderRightStyle',
    'borderRightWidth',
    'borderSpacing',
    'borderStyle',
    'borderTop',
    'borderTopColor',
    'borderTopStyle',
    'borderTopWidth',
    'borderWidth',
    'bottom',
    'captionSide',
    'clear',
    'clip',
    'color',
    'content',
    'cursor',
    'direction',
    'display',
    'emptyCells',
    'font',
    'fontFamily',
    'fontSize',
    'fontStyle',
    'fontVariant',
    'fontWeight',
    'height',
    'left',
    'letterSpacing',
    'lineHeight',
    'listStyle',
    'listStyleImage',
    'listStylePosition',
    'listStyleType',
    'margin',
    'marginBottom',
    'marginLeft',
    'marginRight',
    'marginTop',
    'maxHeight',
    'maxWidth',
    'minHeight',
    'minWidth',
    'outline',
    'outlineColor',
    'outlineStyle',
    'outlineWidth',
    'overflow',
    'padding',
    'paddingBottom',
    'paddingLeft',
    'paddingRight',
    'paddingTop',
    'pageBreakAfter',
    'pageBreakBefore',
    'pageBreakInside',
    'position',
    'quotes',
    'right',
    'tableLayout',
    'textAlign',
    'textDecoration',
    'textIndent',
    'textTransform',
    'top',
    'unicodeBidi',
    'verticalAlign',
    'visibility',
    'whiteSpace',
    'width',
    'wordSpacing',
    'zIndex'
  ]);
  dart.defineExtensionNames([
    'selectorText',
    'style'
  ]);
  html$.CssStyleRule = class CssStyleRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.selectorText]() {
      return this.selectorText;
    }
    set [dartx.selectorText](value) {
      this.selectorText = value;
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssStyleRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleRule, [])}),
    fields: () => ({
      [dartx.selectorText]: core.String,
      [dartx.style]: html$.CssStyleDeclaration
    })
  });
  dart.registerExtension(dart.global.CSSStyleRule, html$.CssStyleRule);
  dart.defineExtensionNames([
    'disabled',
    'href',
    'media',
    'ownerNode',
    'parentStyleSheet',
    'title',
    'type'
  ]);
  html$.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    get [dartx.media]() {
      return this.media;
    }
    get [dartx.ownerNode]() {
      return this.ownerNode;
    }
    get [dartx.parentStyleSheet]() {
      return this.parentStyleSheet;
    }
    get [dartx.title]() {
      return this.title;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.StyleSheet, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StyleSheet, [])}),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.href]: core.String,
      [dartx.media]: html$.MediaList,
      [dartx.ownerNode]: html$.Node,
      [dartx.parentStyleSheet]: html$.StyleSheet,
      [dartx.title]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.StyleSheet, html$.StyleSheet);
  dart.defineExtensionNames([
    'addRule',
    'deleteRule',
    'insertRule',
    'removeRule',
    'cssRules',
    'ownerRule',
    'rules'
  ]);
  html$.CssStyleSheet = class CssStyleSheet extends html$.StyleSheet {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    get [dartx.ownerRule]() {
      return this.ownerRule;
    }
    get [dartx.rules]() {
      return this.rules;
    }
    [dartx.addRule](...args) {
      return this.addRule.apply(this, args);
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.insertRule](...args) {
      return this.insertRule.apply(this, args);
    }
    [dartx.removeRule](...args) {
      return this.removeRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssStyleSheet, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleSheet, [])}),
    fields: () => ({
      [dartx.cssRules]: ListOfCssRule(),
      [dartx.ownerRule]: html$.CssRule,
      [dartx.rules]: ListOfCssRule()
    }),
    methods: () => ({
      [dartx.addRule]: dart.definiteFunctionType(core.int, [core.String, core.String], [core.int]),
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String], [core.int]),
      [dartx.removeRule]: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  dart.registerExtension(dart.global.CSSStyleSheet, html$.CssStyleSheet);
  dart.defineExtensionNames([
    'deleteRule',
    'insertRule',
    'conditionText',
    'cssRules'
  ]);
  html$.CssSupportsRule = class CssSupportsRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.conditionText]() {
      return this.conditionText;
    }
    get [dartx.cssRules]() {
      return this.cssRules;
    }
    [dartx.deleteRule](...args) {
      return this.deleteRule.apply(this, args);
    }
    [dartx.insertRule](...args) {
      return this.insertRule.apply(this, args);
    }
  };
  dart.setSignature(html$.CssSupportsRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssSupportsRule, [])}),
    fields: () => ({
      [dartx.conditionText]: core.String,
      [dartx.cssRules]: ListOfCssRule()
    }),
    methods: () => ({
      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
    })
  });
  dart.registerExtension(dart.global.CSSSupportsRule, html$.CssSupportsRule);
  dart.defineExtensionNames([
    'style'
  ]);
  html$.CssViewportRule = class CssViewportRule extends html$.CssRule {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.style]() {
      return this.style;
    }
  };
  dart.setSignature(html$.CssViewportRule, {
    constructors: () => ({_: dart.definiteFunctionType(html$.CssViewportRule, [])}),
    fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
  });
  dart.registerExtension(dart.global.CSSViewportRule, html$.CssViewportRule);
  const _dartDetail = Symbol('_dartDetail');
  const _initCustomEvent = Symbol('_initCustomEvent');
  const _detail = Symbol('_detail');
  const _get__detail = Symbol('_get__detail');
  dart.defineExtensionNames([
    'detail'
  ]);
  html$.CustomEvent = class CustomEvent extends html$.Event {
    get [_dartDetail]() {
      return this._dartDetail;
    }
    set [_dartDetail](value) {
      this._dartDetail = value;
    }
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let detail = opts && 'detail' in opts ? opts.detail : null;
      let e = html$.CustomEvent._check(html$.document[_createEvent]('CustomEvent'));
      e[_dartDetail] = detail;
      if (core.List.is(detail) || core.Map.is(detail) || typeof detail == 'string' || typeof detail == 'number') {
        try {
          detail = html_common.convertDartToNative_SerializedScriptValue(detail);
          e[_initCustomEvent](type, canBubble, cancelable, detail);
        } catch (_) {
          e[_initCustomEvent](type, canBubble, cancelable, null);
        }

      } else {
        e[_initCustomEvent](type, canBubble, cancelable, null);
      }
      return e;
    }
    get [dartx.detail]() {
      if (this[_dartDetail] != null) {
        return this[_dartDetail];
      }
      return this[_detail];
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.CustomEvent._create_1(type, eventInitDict_1);
      }
      return html$.CustomEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new CustomEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new CustomEvent(type);
    }
    get [_detail]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get__detail]);
    }
    get [_get__detail]() {
      return this.detail;
    }
    [_initCustomEvent](...args) {
      return this.initCustomEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.CustomEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.CustomEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, detail: core.Object}),
      _: dart.definiteFunctionType(html$.CustomEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_dartDetail]: dart.dynamic,
      [_get__detail]: dart.dynamic
    }),
    getters: () => ({
      [dartx.detail]: dart.definiteFunctionType(dart.dynamic, []),
      [_detail]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({[_initCustomEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.CustomEvent, html$.CustomEvent);
  html$.DListElement = class DListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DListElement._check(html$.document[dartx.createElement]("dl"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.DListElement, 'created');
  dart.setSignature(html$.DListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DListElement, []),
      new: dart.definiteFunctionType(html$.DListElement, []),
      created: dart.definiteFunctionType(html$.DListElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDListElement, html$.DListElement);
  dart.defineExtensionNames([
    'options'
  ]);
  html$.DataListElement = class DataListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DataListElement._check(html$.document[dartx.createElement]("datalist"));
    }
    created() {
      this[dartx.options] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('datalist');
    }
    get [dartx.options]() {
      return this.options;
    }
  };
  dart.defineNamedConstructor(html$.DataListElement, 'created');
  dart.setSignature(html$.DataListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DataListElement, []),
      new: dart.definiteFunctionType(html$.DataListElement, []),
      created: dart.definiteFunctionType(html$.DataListElement, [])
    }),
    fields: () => ({[dartx.options]: ListOfNode()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLDataListElement, html$.DataListElement);
  dart.defineExtensionNames([
    'clearData',
    'getData',
    'setData',
    'setDragImage',
    'dropEffect',
    'effectAllowed',
    'files',
    'items',
    'types'
  ]);
  html$.DataTransfer = class DataTransfer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.dropEffect]() {
      return this.dropEffect;
    }
    set [dartx.dropEffect](value) {
      this.dropEffect = value;
    }
    get [dartx.effectAllowed]() {
      return this.effectAllowed;
    }
    set [dartx.effectAllowed](value) {
      this.effectAllowed = value;
    }
    get [dartx.files]() {
      return this.files;
    }
    get [dartx.items]() {
      return this.items;
    }
    get [dartx.types]() {
      return this.types;
    }
    [dartx.clearData](...args) {
      return this.clearData.apply(this, args);
    }
    [dartx.getData](...args) {
      return this.getData.apply(this, args);
    }
    [dartx.setData](...args) {
      return this.setData.apply(this, args);
    }
    [dartx.setDragImage](...args) {
      return this.setDragImage.apply(this, args);
    }
  };
  dart.setSignature(html$.DataTransfer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransfer, [])}),
    fields: () => ({
      [dartx.dropEffect]: core.String,
      [dartx.effectAllowed]: core.String,
      [dartx.files]: ListOfFile(),
      [dartx.items]: html$.DataTransferItemList,
      [dartx.types]: ListOfString()
    }),
    methods: () => ({
      [dartx.clearData]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.getData]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.setData]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.setDragImage]: dart.definiteFunctionType(dart.void, [html$.Element, core.int, core.int])
    })
  });
  dart.registerExtension(dart.global.DataTransfer, html$.DataTransfer);
  const _getAsString = Symbol('_getAsString');
  dart.defineExtensionNames([
    'getAsFile',
    'getAsString',
    'getAsEntry',
    'kind',
    'type'
  ]);
  html$.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.getAsFile](...args) {
      return this.getAsFile.apply(this, args);
    }
    [_getAsString](...args) {
      return this.getAsString.apply(this, args);
    }
    [dartx.getAsString]() {
      let completer = CompleterOfString().new();
      this[_getAsString](dart.fn(value => {
        completer.complete(value);
      }, StringTovoid$()));
      return completer.future;
    }
    [dartx.getAsEntry](...args) {
      return this.webkitGetAsEntry.apply(this, args);
    }
  };
  dart.setSignature(html$.DataTransferItem, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItem, [])}),
    fields: () => ({
      [dartx.kind]: core.String,
      [dartx.type]: core.String
    }),
    methods: () => ({
      [dartx.getAsFile]: dart.definiteFunctionType(html$.Blob, []),
      [_getAsString]: dart.definiteFunctionType(dart.void, [html$._StringCallback]),
      [dartx.getAsString]: dart.definiteFunctionType(async.Future$(core.String), []),
      [dartx.getAsEntry]: dart.definiteFunctionType(html$.Entry, [])
    })
  });
  dart.registerExtension(dart.global.DataTransferItem, html$.DataTransferItem);
  dart.defineExtensionNames([
    'add',
    'addData',
    'addFile',
    'clear',
    'item',
    'remove',
    '_get',
    'length'
  ]);
  html$.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.addData](...args) {
      return this.add.apply(this, args);
    }
    [dartx.addFile](...args) {
      return this.add.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
    [dartx._get](index) {
      return this[index];
    }
  };
  dart.setSignature(html$.DataTransferItemList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItemList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(html$.DataTransferItem, [dart.dynamic], [core.String]),
      [dartx.addData]: dart.definiteFunctionType(html$.DataTransferItem, [core.String, core.String]),
      [dartx.addFile]: dart.definiteFunctionType(html$.DataTransferItem, [html$.File]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.item]: dart.definiteFunctionType(html$.DataTransferItem, [core.int]),
      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx._get]: dart.definiteFunctionType(html$.DataTransferItem, [core.int])
    })
  });
  dart.registerExtension(dart.global.DataTransferItemList, html$.DataTransferItemList);
  html$.DatabaseCallback = dart.typedef('DatabaseCallback', () => dart.functionType(dart.void, [web_sql.SqlDatabase]));
  dart.defineExtensionNames([
    'postMessage',
    'onMessage'
  ]);
  html$.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.DedicatedWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DedicatedWorkerGlobalScope, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.DedicatedWorkerGlobalScope, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.DedicatedWorkerGlobalScope, html$.DedicatedWorkerGlobalScope);
  dart.defineExtensionNames([
    'session'
  ]);
  html$.DefaultSessionStartEvent = class DefaultSessionStartEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.DefaultSessionStartEvent._create_1(type, eventInitDict_1);
      }
      return html$.DefaultSessionStartEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new DefaultSessionStartEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new DefaultSessionStartEvent(type);
    }
    get [dartx.session]() {
      return this.session;
    }
  };
  dart.setSignature(html$.DefaultSessionStartEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DefaultSessionStartEvent, []),
      new: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.session]: html$.PresentationSession}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DefaultSessionStartEvent, html$.DefaultSessionStartEvent);
  dart.defineExtensionNames([
    'queryUsageAndQuota',
    'requestQuota'
  ]);
  html$.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.queryUsageAndQuota](...args) {
      return this.queryUsageAndQuota.apply(this, args);
    }
    [dartx.requestQuota](...args) {
      return this.requestQuota.apply(this, args);
    }
  };
  dart.setSignature(html$.DeprecatedStorageInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageInfo, [])}),
    methods: () => ({
      [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageUsageCallback, html$.StorageErrorCallback]),
      [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
    }),
    sfields: () => ({
      PERSISTENT: core.int,
      TEMPORARY: core.int
    })
  });
  html$.DeprecatedStorageInfo.PERSISTENT = 1;
  html$.DeprecatedStorageInfo.TEMPORARY = 0;
  dart.registerExtension(dart.global.DeprecatedStorageInfo, html$.DeprecatedStorageInfo);
  dart.defineExtensionNames([
    'queryUsageAndQuota',
    'requestQuota'
  ]);
  html$.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.queryUsageAndQuota](...args) {
      return this.queryUsageAndQuota.apply(this, args);
    }
    [dartx.requestQuota](...args) {
      return this.requestQuota.apply(this, args);
    }
  };
  dart.setSignature(html$.DeprecatedStorageQuota, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageQuota, [])}),
    methods: () => ({
      [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [html$.StorageUsageCallback], [html$.StorageErrorCallback]),
      [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
    })
  });
  dart.registerExtension(dart.global.DeprecatedStorageQuota, html$.DeprecatedStorageQuota);
  dart.defineExtensionNames([
    'open'
  ]);
  html$.DetailsElement = class DetailsElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DetailsElement._check(html$.document[dartx.createElement]("details"));
    }
    created() {
      this[dartx.open] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('details');
    }
    get [dartx.open]() {
      return this.open;
    }
    set [dartx.open](value) {
      this.open = value;
    }
  };
  dart.defineNamedConstructor(html$.DetailsElement, 'created');
  dart.setSignature(html$.DetailsElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DetailsElement, []),
      new: dart.definiteFunctionType(html$.DetailsElement, []),
      created: dart.definiteFunctionType(html$.DetailsElement, [])
    }),
    fields: () => ({[dartx.open]: core.bool}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLDetailsElement, html$.DetailsElement);
  dart.defineExtensionNames([
    'x',
    'y',
    'z'
  ]);
  html$.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.setSignature(html$.DeviceAcceleration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceAcceleration, [])}),
    fields: () => ({
      [dartx.x]: core.double,
      [dartx.y]: core.double,
      [dartx.z]: core.double
    })
  });
  dart.registerExtension(dart.global.DeviceAcceleration, html$.DeviceAcceleration);
  dart.defineExtensionNames([
    'value'
  ]);
  html$.DeviceLightEvent = class DeviceLightEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.DeviceLightEvent._create_1(type, eventInitDict_1);
      }
      return html$.DeviceLightEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new DeviceLightEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new DeviceLightEvent(type);
    }
    get [dartx.value]() {
      return this.value;
    }
  };
  dart.setSignature(html$.DeviceLightEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DeviceLightEvent, []),
      new: dart.definiteFunctionType(html$.DeviceLightEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.value]: core.double}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DeviceLightEvent, html$.DeviceLightEvent);
  dart.defineExtensionNames([
    'initDeviceMotionEvent',
    'acceleration',
    'accelerationIncludingGravity',
    'interval',
    'rotationRate'
  ]);
  html$.DeviceMotionEvent = class DeviceMotionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.acceleration]() {
      return this.acceleration;
    }
    get [dartx.accelerationIncludingGravity]() {
      return this.accelerationIncludingGravity;
    }
    get [dartx.interval]() {
      return this.interval;
    }
    get [dartx.rotationRate]() {
      return this.rotationRate;
    }
    [dartx.initDeviceMotionEvent](...args) {
      return this.initDeviceMotionEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.DeviceMotionEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceMotionEvent, [])}),
    fields: () => ({
      [dartx.acceleration]: html$.DeviceAcceleration,
      [dartx.accelerationIncludingGravity]: html$.DeviceAcceleration,
      [dartx.interval]: core.double,
      [dartx.rotationRate]: html$.DeviceRotationRate
    }),
    methods: () => ({[dartx.initDeviceMotionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.DeviceAcceleration, html$.DeviceAcceleration, html$.DeviceRotationRate, core.num])})
  });
  dart.registerExtension(dart.global.DeviceMotionEvent, html$.DeviceMotionEvent);
  const _initDeviceOrientationEvent = Symbol('_initDeviceOrientationEvent');
  dart.defineExtensionNames([
    'absolute',
    'alpha',
    'beta',
    'gamma'
  ]);
  html$.DeviceOrientationEvent = class DeviceOrientationEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let alpha = opts && 'alpha' in opts ? opts.alpha : 0;
      let beta = opts && 'beta' in opts ? opts.beta : 0;
      let gamma = opts && 'gamma' in opts ? opts.gamma : 0;
      let absolute = opts && 'absolute' in opts ? opts.absolute : false;
      let e = html$.DeviceOrientationEvent._check(html$.document[_createEvent]("DeviceOrientationEvent"));
      e[_initDeviceOrientationEvent](type, canBubble, cancelable, alpha, beta, gamma, absolute);
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.absolute]() {
      return this.absolute;
    }
    get [dartx.alpha]() {
      return this.alpha;
    }
    get [dartx.beta]() {
      return this.beta;
    }
    get [dartx.gamma]() {
      return this.gamma;
    }
    [_initDeviceOrientationEvent](...args) {
      return this.initDeviceOrientationEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.DeviceOrientationEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.DeviceOrientationEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, alpha: core.num, beta: core.num, gamma: core.num, absolute: core.bool}),
      _: dart.definiteFunctionType(html$.DeviceOrientationEvent, [])
    }),
    fields: () => ({
      [dartx.absolute]: core.bool,
      [dartx.alpha]: core.double,
      [dartx.beta]: core.double,
      [dartx.gamma]: core.double
    }),
    methods: () => ({[_initDeviceOrientationEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.num, core.num, core.num, core.bool])})
  });
  dart.registerExtension(dart.global.DeviceOrientationEvent, html$.DeviceOrientationEvent);
  dart.defineExtensionNames([
    'alpha',
    'beta',
    'gamma'
  ]);
  html$.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.alpha]() {
      return this.alpha;
    }
    get [dartx.beta]() {
      return this.beta;
    }
    get [dartx.gamma]() {
      return this.gamma;
    }
  };
  dart.setSignature(html$.DeviceRotationRate, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceRotationRate, [])}),
    fields: () => ({
      [dartx.alpha]: core.double,
      [dartx.beta]: core.double,
      [dartx.gamma]: core.double
    })
  });
  dart.registerExtension(dart.global.DeviceRotationRate, html$.DeviceRotationRate);
  dart.defineExtensionNames([
    'close',
    'show',
    'showModal',
    'open',
    'returnValue'
  ]);
  html$.DialogElement = class DialogElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.open] = null;
      this[dartx.returnValue] = null;
      super.created();
    }
    get [dartx.open]() {
      return this.open;
    }
    set [dartx.open](value) {
      this.open = value;
    }
    get [dartx.returnValue]() {
      return this.returnValue;
    }
    set [dartx.returnValue](value) {
      this.returnValue = value;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.show](...args) {
      return this.show.apply(this, args);
    }
    [dartx.showModal](...args) {
      return this.showModal.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.DialogElement, 'created');
  dart.setSignature(html$.DialogElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DialogElement, []),
      created: dart.definiteFunctionType(html$.DialogElement, [])
    }),
    fields: () => ({
      [dartx.open]: core.bool,
      [dartx.returnValue]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.show]: dart.definiteFunctionType(dart.void, []),
      [dartx.showModal]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDialogElement, html$.DialogElement);
  const _getDirectory = Symbol('_getDirectory');
  const _getFile = Symbol('_getFile');
  const __getDirectory_1 = Symbol('__getDirectory_1');
  const __getDirectory_2 = Symbol('__getDirectory_2');
  const __getDirectory_3 = Symbol('__getDirectory_3');
  const __getDirectory_4 = Symbol('__getDirectory_4');
  const __getDirectory = Symbol('__getDirectory');
  const __getFile_1 = Symbol('__getFile_1');
  const __getFile_2 = Symbol('__getFile_2');
  const __getFile_3 = Symbol('__getFile_3');
  const __getFile_4 = Symbol('__getFile_4');
  const __getFile = Symbol('__getFile');
  const _removeRecursively = Symbol('_removeRecursively');
  const _copyTo = Symbol('_copyTo');
  const _getMetadata = Symbol('_getMetadata');
  const _getParent = Symbol('_getParent');
  const _moveTo = Symbol('_moveTo');
  const _remove$ = Symbol('_remove');
  dart.defineExtensionNames([
    'copyTo',
    'getMetadata',
    'getParent',
    'moveTo',
    'remove',
    'toUrl',
    'filesystem',
    'fullPath',
    'isDirectory',
    'isFile',
    'name'
  ]);
  html$.Entry = class Entry extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.filesystem]() {
      return this.filesystem;
    }
    get [dartx.fullPath]() {
      return this.fullPath;
    }
    get [dartx.isDirectory]() {
      return this.isDirectory;
    }
    get [dartx.isFile]() {
      return this.isFile;
    }
    get [dartx.name]() {
      return this.name;
    }
    [_copyTo](...args) {
      return this.copyTo.apply(this, args);
    }
    [dartx.copyTo](parent, opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      let completer = CompleterOfEntry().new();
      this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [_getMetadata](...args) {
      return this.getMetadata.apply(this, args);
    }
    [dartx.getMetadata]() {
      let completer = CompleterOfMetadata().new();
      this[_getMetadata](dart.fn(value => {
        completer.complete(value);
      }, MetadataTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_getParent](...args) {
      return this.getParent.apply(this, args);
    }
    [dartx.getParent]() {
      let completer = CompleterOfEntry().new();
      this[_getParent](dart.fn(value => {
        completer.complete(value);
      }, EntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.moveTo](parent, opts) {
      let name = opts && 'name' in opts ? opts.name : null;
      let completer = CompleterOfEntry().new();
      this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [_remove$](...args) {
      return this.remove.apply(this, args);
    }
    [dartx.remove]() {
      let completer = async.Completer.new();
      this[_remove$](dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.toUrl](...args) {
      return this.toURL.apply(this, args);
    }
  };
  dart.setSignature(html$.Entry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Entry, [])}),
    fields: () => ({
      [dartx.filesystem]: html$.FileSystem,
      [dartx.fullPath]: core.String,
      [dartx.isDirectory]: core.bool,
      [dartx.isFile]: core.bool,
      [dartx.name]: core.String
    }),
    methods: () => ({
      [_copyTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [dartx.copyTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
      [_getMetadata]: dart.definiteFunctionType(dart.void, [html$.MetadataCallback], [html$._ErrorCallback]),
      [dartx.getMetadata]: dart.definiteFunctionType(async.Future$(html$.Metadata), []),
      [_getParent]: dart.definiteFunctionType(dart.void, [], [html$._EntryCallback, html$._ErrorCallback]),
      [dartx.getParent]: dart.definiteFunctionType(async.Future$(html$.Entry), []),
      [_moveTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [dartx.moveTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
      [_remove$]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
      [dartx.remove]: dart.definiteFunctionType(async.Future, []),
      [dartx.toUrl]: dart.definiteFunctionType(core.String, [])
    })
  });
  dart.registerExtension(dart.global.Entry, html$.Entry);
  dart.defineExtensionNames([
    'createDirectory',
    'getDirectory',
    'createFile',
    'getFile',
    'createReader',
    'removeRecursively'
  ]);
  html$.DirectoryEntry = class DirectoryEntry extends html$.Entry {
    [dartx.createDirectory](path, opts) {
      let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
      return this[_getDirectory](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
    }
    [dartx.getDirectory](path) {
      return this[_getDirectory](path);
    }
    [dartx.createFile](path, opts) {
      let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
      return this[_getFile](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
    }
    [dartx.getFile](path) {
      return this[_getFile](path);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.createReader](...args) {
      return this.createReader.apply(this, args);
    }
    [__getDirectory](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      if (errorCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getDirectory_1](path, options_1, successCallback, errorCallback);
        return;
      }
      if (successCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getDirectory_2](path, options_1, successCallback);
        return;
      }
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getDirectory_3](path, options_1);
        return;
      }
      this[__getDirectory_4](path);
      return;
    }
    [__getDirectory_1](...args) {
      return this.getDirectory.apply(this, args);
    }
    [__getDirectory_2](...args) {
      return this.getDirectory.apply(this, args);
    }
    [__getDirectory_3](...args) {
      return this.getDirectory.apply(this, args);
    }
    [__getDirectory_4](...args) {
      return this.getDirectory.apply(this, args);
    }
    [_getDirectory](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let completer = CompleterOfEntry().new();
      this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [__getFile](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
      if (errorCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getFile_1](path, options_1, successCallback, errorCallback);
        return;
      }
      if (successCallback != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getFile_2](path, options_1, successCallback);
        return;
      }
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[__getFile_3](path, options_1);
        return;
      }
      this[__getFile_4](path);
      return;
    }
    [__getFile_1](...args) {
      return this.getFile.apply(this, args);
    }
    [__getFile_2](...args) {
      return this.getFile.apply(this, args);
    }
    [__getFile_3](...args) {
      return this.getFile.apply(this, args);
    }
    [__getFile_4](...args) {
      return this.getFile.apply(this, args);
    }
    [_getFile](path, opts) {
      let options = opts && 'options' in opts ? opts.options : null;
      let completer = CompleterOfEntry().new();
      this[__getFile](path, {options: options, successCallback: dart.fn(value => {
          completer.complete(value);
        }, EntryTovoid()), errorCallback: dart.fn(error => {
          completer.completeError(error);
        }, FileErrorTovoid())});
      return completer.future;
    }
    [_removeRecursively](...args) {
      return this.removeRecursively.apply(this, args);
    }
    [dartx.removeRecursively]() {
      let completer = async.Completer.new();
      this[_removeRecursively](dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(html$.DirectoryEntry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryEntry, [])}),
    methods: () => ({
      [dartx.createDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
      [dartx.getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.createFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
      [dartx.getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.createReader]: dart.definiteFunctionType(html$.DirectoryReader, []),
      [__getDirectory]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [__getDirectory_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
      [__getDirectory_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
      [__getDirectory_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [__getDirectory_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
      [__getFile]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
      [__getFile_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
      [__getFile_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
      [__getFile_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [__getFile_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
      [_removeRecursively]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
      [dartx.removeRecursively]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.DirectoryEntry, html$.DirectoryEntry);
  const _readEntries = Symbol('_readEntries');
  dart.defineExtensionNames([
    'readEntries'
  ]);
  html$.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_readEntries](...args) {
      return this.readEntries.apply(this, args);
    }
    [dartx.readEntries]() {
      let completer = CompleterOfListOfEntry().new();
      this[_readEntries](dart.fn(value => {
        completer.complete(value);
      }, ListOfEntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(html$.DirectoryReader, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryReader, [])}),
    methods: () => ({
      [_readEntries]: dart.definiteFunctionType(dart.void, [html$._EntriesCallback], [html$._ErrorCallback]),
      [dartx.readEntries]: dart.definiteFunctionType(async.Future$(core.List$(html$.Entry)), [])
    })
  });
  dart.registerExtension(dart.global.DirectoryReader, html$.DirectoryReader);
  html$.DivElement = class DivElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DivElement._check(html$.document[dartx.createElement]("div"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.DivElement, 'created');
  dart.setSignature(html$.DivElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DivElement, []),
      new: dart.definiteFunctionType(html$.DivElement, []),
      created: dart.definiteFunctionType(html$.DivElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDivElement, html$.DivElement);
  const _body = Symbol('_body');
  const _get_window = Symbol('_get_window');
  const _head$ = Symbol('_head');
  const _lastModified = Symbol('_lastModified');
  const _preferredStylesheetSet = Symbol('_preferredStylesheetSet');
  const _referrer = Symbol('_referrer');
  const _selectedStylesheetSet = Symbol('_selectedStylesheetSet');
  const _styleSheets = Symbol('_styleSheets');
  const _title = Symbol('_title');
  const _visibilityState = Symbol('_visibilityState');
  const _webkitFullscreenElement = Symbol('_webkitFullscreenElement');
  const _webkitFullscreenEnabled = Symbol('_webkitFullscreenEnabled');
  const _webkitHidden = Symbol('_webkitHidden');
  const _webkitVisibilityState = Symbol('_webkitVisibilityState');
  const _caretRangeFromPoint = Symbol('_caretRangeFromPoint');
  const _createElement = Symbol('_createElement');
  const _createElementNS = Symbol('_createElementNS');
  const _createTouch_1 = Symbol('_createTouch_1');
  const _createTouch = Symbol('_createTouch');
  const _createTouchList = Symbol('_createTouchList');
  const _elementFromPoint = Symbol('_elementFromPoint');
  const _getCssCanvasContext = Symbol('_getCssCanvasContext');
  const _webkitExitFullscreen = Symbol('_webkitExitFullscreen');
  const _createElement_2 = Symbol('_createElement_2');
  const _createElementNS_2 = Symbol('_createElementNS_2');
  const _createNodeIterator = Symbol('_createNodeIterator');
  const _createTreeWalker = Symbol('_createTreeWalker');
  dart.defineExtensionNames([
    'window',
    'adoptNode',
    'createDocumentFragment',
    'createRange',
    'elementsFromPoint',
    'execCommand',
    'exitFullscreen',
    'exitPointerLock',
    'getElementsByClassName',
    'getElementsByName',
    'getElementsByTagName',
    'importNode',
    'queryCommandEnabled',
    'queryCommandIndeterm',
    'queryCommandState',
    'queryCommandSupported',
    'queryCommandValue',
    'transformDocumentToTreeView',
    'getElementById',
    'querySelector',
    'onAbort',
    'onBeforeCopy',
    'onBeforeCut',
    'onBeforePaste',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onCopy',
    'onCut',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPaste',
    'onPause',
    'onPlay',
    'onPlaying',
    'onPointerLockChange',
    'onPointerLockError',
    'onRateChange',
    'onReadyStateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSearch',
    'onSecurityPolicyViolation',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onSelectionChange',
    'onSelectStart',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onTouchCancel',
    'onTouchEnd',
    'onTouchMove',
    'onTouchStart',
    'onVolumeChange',
    'onWaiting',
    'onFullscreenChange',
    'onFullscreenError',
    'querySelectorAll',
    'query',
    'queryAll',
    'supportsRegisterElement',
    'supportsRegister',
    'createElement',
    'createElementNS',
    'visibilityState',
    'activeElement',
    'contentType',
    'cookie',
    'currentScript',
    'documentElement',
    'domain',
    'fonts',
    'fullscreenElement',
    'fullscreenEnabled',
    'hidden',
    'implementation',
    'origin',
    'pointerLockElement',
    'readyState',
    'rootElement',
    'scrollingElement',
    'timeline'
  ]);
  html$.Document = class Document extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.activeElement]() {
      return this.activeElement;
    }
    get [_body]() {
      return this.body;
    }
    set [_body](value) {
      this.body = value;
    }
    get [dartx.contentType]() {
      return this.contentType;
    }
    get [dartx.cookie]() {
      return this.cookie;
    }
    set [dartx.cookie](value) {
      this.cookie = value;
    }
    get [dartx.currentScript]() {
      return this.currentScript;
    }
    get [dartx.window]() {
      return html$._convertNativeToDart_Window(this[_get_window]);
    }
    get [_get_window]() {
      return this.defaultView;
    }
    get [dartx.documentElement]() {
      return this.documentElement;
    }
    get [dartx.domain]() {
      return this.domain;
    }
    get [dartx.fonts]() {
      return this.fonts;
    }
    get [dartx.fullscreenElement]() {
      return this.fullscreenElement;
    }
    get [dartx.fullscreenEnabled]() {
      return this.fullscreenEnabled;
    }
    get [_head$]() {
      return this.head;
    }
    get [dartx.hidden]() {
      return this.hidden;
    }
    get [dartx.implementation]() {
      return this.implementation;
    }
    get [_lastModified]() {
      return this.lastModified;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.pointerLockElement]() {
      return this.pointerLockElement;
    }
    get [_preferredStylesheetSet]() {
      return this.preferredStylesheetSet;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [_referrer]() {
      return this.referrer;
    }
    get [dartx.rootElement]() {
      return this.rootElement;
    }
    get [dartx.scrollingElement]() {
      return this.scrollingElement;
    }
    get [_selectedStylesheetSet]() {
      return this.selectedStylesheetSet;
    }
    set [_selectedStylesheetSet](value) {
      this.selectedStylesheetSet = value;
    }
    get [_styleSheets]() {
      return this.styleSheets;
    }
    get [dartx.timeline]() {
      return this.timeline;
    }
    get [_title]() {
      return this.title;
    }
    set [_title](value) {
      this.title = value;
    }
    get [_visibilityState]() {
      return this.visibilityState;
    }
    get [_webkitFullscreenElement]() {
      return this.webkitFullscreenElement;
    }
    get [_webkitFullscreenEnabled]() {
      return this.webkitFullscreenEnabled;
    }
    get [_webkitHidden]() {
      return this.webkitHidden;
    }
    get [_webkitVisibilityState]() {
      return this.webkitVisibilityState;
    }
    [dartx.adoptNode](...args) {
      return this.adoptNode.apply(this, args);
    }
    [_caretRangeFromPoint](...args) {
      return this.caretRangeFromPoint.apply(this, args);
    }
    [dartx.createDocumentFragment](...args) {
      return this.createDocumentFragment.apply(this, args);
    }
    [_createElement](...args) {
      return this.createElement.apply(this, args);
    }
    [_createElementNS](...args) {
      return this.createElementNS.apply(this, args);
    }
    [_createEvent](...args) {
      return this.createEvent.apply(this, args);
    }
    [dartx.createRange](...args) {
      return this.createRange.apply(this, args);
    }
    [_createTextNode](...args) {
      return this.createTextNode.apply(this, args);
    }
    [_createTouch](window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) {
      let target_1 = html$._convertDartToNative_EventTarget(target);
      return this[_createTouch_1](window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
    }
    [_createTouch_1](...args) {
      return this.createTouch.apply(this, args);
    }
    [_createTouchList](...args) {
      return this.createTouchList.apply(this, args);
    }
    [_elementFromPoint](...args) {
      return this.elementFromPoint.apply(this, args);
    }
    [dartx.elementsFromPoint](...args) {
      return this.elementsFromPoint.apply(this, args);
    }
    [dartx.execCommand](...args) {
      return this.execCommand.apply(this, args);
    }
    [dartx.exitFullscreen](...args) {
      return this.exitFullscreen.apply(this, args);
    }
    [dartx.exitPointerLock](...args) {
      return this.exitPointerLock.apply(this, args);
    }
    [_getCssCanvasContext](...args) {
      return this.getCSSCanvasContext.apply(this, args);
    }
    [dartx.getElementsByClassName](...args) {
      return this.getElementsByClassName.apply(this, args);
    }
    [dartx.getElementsByName](...args) {
      return this.getElementsByName.apply(this, args);
    }
    [dartx.getElementsByTagName](...args) {
      return this.getElementsByTagName.apply(this, args);
    }
    [dartx.importNode](...args) {
      return this.importNode.apply(this, args);
    }
    [dartx.queryCommandEnabled](...args) {
      return this.queryCommandEnabled.apply(this, args);
    }
    [dartx.queryCommandIndeterm](...args) {
      return this.queryCommandIndeterm.apply(this, args);
    }
    [dartx.queryCommandState](...args) {
      return this.queryCommandState.apply(this, args);
    }
    [dartx.queryCommandSupported](...args) {
      return this.queryCommandSupported.apply(this, args);
    }
    [dartx.queryCommandValue](...args) {
      return this.queryCommandValue.apply(this, args);
    }
    [dartx.transformDocumentToTreeView](...args) {
      return this.transformDocumentToTreeView.apply(this, args);
    }
    [_webkitExitFullscreen](...args) {
      return this.webkitExitFullscreen.apply(this, args);
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
    get [_childElementCount]() {
      return this.childElementCount;
    }
    get [_children]() {
      return this.children;
    }
    get [_firstElementChild]() {
      return this.firstElementChild;
    }
    get [_lastElementChild]() {
      return this.lastElementChild;
    }
    [dartx.querySelector](...args) {
      return this.querySelector.apply(this, args);
    }
    [_querySelectorAll](...args) {
      return this.querySelectorAll.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.Element.abortEvent.forTarget(this);
    }
    get [dartx.onBeforeCopy]() {
      return html$.Element.beforeCopyEvent.forTarget(this);
    }
    get [dartx.onBeforeCut]() {
      return html$.Element.beforeCutEvent.forTarget(this);
    }
    get [dartx.onBeforePaste]() {
      return html$.Element.beforePasteEvent.forTarget(this);
    }
    get [dartx.onBlur]() {
      return html$.Element.blurEvent.forTarget(this);
    }
    get [dartx.onCanPlay]() {
      return html$.Element.canPlayEvent.forTarget(this);
    }
    get [dartx.onCanPlayThrough]() {
      return html$.Element.canPlayThroughEvent.forTarget(this);
    }
    get [dartx.onChange]() {
      return html$.Element.changeEvent.forTarget(this);
    }
    get [dartx.onClick]() {
      return html$.Element.clickEvent.forTarget(this);
    }
    get [dartx.onContextMenu]() {
      return html$.Element.contextMenuEvent.forTarget(this);
    }
    get [dartx.onCopy]() {
      return html$.Element.copyEvent.forTarget(this);
    }
    get [dartx.onCut]() {
      return html$.Element.cutEvent.forTarget(this);
    }
    get [dartx.onDoubleClick]() {
      return html$.Element.doubleClickEvent.forTarget(this);
    }
    get [dartx.onDrag]() {
      return html$.Element.dragEvent.forTarget(this);
    }
    get [dartx.onDragEnd]() {
      return html$.Element.dragEndEvent.forTarget(this);
    }
    get [dartx.onDragEnter]() {
      return html$.Element.dragEnterEvent.forTarget(this);
    }
    get [dartx.onDragLeave]() {
      return html$.Element.dragLeaveEvent.forTarget(this);
    }
    get [dartx.onDragOver]() {
      return html$.Element.dragOverEvent.forTarget(this);
    }
    get [dartx.onDragStart]() {
      return html$.Element.dragStartEvent.forTarget(this);
    }
    get [dartx.onDrop]() {
      return html$.Element.dropEvent.forTarget(this);
    }
    get [dartx.onDurationChange]() {
      return html$.Element.durationChangeEvent.forTarget(this);
    }
    get [dartx.onEmptied]() {
      return html$.Element.emptiedEvent.forTarget(this);
    }
    get [dartx.onEnded]() {
      return html$.Element.endedEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.Element.errorEvent.forTarget(this);
    }
    get [dartx.onFocus]() {
      return html$.Element.focusEvent.forTarget(this);
    }
    get [dartx.onInput]() {
      return html$.Element.inputEvent.forTarget(this);
    }
    get [dartx.onInvalid]() {
      return html$.Element.invalidEvent.forTarget(this);
    }
    get [dartx.onKeyDown]() {
      return html$.Element.keyDownEvent.forTarget(this);
    }
    get [dartx.onKeyPress]() {
      return html$.Element.keyPressEvent.forTarget(this);
    }
    get [dartx.onKeyUp]() {
      return html$.Element.keyUpEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.Element.loadEvent.forTarget(this);
    }
    get [dartx.onLoadedData]() {
      return html$.Element.loadedDataEvent.forTarget(this);
    }
    get [dartx.onLoadedMetadata]() {
      return html$.Element.loadedMetadataEvent.forTarget(this);
    }
    get [dartx.onMouseDown]() {
      return html$.Element.mouseDownEvent.forTarget(this);
    }
    get [dartx.onMouseEnter]() {
      return html$.Element.mouseEnterEvent.forTarget(this);
    }
    get [dartx.onMouseLeave]() {
      return html$.Element.mouseLeaveEvent.forTarget(this);
    }
    get [dartx.onMouseMove]() {
      return html$.Element.mouseMoveEvent.forTarget(this);
    }
    get [dartx.onMouseOut]() {
      return html$.Element.mouseOutEvent.forTarget(this);
    }
    get [dartx.onMouseOver]() {
      return html$.Element.mouseOverEvent.forTarget(this);
    }
    get [dartx.onMouseUp]() {
      return html$.Element.mouseUpEvent.forTarget(this);
    }
    get [dartx.onMouseWheel]() {
      return html$.Element.mouseWheelEvent.forTarget(this);
    }
    get [dartx.onPaste]() {
      return html$.Element.pasteEvent.forTarget(this);
    }
    get [dartx.onPause]() {
      return html$.Element.pauseEvent.forTarget(this);
    }
    get [dartx.onPlay]() {
      return html$.Element.playEvent.forTarget(this);
    }
    get [dartx.onPlaying]() {
      return html$.Element.playingEvent.forTarget(this);
    }
    get [dartx.onPointerLockChange]() {
      return html$.Document.pointerLockChangeEvent.forTarget(this);
    }
    get [dartx.onPointerLockError]() {
      return html$.Document.pointerLockErrorEvent.forTarget(this);
    }
    get [dartx.onRateChange]() {
      return html$.Element.rateChangeEvent.forTarget(this);
    }
    get [dartx.onReadyStateChange]() {
      return html$.Document.readyStateChangeEvent.forTarget(this);
    }
    get [dartx.onReset]() {
      return html$.Element.resetEvent.forTarget(this);
    }
    get [dartx.onResize]() {
      return html$.Element.resizeEvent.forTarget(this);
    }
    get [dartx.onScroll]() {
      return html$.Element.scrollEvent.forTarget(this);
    }
    get [dartx.onSearch]() {
      return html$.Element.searchEvent.forTarget(this);
    }
    get [dartx.onSecurityPolicyViolation]() {
      return html$.Document.securityPolicyViolationEvent.forTarget(this);
    }
    get [dartx.onSeeked]() {
      return html$.Element.seekedEvent.forTarget(this);
    }
    get [dartx.onSeeking]() {
      return html$.Element.seekingEvent.forTarget(this);
    }
    get [dartx.onSelect]() {
      return html$.Element.selectEvent.forTarget(this);
    }
    get [dartx.onSelectionChange]() {
      return html$.Document.selectionChangeEvent.forTarget(this);
    }
    get [dartx.onSelectStart]() {
      return html$.Element.selectStartEvent.forTarget(this);
    }
    get [dartx.onStalled]() {
      return html$.Element.stalledEvent.forTarget(this);
    }
    get [dartx.onSubmit]() {
      return html$.Element.submitEvent.forTarget(this);
    }
    get [dartx.onSuspend]() {
      return html$.Element.suspendEvent.forTarget(this);
    }
    get [dartx.onTimeUpdate]() {
      return html$.Element.timeUpdateEvent.forTarget(this);
    }
    get [dartx.onTouchCancel]() {
      return html$.Element.touchCancelEvent.forTarget(this);
    }
    get [dartx.onTouchEnd]() {
      return html$.Element.touchEndEvent.forTarget(this);
    }
    get [dartx.onTouchMove]() {
      return html$.Element.touchMoveEvent.forTarget(this);
    }
    get [dartx.onTouchStart]() {
      return html$.Element.touchStartEvent.forTarget(this);
    }
    get [dartx.onVolumeChange]() {
      return html$.Element.volumeChangeEvent.forTarget(this);
    }
    get [dartx.onWaiting]() {
      return html$.Element.waitingEvent.forTarget(this);
    }
    get [dartx.onFullscreenChange]() {
      return html$.Element.fullscreenChangeEvent.forTarget(this);
    }
    get [dartx.onFullscreenError]() {
      return html$.Element.fullscreenErrorEvent.forTarget(this);
    }
    [dartx.querySelectorAll](T) {
      return selectors => {
        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
      };
    }
    [dartx.query](relativeSelectors) {
      return this[dartx.querySelector](relativeSelectors);
    }
    [dartx.queryAll](T) {
      return relativeSelectors => {
        return this[dartx.querySelectorAll](T)(relativeSelectors);
      };
    }
    get [dartx.supportsRegisterElement]() {
      return "registerElement" in this;
    }
    get [dartx.supportsRegister]() {
      return this[dartx.supportsRegisterElement];
    }
    [dartx.createElement](tagName, typeExtension) {
      if (typeExtension === void 0) typeExtension = null;
      return html$.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
    }
    [_createElement_2](tagName) {
      return this.createElement(tagName);
    }
    [_createElementNS_2](namespaceURI, qualifiedName) {
      return this.createElementNS(namespaceURI, qualifiedName);
    }
    [dartx.createElementNS](namespaceURI, qualifiedName, typeExtension) {
      if (typeExtension === void 0) typeExtension = null;
      return html$.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
    }
    [_createNodeIterator](root, whatToShow, filter) {
      if (whatToShow === void 0) whatToShow = null;
      if (filter === void 0) filter = null;
      return this.createNodeIterator(root, whatToShow, filter, false);
    }
    [_createTreeWalker](root, whatToShow, filter) {
      if (whatToShow === void 0) whatToShow = null;
      if (filter === void 0) filter = null;
      return this.createTreeWalker(root, whatToShow, filter, false);
    }
    get [dartx.visibilityState]() {
      return this.visibilityState || this.mozVisibilityState || this.msVisibilityState || this.webkitVisibilityState;
    }
  };
  dart.setSignature(html$.Document, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Document, [])}),
    fields: () => ({
      [dartx.activeElement]: html$.Element,
      [_body]: html$.HtmlElement,
      [dartx.contentType]: core.String,
      [dartx.cookie]: core.String,
      [dartx.currentScript]: html$.ScriptElement,
      [_get_window]: dart.dynamic,
      [dartx.documentElement]: html$.Element,
      [dartx.domain]: core.String,
      [dartx.fonts]: html$.FontFaceSet,
      [dartx.fullscreenElement]: html$.Element,
      [dartx.fullscreenEnabled]: core.bool,
      [_head$]: html$.HeadElement,
      [dartx.hidden]: core.bool,
      [dartx.implementation]: html$.DomImplementation,
      [_lastModified]: core.String,
      [dartx.origin]: core.String,
      [dartx.pointerLockElement]: html$.Element,
      [_preferredStylesheetSet]: core.String,
      [dartx.readyState]: core.String,
      [_referrer]: core.String,
      [dartx.rootElement]: svg$.SvgSvgElement,
      [dartx.scrollingElement]: html$.Element,
      [_selectedStylesheetSet]: core.String,
      [_styleSheets]: ListOfStyleSheet(),
      [dartx.timeline]: html$.AnimationTimeline,
      [_title]: core.String,
      [_visibilityState]: core.String,
      [_webkitFullscreenElement]: html$.Element,
      [_webkitFullscreenEnabled]: core.bool,
      [_webkitHidden]: core.bool,
      [_webkitVisibilityState]: core.String,
      [_childElementCount]: core.int,
      [_children]: ListOfNode(),
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    }),
    getters: () => ({
      [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBeforeCopy]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBeforeCut]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBeforePaste]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onCopy]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
      [dartx.onCut]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
      [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
      [dartx.onPaste]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPointerLockChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPointerLockError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSecurityPolicyViolation]: dart.definiteFunctionType(async.Stream$(html$.SecurityPolicyViolationEvent), []),
      [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelectionChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelectStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFullscreenChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFullscreenError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.supportsRegisterElement]: dart.definiteFunctionType(core.bool, []),
      [dartx.supportsRegister]: dart.definiteFunctionType(core.bool, []),
      [dartx.visibilityState]: dart.definiteFunctionType(core.String, [])
    }),
    methods: () => ({
      [dartx.adoptNode]: dart.definiteFunctionType(html$.Node, [html$.Node]),
      [_caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
      [dartx.createDocumentFragment]: dart.definiteFunctionType(html$.DocumentFragment, []),
      [_createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
      [_createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
      [_createEvent]: dart.definiteFunctionType(html$.Event, [core.String]),
      [dartx.createRange]: dart.definiteFunctionType(html$.Range, []),
      [_createTextNode]: dart.definiteFunctionType(html$.Text, [core.String]),
      [_createTouch]: dart.definiteFunctionType(html$.Touch, [html$.Window, html$.EventTarget, core.int, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
      [_createTouch_1]: dart.definiteFunctionType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_createTouchList]: dart.definiteFunctionType(html$.TouchList, [html$.Touch]),
      [_elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
      [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
      [dartx.execCommand]: dart.definiteFunctionType(core.bool, [core.String], [core.bool, core.String]),
      [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.exitPointerLock]: dart.definiteFunctionType(dart.void, []),
      [_getCssCanvasContext]: dart.definiteFunctionType(core.Object, [core.String, core.String, core.int, core.int]),
      [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.getElementsByName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.importNode]: dart.definiteFunctionType(html$.Node, [html$.Node], [core.bool]),
      [dartx.queryCommandEnabled]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandIndeterm]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandState]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandSupported]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.queryCommandValue]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.transformDocumentToTreeView]: dart.definiteFunctionType(dart.void, [core.String]),
      [_webkitExitFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
      [_createElement_2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
      [_createElementNS_2]: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
      [dartx.createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
      [_createNodeIterator]: dart.definiteFunctionType(html$.NodeIterator, [html$.Node], [core.int, html$.NodeFilter]),
      [_createTreeWalker]: dart.definiteFunctionType(html$.TreeWalker, [html$.Node], [core.int, html$.NodeFilter])
    }),
    sfields: () => ({
      pointerLockChangeEvent: EventStreamProviderOfEvent(),
      pointerLockErrorEvent: EventStreamProviderOfEvent(),
      readyStateChangeEvent: EventStreamProviderOfEvent(),
      securityPolicyViolationEvent: EventStreamProviderOfSecurityPolicyViolationEvent(),
      selectionChangeEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.Document, {
    get pointerLockChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pointerlockchange'));
    },
    get pointerLockErrorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pointerlockerror'));
    },
    get readyStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('readystatechange'));
    },
    get securityPolicyViolationEvent() {
      return dart.const(new (EventStreamProviderOfSecurityPolicyViolationEvent())('securitypolicyviolation'));
    },
    get selectionChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('selectionchange'));
    }
  });
  dart.registerExtension(dart.global.Document, html$.Document);
  const _docChildren = Symbol('_docChildren');
  dart.defineExtensionNames([
    'children',
    'children',
    'querySelectorAll',
    'innerHtml',
    'innerHtml',
    'setInnerHtml',
    'appendText',
    'appendHtml',
    'query',
    'queryAll',
    'getElementById',
    'querySelector'
  ]);
  html$.DocumentFragment = class DocumentFragment extends html$.Node {
    static new() {
      return html$.document[dartx.createDocumentFragment]();
    }
    static html(html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      return html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
    }
    static svg(svgContent, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      return svg$.SvgSvgElement.new()[dartx.createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
    }
    get [_children]() {
      return dart.throw(new core.UnimplementedError('Use _docChildren instead'));
    }
    get [_docChildren]() {
      return this._docChildren;
    }
    set [_docChildren](value) {
      this._docChildren = value;
    }
    get [dartx.children]() {
      if (this[_docChildren] == null) {
        this[_docChildren] = new html_common.FilteredElementList(this);
      }
      return this[_docChildren];
    }
    set [dartx.children](value) {
      let copy = value[dartx.toList]();
      let children = this[dartx.children];
      children[dartx.clear]();
      children[dartx.addAll](copy);
    }
    [dartx.querySelectorAll](T) {
      return selectors => {
        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
      };
    }
    get [dartx.innerHtml]() {
      let e = html$.Element.tag("div");
      e[dartx.append](this[dartx.clone](true));
      return e[dartx.innerHtml];
    }
    set [dartx.innerHtml](value) {
      this[dartx.setInnerHtml](value);
    }
    [dartx.setInnerHtml](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.nodes][dartx.clear]();
      this[dartx.append](html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
    }
    [dartx.appendText](text) {
      this[dartx.append](html$.Text.new(text));
    }
    [dartx.appendHtml](text, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let NodeTreeSanitizer = opts && 'NodeTreeSanitizer' in opts ? opts.NodeTreeSanitizer : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.append](html$.DocumentFragment.html(text, {validator: validator, treeSanitizer: html$.NodeTreeSanitizer._check(treeSanitizer)}));
    }
    [dartx.query](relativeSelectors) {
      return this[dartx.querySelector](relativeSelectors);
    }
    [dartx.queryAll](T) {
      return relativeSelectors => {
        return this[dartx.querySelectorAll](T)(relativeSelectors);
      };
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
    get [_childElementCount]() {
      return this.childElementCount;
    }
    get [_firstElementChild]() {
      return this.firstElementChild;
    }
    get [_lastElementChild]() {
      return this.lastElementChild;
    }
    [dartx.querySelector](...args) {
      return this.querySelector.apply(this, args);
    }
    [_querySelectorAll](...args) {
      return this.querySelectorAll.apply(this, args);
    }
  };
  html$.DocumentFragment[dart.implements] = () => [html$.NonElementParentNode, html$.ParentNode];
  dart.setSignature(html$.DocumentFragment, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.DocumentFragment, []),
      html: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      svg: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      _: dart.definiteFunctionType(html$.DocumentFragment, [])
    }),
    fields: () => ({
      [_docChildren]: ListOfElement(),
      [_childElementCount]: core.int,
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    }),
    getters: () => ({
      [_children]: dart.definiteFunctionType(html$.HtmlCollection, []),
      [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
      [dartx.innerHtml]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({
      [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
      [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    methods: () => ({
      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, NodeTreeSanitizer: dart.dynamic, treeSanitizer: dart.dynamic}),
      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
    })
  });
  dart.registerExtension(dart.global.DocumentFragment, html$.DocumentFragment);
  dart.defineExtensionNames([
    'message',
    'name'
  ]);
  html$.DomError = class DomError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(name, message) {
      if (message === void 0) message = null;
      if (message != null) {
        return html$.DomError._create_1(name, message);
      }
      return html$.DomError._create_2(name);
    }
    static _create_1(name, message) {
      return new DOMError(name, message);
    }
    static _create_2(name) {
      return new DOMError(name);
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.name]() {
      return this.name;
    }
  };
  dart.setSignature(html$.DomError, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomError, []),
      new: dart.definiteFunctionType(html$.DomError, [core.String], [core.String])
    }),
    fields: () => ({
      [dartx.message]: core.String,
      [dartx.name]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DomError, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DomError, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DOMError, html$.DomError);
  dart.defineExtensionNames([
    'name',
    'toString',
    'message'
  ]);
  html$.DomException = class DomException extends _interceptors.Interceptor {
    get [dartx.name]() {
      let errorName = this.name;
      if (dart.test(html_common.Device.isWebKit) && errorName == 'SECURITY_ERR') return 'SecurityError';
      if (dart.test(html_common.Device.isWebKit) && errorName == 'SYNTAX_ERR') return 'SyntaxError';
      return errorName;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.message]() {
      return this.message;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  dart.setSignature(html$.DomException, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomException, [])}),
    fields: () => ({[dartx.message]: core.String}),
    getters: () => ({[dartx.name]: dart.definiteFunctionType(core.String, [])}),
    sfields: () => ({
      INDEX_SIZE: core.String,
      HIERARCHY_REQUEST: core.String,
      WRONG_DOCUMENT: core.String,
      INVALID_CHARACTER: core.String,
      NO_MODIFICATION_ALLOWED: core.String,
      NOT_FOUND: core.String,
      NOT_SUPPORTED: core.String,
      INVALID_STATE: core.String,
      SYNTAX: core.String,
      INVALID_MODIFICATION: core.String,
      NAMESPACE: core.String,
      INVALID_ACCESS: core.String,
      TYPE_MISMATCH: core.String,
      SECURITY: core.String,
      NETWORK: core.String,
      ABORT: core.String,
      URL_MISMATCH: core.String,
      QUOTA_EXCEEDED: core.String,
      TIMEOUT: core.String,
      INVALID_NODE_TYPE: core.String,
      DATA_CLONE: core.String
    })
  });
  html$.DomException.INDEX_SIZE = 'IndexSizeError';
  html$.DomException.HIERARCHY_REQUEST = 'HierarchyRequestError';
  html$.DomException.WRONG_DOCUMENT = 'WrongDocumentError';
  html$.DomException.INVALID_CHARACTER = 'InvalidCharacterError';
  html$.DomException.NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
  html$.DomException.NOT_FOUND = 'NotFoundError';
  html$.DomException.NOT_SUPPORTED = 'NotSupportedError';
  html$.DomException.INVALID_STATE = 'InvalidStateError';
  html$.DomException.SYNTAX = 'SyntaxError';
  html$.DomException.INVALID_MODIFICATION = 'InvalidModificationError';
  html$.DomException.NAMESPACE = 'NamespaceError';
  html$.DomException.INVALID_ACCESS = 'InvalidAccessError';
  html$.DomException.TYPE_MISMATCH = 'TypeMismatchError';
  html$.DomException.SECURITY = 'SecurityError';
  html$.DomException.NETWORK = 'NetworkError';
  html$.DomException.ABORT = 'AbortError';
  html$.DomException.URL_MISMATCH = 'URLMismatchError';
  html$.DomException.QUOTA_EXCEEDED = 'QuotaExceededError';
  html$.DomException.TIMEOUT = 'TimeoutError';
  html$.DomException.INVALID_NODE_TYPE = 'InvalidNodeTypeError';
  html$.DomException.DATA_CLONE = 'DataCloneError';
  dart.registerExtension(dart.global.DOMException, html$.DomException);
  dart.defineExtensionNames([
    'createDocument',
    'createDocumentType',
    'createHtmlDocument',
    'hasFeature'
  ]);
  html$.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.createDocument](...args) {
      return this.createDocument.apply(this, args);
    }
    [dartx.createDocumentType](...args) {
      return this.createDocumentType.apply(this, args);
    }
    [dartx.createHtmlDocument](...args) {
      return this.createHTMLDocument.apply(this, args);
    }
    [dartx.hasFeature](...args) {
      return this.hasFeature.apply(this, args);
    }
  };
  dart.setSignature(html$.DomImplementation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomImplementation, [])}),
    methods: () => ({
      [dartx.createDocument]: dart.definiteFunctionType(html$.XmlDocument, [core.String, core.String, html$._DocumentType]),
      [dartx.createDocumentType]: dart.definiteFunctionType(html$._DocumentType, [core.String, core.String, core.String]),
      [dartx.createHtmlDocument]: dart.definiteFunctionType(html$.HtmlDocument, [core.String]),
      [dartx.hasFeature]: dart.definiteFunctionType(core.bool, [])
    })
  });
  dart.registerExtension(dart.global.DOMImplementation, html$.DomImplementation);
  dart.defineExtensionNames([
    'next'
  ]);
  html$.DomIterator = class DomIterator extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.next](...args) {
      return this.next.apply(this, args);
    }
  };
  dart.setSignature(html$.DomIterator, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomIterator, [])}),
    methods: () => ({[dartx.next]: dart.definiteFunctionType(core.Object, [], [core.Object])})
  });
  dart.registerExtension(dart.global.Iterator, html$.DomIterator);
  dart.defineExtensionNames([
    'a',
    'b',
    'c',
    'd',
    'e',
    'f',
    'is2D',
    'isIdentity',
    'm11',
    'm12',
    'm13',
    'm14',
    'm21',
    'm22',
    'm23',
    'm24',
    'm31',
    'm32',
    'm33',
    'm34',
    'm41',
    'm42',
    'm43',
    'm44',
    'multiply',
    'scale',
    'scale3d',
    'scaleNonUniform',
    'toFloat32Array',
    'toFloat64Array',
    'translate'
  ]);
  html$.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.a]() {
      return this.a;
    }
    get [dartx.b]() {
      return this.b;
    }
    get [dartx.c]() {
      return this.c;
    }
    get [dartx.d]() {
      return this.d;
    }
    get [dartx.e]() {
      return this.e;
    }
    get [dartx.f]() {
      return this.f;
    }
    get [dartx.is2D]() {
      return this.is2D;
    }
    get [dartx.isIdentity]() {
      return this.isIdentity;
    }
    get [dartx.m11]() {
      return this.m11;
    }
    get [dartx.m12]() {
      return this.m12;
    }
    get [dartx.m13]() {
      return this.m13;
    }
    get [dartx.m14]() {
      return this.m14;
    }
    get [dartx.m21]() {
      return this.m21;
    }
    get [dartx.m22]() {
      return this.m22;
    }
    get [dartx.m23]() {
      return this.m23;
    }
    get [dartx.m24]() {
      return this.m24;
    }
    get [dartx.m31]() {
      return this.m31;
    }
    get [dartx.m32]() {
      return this.m32;
    }
    get [dartx.m33]() {
      return this.m33;
    }
    get [dartx.m34]() {
      return this.m34;
    }
    get [dartx.m41]() {
      return this.m41;
    }
    get [dartx.m42]() {
      return this.m42;
    }
    get [dartx.m43]() {
      return this.m43;
    }
    get [dartx.m44]() {
      return this.m44;
    }
    [dartx.multiply](...args) {
      return this.multiply.apply(this, args);
    }
    [dartx.scale](...args) {
      return this.scale.apply(this, args);
    }
    [dartx.scale3d](...args) {
      return this.scale3d.apply(this, args);
    }
    [dartx.scaleNonUniform](...args) {
      return this.scaleNonUniform.apply(this, args);
    }
    [dartx.toFloat32Array](...args) {
      return this.toFloat32Array.apply(this, args);
    }
    [dartx.toFloat64Array](...args) {
      return this.toFloat64Array.apply(this, args);
    }
    [dartx.translate](...args) {
      return this.translate.apply(this, args);
    }
  };
  dart.setSignature(html$.DomMatrixReadOnly, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomMatrixReadOnly, [])}),
    getters: () => ({
      [dartx.a]: dart.definiteFunctionType(core.num, []),
      [dartx.b]: dart.definiteFunctionType(core.num, []),
      [dartx.c]: dart.definiteFunctionType(core.num, []),
      [dartx.d]: dart.definiteFunctionType(core.num, []),
      [dartx.e]: dart.definiteFunctionType(core.num, []),
      [dartx.f]: dart.definiteFunctionType(core.num, []),
      [dartx.is2D]: dart.definiteFunctionType(core.bool, []),
      [dartx.isIdentity]: dart.definiteFunctionType(core.bool, []),
      [dartx.m11]: dart.definiteFunctionType(core.num, []),
      [dartx.m12]: dart.definiteFunctionType(core.num, []),
      [dartx.m13]: dart.definiteFunctionType(core.num, []),
      [dartx.m14]: dart.definiteFunctionType(core.num, []),
      [dartx.m21]: dart.definiteFunctionType(core.num, []),
      [dartx.m22]: dart.definiteFunctionType(core.num, []),
      [dartx.m23]: dart.definiteFunctionType(core.num, []),
      [dartx.m24]: dart.definiteFunctionType(core.num, []),
      [dartx.m31]: dart.definiteFunctionType(core.num, []),
      [dartx.m32]: dart.definiteFunctionType(core.num, []),
      [dartx.m33]: dart.definiteFunctionType(core.num, []),
      [dartx.m34]: dart.definiteFunctionType(core.num, []),
      [dartx.m41]: dart.definiteFunctionType(core.num, []),
      [dartx.m42]: dart.definiteFunctionType(core.num, []),
      [dartx.m43]: dart.definiteFunctionType(core.num, []),
      [dartx.m44]: dart.definiteFunctionType(core.num, [])
    }),
    methods: () => ({
      [dartx.multiply]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
      [dartx.scale]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
      [dartx.scale3d]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
      [dartx.scaleNonUniform]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
      [dartx.toFloat32Array]: dart.definiteFunctionType(typed_data.Float32List, []),
      [dartx.toFloat64Array]: dart.definiteFunctionType(typed_data.Float64List, []),
      [dartx.translate]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
    })
  });
  dart.registerExtension(dart.global.DOMMatrixReadOnly, html$.DomMatrixReadOnly);
  dart.defineExtensionNames([
    'a',
    'a',
    'b',
    'b',
    'c',
    'c',
    'd',
    'd',
    'e',
    'e',
    'f',
    'f',
    'm11',
    'm11',
    'm12',
    'm12',
    'm13',
    'm13',
    'm14',
    'm14',
    'm21',
    'm21',
    'm22',
    'm22',
    'm23',
    'm23',
    'm24',
    'm24',
    'm31',
    'm31',
    'm32',
    'm32',
    'm33',
    'm33',
    'm34',
    'm34',
    'm41',
    'm41',
    'm42',
    'm42',
    'm43',
    'm43',
    'm44',
    'm44',
    'multiplySelf',
    'preMultiplySelf',
    'scale3dSelf',
    'scaleNonUniformSelf',
    'scaleSelf',
    'translateSelf'
  ]);
  html$.DomMatrix = class DomMatrix extends html$.DomMatrixReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(other) {
      if (other === void 0) other = null;
      if (other == null) {
        return html$.DomMatrix._create_1();
      }
      if (html$.DomMatrixReadOnly.is(other) || other == null) {
        return html$.DomMatrix._create_2(other);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new DOMMatrix();
    }
    static _create_2(other) {
      return new DOMMatrix(other);
    }
    get [dartx.a]() {
      return this.a;
    }
    set [dartx.a](value) {
      this.a = value;
    }
    get [dartx.b]() {
      return this.b;
    }
    set [dartx.b](value) {
      this.b = value;
    }
    get [dartx.c]() {
      return this.c;
    }
    set [dartx.c](value) {
      this.c = value;
    }
    get [dartx.d]() {
      return this.d;
    }
    set [dartx.d](value) {
      this.d = value;
    }
    get [dartx.e]() {
      return this.e;
    }
    set [dartx.e](value) {
      this.e = value;
    }
    get [dartx.f]() {
      return this.f;
    }
    set [dartx.f](value) {
      this.f = value;
    }
    get [dartx.m11]() {
      return this.m11;
    }
    set [dartx.m11](value) {
      this.m11 = value;
    }
    get [dartx.m12]() {
      return this.m12;
    }
    set [dartx.m12](value) {
      this.m12 = value;
    }
    get [dartx.m13]() {
      return this.m13;
    }
    set [dartx.m13](value) {
      this.m13 = value;
    }
    get [dartx.m14]() {
      return this.m14;
    }
    set [dartx.m14](value) {
      this.m14 = value;
    }
    get [dartx.m21]() {
      return this.m21;
    }
    set [dartx.m21](value) {
      this.m21 = value;
    }
    get [dartx.m22]() {
      return this.m22;
    }
    set [dartx.m22](value) {
      this.m22 = value;
    }
    get [dartx.m23]() {
      return this.m23;
    }
    set [dartx.m23](value) {
      this.m23 = value;
    }
    get [dartx.m24]() {
      return this.m24;
    }
    set [dartx.m24](value) {
      this.m24 = value;
    }
    get [dartx.m31]() {
      return this.m31;
    }
    set [dartx.m31](value) {
      this.m31 = value;
    }
    get [dartx.m32]() {
      return this.m32;
    }
    set [dartx.m32](value) {
      this.m32 = value;
    }
    get [dartx.m33]() {
      return this.m33;
    }
    set [dartx.m33](value) {
      this.m33 = value;
    }
    get [dartx.m34]() {
      return this.m34;
    }
    set [dartx.m34](value) {
      this.m34 = value;
    }
    get [dartx.m41]() {
      return this.m41;
    }
    set [dartx.m41](value) {
      this.m41 = value;
    }
    get [dartx.m42]() {
      return this.m42;
    }
    set [dartx.m42](value) {
      this.m42 = value;
    }
    get [dartx.m43]() {
      return this.m43;
    }
    set [dartx.m43](value) {
      this.m43 = value;
    }
    get [dartx.m44]() {
      return this.m44;
    }
    set [dartx.m44](value) {
      this.m44 = value;
    }
    [dartx.multiplySelf](...args) {
      return this.multiplySelf.apply(this, args);
    }
    [dartx.preMultiplySelf](...args) {
      return this.preMultiplySelf.apply(this, args);
    }
    [dartx.scale3dSelf](...args) {
      return this.scale3dSelf.apply(this, args);
    }
    [dartx.scaleNonUniformSelf](...args) {
      return this.scaleNonUniformSelf.apply(this, args);
    }
    [dartx.scaleSelf](...args) {
      return this.scaleSelf.apply(this, args);
    }
    [dartx.translateSelf](...args) {
      return this.translateSelf.apply(this, args);
    }
  };
  dart.setSignature(html$.DomMatrix, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomMatrix, []),
      new: dart.definiteFunctionType(html$.DomMatrix, [], [html$.DomMatrixReadOnly])
    }),
    setters: () => ({
      [dartx.a]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.b]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.c]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.d]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.e]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.f]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m11]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m12]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m13]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m14]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m21]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m22]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m23]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m24]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m31]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m32]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m33]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m34]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m41]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m42]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m43]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.m44]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    methods: () => ({
      [dartx.multiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
      [dartx.preMultiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
      [dartx.scale3dSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
      [dartx.scaleNonUniformSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
      [dartx.scaleSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
      [dartx.translateSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DomMatrix, []),
      _create_2: dart.definiteFunctionType(html$.DomMatrix, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.DOMMatrix, html$.DomMatrix);
  dart.defineExtensionNames([
    'parseFromString'
  ]);
  html$.DomParser = class DomParser extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.DomParser._create_1();
    }
    static _create_1() {
      return new DOMParser();
    }
    [dartx.parseFromString](...args) {
      return this.parseFromString.apply(this, args);
    }
  };
  dart.setSignature(html$.DomParser, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomParser, []),
      new: dart.definiteFunctionType(html$.DomParser, [])
    }),
    methods: () => ({[dartx.parseFromString]: dart.definiteFunctionType(html$.Document, [core.String, core.String])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomParser, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.DOMParser, html$.DomParser);
  dart.defineExtensionNames([
    'w',
    'x',
    'y',
    'z'
  ]);
  html$.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(x, y, z, w) {
      return html$.DomPointReadOnly._create_1(x, y, z, w);
    }
    static _create_1(x, y, z, w) {
      return new DOMPointReadOnly(x, y, z, w);
    }
    get [dartx.w]() {
      return this.w;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.setSignature(html$.DomPointReadOnly, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomPointReadOnly, []),
      new: dart.definiteFunctionType(html$.DomPointReadOnly, [core.num, core.num, core.num, core.num])
    }),
    getters: () => ({
      [dartx.w]: dart.definiteFunctionType(core.num, []),
      [dartx.x]: dart.definiteFunctionType(core.num, []),
      [dartx.y]: dart.definiteFunctionType(core.num, []),
      [dartx.z]: dart.definiteFunctionType(core.num, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomPointReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.DOMPointReadOnly, html$.DomPointReadOnly);
  dart.defineExtensionNames([
    'w',
    'w',
    'x',
    'x',
    'y',
    'y',
    'z',
    'z'
  ]);
  html$.DomPoint = class DomPoint extends html$.DomPointReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(point_OR_x, y, z, w) {
      if (point_OR_x === void 0) point_OR_x = null;
      if (y === void 0) y = null;
      if (z === void 0) z = null;
      if (w === void 0) w = null;
      if ((core.Map.is(point_OR_x) || point_OR_x == null) && y == null && z == null && w == null) {
        let point_1 = html_common.convertDartToNative_Dictionary(core.Map._check(point_OR_x));
        return html$.DomPoint._create_1(point_1);
      }
      if (point_OR_x == null && y == null && z == null && w == null) {
        return html$.DomPoint._create_2();
      }
      if ((typeof point_OR_x == 'number' || point_OR_x == null) && y == null && z == null && w == null) {
        return html$.DomPoint._create_3(point_OR_x);
      }
      if ((typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && z == null && w == null) {
        return html$.DomPoint._create_4(point_OR_x, y);
      }
      if ((typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && w == null) {
        return html$.DomPoint._create_5(point_OR_x, y, z);
      }
      if ((typeof w == 'number' || w == null) && (typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null)) {
        return html$.DomPoint._create_6(point_OR_x, y, z, w);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1(point_OR_x) {
      return new DOMPoint(point_OR_x);
    }
    static _create_2() {
      return new DOMPoint();
    }
    static _create_3(point_OR_x) {
      return new DOMPoint(point_OR_x);
    }
    static _create_4(point_OR_x, y) {
      return new DOMPoint(point_OR_x, y);
    }
    static _create_5(point_OR_x, y, z) {
      return new DOMPoint(point_OR_x, y, z);
    }
    static _create_6(point_OR_x, y, z, w) {
      return new DOMPoint(point_OR_x, y, z, w);
    }
    static get supported() {
      return !!window.DOMPoint || !!window.WebKitPoint;
    }
    get [dartx.w]() {
      return this.w;
    }
    set [dartx.w](value) {
      this.w = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.z]() {
      return this.z;
    }
    set [dartx.z](value) {
      this.z = value;
    }
  };
  dart.setSignature(html$.DomPoint, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomPoint, []),
      new: dart.definiteFunctionType(html$.DomPoint, [], [dart.dynamic, core.num, core.num, core.num])
    }),
    setters: () => ({
      [dartx.w]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.y]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.z]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.DomPoint, []),
      _create_3: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_6: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6']
  });
  dart.registerExtension(dart.global.DOMPoint, html$.DomPoint);
  dart.defineExtensionNames([
    'toString',
    '==',
    'hashCode',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft',
    'bottom',
    'height',
    'left',
    'right',
    'top',
    'width',
    'x',
    'y'
  ]);
  html$.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
    [dartx.toString]() {
      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
    }
    [dartx['==']](other) {
      if (!RectangleOfnum().is(other)) return false;
      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
    }
    get [dartx.hashCode]() {
      return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
    }
    [dartx.intersection](other) {
      let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
      let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      if (dart.notNull(x0) <= dart.notNull(x1)) {
        let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
        let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        if (dart.notNull(y0) <= dart.notNull(y1)) {
          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
        }
      }
      return null;
    }
    [dartx.intersects](other) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    [dartx.boundingBox](other) {
      let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
      let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
    }
    [dartx.containsRectangle](another) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
    }
    [dartx.containsPoint](another) {
      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    get [dartx.topLeft]() {
      return new (PointOfnum())(this[dartx.left], this[dartx.top]);
    }
    get [dartx.topRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
    }
    get [dartx.bottomRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    get [dartx.bottomLeft]() {
      return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(x, y, width, height) {
      return html$.DomRectReadOnly._create_1(x, y, width, height);
    }
    static _create_1(x, y, width, height) {
      return new DOMRectReadOnly(x, y, width, height);
    }
    get [dartx.bottom]() {
      return this.bottom;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.left]() {
      return this.left;
    }
    get [dartx.right]() {
      return this.right;
    }
    get [dartx.top]() {
      return this.top;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  html$.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
  dart.setSignature(html$.DomRectReadOnly, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.DomRectReadOnly, []),
      new: dart.definiteFunctionType(html$.DomRectReadOnly, [core.num, core.num, core.num, core.num])
    }),
    getters: () => ({
      [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottom]: dart.definiteFunctionType(core.num, []),
      [dartx.height]: dart.definiteFunctionType(core.num, []),
      [dartx.left]: dart.definiteFunctionType(core.num, []),
      [dartx.right]: dart.definiteFunctionType(core.num, []),
      [dartx.top]: dart.definiteFunctionType(core.num, []),
      [dartx.width]: dart.definiteFunctionType(core.num, []),
      [dartx.x]: dart.definiteFunctionType(core.num, []),
      [dartx.y]: dart.definiteFunctionType(core.num, [])
    }),
    methods: () => ({
      [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomRectReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.DOMRectReadOnly, html$.DomRectReadOnly);
  dart.defineExtensionNames([
    'add',
    'contains',
    'item',
    'remove',
    'toggle',
    'length'
  ]);
  html$.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.contains](...args) {
      return this.contains.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
    [dartx.toggle](...args) {
      return this.toggle.apply(this, args);
    }
  };
  dart.setSignature(html$.DomTokenList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomTokenList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.toggle]: dart.definiteFunctionType(core.bool, [core.String], [core.bool])
    })
  });
  dart.registerExtension(dart.global.DOMTokenList, html$.DomTokenList);
  dart.defineExtensionNames([
    'value'
  ]);
  html$.DomSettableTokenList = class DomSettableTokenList extends html$.DomTokenList {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.setSignature(html$.DomSettableTokenList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomSettableTokenList, [])}),
    fields: () => ({[dartx.value]: core.String})
  });
  dart.registerExtension(dart.global.DOMSettableTokenList, html$.DomSettableTokenList);
  html$.ImmutableListMixin$ = dart.generic(E => {
    let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html$.FixedSizeListIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
    dart.defineExtensionNames([
      'iterator',
      'add',
      'addAll',
      'sort',
      'shuffle',
      'insert',
      'insertAll',
      'setAll',
      'removeAt',
      'removeLast',
      'remove',
      'removeWhere',
      'retainWhere',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange'
    ]);
    class ImmutableListMixin extends core.Object {
      get iterator() {
        return new (FixedSizeListIteratorOfE())(this);
      }
      [Symbol.iterator]() {
        return new dart.JsIterator(this[dartx.iterator]);
      }
      add(value) {
        E._check(value);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      addAll(iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        dart.throw(new core.UnsupportedError("Cannot sort immutable List."));
      }
      shuffle(random) {
        if (random === void 0) random = null;
        dart.throw(new core.UnsupportedError("Cannot shuffle immutable List."));
      }
      insert(index, element) {
        E._check(element);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      insertAll(index, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
      }
      setAll(index, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
      }
      removeAt(pos) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      removeLast() {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      remove(object) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      removeWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      retainWhere(test) {
        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        dart.throw(new core.UnsupportedError("Cannot setRange on immutable List."));
      }
      removeRange(start, end) {
        dart.throw(new core.UnsupportedError("Cannot removeRange on immutable List."));
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
      }
      fillRange(start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
      }
    }
    dart.addTypeTests(ImmutableListMixin);
    ImmutableListMixin[dart.implements] = () => [ListOfE()];
    dart.setSignature(ImmutableListMixin, {
      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [E]),
        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        removeLast: dart.definiteFunctionType(E, []),
        remove: dart.definiteFunctionType(core.bool, [core.Object]),
        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
      })
    });
    dart.defineExtensionMembers(ImmutableListMixin, [
      'add',
      'addAll',
      'sort',
      'shuffle',
      'insert',
      'insertAll',
      'setAll',
      'removeAt',
      'removeLast',
      'remove',
      'removeWhere',
      'retainWhere',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange',
      'iterator'
    ]);
    return ImmutableListMixin;
  });
  html$.ImmutableListMixin = ImmutableListMixin();
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.DomStringList = class DomStringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.item](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.DomStringList[dart.implements] = () => [ListOfString()];
  dart.setSignature(html$.DomStringList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomStringList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(core.String, []),
      [dartx.last]: dart.definiteFunctionType(core.String, []),
      [dartx.single]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.elementAt]: dart.definiteFunctionType(core.String, [core.int]),
      [__getter__]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
    })
  });
  dart.registerExtension(dart.global.DOMStringList, html$.DomStringList);
  html$.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.DomStringMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.DomStringMap, [])})
  });
  html$.EffectModel = class EffectModel extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.EffectModel, {
    constructors: () => ({_: dart.definiteFunctionType(html$.EffectModel, [])})
  });
  dart.registerExtension(dart.global.EffectModel, html$.EffectModel);
  const _childElements = Symbol('_childElements');
  const _element$ = Symbol('_element');
  const _filter$ = Symbol('_filter');
  html$._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html$.Element) {
    _wrap(element) {
      this[_childElements] = html$.HtmlCollection._check(element[_children]);
      this[_element$] = element;
    }
    contains(element) {
      return this[_childElements][dartx.contains](element);
    }
    get isEmpty() {
      return this[_element$][_firstElementChild] == null;
    }
    get length() {
      return this[_childElements][dartx.length];
    }
    _get(index) {
      return html$.Element._check(this[_childElements][dartx._get](index));
    }
    _set(index, value) {
      this[_element$][_replaceChild](value, this[_childElements][dartx._get](index));
      return value;
    }
    set length(newLength) {
      dart.throw(new core.UnsupportedError('Cannot resize element lists'));
    }
    add(value) {
      this[_element$][dartx.append](value);
      return value;
    }
    get iterator() {
      return this[dartx.toList]()[dartx.iterator];
    }
    addAll(iterable) {
      if (html$._ChildNodeListLazy.is(iterable)) {
        iterable = ListOfElement().from(iterable);
      }
      for (let element of iterable) {
        this[_element$][dartx.append](element);
      }
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError('Cannot sort element lists'));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError('Cannot shuffle element lists'));
    }
    removeWhere(test) {
      this[_filter$](test, false);
    }
    retainWhere(test) {
      this[_filter$](test, true);
    }
    [_filter$](test, retainMatching) {
      let removed = null;
      if (dart.test(retainMatching)) {
        removed = this[_element$][dartx.children][dartx.where](dart.fn(e => !dart.test(test(e)), ElementTobool$()));
      } else {
        removed = this[_element$][dartx.children][dartx.where](test);
      }
      for (let e of core.Iterable._check(removed))
        dart.dsend(e, 'remove');
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnimplementedError());
    }
    replaceRange(start, end, iterable) {
      dart.throw(new core.UnimplementedError());
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      dart.throw(new core.UnimplementedError());
    }
    remove(object) {
      if (html$.Element.is(object)) {
        let element = object;
        if (core.identical(element[dartx.parentNode], this[_element$])) {
          this[_element$][_removeChild](element);
          return true;
        }
      }
      return false;
    }
    insert(index, element) {
      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
      if (index == this.length) {
        this[_element$][dartx.append](element);
      } else {
        this[_element$][dartx.insertBefore](element, this._get(index));
      }
    }
    setAll(index, iterable) {
      dart.throw(new core.UnimplementedError());
    }
    clear() {
      this[_element$][_clearChildren]();
    }
    removeAt(index) {
      let result = this._get(index);
      if (result != null) {
        this[_element$][_removeChild](result);
      }
      return result;
    }
    removeLast() {
      let result = this.last;
      if (result != null) {
        this[_element$][_removeChild](result);
      }
      return result;
    }
    get first() {
      let result = this[_element$][_firstElementChild];
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get last() {
      let result = this[_element$][_lastElementChild];
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get single() {
      if (dart.notNull(this.length) > 1) dart.throw(new core.StateError("More than one element"));
      return this.first;
    }
    get rawList() {
      return this[_childElements];
    }
  };
  dart.addSimpleTypeTests(html$._ChildrenElementList);
  dart.defineNamedConstructor(html$._ChildrenElementList, '_wrap');
  html$._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setSignature(html$._ChildrenElementList, {
    constructors: () => ({_wrap: dart.definiteFunctionType(html$._ChildrenElementList, [html$.Element])}),
    fields: () => ({
      [_element$]: html$.Element,
      [_childElements]: html$.HtmlCollection
    }),
    getters: () => ({
      length: dart.definiteFunctionType(core.int, []),
      iterator: dart.definiteFunctionType(core.Iterator$(html$.Element), []),
      first: dart.definiteFunctionType(html$.Element, []),
      last: dart.definiteFunctionType(html$.Element, []),
      single: dart.definiteFunctionType(html$.Element, []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      _get: dart.definiteFunctionType(html$.Element, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      add: dart.definiteFunctionType(html$.Element, [html$.Element]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfElement()]),
      sort: dart.definiteFunctionType(dart.void, [], [ElementAndElementToint()]),
      removeWhere: dart.definiteFunctionType(dart.void, [ElementTobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [ElementTobool()]),
      [_filter$]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()], [core.int]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.Element]),
      insert: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfElement()]),
      removeAt: dart.definiteFunctionType(html$.Element, [core.int]),
      removeLast: dart.definiteFunctionType(html$.Element, [])
    })
  });
  dart.defineExtensionMembers(html$._ChildrenElementList, [
    'contains',
    '_get',
    '_set',
    'add',
    'addAll',
    'sort',
    'shuffle',
    'removeWhere',
    'retainWhere',
    'setRange',
    'replaceRange',
    'fillRange',
    'remove',
    'insert',
    'setAll',
    'clear',
    'removeAt',
    'removeLast',
    'isEmpty',
    'length',
    'length',
    'iterator',
    'first',
    'last',
    'single'
  ]);
  html$.ElementList$ = dart.generic(T => {
    class ElementList extends collection.ListBase$(T) {}
    return ElementList;
  });
  html$.ElementList = ElementList();
  const _nodeList = Symbol('_nodeList');
  const _forElementList = Symbol('_forElementList');
  html$._FrozenElementList$ = dart.generic(E => {
    let ElementListOfE = () => (ElementListOfE = dart.constFn(html$.ElementList$(E)))();
    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
    let EToIterableOfString = () => (EToIterableOfString = dart.constFn(dart.definiteFunctionType(IterableOfString(), [E])))();
    class _FrozenElementList extends collection.ListBase$(E) {
      _wrap(nodeList) {
        this[_nodeList] = nodeList;
      }
      get length() {
        return this[_nodeList][dartx.length];
      }
      _get(index) {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx._get](index));
      }
      _set(index, value) {
        E._check(value);
        dart.throw(new core.UnsupportedError('Cannot modify list'));
        return value;
      }
      set length(newLength) {
        dart.throw(new core.UnsupportedError('Cannot modify list'));
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        dart.throw(new core.UnsupportedError('Cannot sort list'));
      }
      shuffle(random) {
        if (random === void 0) random = null;
        dart.throw(new core.UnsupportedError('Cannot shuffle list'));
      }
      get first() {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.first]);
      }
      get last() {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.last]);
      }
      get single() {
        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.single]);
      }
      get classes() {
        return html$._MultiElementCssClassSet.new(this);
      }
      get style() {
        return new html$._CssStyleDeclarationSet(this);
      }
      set classes(value) {
        this[dartx.forEach](dart.fn(e => e[dartx.classes] = value, EToIterableOfString()));
      }
      get contentEdge() {
        return new html$._ContentCssListRect(this);
      }
      get paddingEdge() {
        return this.first[dartx.paddingEdge];
      }
      get borderEdge() {
        return this.first[dartx.borderEdge];
      }
      get marginEdge() {
        return this.first[dartx.marginEdge];
      }
      get rawList() {
        return this[_nodeList];
      }
      get onAbort() {
        return html$.Element.abortEvent[_forElementList](this);
      }
      get onBeforeCopy() {
        return html$.Element.beforeCopyEvent[_forElementList](this);
      }
      get onBeforeCut() {
        return html$.Element.beforeCutEvent[_forElementList](this);
      }
      get onBeforePaste() {
        return html$.Element.beforePasteEvent[_forElementList](this);
      }
      get onBlur() {
        return html$.Element.blurEvent[_forElementList](this);
      }
      get onCanPlay() {
        return html$.Element.canPlayEvent[_forElementList](this);
      }
      get onCanPlayThrough() {
        return html$.Element.canPlayThroughEvent[_forElementList](this);
      }
      get onChange() {
        return html$.Element.changeEvent[_forElementList](this);
      }
      get onClick() {
        return html$.Element.clickEvent[_forElementList](this);
      }
      get onContextMenu() {
        return html$.Element.contextMenuEvent[_forElementList](this);
      }
      get onCopy() {
        return html$.Element.copyEvent[_forElementList](this);
      }
      get onCut() {
        return html$.Element.cutEvent[_forElementList](this);
      }
      get onDoubleClick() {
        return html$.Element.doubleClickEvent[_forElementList](this);
      }
      get onDrag() {
        return html$.Element.dragEvent[_forElementList](this);
      }
      get onDragEnd() {
        return html$.Element.dragEndEvent[_forElementList](this);
      }
      get onDragEnter() {
        return html$.Element.dragEnterEvent[_forElementList](this);
      }
      get onDragLeave() {
        return html$.Element.dragLeaveEvent[_forElementList](this);
      }
      get onDragOver() {
        return html$.Element.dragOverEvent[_forElementList](this);
      }
      get onDragStart() {
        return html$.Element.dragStartEvent[_forElementList](this);
      }
      get onDrop() {
        return html$.Element.dropEvent[_forElementList](this);
      }
      get onDurationChange() {
        return html$.Element.durationChangeEvent[_forElementList](this);
      }
      get onEmptied() {
        return html$.Element.emptiedEvent[_forElementList](this);
      }
      get onEnded() {
        return html$.Element.endedEvent[_forElementList](this);
      }
      get onError() {
        return html$.Element.errorEvent[_forElementList](this);
      }
      get onFocus() {
        return html$.Element.focusEvent[_forElementList](this);
      }
      get onInput() {
        return html$.Element.inputEvent[_forElementList](this);
      }
      get onInvalid() {
        return html$.Element.invalidEvent[_forElementList](this);
      }
      get onKeyDown() {
        return html$.Element.keyDownEvent[_forElementList](this);
      }
      get onKeyPress() {
        return html$.Element.keyPressEvent[_forElementList](this);
      }
      get onKeyUp() {
        return html$.Element.keyUpEvent[_forElementList](this);
      }
      get onLoad() {
        return html$.Element.loadEvent[_forElementList](this);
      }
      get onLoadedData() {
        return html$.Element.loadedDataEvent[_forElementList](this);
      }
      get onLoadedMetadata() {
        return html$.Element.loadedMetadataEvent[_forElementList](this);
      }
      get onMouseDown() {
        return html$.Element.mouseDownEvent[_forElementList](this);
      }
      get onMouseEnter() {
        return html$.Element.mouseEnterEvent[_forElementList](this);
      }
      get onMouseLeave() {
        return html$.Element.mouseLeaveEvent[_forElementList](this);
      }
      get onMouseMove() {
        return html$.Element.mouseMoveEvent[_forElementList](this);
      }
      get onMouseOut() {
        return html$.Element.mouseOutEvent[_forElementList](this);
      }
      get onMouseOver() {
        return html$.Element.mouseOverEvent[_forElementList](this);
      }
      get onMouseUp() {
        return html$.Element.mouseUpEvent[_forElementList](this);
      }
      get onMouseWheel() {
        return html$.Element.mouseWheelEvent[_forElementList](this);
      }
      get onPaste() {
        return html$.Element.pasteEvent[_forElementList](this);
      }
      get onPause() {
        return html$.Element.pauseEvent[_forElementList](this);
      }
      get onPlay() {
        return html$.Element.playEvent[_forElementList](this);
      }
      get onPlaying() {
        return html$.Element.playingEvent[_forElementList](this);
      }
      get onRateChange() {
        return html$.Element.rateChangeEvent[_forElementList](this);
      }
      get onReset() {
        return html$.Element.resetEvent[_forElementList](this);
      }
      get onResize() {
        return html$.Element.resizeEvent[_forElementList](this);
      }
      get onScroll() {
        return html$.Element.scrollEvent[_forElementList](this);
      }
      get onSearch() {
        return html$.Element.searchEvent[_forElementList](this);
      }
      get onSeeked() {
        return html$.Element.seekedEvent[_forElementList](this);
      }
      get onSeeking() {
        return html$.Element.seekingEvent[_forElementList](this);
      }
      get onSelect() {
        return html$.Element.selectEvent[_forElementList](this);
      }
      get onSelectStart() {
        return html$.Element.selectStartEvent[_forElementList](this);
      }
      get onStalled() {
        return html$.Element.stalledEvent[_forElementList](this);
      }
      get onSubmit() {
        return html$.Element.submitEvent[_forElementList](this);
      }
      get onSuspend() {
        return html$.Element.suspendEvent[_forElementList](this);
      }
      get onTimeUpdate() {
        return html$.Element.timeUpdateEvent[_forElementList](this);
      }
      get onTouchCancel() {
        return html$.Element.touchCancelEvent[_forElementList](this);
      }
      get onTouchEnd() {
        return html$.Element.touchEndEvent[_forElementList](this);
      }
      get onTouchEnter() {
        return html$.Element.touchEnterEvent[_forElementList](this);
      }
      get onTouchLeave() {
        return html$.Element.touchLeaveEvent[_forElementList](this);
      }
      get onTouchMove() {
        return html$.Element.touchMoveEvent[_forElementList](this);
      }
      get onTouchStart() {
        return html$.Element.touchStartEvent[_forElementList](this);
      }
      get onTransitionEnd() {
        return html$.Element.transitionEndEvent[_forElementList](this);
      }
      get onVolumeChange() {
        return html$.Element.volumeChangeEvent[_forElementList](this);
      }
      get onWaiting() {
        return html$.Element.waitingEvent[_forElementList](this);
      }
      get onFullscreenChange() {
        return html$.Element.fullscreenChangeEvent[_forElementList](this);
      }
      get onFullscreenError() {
        return html$.Element.fullscreenErrorEvent[_forElementList](this);
      }
    }
    dart.defineNamedConstructor(_FrozenElementList, '_wrap');
    _FrozenElementList[dart.implements] = () => [ElementListOfE(), html_common.NodeListWrapper];
    dart.setSignature(_FrozenElementList, {
      constructors: () => ({_wrap: dart.definiteFunctionType(html$._FrozenElementList$(E), [ListOfNode()])}),
      fields: () => ({[_nodeList]: ListOfNode()}),
      getters: () => ({
        length: dart.definiteFunctionType(core.int, []),
        first: dart.definiteFunctionType(E, []),
        last: dart.definiteFunctionType(E, []),
        single: dart.definiteFunctionType(E, []),
        classes: dart.definiteFunctionType(html$.CssClassSet, []),
        style: dart.definiteFunctionType(html$.CssStyleDeclarationBase, []),
        contentEdge: dart.definiteFunctionType(html$.CssRect, []),
        paddingEdge: dart.definiteFunctionType(html$.CssRect, []),
        borderEdge: dart.definiteFunctionType(html$.CssRect, []),
        marginEdge: dart.definiteFunctionType(html$.CssRect, []),
        rawList: dart.definiteFunctionType(core.List$(html$.Node), []),
        onAbort: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBeforeCopy: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBeforeCut: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBeforePaste: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onBlur: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onCanPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onCanPlayThrough: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onClick: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onContextMenu: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onCopy: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
        onCut: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
        onDoubleClick: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onDrag: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragEnd: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDragStart: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDrop: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onDurationChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onEmptied: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onEnded: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onFocus: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onInput: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onInvalid: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onKeyDown: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
        onKeyPress: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
        onKeyUp: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
        onLoad: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onLoadedData: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onLoadedMetadata: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onMouseDown: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseMove: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseOut: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseUp: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
        onMouseWheel: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
        onPaste: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
        onPause: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onPlaying: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onRateChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onReset: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onResize: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onScroll: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSearch: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSeeked: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSeeking: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSelect: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSelectStart: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onStalled: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSubmit: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onSuspend: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onTimeUpdate: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onTouchCancel: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchEnter: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchLeave: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchMove: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTouchStart: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
        onTransitionEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
        onVolumeChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onWaiting: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onFullscreenChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
        onFullscreenError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
      }),
      setters: () => ({
        length: dart.definiteFunctionType(dart.void, [core.int]),
        classes: dart.definiteFunctionType(dart.void, [IterableOfString()])
      }),
      methods: () => ({
        _get: dart.definiteFunctionType(E, [core.int]),
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfE()])
      })
    });
    dart.defineExtensionMembers(_FrozenElementList, [
      '_get',
      '_set',
      'sort',
      'shuffle',
      'length',
      'length',
      'first',
      'last',
      'single'
    ]);
    return _FrozenElementList;
  });
  html$._FrozenElementList = _FrozenElementList();
  html$._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
    static createElement_tag(tag, typeExtension) {
      if (typeExtension != null) {
        return document.createElement(tag, typeExtension);
      }
      return document.createElement(tag);
    }
  };
  dart.setSignature(html$._ElementFactoryProvider, {
    statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
    names: ['createElement_tag']
  });
  const _value$1 = Symbol('_value');
  html$.ScrollAlignment = class ScrollAlignment extends core.Object {
    _internal(value) {
      this[_value$1] = value;
    }
    toString() {
      return dart.str`ScrollAlignment.${this[_value$1]}`;
    }
  };
  dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
  dart.setSignature(html$.ScrollAlignment, {
    constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
    fields: () => ({[_value$1]: dart.dynamic}),
    sfields: () => ({
      TOP: html$.ScrollAlignment,
      CENTER: html$.ScrollAlignment,
      BOTTOM: html$.ScrollAlignment
    })
  });
  dart.defineLazy(html$.ScrollAlignment, {
    get TOP() {
      return dart.const(new html$.ScrollAlignment._internal('TOP'));
    },
    get CENTER() {
      return dart.const(new html$.ScrollAlignment._internal('CENTER'));
    },
    get BOTTOM() {
      return dart.const(new html$.ScrollAlignment._internal('BOTTOM'));
    }
  });
  const __setter__ = Symbol('__setter__');
  dart.defineExtensionNames([
    'height',
    'name',
    'src',
    'type',
    'width'
  ]);
  html$.EmbedElement = class EmbedElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.EmbedElement._check(html$.document[dartx.createElement]("embed"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.name] = null;
      this[dartx.src] = null;
      this[dartx.type] = null;
      this[dartx.width] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('embed');
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.EmbedElement, 'created');
  dart.setSignature(html$.EmbedElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.EmbedElement, []),
      new: dart.definiteFunctionType(html$.EmbedElement, []),
      created: dart.definiteFunctionType(html$.EmbedElement, [])
    }),
    fields: () => ({
      [dartx.height]: core.String,
      [dartx.name]: core.String,
      [dartx.src]: core.String,
      [dartx.type]: core.String,
      [dartx.width]: core.String
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLEmbedElement, html$.EmbedElement);
  html$._EntriesCallback = dart.typedef('_EntriesCallback', () => dart.functionType(dart.void, [ListOfEntry()]));
  html$._EntryCallback = dart.typedef('_EntryCallback', () => dart.functionType(dart.void, [html$.Entry]));
  html$._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [html$.FileError]));
  dart.defineExtensionNames([
    'colno',
    'error',
    'filename',
    'lineno',
    'message'
  ]);
  html$.ErrorEvent = class ErrorEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ErrorEvent._create_1(type, eventInitDict_1);
      }
      return html$.ErrorEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ErrorEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ErrorEvent(type);
    }
    get [dartx.colno]() {
      return this.colno;
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.filename]() {
      return this.filename;
    }
    get [dartx.lineno]() {
      return this.lineno;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(html$.ErrorEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ErrorEvent, []),
      new: dart.definiteFunctionType(html$.ErrorEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.colno]: core.int,
      [dartx.error]: core.Object,
      [dartx.filename]: core.String,
      [dartx.lineno]: core.int,
      [dartx.message]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ErrorEvent, html$.ErrorEvent);
  dart.defineExtensionNames([
    'close',
    'onError',
    'onMessage',
    'onOpen',
    'readyState',
    'url',
    'withCredentials'
  ]);
  html$.EventSource = class EventSource extends html$.EventTarget {
    static new(url, opts) {
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : false;
      let parsedOptions = dart.map({withCredentials: withCredentials}, core.String, dart.dynamic);
      return html$.EventSource._factoryEventSource(url, parsedOptions);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static _factoryEventSource(url, eventSourceInitDict) {
      if (eventSourceInitDict === void 0) eventSourceInitDict = null;
      if (eventSourceInitDict != null) {
        let eventSourceInitDict_1 = html_common.convertDartToNative_Dictionary(eventSourceInitDict);
        return html$.EventSource._create_1(url, eventSourceInitDict_1);
      }
      return html$.EventSource._create_2(url);
    }
    static _create_1(url, eventSourceInitDict) {
      return new EventSource(url, eventSourceInitDict);
    }
    static _create_2(url) {
      return new EventSource(url);
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.url]() {
      return this.url;
    }
    get [dartx.withCredentials]() {
      return this.withCredentials;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.EventSource.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.EventSource.messageEvent.forTarget(this);
    }
    get [dartx.onOpen]() {
      return html$.EventSource.openEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.EventSource, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.EventSource, [core.String], {withCredentials: dart.dynamic}),
      _: dart.definiteFunctionType(html$.EventSource, [])
    }),
    fields: () => ({
      [dartx.readyState]: core.int,
      [dartx.url]: core.String,
      [dartx.withCredentials]: core.bool
    }),
    getters: () => ({
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      openEvent: EventStreamProviderOfEvent(),
      CLOSED: core.int,
      CONNECTING: core.int,
      OPEN: core.int
    }),
    statics: () => ({
      _factoryEventSource: dart.definiteFunctionType(html$.EventSource, [core.String], [core.Map]),
      _create_1: dart.definiteFunctionType(html$.EventSource, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.EventSource, [dart.dynamic])
    }),
    names: ['_factoryEventSource', '_create_1', '_create_2']
  });
  html$.EventSource.CLOSED = 2;
  html$.EventSource.CONNECTING = 0;
  html$.EventSource.OPEN = 1;
  dart.defineLazy(html$.EventSource, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get openEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('open'));
    }
  });
  dart.registerExtension(dart.global.EventSource, html$.EventSource);
  const _ptr = Symbol('_ptr');
  html$.Events = class Events extends core.Object {
    new(ptr) {
      this[_ptr] = ptr;
    }
    _get(type) {
      return new (_EventStreamOfEvent())(this[_ptr], type, false);
    }
  };
  dart.setSignature(html$.Events, {
    constructors: () => ({new: dart.definiteFunctionType(html$.Events, [html$.EventTarget])}),
    fields: () => ({[_ptr]: html$.EventTarget}),
    methods: () => ({_get: dart.definiteFunctionType(async.Stream, [core.String])})
  });
  html$.ElementEvents = class ElementEvents extends html$.Events {
    new(ptr) {
      super.new(ptr);
    }
    _get(type) {
      if (dart.test(html$.ElementEvents.webkitEvents[dartx.keys][dartx.contains](type[dartx.toLowerCase]()))) {
        if (dart.test(html_common.Device.isWebKit)) {
          return new (_ElementEventStreamImplOfEvent())(this[_ptr], html$.ElementEvents.webkitEvents[dartx._get](type[dartx.toLowerCase]()), false);
        }
      }
      return new (_ElementEventStreamImplOfEvent())(this[_ptr], type, false);
    }
  };
  dart.setSignature(html$.ElementEvents, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ElementEvents, [html$.Element])}),
    sfields: () => ({webkitEvents: MapOfString$String()})
  });
  dart.defineLazy(html$.ElementEvents, {
    get webkitEvents() {
      return dart.map({animationend: 'webkitAnimationEnd', animationiteration: 'webkitAnimationIteration', animationstart: 'webkitAnimationStart', fullscreenchange: 'webkitfullscreenchange', fullscreenerror: 'webkitfullscreenerror', keyadded: 'webkitkeyadded', keyerror: 'webkitkeyerror', keymessage: 'webkitkeymessage', needkey: 'webkitneedkey', pointerlockchange: 'webkitpointerlockchange', pointerlockerror: 'webkitpointerlockerror', resourcetimingbufferfull: 'webkitresourcetimingbufferfull', transitionend: 'webkitTransitionEnd', speechchange: 'webkitSpeechChange'}, core.String, core.String);
    }
  });
  dart.defineExtensionNames([
    'waitUntil'
  ]);
  html$.ExtendableEvent = class ExtendableEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ExtendableEvent._create_1(type, eventInitDict_1);
      }
      return html$.ExtendableEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ExtendableEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ExtendableEvent(type);
    }
    [dartx.waitUntil](...args) {
      return this.waitUntil.apply(this, args);
    }
  };
  dart.setSignature(html$.ExtendableEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ExtendableEvent, []),
      new: dart.definiteFunctionType(html$.ExtendableEvent, [core.String], [core.Map])
    }),
    methods: () => ({[dartx.waitUntil]: dart.definiteFunctionType(dart.void, [core.Object])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ExtendableEvent, html$.ExtendableEvent);
  dart.defineExtensionNames([
    'protocol',
    'provider'
  ]);
  html$.FederatedCredential = class FederatedCredential extends html$.Credential {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(data) {
      let data_1 = html_common.convertDartToNative_Dictionary(data);
      return html$.FederatedCredential._create_1(data_1);
    }
    static _create_1(data) {
      return new FederatedCredential(data);
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    get [dartx.provider]() {
      return this.provider;
    }
  };
  dart.setSignature(html$.FederatedCredential, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FederatedCredential, []),
      new: dart.definiteFunctionType(html$.FederatedCredential, [core.Map])
    }),
    fields: () => ({
      [dartx.protocol]: core.String,
      [dartx.provider]: core.String
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.FederatedCredential, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.FederatedCredential, html$.FederatedCredential);
  dart.defineExtensionNames([
    'respondWith',
    'isReload',
    'request'
  ]);
  html$.FetchEvent = class FetchEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.FetchEvent._create_1(type, eventInitDict_1);
      }
      return html$.FetchEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new FetchEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new FetchEvent(type);
    }
    get [dartx.isReload]() {
      return this.isReload;
    }
    get [dartx.request]() {
      return this.request;
    }
    [dartx.respondWith](...args) {
      return this.respondWith.apply(this, args);
    }
  };
  dart.setSignature(html$.FetchEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FetchEvent, []),
      new: dart.definiteFunctionType(html$.FetchEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.isReload]: core.bool,
      [dartx.request]: html$._Request
    }),
    methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(dart.void, [core.Object])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FetchEvent, html$.FetchEvent);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'disabled',
    'elements',
    'form',
    'name',
    'type',
    'validationMessage',
    'validity',
    'willValidate'
  ]);
  html$.FieldSetElement = class FieldSetElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.FieldSetElement._check(html$.document[dartx.createElement]("fieldset"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.elements] = null;
      this[dartx.form] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.elements]() {
      return this.elements;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.FieldSetElement, 'created');
  dart.setSignature(html$.FieldSetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FieldSetElement, []),
      new: dart.definiteFunctionType(html$.FieldSetElement, []),
      created: dart.definiteFunctionType(html$.FieldSetElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.elements]: html$.HtmlFormControlsCollection,
      [dartx.form]: html$.FormElement,
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLFieldSetElement, html$.FieldSetElement);
  const _get_lastModifiedDate = Symbol('_get_lastModifiedDate');
  dart.defineExtensionNames([
    'lastModifiedDate',
    'lastModified',
    'name',
    'relativePath'
  ]);
  html$.File = class File extends html$.Blob {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(fileBits, fileName, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return html$.File._create_1(fileBits, fileName, options_1);
      }
      return html$.File._create_2(fileBits, fileName);
    }
    static _create_1(fileBits, fileName, options) {
      return new File(fileBits, fileName, options);
    }
    static _create_2(fileBits, fileName) {
      return new File(fileBits, fileName);
    }
    get [dartx.lastModified]() {
      return this.lastModified;
    }
    get [dartx.lastModifiedDate]() {
      return html_common.convertNativeToDart_DateTime(this[_get_lastModifiedDate]);
    }
    get [_get_lastModifiedDate]() {
      return this.lastModifiedDate;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.relativePath]() {
      return this.webkitRelativePath;
    }
  };
  dart.setSignature(html$.File, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.File, []),
      new: dart.definiteFunctionType(html$.File, [ListOfObject(), core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.lastModified]: core.int,
      [_get_lastModifiedDate]: dart.dynamic,
      [dartx.name]: core.String,
      [dartx.relativePath]: core.String
    }),
    getters: () => ({[dartx.lastModifiedDate]: dart.definiteFunctionType(core.DateTime, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.File, html$.File);
  html$._FileCallback = dart.typedef('_FileCallback', () => dart.functionType(dart.void, [html$.File]));
  const _createWriter = Symbol('_createWriter');
  const _file = Symbol('_file');
  dart.defineExtensionNames([
    'createWriter',
    'file'
  ]);
  html$.FileEntry = class FileEntry extends html$.Entry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_createWriter](...args) {
      return this.createWriter.apply(this, args);
    }
    [dartx.createWriter]() {
      let completer = CompleterOfFileWriter().new();
      this[_createWriter](dart.fn(value => {
        completer.complete(value);
      }, FileWriterTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_file](...args) {
      return this.file.apply(this, args);
    }
    [dartx.file]() {
      let completer = CompleterOfFile().new();
      this[_file](dart.fn(value => {
        completer.complete(value);
      }, FileTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(html$.FileEntry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileEntry, [])}),
    methods: () => ({
      [_createWriter]: dart.definiteFunctionType(dart.void, [html$._FileWriterCallback], [html$._ErrorCallback]),
      [dartx.createWriter]: dart.definiteFunctionType(async.Future$(html$.FileWriter), []),
      [_file]: dart.definiteFunctionType(dart.void, [html$._FileCallback], [html$._ErrorCallback]),
      [dartx.file]: dart.definiteFunctionType(async.Future$(html$.File), [])
    })
  });
  dart.registerExtension(dart.global.FileEntry, html$.FileEntry);
  dart.defineExtensionNames([
    'code'
  ]);
  html$.FileError = class FileError extends html$.DomError {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
  };
  dart.setSignature(html$.FileError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileError, [])}),
    fields: () => ({[dartx.code]: core.int}),
    sfields: () => ({
      ABORT_ERR: core.int,
      ENCODING_ERR: core.int,
      INVALID_MODIFICATION_ERR: core.int,
      INVALID_STATE_ERR: core.int,
      NOT_FOUND_ERR: core.int,
      NOT_READABLE_ERR: core.int,
      NO_MODIFICATION_ALLOWED_ERR: core.int,
      PATH_EXISTS_ERR: core.int,
      QUOTA_EXCEEDED_ERR: core.int,
      SECURITY_ERR: core.int,
      SYNTAX_ERR: core.int,
      TYPE_MISMATCH_ERR: core.int
    })
  });
  html$.FileError.ABORT_ERR = 3;
  html$.FileError.ENCODING_ERR = 5;
  html$.FileError.INVALID_MODIFICATION_ERR = 9;
  html$.FileError.INVALID_STATE_ERR = 7;
  html$.FileError.NOT_FOUND_ERR = 1;
  html$.FileError.NOT_READABLE_ERR = 4;
  html$.FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
  html$.FileError.PATH_EXISTS_ERR = 12;
  html$.FileError.QUOTA_EXCEEDED_ERR = 10;
  html$.FileError.SECURITY_ERR = 2;
  html$.FileError.SYNTAX_ERR = 8;
  html$.FileError.TYPE_MISMATCH_ERR = 11;
  dart.registerExtension(dart.global.FileError, html$.FileError);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.FileList = class FileList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.File), html$.ImmutableListMixin$(html$.File)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.FileList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfFile()];
  dart.setSignature(html$.FileList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.File, []),
      [dartx.last]: dart.definiteFunctionType(html$.File, []),
      [dartx.single]: dart.definiteFunctionType(html$.File, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.File, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.File]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.File, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.File, [core.int])
    })
  });
  dart.registerExtension(dart.global.FileList, html$.FileList);
  dart.defineExtensionNames([
    'result',
    'abort',
    'readAsArrayBuffer',
    'readAsDataUrl',
    'readAsText',
    'onAbort',
    'onError',
    'onLoad',
    'onLoadEnd',
    'onLoadStart',
    'onProgress',
    'error',
    'readyState'
  ]);
  html$.FileReader = class FileReader extends html$.EventTarget {
    get [dartx.result]() {
      let res = this.result;
      if (typed_data.ByteBuffer.is(res)) {
        return typed_data.Uint8List.view(res);
      }
      return res;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.FileReader._create_1();
    }
    static _create_1() {
      return new FileReader();
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.readAsArrayBuffer](...args) {
      return this.readAsArrayBuffer.apply(this, args);
    }
    [dartx.readAsDataUrl](...args) {
      return this.readAsDataURL.apply(this, args);
    }
    [dartx.readAsText](...args) {
      return this.readAsText.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.FileReader.abortEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.FileReader.errorEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.FileReader.loadEvent.forTarget(this);
    }
    get [dartx.onLoadEnd]() {
      return html$.FileReader.loadEndEvent.forTarget(this);
    }
    get [dartx.onLoadStart]() {
      return html$.FileReader.loadStartEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.FileReader.progressEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.FileReader, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FileReader, []),
      new: dart.definiteFunctionType(html$.FileReader, [])
    }),
    fields: () => ({
      [dartx.error]: html$.FileError,
      [dartx.readyState]: core.int
    }),
    getters: () => ({
      [dartx.result]: dart.definiteFunctionType(core.Object, []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.readAsArrayBuffer]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.readAsDataUrl]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.readAsText]: dart.definiteFunctionType(dart.void, [html$.Blob], [core.String])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfProgressEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      loadEvent: EventStreamProviderOfProgressEvent(),
      loadEndEvent: EventStreamProviderOfProgressEvent(),
      loadStartEvent: EventStreamProviderOfProgressEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      DONE: core.int,
      EMPTY: core.int,
      LOADING: core.int
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.FileReader, [])}),
    names: ['_create_1']
  });
  html$.FileReader.DONE = 2;
  html$.FileReader.EMPTY = 0;
  html$.FileReader.LOADING = 1;
  dart.defineLazy(html$.FileReader, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
    },
    get loadEndEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
    },
    get loadStartEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    }
  });
  dart.registerExtension(dart.global.FileReader, html$.FileReader);
  dart.defineExtensionNames([
    'type'
  ]);
  html$.FileStream = class FileStream extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.FileStream, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileStream, [])}),
    fields: () => ({[dartx.type]: core.String})
  });
  dart.registerExtension(dart.global.Stream, html$.FileStream);
  dart.defineExtensionNames([
    'name',
    'root'
  ]);
  html$.FileSystem = class FileSystem extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.webkitRequestFileSystem;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.root]() {
      return this.root;
    }
  };
  dart.setSignature(html$.FileSystem, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileSystem, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.root]: html$.DirectoryEntry
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.DOMFileSystem, html$.FileSystem);
  html$._FileSystemCallback = dart.typedef('_FileSystemCallback', () => dart.functionType(dart.void, [html$.FileSystem]));
  dart.defineExtensionNames([
    'abort',
    'seek',
    'truncate',
    'write',
    'onAbort',
    'onError',
    'onProgress',
    'onWrite',
    'onWriteEnd',
    'onWriteStart',
    'error',
    'length',
    'position',
    'readyState'
  ]);
  html$.FileWriter = class FileWriter extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.position]() {
      return this.position;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.seek](...args) {
      return this.seek.apply(this, args);
    }
    [dartx.truncate](...args) {
      return this.truncate.apply(this, args);
    }
    [dartx.write](...args) {
      return this.write.apply(this, args);
    }
    get [dartx.onAbort]() {
      return html$.FileWriter.abortEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.FileWriter.errorEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.FileWriter.progressEvent.forTarget(this);
    }
    get [dartx.onWrite]() {
      return html$.FileWriter.writeEvent.forTarget(this);
    }
    get [dartx.onWriteEnd]() {
      return html$.FileWriter.writeEndEvent.forTarget(this);
    }
    get [dartx.onWriteStart]() {
      return html$.FileWriter.writeStartEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.FileWriter, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FileWriter, [])}),
    fields: () => ({
      [dartx.error]: html$.FileError,
      [dartx.length]: core.int,
      [dartx.position]: core.int,
      [dartx.readyState]: core.int
    }),
    getters: () => ({
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onWrite]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onWriteEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onWriteStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.seek]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.truncate]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.write]: dart.definiteFunctionType(dart.void, [html$.Blob])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfProgressEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      writeEvent: EventStreamProviderOfProgressEvent(),
      writeEndEvent: EventStreamProviderOfProgressEvent(),
      writeStartEvent: EventStreamProviderOfProgressEvent(),
      DONE: core.int,
      INIT: core.int,
      WRITING: core.int
    })
  });
  html$.FileWriter.DONE = 2;
  html$.FileWriter.INIT = 0;
  html$.FileWriter.WRITING = 1;
  dart.defineLazy(html$.FileWriter, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    },
    get writeEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('write'));
    },
    get writeEndEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('writeend'));
    },
    get writeStartEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('writestart'));
    }
  });
  dart.registerExtension(dart.global.FileWriter, html$.FileWriter);
  html$._FileWriterCallback = dart.typedef('_FileWriterCallback', () => dart.functionType(dart.void, [html$.FileWriter]));
  const _get_relatedTarget = Symbol('_get_relatedTarget');
  dart.defineExtensionNames([
    'relatedTarget'
  ]);
  html$.FocusEvent = class FocusEvent extends html$.UIEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.FocusEvent._create_1(type, eventInitDict_1);
      }
      return html$.FocusEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new FocusEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new FocusEvent(type);
    }
    get [dartx.relatedTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
    }
    get [_get_relatedTarget]() {
      return this.relatedTarget;
    }
  };
  dart.setSignature(html$.FocusEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FocusEvent, []),
      new: dart.definiteFunctionType(html$.FocusEvent, [core.String], [core.Map])
    }),
    fields: () => ({[_get_relatedTarget]: dart.dynamic}),
    getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FocusEvent, html$.FocusEvent);
  dart.defineExtensionNames([
    'load',
    'family',
    'featureSettings',
    'loaded',
    'status',
    'stretch',
    'style',
    'unicodeRange',
    'variant',
    'weight'
  ]);
  html$.FontFace = class FontFace extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(family, source, descriptors) {
      if (descriptors === void 0) descriptors = null;
      if (descriptors != null) {
        let descriptors_1 = html_common.convertDartToNative_Dictionary(descriptors);
        return html$.FontFace._create_1(family, source, descriptors_1);
      }
      return html$.FontFace._create_2(family, source);
    }
    static _create_1(family, source, descriptors) {
      return new FontFace(family, source, descriptors);
    }
    static _create_2(family, source) {
      return new FontFace(family, source);
    }
    get [dartx.family]() {
      return this.family;
    }
    set [dartx.family](value) {
      this.family = value;
    }
    get [dartx.featureSettings]() {
      return this.featureSettings;
    }
    set [dartx.featureSettings](value) {
      this.featureSettings = value;
    }
    get [dartx.loaded]() {
      return this.loaded;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.stretch]() {
      return this.stretch;
    }
    set [dartx.stretch](value) {
      this.stretch = value;
    }
    get [dartx.style]() {
      return this.style;
    }
    set [dartx.style](value) {
      this.style = value;
    }
    get [dartx.unicodeRange]() {
      return this.unicodeRange;
    }
    set [dartx.unicodeRange](value) {
      this.unicodeRange = value;
    }
    get [dartx.variant]() {
      return this.variant;
    }
    set [dartx.variant](value) {
      this.variant = value;
    }
    get [dartx.weight]() {
      return this.weight;
    }
    set [dartx.weight](value) {
      this.weight = value;
    }
    [dartx.load](...args) {
      return this.load.apply(this, args);
    }
  };
  dart.setSignature(html$.FontFace, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FontFace, []),
      new: dart.definiteFunctionType(html$.FontFace, [core.String, core.Object], [core.Map])
    }),
    fields: () => ({
      [dartx.family]: core.String,
      [dartx.featureSettings]: core.String,
      [dartx.loaded]: async.Future,
      [dartx.status]: core.String,
      [dartx.stretch]: core.String,
      [dartx.style]: core.String,
      [dartx.unicodeRange]: core.String,
      [dartx.variant]: core.String,
      [dartx.weight]: core.String
    }),
    methods: () => ({[dartx.load]: dart.definiteFunctionType(async.Future, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FontFace, html$.FontFace);
  dart.defineExtensionNames([
    'add',
    'check',
    'clear',
    'delete',
    'forEach',
    'has',
    'size',
    'status'
  ]);
  html$.FontFaceSet = class FontFaceSet extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
    get [dartx.status]() {
      return this.status;
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.check](...args) {
      return this.check.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.delete](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.forEach](...args) {
      return this.forEach.apply(this, args);
    }
    [dartx.has](...args) {
      return this.has.apply(this, args);
    }
  };
  dart.setSignature(html$.FontFaceSet, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSet, [])}),
    fields: () => ({
      [dartx.size]: core.int,
      [dartx.status]: core.String
    }),
    methods: () => ({
      [dartx.add]: dart.definiteFunctionType(dart.void, [html$.FontFace]),
      [dartx.check]: dart.definiteFunctionType(core.bool, [core.String], [core.String]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.delete]: dart.definiteFunctionType(core.bool, [html$.FontFace]),
      [dartx.forEach]: dart.definiteFunctionType(dart.void, [html$.FontFaceSetForEachCallback], [core.Object]),
      [dartx.has]: dart.definiteFunctionType(core.bool, [html$.FontFace])
    })
  });
  dart.registerExtension(dart.global.FontFaceSet, html$.FontFaceSet);
  html$.FontFaceSetForEachCallback = dart.typedef('FontFaceSetForEachCallback', () => dart.functionType(dart.void, [html$.FontFace, html$.FontFace, html$.FontFaceSet]));
  dart.defineExtensionNames([
    'fontfaces'
  ]);
  html$.FontFaceSetLoadEvent = class FontFaceSetLoadEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.fontfaces]() {
      return this.fontfaces;
    }
  };
  dart.setSignature(html$.FontFaceSetLoadEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSetLoadEvent, [])}),
    fields: () => ({[dartx.fontfaces]: ListOfFontFace()})
  });
  dart.registerExtension(dart.global.FontFaceSetLoadEvent, html$.FontFaceSetLoadEvent);
  dart.defineExtensionNames([
    'append',
    'appendBlob',
    'delete',
    'get',
    'getAll',
    'has',
    'set'
  ]);
  html$.FormData = class FormData extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(form) {
      if (form === void 0) form = null;
      if (form != null) {
        return html$.FormData._create_1(form);
      }
      return html$.FormData._create_2();
    }
    static _create_1(form) {
      return new FormData(form);
    }
    static _create_2() {
      return new FormData();
    }
    static get supported() {
      return !!window.FormData;
    }
    [dartx.append](...args) {
      return this.append.apply(this, args);
    }
    [dartx.appendBlob](...args) {
      return this.append.apply(this, args);
    }
    [dartx.delete](...args) {
      return this.delete.apply(this, args);
    }
    [dartx.get](...args) {
      return this.get.apply(this, args);
    }
    [dartx.getAll](...args) {
      return this.getAll.apply(this, args);
    }
    [dartx.has](...args) {
      return this.has.apply(this, args);
    }
    [dartx.set](...args) {
      return this.set.apply(this, args);
    }
  };
  dart.setSignature(html$.FormData, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FormData, []),
      new: dart.definiteFunctionType(html$.FormData, [], [html$.FormElement])
    }),
    methods: () => ({
      [dartx.append]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.appendBlob]: dart.definiteFunctionType(dart.void, [core.String, html$.Blob], [core.String]),
      [dartx.delete]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.get]: dart.definiteFunctionType(core.Object, [core.String]),
      [dartx.getAll]: dart.definiteFunctionType(core.List$(core.Object), [core.String]),
      [dartx.has]: dart.definiteFunctionType(core.bool, [core.String]),
      [dartx.set]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic], [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.FormData, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.FormData, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.FormData, html$.FormData);
  const _requestAutocomplete_1 = Symbol('_requestAutocomplete_1');
  dart.defineExtensionNames([
    'checkValidity',
    'item',
    'reportValidity',
    'requestAutocomplete',
    'reset',
    'submit',
    'acceptCharset',
    'action',
    'autocomplete',
    'encoding',
    'enctype',
    'length',
    'method',
    'name',
    'noValidate',
    'target'
  ]);
  html$.FormElement = class FormElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.FormElement._check(html$.document[dartx.createElement]("form"));
    }
    created() {
      this[dartx.acceptCharset] = null;
      this[dartx.action] = null;
      this[dartx.autocomplete] = null;
      this[dartx.encoding] = null;
      this[dartx.enctype] = null;
      this[dartx.length] = null;
      this[dartx.method] = null;
      this[dartx.name] = null;
      this[dartx.noValidate] = null;
      this[dartx.target] = null;
      super.created();
    }
    get [dartx.acceptCharset]() {
      return this.acceptCharset;
    }
    set [dartx.acceptCharset](value) {
      this.acceptCharset = value;
    }
    get [dartx.action]() {
      return this.action;
    }
    set [dartx.action](value) {
      this.action = value;
    }
    get [dartx.autocomplete]() {
      return this.autocomplete;
    }
    set [dartx.autocomplete](value) {
      this.autocomplete = value;
    }
    get [dartx.encoding]() {
      return this.encoding;
    }
    set [dartx.encoding](value) {
      this.encoding = value;
    }
    get [dartx.enctype]() {
      return this.enctype;
    }
    set [dartx.enctype](value) {
      this.enctype = value;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.method]() {
      return this.method;
    }
    set [dartx.method](value) {
      this.method = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.noValidate]() {
      return this.noValidate;
    }
    set [dartx.noValidate](value) {
      this.noValidate = value;
    }
    get [dartx.target]() {
      return this.target;
    }
    set [dartx.target](value) {
      this.target = value;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.requestAutocomplete](details) {
      let details_1 = html_common.convertDartToNative_Dictionary(details);
      this[_requestAutocomplete_1](details_1);
      return;
    }
    [_requestAutocomplete_1](...args) {
      return this.requestAutocomplete.apply(this, args);
    }
    [dartx.reset](...args) {
      return this.reset.apply(this, args);
    }
    [dartx.submit](...args) {
      return this.submit.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.FormElement, 'created');
  dart.setSignature(html$.FormElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.FormElement, []),
      new: dart.definiteFunctionType(html$.FormElement, []),
      created: dart.definiteFunctionType(html$.FormElement, [])
    }),
    fields: () => ({
      [dartx.acceptCharset]: core.String,
      [dartx.action]: core.String,
      [dartx.autocomplete]: core.String,
      [dartx.encoding]: core.String,
      [dartx.enctype]: core.String,
      [dartx.length]: core.int,
      [dartx.method]: core.String,
      [dartx.name]: core.String,
      [dartx.noValidate]: core.bool,
      [dartx.target]: core.String
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(core.Object, [core.String]),
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.requestAutocomplete]: dart.definiteFunctionType(dart.void, [core.Map]),
      [_requestAutocomplete_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.reset]: dart.definiteFunctionType(dart.void, []),
      [dartx.submit]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFormElement, html$.FormElement);
  html$.FrameRequestCallback = dart.typedef('FrameRequestCallback', () => dart.functionType(dart.void, [core.num]));
  dart.defineExtensionNames([
    'axes',
    'buttons',
    'connected',
    'id',
    'index',
    'mapping',
    'timestamp'
  ]);
  html$.Gamepad = class Gamepad extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.axes]() {
      return this.axes;
    }
    get [dartx.buttons]() {
      return this.buttons;
    }
    get [dartx.connected]() {
      return this.connected;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.index]() {
      return this.index;
    }
    get [dartx.mapping]() {
      return this.mapping;
    }
    get [dartx.timestamp]() {
      return this.timestamp;
    }
  };
  dart.setSignature(html$.Gamepad, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Gamepad, [])}),
    fields: () => ({
      [dartx.axes]: ListOfnum(),
      [dartx.buttons]: ListOfGamepadButton(),
      [dartx.connected]: core.bool,
      [dartx.id]: core.String,
      [dartx.index]: core.int,
      [dartx.mapping]: core.String,
      [dartx.timestamp]: core.int
    })
  });
  dart.registerExtension(dart.global.Gamepad, html$.Gamepad);
  dart.defineExtensionNames([
    'pressed',
    'value'
  ]);
  html$.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.pressed]() {
      return this.pressed;
    }
    get [dartx.value]() {
      return this.value;
    }
  };
  dart.setSignature(html$.GamepadButton, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GamepadButton, [])}),
    fields: () => ({
      [dartx.pressed]: core.bool,
      [dartx.value]: core.double
    })
  });
  dart.registerExtension(dart.global.GamepadButton, html$.GamepadButton);
  dart.defineExtensionNames([
    'gamepad'
  ]);
  html$.GamepadEvent = class GamepadEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.GamepadEvent._create_1(type, eventInitDict_1);
      }
      return html$.GamepadEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new GamepadEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new GamepadEvent(type);
    }
    get [dartx.gamepad]() {
      return this.gamepad;
    }
  };
  dart.setSignature(html$.GamepadEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.GamepadEvent, []),
      new: dart.definiteFunctionType(html$.GamepadEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.gamepad]: html$.Gamepad}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.GamepadEvent, html$.GamepadEvent);
  dart.defineExtensionNames([
    'getRegisteredRegions',
    'registerRegion',
    'unregisterRegion'
  ]);
  html$.Geofencing = class Geofencing extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getRegisteredRegions](...args) {
      return this.getRegisteredRegions.apply(this, args);
    }
    [dartx.registerRegion](...args) {
      return this.registerRegion.apply(this, args);
    }
    [dartx.unregisterRegion](...args) {
      return this.unregisterRegion.apply(this, args);
    }
  };
  dart.setSignature(html$.Geofencing, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Geofencing, [])}),
    methods: () => ({
      [dartx.getRegisteredRegions]: dart.definiteFunctionType(async.Future, []),
      [dartx.registerRegion]: dart.definiteFunctionType(async.Future, [html$.GeofencingRegion]),
      [dartx.unregisterRegion]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.Geofencing, html$.Geofencing);
  dart.defineExtensionNames([
    'id',
    'region'
  ]);
  html$.GeofencingEvent = class GeofencingEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.region]() {
      return this.region;
    }
  };
  dart.setSignature(html$.GeofencingEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingEvent, [])}),
    fields: () => ({
      [dartx.id]: core.String,
      [dartx.region]: html$.GeofencingRegion
    })
  });
  dart.registerExtension(dart.global.GeofencingEvent, html$.GeofencingEvent);
  const _getCurrentPosition = Symbol('_getCurrentPosition');
  const _ensurePosition = Symbol('_ensurePosition');
  const _watchPosition = Symbol('_watchPosition');
  const _clearWatch = Symbol('_clearWatch');
  const _getCurrentPosition_1 = Symbol('_getCurrentPosition_1');
  const _getCurrentPosition_2 = Symbol('_getCurrentPosition_2');
  const _getCurrentPosition_3 = Symbol('_getCurrentPosition_3');
  const _watchPosition_1 = Symbol('_watchPosition_1');
  const _watchPosition_2 = Symbol('_watchPosition_2');
  const _watchPosition_3 = Symbol('_watchPosition_3');
  dart.defineExtensionNames([
    'getCurrentPosition',
    'watchPosition'
  ]);
  html$.Geolocation = class Geolocation extends _interceptors.Interceptor {
    [dartx.getCurrentPosition](opts) {
      let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
      let timeout = opts && 'timeout' in opts ? opts.timeout : null;
      let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
      let options = dart.map();
      if (enableHighAccuracy != null) {
        options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
      }
      if (timeout != null) {
        options[dartx._set]('timeout', timeout.inMilliseconds);
      }
      if (maximumAge != null) {
        options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
      }
      let completer = CompleterOfGeoposition().new();
      try {
        this[_getCurrentPosition](dart.fn(position => {
          completer.complete(this[_ensurePosition](position));
        }, GeopositionTovoid()), dart.fn(error => {
          completer.completeError(error);
        }, PositionErrorTovoid()), options);
      } catch (e) {
        let stacktrace = dart.stackTrace(e);
        completer.completeError(e, stacktrace);
      }

      return completer.future;
    }
    [dartx.watchPosition](opts) {
      let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
      let timeout = opts && 'timeout' in opts ? opts.timeout : null;
      let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
      let options = dart.map();
      if (enableHighAccuracy != null) {
        options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
      }
      if (timeout != null) {
        options[dartx._set]('timeout', timeout.inMilliseconds);
      }
      if (maximumAge != null) {
        options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
      }
      let watchId = null;
      let controller = null;
      controller = StreamControllerOfGeoposition().new({sync: true, onListen: dart.fn(() => {
          dart.assert(watchId == null);
          watchId = this[_watchPosition](dart.fn(position => {
            controller.add(this[_ensurePosition](position));
          }, GeopositionTovoid()), dart.fn(error => {
            controller.addError(error);
          }, PositionErrorTovoid()), options);
        }, VoidTovoid$()), onCancel: dart.fn(() => {
          dart.assert(watchId != null);
          this[_clearWatch](watchId);
        }, VoidTodynamic$())});
      return controller.stream;
    }
    [_ensurePosition](domPosition) {
      try {
        if (html$.Geoposition.is(domPosition)) {
          return domPosition;
        }
      } catch (e) {
      }

      return new html$._GeopositionWrapper(domPosition);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_clearWatch](...args) {
      return this.clearWatch.apply(this, args);
    }
    [_getCurrentPosition](successCallback, errorCallback, options) {
      if (errorCallback === void 0) errorCallback = null;
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        this[_getCurrentPosition_1](successCallback, errorCallback, options_1);
        return;
      }
      if (errorCallback != null) {
        this[_getCurrentPosition_2](successCallback, errorCallback);
        return;
      }
      this[_getCurrentPosition_3](successCallback);
      return;
    }
    [_getCurrentPosition_1](...args) {
      return this.getCurrentPosition.apply(this, args);
    }
    [_getCurrentPosition_2](...args) {
      return this.getCurrentPosition.apply(this, args);
    }
    [_getCurrentPosition_3](...args) {
      return this.getCurrentPosition.apply(this, args);
    }
    [_watchPosition](successCallback, errorCallback, options) {
      if (errorCallback === void 0) errorCallback = null;
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_watchPosition_1](successCallback, errorCallback, options_1);
      }
      if (errorCallback != null) {
        return this[_watchPosition_2](successCallback, errorCallback);
      }
      return this[_watchPosition_3](successCallback);
    }
    [_watchPosition_1](...args) {
      return this.watchPosition.apply(this, args);
    }
    [_watchPosition_2](...args) {
      return this.watchPosition.apply(this, args);
    }
    [_watchPosition_3](...args) {
      return this.watchPosition.apply(this, args);
    }
  };
  dart.setSignature(html$.Geolocation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Geolocation, [])}),
    methods: () => ({
      [dartx.getCurrentPosition]: dart.definiteFunctionType(async.Future$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
      [dartx.watchPosition]: dart.definiteFunctionType(async.Stream$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
      [_ensurePosition]: dart.definiteFunctionType(html$.Geoposition, [dart.dynamic]),
      [_clearWatch]: dart.definiteFunctionType(dart.void, [core.int]),
      [_getCurrentPosition]: dart.definiteFunctionType(dart.void, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
      [_getCurrentPosition_1]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
      [_getCurrentPosition_2]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback]),
      [_getCurrentPosition_3]: dart.definiteFunctionType(dart.void, [html$._PositionCallback]),
      [_watchPosition]: dart.definiteFunctionType(core.int, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
      [_watchPosition_1]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
      [_watchPosition_2]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback]),
      [_watchPosition_3]: dart.definiteFunctionType(core.int, [html$._PositionCallback])
    })
  });
  dart.registerExtension(dart.global.Geolocation, html$.Geolocation);
  html$._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
    new(ptr) {
      this[_ptr] = ptr;
    }
    get coords() {
      return this[_ptr].coords;
    }
    get timestamp() {
      return this[_ptr].timestamp;
    }
  };
  html$._GeopositionWrapper[dart.implements] = () => [html$.Geoposition];
  dart.setSignature(html$._GeopositionWrapper, {
    constructors: () => ({new: dart.definiteFunctionType(html$._GeopositionWrapper, [dart.dynamic])}),
    fields: () => ({[_ptr]: dart.dynamic}),
    getters: () => ({
      coords: dart.definiteFunctionType(html$.Coordinates, []),
      timestamp: dart.definiteFunctionType(core.int, [])
    })
  });
  dart.defineExtensionNames([
    'coords',
    'timestamp'
  ]);
  html$.Geoposition = class Geoposition extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.coords]() {
      return this.coords;
    }
    get [dartx.timestamp]() {
      return this.timestamp;
    }
  };
  dart.setSignature(html$.Geoposition, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Geoposition, [])}),
    fields: () => ({
      [dartx.coords]: html$.Coordinates,
      [dartx.timestamp]: core.int
    })
  });
  dart.registerExtension(dart.global.Geoposition, html$.Geoposition);
  dart.defineExtensionNames([
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onVolumeChange',
    'onWaiting'
  ]);
  html$.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onAbort() {
      return html$.GlobalEventHandlers.abortEvent.forTarget(this);
    }
    get onBlur() {
      return html$.GlobalEventHandlers.blurEvent.forTarget(this);
    }
    get onCanPlay() {
      return html$.GlobalEventHandlers.canPlayEvent.forTarget(this);
    }
    get onCanPlayThrough() {
      return html$.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
    }
    get onChange() {
      return html$.GlobalEventHandlers.changeEvent.forTarget(this);
    }
    get onClick() {
      return html$.GlobalEventHandlers.clickEvent.forTarget(this);
    }
    get onContextMenu() {
      return html$.GlobalEventHandlers.contextMenuEvent.forTarget(this);
    }
    get onDoubleClick() {
      return html$.GlobalEventHandlers.doubleClickEvent.forTarget(this);
    }
    get onDrag() {
      return html$.GlobalEventHandlers.dragEvent.forTarget(this);
    }
    get onDragEnd() {
      return html$.GlobalEventHandlers.dragEndEvent.forTarget(this);
    }
    get onDragEnter() {
      return html$.GlobalEventHandlers.dragEnterEvent.forTarget(this);
    }
    get onDragLeave() {
      return html$.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
    }
    get onDragOver() {
      return html$.GlobalEventHandlers.dragOverEvent.forTarget(this);
    }
    get onDragStart() {
      return html$.GlobalEventHandlers.dragStartEvent.forTarget(this);
    }
    get onDrop() {
      return html$.GlobalEventHandlers.dropEvent.forTarget(this);
    }
    get onDurationChange() {
      return html$.GlobalEventHandlers.durationChangeEvent.forTarget(this);
    }
    get onEmptied() {
      return html$.GlobalEventHandlers.emptiedEvent.forTarget(this);
    }
    get onEnded() {
      return html$.GlobalEventHandlers.endedEvent.forTarget(this);
    }
    get onError() {
      return html$.GlobalEventHandlers.errorEvent.forTarget(this);
    }
    get onFocus() {
      return html$.GlobalEventHandlers.focusEvent.forTarget(this);
    }
    get onInput() {
      return html$.GlobalEventHandlers.inputEvent.forTarget(this);
    }
    get onInvalid() {
      return html$.GlobalEventHandlers.invalidEvent.forTarget(this);
    }
    get onKeyDown() {
      return html$.GlobalEventHandlers.keyDownEvent.forTarget(this);
    }
    get onKeyPress() {
      return html$.GlobalEventHandlers.keyPressEvent.forTarget(this);
    }
    get onKeyUp() {
      return html$.GlobalEventHandlers.keyUpEvent.forTarget(this);
    }
    get onLoad() {
      return html$.GlobalEventHandlers.loadEvent.forTarget(this);
    }
    get onLoadedData() {
      return html$.GlobalEventHandlers.loadedDataEvent.forTarget(this);
    }
    get onLoadedMetadata() {
      return html$.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
    }
    get onMouseDown() {
      return html$.GlobalEventHandlers.mouseDownEvent.forTarget(this);
    }
    get onMouseEnter() {
      return html$.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
    }
    get onMouseLeave() {
      return html$.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
    }
    get onMouseMove() {
      return html$.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
    }
    get onMouseOut() {
      return html$.GlobalEventHandlers.mouseOutEvent.forTarget(this);
    }
    get onMouseOver() {
      return html$.GlobalEventHandlers.mouseOverEvent.forTarget(this);
    }
    get onMouseUp() {
      return html$.GlobalEventHandlers.mouseUpEvent.forTarget(this);
    }
    get onMouseWheel() {
      return html$.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
    }
    get onPause() {
      return html$.GlobalEventHandlers.pauseEvent.forTarget(this);
    }
    get onPlay() {
      return html$.GlobalEventHandlers.playEvent.forTarget(this);
    }
    get onPlaying() {
      return html$.GlobalEventHandlers.playingEvent.forTarget(this);
    }
    get onRateChange() {
      return html$.GlobalEventHandlers.rateChangeEvent.forTarget(this);
    }
    get onReset() {
      return html$.GlobalEventHandlers.resetEvent.forTarget(this);
    }
    get onResize() {
      return html$.GlobalEventHandlers.resizeEvent.forTarget(this);
    }
    get onScroll() {
      return html$.GlobalEventHandlers.scrollEvent.forTarget(this);
    }
    get onSeeked() {
      return html$.GlobalEventHandlers.seekedEvent.forTarget(this);
    }
    get onSeeking() {
      return html$.GlobalEventHandlers.seekingEvent.forTarget(this);
    }
    get onSelect() {
      return html$.GlobalEventHandlers.selectEvent.forTarget(this);
    }
    get onStalled() {
      return html$.GlobalEventHandlers.stalledEvent.forTarget(this);
    }
    get onSubmit() {
      return html$.GlobalEventHandlers.submitEvent.forTarget(this);
    }
    get onSuspend() {
      return html$.GlobalEventHandlers.suspendEvent.forTarget(this);
    }
    get onTimeUpdate() {
      return html$.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
    }
    get onVolumeChange() {
      return html$.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
    }
    get onWaiting() {
      return html$.GlobalEventHandlers.waitingEvent.forTarget(this);
    }
  };
  html$.GlobalEventHandlers[dart.implements] = () => [html$.EventTarget];
  dart.setSignature(html$.GlobalEventHandlers, {
    constructors: () => ({_: dart.definiteFunctionType(html$.GlobalEventHandlers, [])}),
    getters: () => ({
      onAbort: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onBlur: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onCanPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onCanPlayThrough: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onClick: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onContextMenu: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDoubleClick: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onDrag: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragEnd: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDragStart: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDrop: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onDurationChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onEmptied: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onEnded: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onError: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onFocus: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onInput: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onInvalid: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onKeyDown: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      onKeyPress: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      onKeyUp: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      onLoad: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onLoadedData: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onLoadedMetadata: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onMouseDown: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseMove: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseOut: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseUp: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      onMouseWheel: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
      onPause: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onPlaying: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onRateChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onReset: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onResize: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onScroll: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSeeked: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSeeking: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSelect: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onStalled: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSubmit: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onSuspend: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onTimeUpdate: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onVolumeChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onWaiting: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfEvent(),
      blurEvent: EventStreamProviderOfEvent(),
      canPlayEvent: EventStreamProviderOfEvent(),
      canPlayThroughEvent: EventStreamProviderOfEvent(),
      changeEvent: EventStreamProviderOfEvent(),
      clickEvent: EventStreamProviderOfMouseEvent(),
      contextMenuEvent: EventStreamProviderOfMouseEvent(),
      doubleClickEvent: EventStreamProviderOfEvent(),
      dragEvent: EventStreamProviderOfMouseEvent(),
      dragEndEvent: EventStreamProviderOfMouseEvent(),
      dragEnterEvent: EventStreamProviderOfMouseEvent(),
      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
      dragOverEvent: EventStreamProviderOfMouseEvent(),
      dragStartEvent: EventStreamProviderOfMouseEvent(),
      dropEvent: EventStreamProviderOfMouseEvent(),
      durationChangeEvent: EventStreamProviderOfEvent(),
      emptiedEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      inputEvent: EventStreamProviderOfEvent(),
      invalidEvent: EventStreamProviderOfEvent(),
      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      loadedDataEvent: EventStreamProviderOfEvent(),
      loadedMetadataEvent: EventStreamProviderOfEvent(),
      mouseDownEvent: EventStreamProviderOfMouseEvent(),
      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
      mouseOutEvent: EventStreamProviderOfMouseEvent(),
      mouseOverEvent: EventStreamProviderOfMouseEvent(),
      mouseUpEvent: EventStreamProviderOfMouseEvent(),
      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      playEvent: EventStreamProviderOfEvent(),
      playingEvent: EventStreamProviderOfEvent(),
      rateChangeEvent: EventStreamProviderOfEvent(),
      resetEvent: EventStreamProviderOfEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      seekedEvent: EventStreamProviderOfEvent(),
      seekingEvent: EventStreamProviderOfEvent(),
      selectEvent: EventStreamProviderOfEvent(),
      stalledEvent: EventStreamProviderOfEvent(),
      submitEvent: EventStreamProviderOfEvent(),
      suspendEvent: EventStreamProviderOfEvent(),
      timeUpdateEvent: EventStreamProviderOfEvent(),
      volumeChangeEvent: EventStreamProviderOfEvent(),
      waitingEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineExtensionMembers(html$.GlobalEventHandlers, [
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onVolumeChange',
    'onWaiting'
  ]);
  dart.defineLazy(html$.GlobalEventHandlers, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get canPlayEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
    },
    get canPlayThroughEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    },
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
    },
    get contextMenuEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
    },
    get doubleClickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
    },
    get dragEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
    },
    get dragEndEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
    },
    get dragEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
    },
    get dragLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
    },
    get dragOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
    },
    get dragStartEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
    },
    get dropEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
    },
    get durationChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
    },
    get emptiedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get inputEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('input'));
    },
    get invalidEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
    },
    get keyDownEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
    },
    get keyPressEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
    },
    get keyUpEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get loadedDataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
    },
    get loadedMetadataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
    },
    get mouseDownEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
    },
    get mouseEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
    },
    get mouseLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
    },
    get mouseMoveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
    },
    get mouseOutEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
    },
    get mouseOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
    },
    get mouseUpEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
    },
    get mouseWheelEvent() {
      return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get playEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('play'));
    },
    get playingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('playing'));
    },
    get rateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
    },
    get resetEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('reset'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get seekedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
    },
    get seekingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
    },
    get selectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('select'));
    },
    get stalledEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
    },
    get submitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('submit'));
    },
    get suspendEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
    },
    get timeUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
    },
    get volumeChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
    },
    get waitingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
    }
  });
  dart.defineExtensionNames([
    'color'
  ]);
  html$.HRElement = class HRElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HRElement._check(html$.document[dartx.createElement]("hr"));
    }
    created() {
      this[dartx.color] = null;
      super.created();
    }
    get [dartx.color]() {
      return this.color;
    }
    set [dartx.color](value) {
      this.color = value;
    }
  };
  dart.defineNamedConstructor(html$.HRElement, 'created');
  dart.setSignature(html$.HRElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HRElement, []),
      new: dart.definiteFunctionType(html$.HRElement, []),
      created: dart.definiteFunctionType(html$.HRElement, [])
    }),
    fields: () => ({[dartx.color]: core.String})
  });
  dart.registerExtension(dart.global.HTMLHRElement, html$.HRElement);
  const _initHashChangeEvent = Symbol('_initHashChangeEvent');
  dart.defineExtensionNames([
    'newUrl',
    'oldUrl'
  ]);
  html$.HashChangeEvent = class HashChangeEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let oldUrl = opts && 'oldUrl' in opts ? opts.oldUrl : null;
      let newUrl = opts && 'newUrl' in opts ? opts.newUrl : null;
      let options = dart.map({canBubble: canBubble, cancelable: cancelable, oldURL: oldUrl, newURL: newUrl}, core.String, core.Object);
      return new HashChangeEvent(type, html_common.convertDartToNative_Dictionary(options));
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.HashChangeEvent._create_1(type, eventInitDict_1);
      }
      return html$.HashChangeEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new HashChangeEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new HashChangeEvent(type);
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('HashChangeEvent');
    }
    get [dartx.newUrl]() {
      return this.newURL;
    }
    get [dartx.oldUrl]() {
      return this.oldURL;
    }
    [_initHashChangeEvent](...args) {
      return this.initHashChangeEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.HashChangeEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, oldUrl: core.String, newUrl: core.String}),
      _: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.newUrl]: core.String,
      [dartx.oldUrl]: core.String
    }),
    methods: () => ({[_initHashChangeEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.HashChangeEvent, html$.HashChangeEvent);
  html$.HeadElement = class HeadElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HeadElement._check(html$.document[dartx.createElement]("head"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HeadElement, 'created');
  dart.setSignature(html$.HeadElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HeadElement, []),
      new: dart.definiteFunctionType(html$.HeadElement, []),
      created: dart.definiteFunctionType(html$.HeadElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLHeadElement, html$.HeadElement);
  html$.Headers = class Headers extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(input) {
      if (input === void 0) input = null;
      if (input == null) {
        return html$.Headers._create_1();
      }
      if (html$.Headers.is(input)) {
        return html$.Headers._create_2(input);
      }
      if (core.Map.is(input)) {
        let input_1 = html_common.convertDartToNative_Dictionary(input);
        return html$.Headers._create_3(input_1);
      }
      if (ListOfObject().is(input)) {
        return html$.Headers._create_4(input);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new Headers();
    }
    static _create_2(input) {
      return new Headers(input);
    }
    static _create_3(input) {
      return new Headers(input);
    }
    static _create_4(input) {
      return new Headers(input);
    }
  };
  dart.setSignature(html$.Headers, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Headers, []),
      new: dart.definiteFunctionType(html$.Headers, [], [dart.dynamic])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.Headers, []),
      _create_2: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.Headers, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4']
  });
  dart.registerExtension(dart.global.Headers, html$.Headers);
  html$.HeadingElement = class HeadingElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static h1() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h1"));
    }
    static h2() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h2"));
    }
    static h3() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h3"));
    }
    static h4() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h4"));
    }
    static h5() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h5"));
    }
    static h6() {
      return html$.HeadingElement._check(html$.document[dartx.createElement]("h6"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HeadingElement, 'created');
  dart.setSignature(html$.HeadingElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HeadingElement, []),
      h1: dart.definiteFunctionType(html$.HeadingElement, []),
      h2: dart.definiteFunctionType(html$.HeadingElement, []),
      h3: dart.definiteFunctionType(html$.HeadingElement, []),
      h4: dart.definiteFunctionType(html$.HeadingElement, []),
      h5: dart.definiteFunctionType(html$.HeadingElement, []),
      h6: dart.definiteFunctionType(html$.HeadingElement, []),
      created: dart.definiteFunctionType(html$.HeadingElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLHeadingElement, html$.HeadingElement);
  const _get_options = Symbol('_get_options');
  const _get_state = Symbol('_get_state');
  const _pushState_1 = Symbol('_pushState_1');
  const _pushState_2 = Symbol('_pushState_2');
  const _replaceState_1 = Symbol('_replaceState_1');
  const _replaceState_2 = Symbol('_replaceState_2');
  dart.defineExtensionNames([
    'options',
    'state',
    'back',
    'forward',
    'go',
    'pushState',
    'replaceState',
    'length'
  ]);
  html$.History = class History extends _interceptors.Interceptor {
    static get supportsState() {
      return !!window.history.pushState;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.options]() {
      return html_common.convertNativeToDart_Dictionary(this[_get_options]);
    }
    get [_get_options]() {
      return this.options;
    }
    get [dartx.state]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
    }
    get [_get_state]() {
      return this.state;
    }
    [dartx.back](...args) {
      return this.back.apply(this, args);
    }
    [dartx.forward](...args) {
      return this.forward.apply(this, args);
    }
    [dartx.go](...args) {
      return this.go.apply(this, args);
    }
    [dartx.pushState](data, title, url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
        let options_2 = html_common.convertDartToNative_Dictionary(options);
        this[_pushState_1](data_1, title, url, options_2);
        return;
      }
      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
      this[_pushState_2](data_1, title, url);
      return;
    }
    [_pushState_1](...args) {
      return this.pushState.apply(this, args);
    }
    [_pushState_2](...args) {
      return this.pushState.apply(this, args);
    }
    [dartx.replaceState](data, title, url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
        let options_2 = html_common.convertDartToNative_Dictionary(options);
        this[_replaceState_1](data_1, title, url, options_2);
        return;
      }
      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
      this[_replaceState_2](data_1, title, url);
      return;
    }
    [_replaceState_1](...args) {
      return this.replaceState.apply(this, args);
    }
    [_replaceState_2](...args) {
      return this.replaceState.apply(this, args);
    }
  };
  html$.History[dart.implements] = () => [html$.HistoryBase];
  dart.setSignature(html$.History, {
    constructors: () => ({_: dart.definiteFunctionType(html$.History, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [_get_options]: dart.dynamic,
      [_get_state]: dart.dynamic
    }),
    getters: () => ({
      [dartx.options]: dart.definiteFunctionType(core.Map, []),
      [dartx.state]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({
      [dartx.back]: dart.definiteFunctionType(dart.void, []),
      [dartx.forward]: dart.definiteFunctionType(dart.void, []),
      [dartx.go]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [dartx.pushState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
      [_pushState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_pushState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.replaceState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
      [_replaceState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_replaceState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    sgetters: () => ({supportsState: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.History, html$.History);
  dart.defineExtensionNames([
    'deviceId',
    'deviceName',
    'hardwareUnitId'
  ]);
  html$.VRDevice = class VRDevice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.deviceId]() {
      return this.deviceId;
    }
    get [dartx.deviceName]() {
      return this.deviceName;
    }
    get [dartx.hardwareUnitId]() {
      return this.hardwareUnitId;
    }
  };
  dart.setSignature(html$.VRDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VRDevice, [])}),
    fields: () => ({
      [dartx.deviceId]: core.String,
      [dartx.deviceName]: core.String,
      [dartx.hardwareUnitId]: core.String
    })
  });
  dart.registerExtension(dart.global.VRDevice, html$.VRDevice);
  dart.defineExtensionNames([
    'getEyeParameters',
    'setFieldOfView'
  ]);
  html$.HmdvrDevice = class HmdvrDevice extends html$.VRDevice {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getEyeParameters](...args) {
      return this.getEyeParameters.apply(this, args);
    }
    [dartx.setFieldOfView](...args) {
      return this.setFieldOfView.apply(this, args);
    }
  };
  dart.setSignature(html$.HmdvrDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HmdvrDevice, [])}),
    methods: () => ({
      [dartx.getEyeParameters]: dart.definiteFunctionType(html$.VREyeParameters, [core.String]),
      [dartx.setFieldOfView]: dart.definiteFunctionType(dart.void, [], [html$.VRFieldOfView, html$.VRFieldOfView])
    })
  });
  dart.registerExtension(dart.global.HMDVRDevice, html$.HmdvrDevice);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item',
    'namedItem'
  ]);
  html$.HtmlCollection = class HtmlCollection extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  html$.HtmlCollection[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
  dart.setSignature(html$.HtmlCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlCollection, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Node, []),
      [dartx.last]: dart.definiteFunctionType(html$.Node, []),
      [dartx.single]: dart.definiteFunctionType(html$.Node, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(core.Object, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLCollection, html$.HtmlCollection);
  dart.defineExtensionNames([
    'caretRangeFromPoint',
    'elementFromPoint',
    'getCssCanvasContext',
    'head',
    'lastModified',
    'preferredStylesheetSet',
    'referrer',
    'selectedStylesheetSet',
    'selectedStylesheetSet',
    'styleSheets',
    'title',
    'title',
    'exitFullscreen',
    'registerElement',
    'register',
    'onVisibilityChange',
    'createElementUpgrader',
    'body'
  ]);
  html$.HtmlDocument = class HtmlDocument extends html$.Document {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.body]() {
      return this.body;
    }
    set [dartx.body](value) {
      this.body = value;
    }
    [dartx.caretRangeFromPoint](x, y) {
      return this[_caretRangeFromPoint](x, y);
    }
    [dartx.elementFromPoint](x, y) {
      return this[_elementFromPoint](x, y);
    }
    static get supportsCssCanvasContext() {
      return !!document.getCSSCanvasContext;
    }
    [dartx.getCssCanvasContext](contextId, name, width, height) {
      return html$.CanvasRenderingContext._check(this[_getCssCanvasContext](contextId, name, width, height));
    }
    get [dartx.head]() {
      return this[_head$];
    }
    get [dartx.lastModified]() {
      return this[_lastModified];
    }
    get [dartx.preferredStylesheetSet]() {
      return this[_preferredStylesheetSet];
    }
    get [dartx.referrer]() {
      return this[_referrer];
    }
    get [dartx.selectedStylesheetSet]() {
      return this[_selectedStylesheetSet];
    }
    set [dartx.selectedStylesheetSet](value) {
      this[_selectedStylesheetSet] = value;
    }
    get [dartx.styleSheets]() {
      return this[_styleSheets];
    }
    get [dartx.title]() {
      return this[_title];
    }
    set [dartx.title](value) {
      this[_title] = value;
    }
    [dartx.exitFullscreen]() {
      this[_webkitExitFullscreen]();
    }
    [dartx.registerElement](tag, customElementClass, opts) {
      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
      html$._registerCustomElement(window, this, tag, customElementClass, extendsTag);
    }
    [dartx.register](tag, customElementClass, opts) {
      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
      return this[dartx.registerElement](tag, customElementClass, {extendsTag: extendsTag});
    }
    static _determineVisibilityChangeEventType(e) {
      if (typeof e.hidden !== "undefined") {
        return 'visibilitychange';
      } else if (typeof e.mozHidden !== "undefined") {
        return 'mozvisibilitychange';
      } else if (typeof e.msHidden !== "undefined") {
        return 'msvisibilitychange';
      } else if (typeof e.webkitHidden !== "undefined") {
        return 'webkitvisibilitychange';
      }
      return 'visibilitychange';
    }
    get [dartx.onVisibilityChange]() {
      return html$.HtmlDocument.visibilityChangeEvent.forTarget(this);
    }
    [dartx.createElementUpgrader](type, opts) {
      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
      return new html$._JSElementUpgrader(this, type, extendsTag);
    }
  };
  dart.setSignature(html$.HtmlDocument, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlDocument, [])}),
    fields: () => ({[dartx.body]: html$.BodyElement}),
    getters: () => ({
      [dartx.head]: dart.definiteFunctionType(html$.HeadElement, []),
      [dartx.lastModified]: dart.definiteFunctionType(core.String, []),
      [dartx.preferredStylesheetSet]: dart.definiteFunctionType(core.String, []),
      [dartx.referrer]: dart.definiteFunctionType(core.String, []),
      [dartx.selectedStylesheetSet]: dart.definiteFunctionType(core.String, []),
      [dartx.styleSheets]: dart.definiteFunctionType(core.List$(html$.StyleSheet), []),
      [dartx.title]: dart.definiteFunctionType(core.String, []),
      [dartx.onVisibilityChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    setters: () => ({
      [dartx.selectedStylesheetSet]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.title]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    methods: () => ({
      [dartx.caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
      [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
      [dartx.getCssCanvasContext]: dart.definiteFunctionType(html$.CanvasRenderingContext, [core.String, core.String, core.int, core.int]),
      [dartx.registerElement]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
      [dartx.register]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
      [dartx.createElementUpgrader]: dart.definiteFunctionType(html$.ElementUpgrader, [core.Type], {extendsTag: core.String})
    }),
    sfields: () => ({visibilityChangeEvent: EventStreamProviderOfEvent()}),
    sgetters: () => ({supportsCssCanvasContext: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_determineVisibilityChangeEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])}),
    names: ['_determineVisibilityChangeEventType']
  });
  dart.defineLazy(html$.HtmlDocument, {
    get visibilityChangeEvent() {
      return dart.const(new (_CustomEventStreamProviderOfEvent())(html$.HtmlDocument._determineVisibilityChangeEventType));
    }
  });
  dart.registerExtension(dart.global.HTMLDocument, html$.HtmlDocument);
  dart.defineExtensionNames([
    'item',
    'namedItem'
  ]);
  html$.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html$.HtmlCollection {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  dart.setSignature(html$.HtmlFormControlsCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlFormControlsCollection, [])})
  });
  dart.registerExtension(dart.global.HTMLFormControlsCollection, html$.HtmlFormControlsCollection);
  html$.HtmlHtmlElement = class HtmlHtmlElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HtmlHtmlElement._check(html$.document[dartx.createElement]("html"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.HtmlHtmlElement, 'created');
  dart.setSignature(html$.HtmlHtmlElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
      new: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
      created: dart.definiteFunctionType(html$.HtmlHtmlElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLHtmlElement, html$.HtmlHtmlElement);
  const _item = Symbol('_item');
  html$.HtmlOptionsCollection = class HtmlOptionsCollection extends html$.HtmlCollection {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.HtmlOptionsCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlOptionsCollection, [])}),
    methods: () => ({[_item]: dart.definiteFunctionType(html$.Node, [core.int])})
  });
  dart.registerExtension(dart.global.HTMLOptionsCollection, html$.HtmlOptionsCollection);
  const _get_response = Symbol('_get_response');
  dart.defineExtensionNames([
    'onAbort',
    'onError',
    'onLoad',
    'onLoadEnd',
    'onLoadStart',
    'onProgress',
    'onTimeout'
  ]);
  html$.HttpRequestEventTarget = class HttpRequestEventTarget extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.onAbort]() {
      return html$.HttpRequestEventTarget.abortEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.HttpRequestEventTarget.errorEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.HttpRequestEventTarget.loadEvent.forTarget(this);
    }
    get [dartx.onLoadEnd]() {
      return html$.HttpRequestEventTarget.loadEndEvent.forTarget(this);
    }
    get [dartx.onLoadStart]() {
      return html$.HttpRequestEventTarget.loadStartEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.HttpRequestEventTarget.progressEvent.forTarget(this);
    }
    get [dartx.onTimeout]() {
      return html$.HttpRequestEventTarget.timeoutEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.HttpRequestEventTarget, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestEventTarget, [])}),
    getters: () => ({
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
      [dartx.onTimeout]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    sfields: () => ({
      abortEvent: EventStreamProviderOfProgressEvent(),
      errorEvent: EventStreamProviderOfProgressEvent(),
      loadEvent: EventStreamProviderOfProgressEvent(),
      loadEndEvent: EventStreamProviderOfProgressEvent(),
      loadStartEvent: EventStreamProviderOfProgressEvent(),
      progressEvent: EventStreamProviderOfProgressEvent(),
      timeoutEvent: EventStreamProviderOfProgressEvent()
    })
  });
  dart.defineLazy(html$.HttpRequestEventTarget, {
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('error'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
    },
    get loadEndEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
    },
    get loadStartEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
    },
    get timeoutEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('timeout'));
    }
  });
  dart.registerExtension(dart.global.XMLHttpRequestEventTarget, html$.HttpRequestEventTarget);
  dart.defineExtensionNames([
    'responseHeaders',
    'open',
    'response',
    'abort',
    'getAllResponseHeaders',
    'getResponseHeader',
    'overrideMimeType',
    'send',
    'setRequestHeader',
    'onReadyStateChange',
    'readyState',
    'responseText',
    'responseType',
    'responseUrl',
    'responseXml',
    'status',
    'statusText',
    'timeout',
    'upload',
    'withCredentials'
  ]);
  html$.HttpRequest = class HttpRequest extends html$.HttpRequestEventTarget {
    static getString(url, opts) {
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
      return html$.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
    }
    static postFormData(url, data, opts) {
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
      let responseType = opts && 'responseType' in opts ? opts.responseType : null;
      let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
      let parts = [];
      data[dartx.forEach](dart.fn((key, value) => {
        parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
      }, StringAndStringTovoid$()));
      let formData = parts[dartx.join]('&');
      if (requestHeaders == null) {
        requestHeaders = dart.map({}, core.String, core.String);
      }
      requestHeaders[dartx.putIfAbsent]('Content-Type', dart.fn(() => 'application/x-www-form-urlencoded; charset=UTF-8', VoidToString$()));
      return html$.HttpRequest.request(url, {method: 'POST', withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
    }
    static request(url, opts) {
      let method = opts && 'method' in opts ? opts.method : null;
      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
      let responseType = opts && 'responseType' in opts ? opts.responseType : null;
      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
      let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
      let sendData = opts && 'sendData' in opts ? opts.sendData : null;
      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
      let completer = CompleterOfHttpRequest().new();
      let xhr = html$.HttpRequest.new();
      if (method == null) {
        method = 'GET';
      }
      xhr[dartx.open](method, url, {async: true});
      if (withCredentials != null) {
        xhr[dartx.withCredentials] = withCredentials;
      }
      if (responseType != null) {
        xhr[dartx.responseType] = responseType;
      }
      if (mimeType != null) {
        xhr[dartx.overrideMimeType](mimeType);
      }
      if (requestHeaders != null) {
        requestHeaders[dartx.forEach](dart.fn((header, value) => {
          xhr[dartx.setRequestHeader](header, value);
        }, StringAndStringTovoid$()));
      }
      if (onProgress != null) {
        xhr[dartx.onProgress].listen(onProgress);
      }
      xhr[dartx.onLoad].listen(dart.fn(e => {
        let accepted = dart.notNull(xhr[dartx.status]) >= 200 && dart.notNull(xhr[dartx.status]) < 300;
        let fileUri = xhr[dartx.status] == 0;
        let notModified = xhr[dartx.status] == 304;
        let unknownRedirect = dart.notNull(xhr[dartx.status]) > 307 && dart.notNull(xhr[dartx.status]) < 400;
        if (accepted || fileUri || notModified || unknownRedirect) {
          completer.complete(xhr);
        } else {
          completer.completeError(e);
        }
      }, ProgressEventTovoid$()));
      xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
      if (sendData != null) {
        xhr[dartx.send](sendData);
      } else {
        xhr[dartx.send]();
      }
      return completer.future;
    }
    static get supportsProgressEvent() {
      let xhr = html$.HttpRequest.new();
      return "onprogress" in xhr;
    }
    static get supportsCrossOrigin() {
      let xhr = html$.HttpRequest.new();
      return "withCredentials" in xhr;
    }
    static get supportsLoadEndEvent() {
      let xhr = html$.HttpRequest.new();
      return "onloadend" in xhr;
    }
    static get supportsOverrideMimeType() {
      let xhr = html$.HttpRequest.new();
      return "overrideMimeType" in xhr;
    }
    static requestCrossOrigin(url, opts) {
      let method = opts && 'method' in opts ? opts.method : null;
      let sendData = opts && 'sendData' in opts ? opts.sendData : null;
      if (dart.test(html$.HttpRequest.supportsCrossOrigin)) {
        return html$.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
      }
      let completer = CompleterOfString().new();
      if (method == null) {
        method = 'GET';
      }
      let xhr = new XDomainRequest();
      xhr.open(method, url);
      xhr.onload = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
        let response = xhr.responseText;
        completer.complete(response);
      }, dynamicTodynamic$()), 1);
      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicTodynamic())(dart.fn(e => {
        completer.completeError(e);
      }, dynamicTodynamic$()), 1);
      xhr.onprogress = {};
      xhr.ontimeout = {};
      xhr.timeout = Number.MAX_VALUE;
      if (sendData != null) {
        xhr.send(sendData);
      } else {
        xhr.send();
      }
      return completer.future;
    }
    get [dartx.responseHeaders]() {
      let headers = dart.map({}, core.String, core.String);
      let headersString = this[dartx.getAllResponseHeaders]();
      if (headersString == null) {
        return headers;
      }
      let headersList = headersString[dartx.split]('\r\n');
      for (let header of headersList) {
        if (dart.test(header[dartx.isEmpty])) {
          continue;
        }
        let splitIdx = header[dartx.indexOf](': ');
        if (splitIdx == -1) {
          continue;
        }
        let key = header[dartx.substring](0, splitIdx)[dartx.toLowerCase]();
        let value = header[dartx.substring](dart.notNull(splitIdx) + 2);
        if (dart.test(headers[dartx.containsKey](key))) {
          headers[dartx._set](key, dart.str`${headers[dartx._get](key)}, ${value}`);
        } else {
          headers[dartx._set](key, value);
        }
      }
      return headers;
    }
    [dartx.open](...args) {
      return this.open.apply(this, args);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.HttpRequest._create_1();
    }
    static _create_1() {
      return new XMLHttpRequest();
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.response]() {
      return html$._convertNativeToDart_XHR_Response(this[_get_response]);
    }
    get [_get_response]() {
      return this.response;
    }
    get [dartx.responseText]() {
      return this.responseText;
    }
    get [dartx.responseType]() {
      return this.responseType;
    }
    set [dartx.responseType](value) {
      this.responseType = value;
    }
    get [dartx.responseUrl]() {
      return this.responseURL;
    }
    get [dartx.responseXml]() {
      return this.responseXML;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.statusText]() {
      return this.statusText;
    }
    get [dartx.timeout]() {
      return this.timeout;
    }
    set [dartx.timeout](value) {
      this.timeout = value;
    }
    get [dartx.upload]() {
      return this.upload;
    }
    get [dartx.withCredentials]() {
      return this.withCredentials;
    }
    set [dartx.withCredentials](value) {
      this.withCredentials = value;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.getAllResponseHeaders](...args) {
      return this.getAllResponseHeaders.apply(this, args);
    }
    [dartx.getResponseHeader](...args) {
      return this.getResponseHeader.apply(this, args);
    }
    [dartx.overrideMimeType](...args) {
      return this.overrideMimeType.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    [dartx.setRequestHeader](...args) {
      return this.setRequestHeader.apply(this, args);
    }
    get [dartx.onReadyStateChange]() {
      return html$.HttpRequest.readyStateChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.HttpRequest, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.HttpRequest, []),
      new: dart.definiteFunctionType(html$.HttpRequest, [])
    }),
    fields: () => ({
      [dartx.readyState]: core.int,
      [_get_response]: dart.dynamic,
      [dartx.responseText]: core.String,
      [dartx.responseType]: core.String,
      [dartx.responseUrl]: core.String,
      [dartx.responseXml]: html$.Document,
      [dartx.status]: core.int,
      [dartx.statusText]: core.String,
      [dartx.timeout]: core.int,
      [dartx.upload]: html$.HttpRequestUpload,
      [dartx.withCredentials]: core.bool
    }),
    getters: () => ({
      [dartx.responseHeaders]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
      [dartx.response]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
    }),
    methods: () => ({
      [dartx.open]: dart.definiteFunctionType(dart.void, [core.String, core.String], {async: core.bool, user: core.String, password: core.String}),
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.getAllResponseHeaders]: dart.definiteFunctionType(core.String, []),
      [dartx.getResponseHeader]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.overrideMimeType]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.send]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
      [dartx.setRequestHeader]: dart.definiteFunctionType(dart.void, [core.String, core.String])
    }),
    sfields: () => ({
      readyStateChangeEvent: EventStreamProviderOfProgressEvent(),
      DONE: core.int,
      HEADERS_RECEIVED: core.int,
      LOADING: core.int,
      OPENED: core.int,
      UNSENT: core.int
    }),
    sgetters: () => ({
      supportsProgressEvent: dart.definiteFunctionType(core.bool, []),
      supportsCrossOrigin: dart.definiteFunctionType(core.bool, []),
      supportsLoadEndEvent: dart.definiteFunctionType(core.bool, []),
      supportsOverrideMimeType: dart.definiteFunctionType(core.bool, [])
    }),
    statics: () => ({
      getString: dart.definiteFunctionType(async.Future$(core.String), [core.String], {withCredentials: core.bool, onProgress: ProgressEventTovoid()}),
      postFormData: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String, MapOfString$String()], {withCredentials: core.bool, responseType: core.String, requestHeaders: MapOfString$String(), onProgress: ProgressEventTovoid()}),
      request: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String], {method: core.String, withCredentials: core.bool, responseType: core.String, mimeType: core.String, requestHeaders: MapOfString$String(), sendData: dart.dynamic, onProgress: ProgressEventTovoid()}),
      requestCrossOrigin: dart.definiteFunctionType(async.Future$(core.String), [core.String], {method: core.String, sendData: core.String}),
      _create_1: dart.definiteFunctionType(html$.HttpRequest, [])
    }),
    names: ['getString', 'postFormData', 'request', 'requestCrossOrigin', '_create_1']
  });
  html$.HttpRequest.DONE = 4;
  html$.HttpRequest.HEADERS_RECEIVED = 2;
  html$.HttpRequest.LOADING = 3;
  html$.HttpRequest.OPENED = 1;
  html$.HttpRequest.UNSENT = 0;
  dart.defineLazy(html$.HttpRequest, {
    get readyStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfProgressEvent())('readystatechange'));
    }
  });
  dart.registerExtension(dart.global.XMLHttpRequest, html$.HttpRequest);
  html$.HttpRequestUpload = class HttpRequestUpload extends html$.HttpRequestEventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.HttpRequestUpload, {
    constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestUpload, [])})
  });
  dart.registerExtension(dart.global.XMLHttpRequestUpload, html$.HttpRequestUpload);
  const _get_contentWindow = Symbol('_get_contentWindow');
  dart.defineExtensionNames([
    'contentWindow',
    'allowFullscreen',
    'height',
    'name',
    'sandbox',
    'src',
    'srcdoc',
    'width'
  ]);
  html$.IFrameElement = class IFrameElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.IFrameElement._check(html$.document[dartx.createElement]("iframe"));
    }
    created() {
      this[dartx.allowFullscreen] = null;
      this[_get_contentWindow] = null;
      this[dartx.height] = null;
      this[dartx.name] = null;
      this[dartx.sandbox] = null;
      this[dartx.src] = null;
      this[dartx.srcdoc] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.allowFullscreen]() {
      return this.allowFullscreen;
    }
    set [dartx.allowFullscreen](value) {
      this.allowFullscreen = value;
    }
    get [dartx.contentWindow]() {
      return html$._convertNativeToDart_Window(this[_get_contentWindow]);
    }
    get [_get_contentWindow]() {
      return this.contentWindow;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.sandbox]() {
      return this.sandbox;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srcdoc]() {
      return this.srcdoc;
    }
    set [dartx.srcdoc](value) {
      this.srcdoc = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
  };
  dart.defineNamedConstructor(html$.IFrameElement, 'created');
  dart.setSignature(html$.IFrameElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.IFrameElement, []),
      new: dart.definiteFunctionType(html$.IFrameElement, []),
      created: dart.definiteFunctionType(html$.IFrameElement, [])
    }),
    fields: () => ({
      [dartx.allowFullscreen]: core.bool,
      [_get_contentWindow]: dart.dynamic,
      [dartx.height]: core.String,
      [dartx.name]: core.String,
      [dartx.sandbox]: html$.DomSettableTokenList,
      [dartx.src]: core.String,
      [dartx.srcdoc]: core.String,
      [dartx.width]: core.String
    }),
    getters: () => ({[dartx.contentWindow]: dart.definiteFunctionType(html$.WindowBase, [])})
  });
  dart.registerExtension(dart.global.HTMLIFrameElement, html$.IFrameElement);
  dart.defineExtensionNames([
    'height',
    'width'
  ]);
  html$.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.ImageBitmap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ImageBitmap, [])}),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.width]: core.int
    })
  });
  dart.registerExtension(dart.global.ImageBitmap, html$.ImageBitmap);
  dart.defineExtensionNames([
    'data',
    'height',
    'width'
  ]);
  html$.ImageData = class ImageData extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(data_OR_sw, sh_OR_sw, sh) {
      if (sh === void 0) sh = null;
      if (typeof sh_OR_sw == 'number' && typeof data_OR_sw == 'number' && sh == null) {
        return html$.ImageData._create_1(data_OR_sw, sh_OR_sw);
      }
      if (typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw) && sh == null) {
        return html$.ImageData._create_2(data_OR_sw, sh_OR_sw);
      }
      if (typeof sh == 'number' && typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw)) {
        return html$.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1(data_OR_sw, sh_OR_sw) {
      return new ImageData(data_OR_sw, sh_OR_sw);
    }
    static _create_2(data_OR_sw, sh_OR_sw) {
      return new ImageData(data_OR_sw, sh_OR_sw);
    }
    static _create_3(data_OR_sw, sh_OR_sw, sh) {
      return new ImageData(data_OR_sw, sh_OR_sw, sh);
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.ImageData, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ImageData, []),
      new: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, core.int], [core.int])
    }),
    fields: () => ({
      [dartx.data]: typed_data.Uint8ClampedList,
      [dartx.height]: core.int,
      [dartx.width]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.ImageData, html$.ImageData);
  dart.defineExtensionNames([
    'alt',
    'complete',
    'crossOrigin',
    'currentSrc',
    'height',
    'isMap',
    'naturalHeight',
    'naturalWidth',
    'sizes',
    'src',
    'srcset',
    'useMap',
    'width'
  ]);
  html$.ImageElement = class ImageElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(opts) {
      let src = opts && 'src' in opts ? opts.src : null;
      let width = opts && 'width' in opts ? opts.width : null;
      let height = opts && 'height' in opts ? opts.height : null;
      let e = html$.ImageElement._check(html$.document[dartx.createElement]("img"));
      if (src != null) e[dartx.src] = src;
      if (width != null) e[dartx.width] = width;
      if (height != null) e[dartx.height] = height;
      return e;
    }
    created() {
      this[dartx.alt] = null;
      this[dartx.complete] = null;
      this[dartx.crossOrigin] = null;
      this[dartx.currentSrc] = null;
      this[dartx.height] = null;
      this[dartx.isMap] = null;
      this[dartx.naturalHeight] = null;
      this[dartx.naturalWidth] = null;
      this[dartx.sizes] = null;
      this[dartx.src] = null;
      this[dartx.srcset] = null;
      this[dartx.useMap] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.alt]() {
      return this.alt;
    }
    set [dartx.alt](value) {
      this.alt = value;
    }
    get [dartx.complete]() {
      return this.complete;
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.currentSrc]() {
      return this.currentSrc;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.isMap]() {
      return this.isMap;
    }
    set [dartx.isMap](value) {
      this.isMap = value;
    }
    get [dartx.naturalHeight]() {
      return this.naturalHeight;
    }
    get [dartx.naturalWidth]() {
      return this.naturalWidth;
    }
    get [dartx.sizes]() {
      return this.sizes;
    }
    set [dartx.sizes](value) {
      this.sizes = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srcset]() {
      return this.srcset;
    }
    set [dartx.srcset](value) {
      this.srcset = value;
    }
    get [dartx.useMap]() {
      return this.useMap;
    }
    set [dartx.useMap](value) {
      this.useMap = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
  };
  dart.defineNamedConstructor(html$.ImageElement, 'created');
  html$.ImageElement[dart.implements] = () => [html$.CanvasImageSource];
  dart.setSignature(html$.ImageElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ImageElement, []),
      new: dart.definiteFunctionType(html$.ImageElement, [], {src: core.String, width: core.int, height: core.int}),
      created: dart.definiteFunctionType(html$.ImageElement, [])
    }),
    fields: () => ({
      [dartx.alt]: core.String,
      [dartx.complete]: core.bool,
      [dartx.crossOrigin]: core.String,
      [dartx.currentSrc]: core.String,
      [dartx.height]: core.int,
      [dartx.isMap]: core.bool,
      [dartx.naturalHeight]: core.int,
      [dartx.naturalWidth]: core.int,
      [dartx.sizes]: core.String,
      [dartx.src]: core.String,
      [dartx.srcset]: core.String,
      [dartx.useMap]: core.String,
      [dartx.width]: core.int
    })
  });
  dart.registerExtension(dart.global.HTMLImageElement, html$.ImageElement);
  dart.defineExtensionNames([
    'inspect'
  ]);
  html$.InjectedScriptHost = class InjectedScriptHost extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.inspect](...args) {
      return this.inspect.apply(this, args);
    }
  };
  dart.setSignature(html$.InjectedScriptHost, {
    constructors: () => ({_: dart.definiteFunctionType(html$.InjectedScriptHost, [])}),
    methods: () => ({[dartx.inspect]: dart.definiteFunctionType(dart.void, [core.Object, core.Object])})
  });
  dart.registerExtension(dart.global.InjectedScriptHost, html$.InjectedScriptHost);
  dart.defineExtensionNames([
    'firesTouchEvents'
  ]);
  html$.InputDevice = class InputDevice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(deviceInitDict) {
      if (deviceInitDict === void 0) deviceInitDict = null;
      if (deviceInitDict != null) {
        let deviceInitDict_1 = html_common.convertDartToNative_Dictionary(deviceInitDict);
        return html$.InputDevice._create_1(deviceInitDict_1);
      }
      return html$.InputDevice._create_2();
    }
    static _create_1(deviceInitDict) {
      return new InputDevice(deviceInitDict);
    }
    static _create_2() {
      return new InputDevice();
    }
    get [dartx.firesTouchEvents]() {
      return this.firesTouchEvents;
    }
  };
  dart.setSignature(html$.InputDevice, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.InputDevice, []),
      new: dart.definiteFunctionType(html$.InputDevice, [], [core.Map])
    }),
    fields: () => ({[dartx.firesTouchEvents]: core.bool}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.InputDevice, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.InputDevice, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.InputDevice, html$.InputDevice);
  const _get_valueAsDate = Symbol('_get_valueAsDate');
  const _set_valueAsDate = Symbol('_set_valueAsDate');
  dart.defineExtensionNames([
    'valueAsDate',
    'valueAsDate',
    'checkValidity',
    'reportValidity',
    'select',
    'setCustomValidity',
    'setRangeText',
    'setSelectionRange',
    'stepDown',
    'stepUp',
    'accept',
    'alt',
    'autocapitalize',
    'autocomplete',
    'autofocus',
    'capture',
    'checked',
    'defaultChecked',
    'defaultValue',
    'dirName',
    'disabled',
    'files',
    'form',
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget',
    'height',
    'incremental',
    'indeterminate',
    'inputMode',
    'labels',
    'list',
    'max',
    'maxLength',
    'min',
    'minLength',
    'multiple',
    'name',
    'pattern',
    'placeholder',
    'readOnly',
    'required',
    'selectionDirection',
    'selectionEnd',
    'selectionStart',
    'size',
    'src',
    'step',
    'type',
    'validationMessage',
    'validity',
    'value',
    'valueAsNumber',
    'entries',
    'directory',
    'width',
    'willValidate'
  ]);
  html$.InputElement = class InputElement extends html$.HtmlElement {
    static new(opts) {
      let type = opts && 'type' in opts ? opts.type : null;
      let e = html$.InputElement._check(html$.document[dartx.createElement]("input"));
      if (type != null) {
        try {
          e[dartx.type] = type;
        } catch (_) {
        }

      }
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.accept] = null;
      this[dartx.alt] = null;
      this[dartx.autocapitalize] = null;
      this[dartx.autocomplete] = null;
      this[dartx.autofocus] = null;
      this[dartx.capture] = null;
      this[dartx.checked] = null;
      this[dartx.defaultChecked] = null;
      this[dartx.defaultValue] = null;
      this[dartx.dirName] = null;
      this[dartx.disabled] = null;
      this[dartx.files] = null;
      this[dartx.form] = null;
      this[dartx.formAction] = null;
      this[dartx.formEnctype] = null;
      this[dartx.formMethod] = null;
      this[dartx.formNoValidate] = null;
      this[dartx.formTarget] = null;
      this[dartx.height] = null;
      this[dartx.incremental] = null;
      this[dartx.indeterminate] = null;
      this[dartx.inputMode] = null;
      this[dartx.labels] = null;
      this[dartx.list] = null;
      this[dartx.max] = null;
      this[dartx.maxLength] = null;
      this[dartx.min] = null;
      this[dartx.minLength] = null;
      this[dartx.multiple] = null;
      this[dartx.name] = null;
      this[dartx.pattern] = null;
      this[dartx.placeholder] = null;
      this[dartx.readOnly] = null;
      this[dartx.required] = null;
      this[dartx.selectionDirection] = null;
      this[dartx.selectionEnd] = null;
      this[dartx.selectionStart] = null;
      this[dartx.size] = null;
      this[dartx.src] = null;
      this[dartx.step] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[_get_valueAsDate] = null;
      this[dartx.valueAsNumber] = null;
      this[dartx.entries] = null;
      this[dartx.directory] = null;
      this[dartx.width] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.accept]() {
      return this.accept;
    }
    set [dartx.accept](value) {
      this.accept = value;
    }
    get [dartx.alt]() {
      return this.alt;
    }
    set [dartx.alt](value) {
      this.alt = value;
    }
    get [dartx.autocapitalize]() {
      return this.autocapitalize;
    }
    set [dartx.autocapitalize](value) {
      this.autocapitalize = value;
    }
    get [dartx.autocomplete]() {
      return this.autocomplete;
    }
    set [dartx.autocomplete](value) {
      this.autocomplete = value;
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.capture]() {
      return this.capture;
    }
    set [dartx.capture](value) {
      this.capture = value;
    }
    get [dartx.checked]() {
      return this.checked;
    }
    set [dartx.checked](value) {
      this.checked = value;
    }
    get [dartx.defaultChecked]() {
      return this.defaultChecked;
    }
    set [dartx.defaultChecked](value) {
      this.defaultChecked = value;
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    set [dartx.defaultValue](value) {
      this.defaultValue = value;
    }
    get [dartx.dirName]() {
      return this.dirName;
    }
    set [dartx.dirName](value) {
      this.dirName = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.files]() {
      return this.files;
    }
    set [dartx.files](value) {
      this.files = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.formAction]() {
      return this.formAction;
    }
    set [dartx.formAction](value) {
      this.formAction = value;
    }
    get [dartx.formEnctype]() {
      return this.formEnctype;
    }
    set [dartx.formEnctype](value) {
      this.formEnctype = value;
    }
    get [dartx.formMethod]() {
      return this.formMethod;
    }
    set [dartx.formMethod](value) {
      this.formMethod = value;
    }
    get [dartx.formNoValidate]() {
      return this.formNoValidate;
    }
    set [dartx.formNoValidate](value) {
      this.formNoValidate = value;
    }
    get [dartx.formTarget]() {
      return this.formTarget;
    }
    set [dartx.formTarget](value) {
      this.formTarget = value;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.incremental]() {
      return this.incremental;
    }
    set [dartx.incremental](value) {
      this.incremental = value;
    }
    get [dartx.indeterminate]() {
      return this.indeterminate;
    }
    set [dartx.indeterminate](value) {
      this.indeterminate = value;
    }
    get [dartx.inputMode]() {
      return this.inputMode;
    }
    set [dartx.inputMode](value) {
      this.inputMode = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.list]() {
      return this.list;
    }
    get [dartx.max]() {
      return this.max;
    }
    set [dartx.max](value) {
      this.max = value;
    }
    get [dartx.maxLength]() {
      return this.maxLength;
    }
    set [dartx.maxLength](value) {
      this.maxLength = value;
    }
    get [dartx.min]() {
      return this.min;
    }
    set [dartx.min](value) {
      this.min = value;
    }
    get [dartx.minLength]() {
      return this.minLength;
    }
    set [dartx.minLength](value) {
      this.minLength = value;
    }
    get [dartx.multiple]() {
      return this.multiple;
    }
    set [dartx.multiple](value) {
      this.multiple = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.pattern]() {
      return this.pattern;
    }
    set [dartx.pattern](value) {
      this.pattern = value;
    }
    get [dartx.placeholder]() {
      return this.placeholder;
    }
    set [dartx.placeholder](value) {
      this.placeholder = value;
    }
    get [dartx.readOnly]() {
      return this.readOnly;
    }
    set [dartx.readOnly](value) {
      this.readOnly = value;
    }
    get [dartx.required]() {
      return this.required;
    }
    set [dartx.required](value) {
      this.required = value;
    }
    get [dartx.selectionDirection]() {
      return this.selectionDirection;
    }
    set [dartx.selectionDirection](value) {
      this.selectionDirection = value;
    }
    get [dartx.selectionEnd]() {
      return this.selectionEnd;
    }
    set [dartx.selectionEnd](value) {
      this.selectionEnd = value;
    }
    get [dartx.selectionStart]() {
      return this.selectionStart;
    }
    set [dartx.selectionStart](value) {
      this.selectionStart = value;
    }
    get [dartx.size]() {
      return this.size;
    }
    set [dartx.size](value) {
      this.size = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.step]() {
      return this.step;
    }
    set [dartx.step](value) {
      this.step = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.valueAsDate]() {
      return html_common.convertNativeToDart_DateTime(this[_get_valueAsDate]);
    }
    get [_get_valueAsDate]() {
      return this.valueAsDate;
    }
    set [dartx.valueAsDate](value) {
      this[_set_valueAsDate] = html_common.convertDartToNative_DateTime(value);
    }
    set [_set_valueAsDate](value) {
      this.valueAsDate = value;
    }
    get [dartx.valueAsNumber]() {
      return this.valueAsNumber;
    }
    set [dartx.valueAsNumber](value) {
      this.valueAsNumber = value;
    }
    get [dartx.entries]() {
      return this.webkitEntries;
    }
    get [dartx.directory]() {
      return this.webkitdirectory;
    }
    set [dartx.directory](value) {
      this.webkitdirectory = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.select](...args) {
      return this.select.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
    [dartx.setRangeText](...args) {
      return this.setRangeText.apply(this, args);
    }
    [dartx.setSelectionRange](...args) {
      return this.setSelectionRange.apply(this, args);
    }
    [dartx.stepDown](...args) {
      return this.stepDown.apply(this, args);
    }
    [dartx.stepUp](...args) {
      return this.stepUp.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.InputElement, 'created');
  html$.InputElement[dart.implements] = () => [html$.HiddenInputElement, html$.SearchInputElement, html$.TextInputElement, html$.UrlInputElement, html$.TelephoneInputElement, html$.EmailInputElement, html$.PasswordInputElement, html$.DateInputElement, html$.MonthInputElement, html$.WeekInputElement, html$.TimeInputElement, html$.LocalDateTimeInputElement, html$.NumberInputElement, html$.RangeInputElement, html$.CheckboxInputElement, html$.RadioButtonInputElement, html$.FileUploadInputElement, html$.SubmitButtonInputElement, html$.ImageButtonInputElement, html$.ResetButtonInputElement, html$.ButtonInputElement];
  dart.setSignature(html$.InputElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.InputElement, [], {type: core.String}),
      _: dart.definiteFunctionType(html$.InputElement, []),
      created: dart.definiteFunctionType(html$.InputElement, [])
    }),
    fields: () => ({
      [dartx.accept]: core.String,
      [dartx.alt]: core.String,
      [dartx.autocapitalize]: core.String,
      [dartx.autocomplete]: core.String,
      [dartx.autofocus]: core.bool,
      [dartx.capture]: core.bool,
      [dartx.checked]: core.bool,
      [dartx.defaultChecked]: core.bool,
      [dartx.defaultValue]: core.String,
      [dartx.dirName]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.files]: ListOfFile(),
      [dartx.form]: html$.FormElement,
      [dartx.formAction]: core.String,
      [dartx.formEnctype]: core.String,
      [dartx.formMethod]: core.String,
      [dartx.formNoValidate]: core.bool,
      [dartx.formTarget]: core.String,
      [dartx.height]: core.int,
      [dartx.incremental]: core.bool,
      [dartx.indeterminate]: core.bool,
      [dartx.inputMode]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.list]: html$.HtmlElement,
      [dartx.max]: core.String,
      [dartx.maxLength]: core.int,
      [dartx.min]: core.String,
      [dartx.minLength]: core.int,
      [dartx.multiple]: core.bool,
      [dartx.name]: core.String,
      [dartx.pattern]: core.String,
      [dartx.placeholder]: core.String,
      [dartx.readOnly]: core.bool,
      [dartx.required]: core.bool,
      [dartx.selectionDirection]: core.String,
      [dartx.selectionEnd]: core.int,
      [dartx.selectionStart]: core.int,
      [dartx.size]: core.int,
      [dartx.src]: core.String,
      [dartx.step]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [_get_valueAsDate]: dart.dynamic,
      [dartx.valueAsNumber]: core.num,
      [dartx.entries]: ListOfEntry(),
      [dartx.directory]: core.bool,
      [dartx.width]: core.int,
      [dartx.willValidate]: core.bool
    }),
    getters: () => ({[dartx.valueAsDate]: dart.definiteFunctionType(core.DateTime, [])}),
    setters: () => ({
      [dartx.valueAsDate]: dart.definiteFunctionType(dart.void, [core.DateTime]),
      [_set_valueAsDate]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.select]: dart.definiteFunctionType(dart.void, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
      [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String]),
      [dartx.stepDown]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [dartx.stepUp]: dart.definiteFunctionType(dart.void, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLInputElement, html$.InputElement);
  dart.defineExtensionNames([
    'autofocus',
    'disabled',
    'incremental',
    'indeterminate',
    'name',
    'value'
  ]);
  html$.InputElementBase = class InputElementBase extends core.Object {
    new() {
      this[autofocus] = null;
      this[disabled] = null;
      this[incremental] = null;
      this[indeterminate] = null;
      this[name] = null;
      this[value$] = null;
    }
    get autofocus() {
      return this[autofocus];
    }
    set autofocus(value) {
      this[autofocus] = value;
    }
    get disabled() {
      return this[disabled];
    }
    set disabled(value) {
      this[disabled] = value;
    }
    get incremental() {
      return this[incremental];
    }
    set incremental(value) {
      this[incremental] = value;
    }
    get indeterminate() {
      return this[indeterminate];
    }
    set indeterminate(value) {
      this[indeterminate] = value;
    }
    get name() {
      return this[name];
    }
    set name(value) {
      this[name] = value;
    }
    get value() {
      return this[value$];
    }
    set value(value) {
      this[value$] = value;
    }
  };
  const autofocus = Symbol(html$.InputElementBase.name + "." + 'autofocus'.toString());
  const disabled = Symbol(html$.InputElementBase.name + "." + 'disabled'.toString());
  const incremental = Symbol(html$.InputElementBase.name + "." + 'incremental'.toString());
  const indeterminate = Symbol(html$.InputElementBase.name + "." + 'indeterminate'.toString());
  const name = Symbol(html$.InputElementBase.name + "." + 'name'.toString());
  const value$ = Symbol(html$.InputElementBase.name + "." + 'value'.toString());
  html$.InputElementBase[dart.implements] = () => [html$.Element];
  dart.setSignature(html$.InputElementBase, {
    fields: () => ({
      autofocus: core.bool,
      disabled: core.bool,
      incremental: core.bool,
      indeterminate: core.bool,
      name: core.String,
      value: core.String
    })
  });
  dart.defineExtensionMembers(html$.InputElementBase, [
    'autofocus',
    'autofocus',
    'disabled',
    'disabled',
    'incremental',
    'incremental',
    'indeterminate',
    'indeterminate',
    'name',
    'name',
    'value',
    'value'
  ]);
  html$.HiddenInputElement = class HiddenInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'hidden'});
    }
  };
  html$.HiddenInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.HiddenInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.HiddenInputElement, [])})
  });
  dart.defineExtensionNames([
    'autocomplete',
    'maxLength',
    'pattern',
    'placeholder',
    'readOnly',
    'required',
    'size',
    'selectionDirection',
    'selectionEnd',
    'selectionStart'
  ]);
  html$.TextInputElementBase = class TextInputElementBase extends core.Object {
    new() {
      this[autocomplete] = null;
      this[maxLength] = null;
      this[pattern] = null;
      this[placeholder] = null;
      this[readOnly] = null;
      this[required] = null;
      this[size] = null;
      this[selectionDirection] = null;
      this[selectionEnd] = null;
      this[selectionStart] = null;
    }
    get autocomplete() {
      return this[autocomplete];
    }
    set autocomplete(value) {
      this[autocomplete] = value;
    }
    get maxLength() {
      return this[maxLength];
    }
    set maxLength(value) {
      this[maxLength] = value;
    }
    get pattern() {
      return this[pattern];
    }
    set pattern(value) {
      this[pattern] = value;
    }
    get placeholder() {
      return this[placeholder];
    }
    set placeholder(value) {
      this[placeholder] = value;
    }
    get readOnly() {
      return this[readOnly];
    }
    set readOnly(value) {
      this[readOnly] = value;
    }
    get required() {
      return this[required];
    }
    set required(value) {
      this[required] = value;
    }
    get size() {
      return this[size];
    }
    set size(value) {
      this[size] = value;
    }
    get selectionDirection() {
      return this[selectionDirection];
    }
    set selectionDirection(value) {
      this[selectionDirection] = value;
    }
    get selectionEnd() {
      return this[selectionEnd];
    }
    set selectionEnd(value) {
      this[selectionEnd] = value;
    }
    get selectionStart() {
      return this[selectionStart];
    }
    set selectionStart(value) {
      this[selectionStart] = value;
    }
  };
  const autocomplete = Symbol(html$.TextInputElementBase.name + "." + 'autocomplete'.toString());
  const maxLength = Symbol(html$.TextInputElementBase.name + "." + 'maxLength'.toString());
  const pattern = Symbol(html$.TextInputElementBase.name + "." + 'pattern'.toString());
  const placeholder = Symbol(html$.TextInputElementBase.name + "." + 'placeholder'.toString());
  const readOnly = Symbol(html$.TextInputElementBase.name + "." + 'readOnly'.toString());
  const required = Symbol(html$.TextInputElementBase.name + "." + 'required'.toString());
  const size = Symbol(html$.TextInputElementBase.name + "." + 'size'.toString());
  const selectionDirection = Symbol(html$.TextInputElementBase.name + "." + 'selectionDirection'.toString());
  const selectionEnd = Symbol(html$.TextInputElementBase.name + "." + 'selectionEnd'.toString());
  const selectionStart = Symbol(html$.TextInputElementBase.name + "." + 'selectionStart'.toString());
  html$.TextInputElementBase[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.TextInputElementBase, {
    fields: () => ({
      autocomplete: core.String,
      maxLength: core.int,
      pattern: core.String,
      placeholder: core.String,
      readOnly: core.bool,
      required: core.bool,
      size: core.int,
      selectionDirection: core.String,
      selectionEnd: core.int,
      selectionStart: core.int
    })
  });
  dart.defineExtensionMembers(html$.TextInputElementBase, [
    'autocomplete',
    'autocomplete',
    'maxLength',
    'maxLength',
    'pattern',
    'pattern',
    'placeholder',
    'placeholder',
    'readOnly',
    'readOnly',
    'required',
    'required',
    'size',
    'size',
    'selectionDirection',
    'selectionDirection',
    'selectionEnd',
    'selectionEnd',
    'selectionStart',
    'selectionStart'
  ]);
  dart.defineExtensionNames([
    'dirName'
  ]);
  html$.SearchInputElement = class SearchInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'search'});
    }
    get dirName() {
      return this[dirName];
    }
    set dirName(value) {
      this[dirName] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'search'})[dartx.type] == 'search';
    }
  };
  const dirName = Symbol(html$.SearchInputElement.name + "." + 'dirName'.toString());
  html$.SearchInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.SearchInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.SearchInputElement, [])}),
    fields: () => ({dirName: core.String}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.SearchInputElement, ['dirName', 'dirName']);
  dart.defineExtensionNames([
    'dirName'
  ]);
  html$.TextInputElement = class TextInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'text'});
    }
    get dirName() {
      return this[dirName$];
    }
    set dirName(value) {
      this[dirName$] = value;
    }
  };
  const dirName$ = Symbol(html$.TextInputElement.name + "." + 'dirName'.toString());
  html$.TextInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.TextInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.TextInputElement, [])}),
    fields: () => ({dirName: core.String})
  });
  dart.defineExtensionMembers(html$.TextInputElement, ['dirName', 'dirName']);
  html$.UrlInputElement = class UrlInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'url'});
    }
    static get supported() {
      return html$.InputElement.new({type: 'url'})[dartx.type] == 'url';
    }
  };
  html$.UrlInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.UrlInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.UrlInputElement, [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  html$.TelephoneInputElement = class TelephoneInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'tel'});
    }
    static get supported() {
      return html$.InputElement.new({type: 'tel'})[dartx.type] == 'tel';
    }
  };
  html$.TelephoneInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.TelephoneInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.TelephoneInputElement, [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionNames([
    'autocomplete',
    'autofocus',
    'maxLength',
    'multiple',
    'pattern',
    'placeholder',
    'readOnly',
    'required',
    'size'
  ]);
  html$.EmailInputElement = class EmailInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'email'});
    }
    get autocomplete() {
      return this[autocomplete$];
    }
    set autocomplete(value) {
      this[autocomplete$] = value;
    }
    get autofocus() {
      return this[autofocus$];
    }
    set autofocus(value) {
      this[autofocus$] = value;
    }
    get maxLength() {
      return this[maxLength$];
    }
    set maxLength(value) {
      this[maxLength$] = value;
    }
    get multiple() {
      return this[multiple];
    }
    set multiple(value) {
      this[multiple] = value;
    }
    get pattern() {
      return this[pattern$];
    }
    set pattern(value) {
      this[pattern$] = value;
    }
    get placeholder() {
      return this[placeholder$];
    }
    set placeholder(value) {
      this[placeholder$] = value;
    }
    get readOnly() {
      return this[readOnly$];
    }
    set readOnly(value) {
      this[readOnly$] = value;
    }
    get required() {
      return this[required$];
    }
    set required(value) {
      this[required$] = value;
    }
    get size() {
      return this[size$];
    }
    set size(value) {
      this[size$] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'email'})[dartx.type] == 'email';
    }
  };
  const autocomplete$ = Symbol(html$.EmailInputElement.name + "." + 'autocomplete'.toString());
  const autofocus$ = Symbol(html$.EmailInputElement.name + "." + 'autofocus'.toString());
  const maxLength$ = Symbol(html$.EmailInputElement.name + "." + 'maxLength'.toString());
  const multiple = Symbol(html$.EmailInputElement.name + "." + 'multiple'.toString());
  const pattern$ = Symbol(html$.EmailInputElement.name + "." + 'pattern'.toString());
  const placeholder$ = Symbol(html$.EmailInputElement.name + "." + 'placeholder'.toString());
  const readOnly$ = Symbol(html$.EmailInputElement.name + "." + 'readOnly'.toString());
  const required$ = Symbol(html$.EmailInputElement.name + "." + 'required'.toString());
  const size$ = Symbol(html$.EmailInputElement.name + "." + 'size'.toString());
  html$.EmailInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.EmailInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.EmailInputElement, [])}),
    fields: () => ({
      autocomplete: core.String,
      autofocus: core.bool,
      maxLength: core.int,
      multiple: core.bool,
      pattern: core.String,
      placeholder: core.String,
      readOnly: core.bool,
      required: core.bool,
      size: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.EmailInputElement, [
    'autocomplete',
    'autocomplete',
    'autofocus',
    'autofocus',
    'maxLength',
    'maxLength',
    'multiple',
    'multiple',
    'pattern',
    'pattern',
    'placeholder',
    'placeholder',
    'readOnly',
    'readOnly',
    'required',
    'required',
    'size',
    'size'
  ]);
  html$.PasswordInputElement = class PasswordInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'password'});
    }
  };
  html$.PasswordInputElement[dart.implements] = () => [html$.TextInputElementBase];
  dart.setSignature(html$.PasswordInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.PasswordInputElement, [])})
  });
  dart.defineExtensionNames([
    'max',
    'min',
    'step',
    'valueAsNumber'
  ]);
  html$.RangeInputElementBase = class RangeInputElementBase extends core.Object {
    new() {
      this[max] = null;
      this[min] = null;
      this[step] = null;
      this[valueAsNumber] = null;
    }
    get max() {
      return this[max];
    }
    set max(value) {
      this[max] = value;
    }
    get min() {
      return this[min];
    }
    set min(value) {
      this[min] = value;
    }
    get step() {
      return this[step];
    }
    set step(value) {
      this[step] = value;
    }
    get valueAsNumber() {
      return this[valueAsNumber];
    }
    set valueAsNumber(value) {
      this[valueAsNumber] = value;
    }
  };
  const max = Symbol(html$.RangeInputElementBase.name + "." + 'max'.toString());
  const min = Symbol(html$.RangeInputElementBase.name + "." + 'min'.toString());
  const step = Symbol(html$.RangeInputElementBase.name + "." + 'step'.toString());
  const valueAsNumber = Symbol(html$.RangeInputElementBase.name + "." + 'valueAsNumber'.toString());
  html$.RangeInputElementBase[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.RangeInputElementBase, {
    fields: () => ({
      max: core.String,
      min: core.String,
      step: core.String,
      valueAsNumber: core.num
    })
  });
  dart.defineExtensionMembers(html$.RangeInputElementBase, [
    'max',
    'max',
    'min',
    'min',
    'step',
    'step',
    'valueAsNumber',
    'valueAsNumber'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.DateInputElement = class DateInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'date'});
    }
    get valueAsDate() {
      return this[valueAsDate];
    }
    set valueAsDate(value) {
      this[valueAsDate] = value;
    }
    get readOnly() {
      return this[readOnly$0];
    }
    set readOnly(value) {
      this[readOnly$0] = value;
    }
    get required() {
      return this[required$0];
    }
    set required(value) {
      this[required$0] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'date'})[dartx.type] == 'date';
    }
  };
  const valueAsDate = Symbol(html$.DateInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$0 = Symbol(html$.DateInputElement.name + "." + 'readOnly'.toString());
  const required$0 = Symbol(html$.DateInputElement.name + "." + 'required'.toString());
  html$.DateInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.DateInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.DateInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.DateInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.MonthInputElement = class MonthInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'month'});
    }
    get valueAsDate() {
      return this[valueAsDate$];
    }
    set valueAsDate(value) {
      this[valueAsDate$] = value;
    }
    get readOnly() {
      return this[readOnly$1];
    }
    set readOnly(value) {
      this[readOnly$1] = value;
    }
    get required() {
      return this[required$1];
    }
    set required(value) {
      this[required$1] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'month'})[dartx.type] == 'month';
    }
  };
  const valueAsDate$ = Symbol(html$.MonthInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$1 = Symbol(html$.MonthInputElement.name + "." + 'readOnly'.toString());
  const required$1 = Symbol(html$.MonthInputElement.name + "." + 'required'.toString());
  html$.MonthInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.MonthInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.MonthInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.MonthInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.WeekInputElement = class WeekInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'week'});
    }
    get valueAsDate() {
      return this[valueAsDate$0];
    }
    set valueAsDate(value) {
      this[valueAsDate$0] = value;
    }
    get readOnly() {
      return this[readOnly$2];
    }
    set readOnly(value) {
      this[readOnly$2] = value;
    }
    get required() {
      return this[required$2];
    }
    set required(value) {
      this[required$2] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'week'})[dartx.type] == 'week';
    }
  };
  const valueAsDate$0 = Symbol(html$.WeekInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$2 = Symbol(html$.WeekInputElement.name + "." + 'readOnly'.toString());
  const required$2 = Symbol(html$.WeekInputElement.name + "." + 'required'.toString());
  html$.WeekInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.WeekInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.WeekInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.WeekInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'valueAsDate',
    'readOnly',
    'required'
  ]);
  html$.TimeInputElement = class TimeInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'time'});
    }
    get valueAsDate() {
      return this[valueAsDate$1];
    }
    set valueAsDate(value) {
      this[valueAsDate$1] = value;
    }
    get readOnly() {
      return this[readOnly$3];
    }
    set readOnly(value) {
      this[readOnly$3] = value;
    }
    get required() {
      return this[required$3];
    }
    set required(value) {
      this[required$3] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'time'})[dartx.type] == 'time';
    }
  };
  const valueAsDate$1 = Symbol(html$.TimeInputElement.name + "." + 'valueAsDate'.toString());
  const readOnly$3 = Symbol(html$.TimeInputElement.name + "." + 'readOnly'.toString());
  const required$3 = Symbol(html$.TimeInputElement.name + "." + 'required'.toString());
  html$.TimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.TimeInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.TimeInputElement, [])}),
    fields: () => ({
      valueAsDate: core.DateTime,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.TimeInputElement, [
    'valueAsDate',
    'valueAsDate',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  dart.defineExtensionNames([
    'readOnly',
    'required'
  ]);
  html$.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'datetime-local'});
    }
    get readOnly() {
      return this[readOnly$4];
    }
    set readOnly(value) {
      this[readOnly$4] = value;
    }
    get required() {
      return this[required$4];
    }
    set required(value) {
      this[required$4] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
    }
  };
  const readOnly$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
  const required$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'required'.toString());
  html$.LocalDateTimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.LocalDateTimeInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.LocalDateTimeInputElement, [])}),
    fields: () => ({
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.LocalDateTimeInputElement, ['readOnly', 'readOnly', 'required', 'required']);
  dart.defineExtensionNames([
    'placeholder',
    'readOnly',
    'required'
  ]);
  html$.NumberInputElement = class NumberInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'number'});
    }
    get placeholder() {
      return this[placeholder$0];
    }
    set placeholder(value) {
      this[placeholder$0] = value;
    }
    get readOnly() {
      return this[readOnly$5];
    }
    set readOnly(value) {
      this[readOnly$5] = value;
    }
    get required() {
      return this[required$5];
    }
    set required(value) {
      this[required$5] = value;
    }
    static get supported() {
      return html$.InputElement.new({type: 'number'})[dartx.type] == 'number';
    }
  };
  const placeholder$0 = Symbol(html$.NumberInputElement.name + "." + 'placeholder'.toString());
  const readOnly$5 = Symbol(html$.NumberInputElement.name + "." + 'readOnly'.toString());
  const required$5 = Symbol(html$.NumberInputElement.name + "." + 'required'.toString());
  html$.NumberInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.NumberInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.NumberInputElement, [])}),
    fields: () => ({
      placeholder: core.String,
      readOnly: core.bool,
      required: core.bool
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionMembers(html$.NumberInputElement, [
    'placeholder',
    'placeholder',
    'readOnly',
    'readOnly',
    'required',
    'required'
  ]);
  html$.RangeInputElement = class RangeInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'range'});
    }
    static get supported() {
      return html$.InputElement.new({type: 'range'})[dartx.type] == 'range';
    }
  };
  html$.RangeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
  dart.setSignature(html$.RangeInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.RangeInputElement, [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineExtensionNames([
    'checked',
    'required'
  ]);
  html$.CheckboxInputElement = class CheckboxInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'checkbox'});
    }
    get checked() {
      return this[checked];
    }
    set checked(value) {
      this[checked] = value;
    }
    get required() {
      return this[required$6];
    }
    set required(value) {
      this[required$6] = value;
    }
  };
  const checked = Symbol(html$.CheckboxInputElement.name + "." + 'checked'.toString());
  const required$6 = Symbol(html$.CheckboxInputElement.name + "." + 'required'.toString());
  html$.CheckboxInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.CheckboxInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.CheckboxInputElement, [])}),
    fields: () => ({
      checked: core.bool,
      required: core.bool
    })
  });
  dart.defineExtensionMembers(html$.CheckboxInputElement, ['checked', 'checked', 'required', 'required']);
  dart.defineExtensionNames([
    'checked',
    'required'
  ]);
  html$.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'radio'});
    }
    get checked() {
      return this[checked$];
    }
    set checked(value) {
      this[checked$] = value;
    }
    get required() {
      return this[required$7];
    }
    set required(value) {
      this[required$7] = value;
    }
  };
  const checked$ = Symbol(html$.RadioButtonInputElement.name + "." + 'checked'.toString());
  const required$7 = Symbol(html$.RadioButtonInputElement.name + "." + 'required'.toString());
  html$.RadioButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.RadioButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.RadioButtonInputElement, [])}),
    fields: () => ({
      checked: core.bool,
      required: core.bool
    })
  });
  dart.defineExtensionMembers(html$.RadioButtonInputElement, ['checked', 'checked', 'required', 'required']);
  dart.defineExtensionNames([
    'accept',
    'multiple',
    'required',
    'files'
  ]);
  html$.FileUploadInputElement = class FileUploadInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'file'});
    }
    get accept() {
      return this[accept];
    }
    set accept(value) {
      this[accept] = value;
    }
    get multiple() {
      return this[multiple$];
    }
    set multiple(value) {
      this[multiple$] = value;
    }
    get required() {
      return this[required$8];
    }
    set required(value) {
      this[required$8] = value;
    }
    get files() {
      return this[files];
    }
    set files(value) {
      this[files] = value;
    }
  };
  const accept = Symbol(html$.FileUploadInputElement.name + "." + 'accept'.toString());
  const multiple$ = Symbol(html$.FileUploadInputElement.name + "." + 'multiple'.toString());
  const required$8 = Symbol(html$.FileUploadInputElement.name + "." + 'required'.toString());
  const files = Symbol(html$.FileUploadInputElement.name + "." + 'files'.toString());
  html$.FileUploadInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.FileUploadInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.FileUploadInputElement, [])}),
    fields: () => ({
      accept: core.String,
      multiple: core.bool,
      required: core.bool,
      files: ListOfFile()
    })
  });
  dart.defineExtensionMembers(html$.FileUploadInputElement, [
    'accept',
    'accept',
    'multiple',
    'multiple',
    'required',
    'required',
    'files',
    'files'
  ]);
  dart.defineExtensionNames([
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget'
  ]);
  html$.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'submit'});
    }
    get formAction() {
      return this[formAction];
    }
    set formAction(value) {
      this[formAction] = value;
    }
    get formEnctype() {
      return this[formEnctype];
    }
    set formEnctype(value) {
      this[formEnctype] = value;
    }
    get formMethod() {
      return this[formMethod];
    }
    set formMethod(value) {
      this[formMethod] = value;
    }
    get formNoValidate() {
      return this[formNoValidate];
    }
    set formNoValidate(value) {
      this[formNoValidate] = value;
    }
    get formTarget() {
      return this[formTarget];
    }
    set formTarget(value) {
      this[formTarget] = value;
    }
  };
  const formAction = Symbol(html$.SubmitButtonInputElement.name + "." + 'formAction'.toString());
  const formEnctype = Symbol(html$.SubmitButtonInputElement.name + "." + 'formEnctype'.toString());
  const formMethod = Symbol(html$.SubmitButtonInputElement.name + "." + 'formMethod'.toString());
  const formNoValidate = Symbol(html$.SubmitButtonInputElement.name + "." + 'formNoValidate'.toString());
  const formTarget = Symbol(html$.SubmitButtonInputElement.name + "." + 'formTarget'.toString());
  html$.SubmitButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.SubmitButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.SubmitButtonInputElement, [])}),
    fields: () => ({
      formAction: core.String,
      formEnctype: core.String,
      formMethod: core.String,
      formNoValidate: core.bool,
      formTarget: core.String
    })
  });
  dart.defineExtensionMembers(html$.SubmitButtonInputElement, [
    'formAction',
    'formAction',
    'formEnctype',
    'formEnctype',
    'formMethod',
    'formMethod',
    'formNoValidate',
    'formNoValidate',
    'formTarget',
    'formTarget'
  ]);
  dart.defineExtensionNames([
    'alt',
    'formAction',
    'formEnctype',
    'formMethod',
    'formNoValidate',
    'formTarget',
    'height',
    'src',
    'width'
  ]);
  html$.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'image'});
    }
    get alt() {
      return this[alt];
    }
    set alt(value) {
      this[alt] = value;
    }
    get formAction() {
      return this[formAction$];
    }
    set formAction(value) {
      this[formAction$] = value;
    }
    get formEnctype() {
      return this[formEnctype$];
    }
    set formEnctype(value) {
      this[formEnctype$] = value;
    }
    get formMethod() {
      return this[formMethod$];
    }
    set formMethod(value) {
      this[formMethod$] = value;
    }
    get formNoValidate() {
      return this[formNoValidate$];
    }
    set formNoValidate(value) {
      this[formNoValidate$] = value;
    }
    get formTarget() {
      return this[formTarget$];
    }
    set formTarget(value) {
      this[formTarget$] = value;
    }
    get height() {
      return this[height];
    }
    set height(value) {
      this[height] = value;
    }
    get src() {
      return this[src];
    }
    set src(value) {
      this[src] = value;
    }
    get width() {
      return this[width];
    }
    set width(value) {
      this[width] = value;
    }
  };
  const alt = Symbol(html$.ImageButtonInputElement.name + "." + 'alt'.toString());
  const formAction$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formAction'.toString());
  const formEnctype$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formEnctype'.toString());
  const formMethod$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formMethod'.toString());
  const formNoValidate$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formNoValidate'.toString());
  const formTarget$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formTarget'.toString());
  const height = Symbol(html$.ImageButtonInputElement.name + "." + 'height'.toString());
  const src = Symbol(html$.ImageButtonInputElement.name + "." + 'src'.toString());
  const width = Symbol(html$.ImageButtonInputElement.name + "." + 'width'.toString());
  html$.ImageButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.ImageButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ImageButtonInputElement, [])}),
    fields: () => ({
      alt: core.String,
      formAction: core.String,
      formEnctype: core.String,
      formMethod: core.String,
      formNoValidate: core.bool,
      formTarget: core.String,
      height: core.int,
      src: core.String,
      width: core.int
    })
  });
  dart.defineExtensionMembers(html$.ImageButtonInputElement, [
    'alt',
    'alt',
    'formAction',
    'formAction',
    'formEnctype',
    'formEnctype',
    'formMethod',
    'formMethod',
    'formNoValidate',
    'formNoValidate',
    'formTarget',
    'formTarget',
    'height',
    'height',
    'src',
    'src',
    'width',
    'width'
  ]);
  html$.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'reset'});
    }
  };
  html$.ResetButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.ResetButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ResetButtonInputElement, [])})
  });
  html$.ButtonInputElement = class ButtonInputElement extends core.Object {
    static new() {
      return html$.InputElement.new({type: 'button'});
    }
  };
  html$.ButtonInputElement[dart.implements] = () => [html$.InputElementBase];
  dart.setSignature(html$.ButtonInputElement, {
    constructors: () => ({new: dart.definiteFunctionType(html$.ButtonInputElement, [])})
  });
  const _initKeyboardEvent = Symbol('_initKeyboardEvent');
  const _keyIdentifier = Symbol('_keyIdentifier');
  dart.defineExtensionNames([
    'keyCode',
    'charCode',
    'which',
    'getModifierState',
    'altKey',
    'code',
    'ctrlKey',
    'key',
    'keyLocation',
    'location',
    'metaKey',
    'repeat',
    'shiftKey'
  ]);
  html$.KeyboardEvent = class KeyboardEvent extends html$.UIEvent {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.KeyboardEvent._check(html$.document[_createEvent]("KeyboardEvent"));
      e[_initKeyboardEvent](type, canBubble, cancelable, view, "", keyLocation, ctrlKey, altKey, shiftKey, metaKey);
      return e;
    }
    [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
      if (typeof this.initKeyEvent == "function") {
        this.initKeyEvent(type, canBubble, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, 0, 0);
      } else {
        this.initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
      }
    }
    get [dartx.keyCode]() {
      return this[_keyCode];
    }
    get [dartx.charCode]() {
      return this[_charCode];
    }
    get [dartx.which]() {
      return this[_which];
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.KeyboardEvent._create_1(type, eventInitDict_1);
      }
      return html$.KeyboardEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new KeyboardEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new KeyboardEvent(type);
    }
    get [dartx.altKey]() {
      return this.altKey;
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.ctrlKey]() {
      return this.ctrlKey;
    }
    get [dartx.key]() {
      return this.key;
    }
    get [_keyIdentifier]() {
      return this.keyIdentifier;
    }
    get [dartx.keyLocation]() {
      return this.keyLocation;
    }
    get [dartx.location]() {
      return this.location;
    }
    get [dartx.metaKey]() {
      return this.metaKey;
    }
    get [dartx.repeat]() {
      return this.repeat;
    }
    get [dartx.shiftKey]() {
      return this.shiftKey;
    }
    [dartx.getModifierState](...args) {
      return this.getModifierState.apply(this, args);
    }
  };
  dart.setSignature(html$.KeyboardEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
      _: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.altKey]: core.bool,
      [dartx.code]: core.String,
      [dartx.ctrlKey]: core.bool,
      [dartx.key]: core.String,
      [_keyIdentifier]: core.String,
      [dartx.keyLocation]: core.int,
      [dartx.location]: core.int,
      [dartx.metaKey]: core.bool,
      [dartx.repeat]: core.bool,
      [dartx.shiftKey]: core.bool
    }),
    getters: () => ({
      [dartx.keyCode]: dart.definiteFunctionType(core.int, []),
      [dartx.charCode]: dart.definiteFunctionType(core.int, []),
      [dartx.which]: dart.definiteFunctionType(core.int, [])
    }),
    methods: () => ({
      [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
      [dartx.getModifierState]: dart.definiteFunctionType(core.bool, [core.String])
    }),
    sfields: () => ({
      DOM_KEY_LOCATION_LEFT: core.int,
      DOM_KEY_LOCATION_NUMPAD: core.int,
      DOM_KEY_LOCATION_RIGHT: core.int,
      DOM_KEY_LOCATION_STANDARD: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.KeyboardEvent.DOM_KEY_LOCATION_LEFT = 1;
  html$.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD = 3;
  html$.KeyboardEvent.DOM_KEY_LOCATION_RIGHT = 2;
  html$.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0;
  dart.registerExtension(dart.global.KeyboardEvent, html$.KeyboardEvent);
  html$.KeyframeEffect = class KeyframeEffect extends html$.AnimationEffectReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(target, keyframes, timing) {
      if (timing === void 0) timing = null;
      if (ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null) && timing == null) {
        return html$.KeyframeEffect._create_1(target, keyframes);
      }
      if (typeof timing == 'number' && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
        return html$.KeyframeEffect._create_2(target, keyframes, timing);
      }
      if (core.Map.is(timing) && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
        let timing_1 = html_common.convertDartToNative_Dictionary(timing);
        return html$.KeyframeEffect._create_3(target, keyframes, timing_1);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1(target, keyframes) {
      return new KeyframeEffect(target, keyframes);
    }
    static _create_2(target, keyframes, timing) {
      return new KeyframeEffect(target, keyframes, timing);
    }
    static _create_3(target, keyframes, timing) {
      return new KeyframeEffect(target, keyframes, timing);
    }
  };
  dart.setSignature(html$.KeyframeEffect, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.KeyframeEffect, []),
      new: dart.definiteFunctionType(html$.KeyframeEffect, [html$.Element, ListOfMap()], [dart.dynamic])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.KeyframeEffect, html$.KeyframeEffect);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'autofocus',
    'challenge',
    'disabled',
    'form',
    'keytype',
    'labels',
    'name',
    'type',
    'validationMessage',
    'validity',
    'willValidate'
  ]);
  html$.KeygenElement = class KeygenElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.KeygenElement._check(html$.document[dartx.createElement]("keygen"));
    }
    created() {
      this[dartx.autofocus] = null;
      this[dartx.challenge] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.keytype] = null;
      this[dartx.labels] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    static get supported() {
      return dart.test(html$.Element.isTagSupported('keygen')) && html$.KeygenElement.is(html$.Element.tag('keygen'));
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.challenge]() {
      return this.challenge;
    }
    set [dartx.challenge](value) {
      this.challenge = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.keytype]() {
      return this.keytype;
    }
    set [dartx.keytype](value) {
      this.keytype = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.KeygenElement, 'created');
  dart.setSignature(html$.KeygenElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.KeygenElement, []),
      new: dart.definiteFunctionType(html$.KeygenElement, []),
      created: dart.definiteFunctionType(html$.KeygenElement, [])
    }),
    fields: () => ({
      [dartx.autofocus]: core.bool,
      [dartx.challenge]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.keytype]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLKeygenElement, html$.KeygenElement);
  dart.defineExtensionNames([
    'value'
  ]);
  html$.LIElement = class LIElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LIElement._check(html$.document[dartx.createElement]("li"));
    }
    created() {
      this[dartx.value] = null;
      super.created();
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.LIElement, 'created');
  dart.setSignature(html$.LIElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LIElement, []),
      new: dart.definiteFunctionType(html$.LIElement, []),
      created: dart.definiteFunctionType(html$.LIElement, [])
    }),
    fields: () => ({[dartx.value]: core.int})
  });
  dart.registerExtension(dart.global.HTMLLIElement, html$.LIElement);
  dart.defineExtensionNames([
    'control',
    'form',
    'htmlFor'
  ]);
  html$.LabelElement = class LabelElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LabelElement._check(html$.document[dartx.createElement]("label"));
    }
    created() {
      this[dartx.control] = null;
      this[dartx.form] = null;
      this[dartx.htmlFor] = null;
      super.created();
    }
    get [dartx.control]() {
      return this.control;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.htmlFor]() {
      return this.htmlFor;
    }
    set [dartx.htmlFor](value) {
      this.htmlFor = value;
    }
  };
  dart.defineNamedConstructor(html$.LabelElement, 'created');
  dart.setSignature(html$.LabelElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LabelElement, []),
      new: dart.definiteFunctionType(html$.LabelElement, []),
      created: dart.definiteFunctionType(html$.LabelElement, [])
    }),
    fields: () => ({
      [dartx.control]: html$.HtmlElement,
      [dartx.form]: html$.FormElement,
      [dartx.htmlFor]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLLabelElement, html$.LabelElement);
  dart.defineExtensionNames([
    'form'
  ]);
  html$.LegendElement = class LegendElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LegendElement._check(html$.document[dartx.createElement]("legend"));
    }
    created() {
      this[dartx.form] = null;
      super.created();
    }
    get [dartx.form]() {
      return this.form;
    }
  };
  dart.defineNamedConstructor(html$.LegendElement, 'created');
  dart.setSignature(html$.LegendElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LegendElement, []),
      new: dart.definiteFunctionType(html$.LegendElement, []),
      created: dart.definiteFunctionType(html$.LegendElement, [])
    }),
    fields: () => ({[dartx.form]: html$.FormElement})
  });
  dart.registerExtension(dart.global.HTMLLegendElement, html$.LegendElement);
  dart.defineExtensionNames([
    'supportsImport',
    'crossOrigin',
    'disabled',
    'href',
    'hreflang',
    'import',
    'integrity',
    'media',
    'rel',
    'sheet',
    'sizes',
    'type'
  ]);
  html$.LinkElement = class LinkElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.LinkElement._check(html$.document[dartx.createElement]("link"));
    }
    created() {
      this[dartx.crossOrigin] = null;
      this[dartx.disabled] = null;
      this[dartx.href] = null;
      this[dartx.hreflang] = null;
      this[dartx.import] = null;
      this[dartx.integrity] = null;
      this[dartx.media] = null;
      this[dartx.rel] = null;
      this[dartx.sheet] = null;
      this[dartx.sizes] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.hreflang]() {
      return this.hreflang;
    }
    set [dartx.hreflang](value) {
      this.hreflang = value;
    }
    get [dartx.import]() {
      return this.import;
    }
    get [dartx.integrity]() {
      return this.integrity;
    }
    set [dartx.integrity](value) {
      this.integrity = value;
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.rel]() {
      return this.rel;
    }
    set [dartx.rel](value) {
      this.rel = value;
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.sizes]() {
      return this.sizes;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.supportsImport]() {
      return "import" in this;
    }
  };
  dart.defineNamedConstructor(html$.LinkElement, 'created');
  dart.setSignature(html$.LinkElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.LinkElement, []),
      new: dart.definiteFunctionType(html$.LinkElement, []),
      created: dart.definiteFunctionType(html$.LinkElement, [])
    }),
    fields: () => ({
      [dartx.crossOrigin]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.href]: core.String,
      [dartx.hreflang]: core.String,
      [dartx.import]: html$.Document,
      [dartx.integrity]: core.String,
      [dartx.media]: core.String,
      [dartx.rel]: core.String,
      [dartx.sheet]: html$.StyleSheet,
      [dartx.sizes]: html$.DomSettableTokenList,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.supportsImport]: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLLinkElement, html$.LinkElement);
  dart.defineExtensionNames([
    'assign',
    'reload',
    'replace',
    'origin',
    'toString',
    'ancestorOrigins',
    'hash',
    'host',
    'hostname',
    'href',
    'pathname',
    'port',
    'protocol',
    'search'
  ]);
  html$.Location = class Location extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.ancestorOrigins]() {
      return this.ancestorOrigins;
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    [dartx.assign](...args) {
      return this.assign.apply(this, args);
    }
    [dartx.reload](...args) {
      return this.reload.apply(this, args);
    }
    [dartx.replace](...args) {
      return this.replace.apply(this, args);
    }
    get [dartx.origin]() {
      if ("origin" in this) {
        return this.origin;
      }
      return dart.str`${this[dartx.protocol]}//${this[dartx.host]}`;
    }
    [dartx.toString]() {
      return String(this);
    }
  };
  html$.Location[dart.implements] = () => [html$.LocationBase];
  dart.setSignature(html$.Location, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Location, [])}),
    fields: () => ({
      [dartx.ancestorOrigins]: ListOfString(),
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String
    }),
    getters: () => ({[dartx.origin]: dart.definiteFunctionType(core.String, [])}),
    methods: () => ({
      [dartx.assign]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.reload]: dart.definiteFunctionType(dart.void, []),
      [dartx.replace]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.Location, html$.Location);
  dart.defineExtensionNames([
    'areas',
    'name'
  ]);
  html$.MapElement = class MapElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MapElement._check(html$.document[dartx.createElement]("map"));
    }
    created() {
      this[dartx.areas] = null;
      this[dartx.name] = null;
      super.created();
    }
    get [dartx.areas]() {
      return this.areas;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
  };
  dart.defineNamedConstructor(html$.MapElement, 'created');
  dart.setSignature(html$.MapElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MapElement, []),
      new: dart.definiteFunctionType(html$.MapElement, []),
      created: dart.definiteFunctionType(html$.MapElement, [])
    }),
    fields: () => ({
      [dartx.areas]: ListOfNode(),
      [dartx.name]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMapElement, html$.MapElement);
  dart.defineExtensionNames([
    'pause',
    'play',
    'unpause',
    'buffered',
    'currentTime',
    'defaultPlaybackRate',
    'duration',
    'muted',
    'paused',
    'playbackRate',
    'playbackState',
    'played',
    'seekable',
    'volume'
  ]);
  html$.MediaController = class MediaController extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MediaController._create_1();
    }
    static _create_1() {
      return new MediaController();
    }
    get [dartx.buffered]() {
      return this.buffered;
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    set [dartx.currentTime](value) {
      this.currentTime = value;
    }
    get [dartx.defaultPlaybackRate]() {
      return this.defaultPlaybackRate;
    }
    set [dartx.defaultPlaybackRate](value) {
      this.defaultPlaybackRate = value;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.muted]() {
      return this.muted;
    }
    set [dartx.muted](value) {
      this.muted = value;
    }
    get [dartx.paused]() {
      return this.paused;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    set [dartx.playbackRate](value) {
      this.playbackRate = value;
    }
    get [dartx.playbackState]() {
      return this.playbackState;
    }
    get [dartx.played]() {
      return this.played;
    }
    get [dartx.seekable]() {
      return this.seekable;
    }
    get [dartx.volume]() {
      return this.volume;
    }
    set [dartx.volume](value) {
      this.volume = value;
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.play](...args) {
      return this.play.apply(this, args);
    }
    [dartx.unpause](...args) {
      return this.unpause.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaController, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaController, []),
      new: dart.definiteFunctionType(html$.MediaController, [])
    }),
    fields: () => ({
      [dartx.buffered]: html$.TimeRanges,
      [dartx.currentTime]: core.num,
      [dartx.defaultPlaybackRate]: core.num,
      [dartx.duration]: core.double,
      [dartx.muted]: core.bool,
      [dartx.paused]: core.bool,
      [dartx.playbackRate]: core.num,
      [dartx.playbackState]: core.String,
      [dartx.played]: html$.TimeRanges,
      [dartx.seekable]: html$.TimeRanges,
      [dartx.volume]: core.num
    }),
    methods: () => ({
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.play]: dart.definiteFunctionType(dart.void, []),
      [dartx.unpause]: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaController, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.MediaController, html$.MediaController);
  dart.defineExtensionNames([
    'deviceId',
    'groupId',
    'kind',
    'label'
  ]);
  html$.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.deviceId]() {
      return this.deviceId;
    }
    get [dartx.groupId]() {
      return this.groupId;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
  };
  dart.setSignature(html$.MediaDeviceInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaDeviceInfo, [])}),
    fields: () => ({
      [dartx.deviceId]: core.String,
      [dartx.groupId]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String
    })
  });
  dart.registerExtension(dart.global.MediaDeviceInfo, html$.MediaDeviceInfo);
  const _getUserMedia_1 = Symbol('_getUserMedia_1');
  dart.defineExtensionNames([
    'enumerateDevices',
    'getUserMedia'
  ]);
  html$.MediaDevices = class MediaDevices extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.enumerateDevices](...args) {
      return this.enumerateDevices.apply(this, args);
    }
    [dartx.getUserMedia](options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_getUserMedia_1](options_1);
    }
    [_getUserMedia_1](...args) {
      return this.getUserMedia.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaDevices, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaDevices, [])}),
    methods: () => ({
      [dartx.enumerateDevices]: dart.definiteFunctionType(async.Future, []),
      [dartx.getUserMedia]: dart.definiteFunctionType(async.Future, [core.Map]),
      [_getUserMedia_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.MediaDevices, html$.MediaDevices);
  dart.defineExtensionNames([
    'initData',
    'initDataType'
  ]);
  html$.MediaEncryptedEvent = class MediaEncryptedEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaEncryptedEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaEncryptedEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaEncryptedEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaEncryptedEvent(type);
    }
    get [dartx.initData]() {
      return this.initData;
    }
    get [dartx.initDataType]() {
      return this.initDataType;
    }
  };
  dart.setSignature(html$.MediaEncryptedEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaEncryptedEvent, []),
      new: dart.definiteFunctionType(html$.MediaEncryptedEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.initData]: typed_data.ByteBuffer,
      [dartx.initDataType]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaEncryptedEvent, html$.MediaEncryptedEvent);
  dart.defineExtensionNames([
    'code'
  ]);
  html$.MediaError = class MediaError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
  };
  dart.setSignature(html$.MediaError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaError, [])}),
    fields: () => ({[dartx.code]: core.int}),
    sfields: () => ({
      MEDIA_ERR_ABORTED: core.int,
      MEDIA_ERR_DECODE: core.int,
      MEDIA_ERR_NETWORK: core.int,
      MEDIA_ERR_SRC_NOT_SUPPORTED: core.int
    })
  });
  html$.MediaError.MEDIA_ERR_ABORTED = 1;
  html$.MediaError.MEDIA_ERR_DECODE = 3;
  html$.MediaError.MEDIA_ERR_NETWORK = 2;
  html$.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
  dart.registerExtension(dart.global.MediaError, html$.MediaError);
  dart.defineExtensionNames([
    'code',
    'systemCode'
  ]);
  html$.MediaKeyError = class MediaKeyError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.systemCode]() {
      return this.systemCode;
    }
  };
  dart.setSignature(html$.MediaKeyError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyError, [])}),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.systemCode]: core.int
    }),
    sfields: () => ({
      MEDIA_KEYERR_CLIENT: core.int,
      MEDIA_KEYERR_DOMAIN: core.int,
      MEDIA_KEYERR_HARDWARECHANGE: core.int,
      MEDIA_KEYERR_OUTPUT: core.int,
      MEDIA_KEYERR_SERVICE: core.int,
      MEDIA_KEYERR_UNKNOWN: core.int
    })
  });
  html$.MediaKeyError.MEDIA_KEYERR_CLIENT = 2;
  html$.MediaKeyError.MEDIA_KEYERR_DOMAIN = 6;
  html$.MediaKeyError.MEDIA_KEYERR_HARDWARECHANGE = 5;
  html$.MediaKeyError.MEDIA_KEYERR_OUTPUT = 4;
  html$.MediaKeyError.MEDIA_KEYERR_SERVICE = 3;
  html$.MediaKeyError.MEDIA_KEYERR_UNKNOWN = 1;
  dart.registerExtension(dart.global.MediaKeyError, html$.MediaKeyError);
  dart.defineExtensionNames([
    'defaultUrl',
    'errorCode',
    'initData',
    'keySystem',
    'message',
    'sessionId',
    'systemCode'
  ]);
  html$.MediaKeyEvent = class MediaKeyEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaKeyEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaKeyEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaKeyEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaKeyEvent(type);
    }
    get [dartx.defaultUrl]() {
      return this.defaultURL;
    }
    get [dartx.errorCode]() {
      return this.errorCode;
    }
    get [dartx.initData]() {
      return this.initData;
    }
    get [dartx.keySystem]() {
      return this.keySystem;
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.sessionId]() {
      return this.sessionId;
    }
    get [dartx.systemCode]() {
      return this.systemCode;
    }
  };
  dart.setSignature(html$.MediaKeyEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaKeyEvent, []),
      new: dart.definiteFunctionType(html$.MediaKeyEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.defaultUrl]: core.String,
      [dartx.errorCode]: html$.MediaKeyError,
      [dartx.initData]: typed_data.Uint8List,
      [dartx.keySystem]: core.String,
      [dartx.message]: typed_data.Uint8List,
      [dartx.sessionId]: core.String,
      [dartx.systemCode]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaKeyEvent, html$.MediaKeyEvent);
  dart.defineExtensionNames([
    'message',
    'messageType'
  ]);
  html$.MediaKeyMessageEvent = class MediaKeyMessageEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaKeyMessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaKeyMessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaKeyMessageEvent(type);
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.messageType]() {
      return this.messageType;
    }
  };
  dart.setSignature(html$.MediaKeyMessageEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaKeyMessageEvent, []),
      new: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.message]: typed_data.ByteBuffer,
      [dartx.messageType]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaKeyMessageEvent, html$.MediaKeyMessageEvent);
  const _update$ = Symbol('_update');
  dart.defineExtensionNames([
    'close',
    'generateRequest',
    'load',
    'remove',
    'closed',
    'expiration',
    'keyStatuses',
    'sessionId'
  ]);
  html$.MediaKeySession = class MediaKeySession extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.closed]() {
      return this.closed;
    }
    get [dartx.expiration]() {
      return this.expiration;
    }
    get [dartx.keyStatuses]() {
      return this.keyStatuses;
    }
    get [dartx.sessionId]() {
      return this.sessionId;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.generateRequest](...args) {
      return this.generateRequest.apply(this, args);
    }
    [dartx.load](...args) {
      return this.load.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
    [_update$](...args) {
      return this.update.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaKeySession, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySession, [])}),
    fields: () => ({
      [dartx.closed]: async.Future,
      [dartx.expiration]: core.double,
      [dartx.keyStatuses]: html$.MediaKeyStatusMap,
      [dartx.sessionId]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(async.Future, []),
      [dartx.generateRequest]: dart.definiteFunctionType(async.Future, [core.String, dart.dynamic]),
      [dartx.load]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.remove]: dart.definiteFunctionType(async.Future, []),
      [_update$]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.MediaKeySession, html$.MediaKeySession);
  dart.defineExtensionNames([
    'size'
  ]);
  html$.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.MediaKeyStatusMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyStatusMap, [])}),
    fields: () => ({[dartx.size]: core.int})
  });
  dart.registerExtension(dart.global.MediaKeyStatusMap, html$.MediaKeyStatusMap);
  const _getConfiguration_1 = Symbol('_getConfiguration_1');
  dart.defineExtensionNames([
    'createMediaKeys',
    'getConfiguration',
    'keySystem'
  ]);
  html$.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.keySystem]() {
      return this.keySystem;
    }
    [dartx.createMediaKeys](...args) {
      return this.createMediaKeys.apply(this, args);
    }
    [dartx.getConfiguration]() {
      return html_common.convertNativeToDart_Dictionary(this[_getConfiguration_1]());
    }
    [_getConfiguration_1](...args) {
      return this.getConfiguration.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaKeySystemAccess, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySystemAccess, [])}),
    fields: () => ({[dartx.keySystem]: core.String}),
    methods: () => ({
      [dartx.createMediaKeys]: dart.definiteFunctionType(async.Future, []),
      [dartx.getConfiguration]: dart.definiteFunctionType(core.Map, []),
      [_getConfiguration_1]: dart.definiteFunctionType(dart.dynamic, [])
    })
  });
  dart.registerExtension(dart.global.MediaKeySystemAccess, html$.MediaKeySystemAccess);
  const _createSession = Symbol('_createSession');
  dart.defineExtensionNames([
    'setServerCertificate'
  ]);
  html$.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_createSession](...args) {
      return this.createSession.apply(this, args);
    }
    [dartx.setServerCertificate](...args) {
      return this.setServerCertificate.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaKeys, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeys, [])}),
    methods: () => ({
      [_createSession]: dart.definiteFunctionType(html$.MediaKeySession, [], [core.String]),
      [dartx.setServerCertificate]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.MediaKeys, html$.MediaKeys);
  dart.defineExtensionNames([
    'appendMedium',
    'deleteMedium',
    'item',
    'length',
    'mediaText'
  ]);
  html$.MediaList = class MediaList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.mediaText]() {
      return this.mediaText;
    }
    set [dartx.mediaText](value) {
      this.mediaText = value;
    }
    [dartx.appendMedium](...args) {
      return this.appendMedium.apply(this, args);
    }
    [dartx.deleteMedium](...args) {
      return this.deleteMedium.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaList, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [dartx.mediaText]: core.String
    }),
    methods: () => ({
      [dartx.appendMedium]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.deleteMedium]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
    })
  });
  dart.registerExtension(dart.global.MediaList, html$.MediaList);
  dart.defineExtensionNames([
    'addListener',
    'removeListener',
    'onChange',
    'matches',
    'media'
  ]);
  html$.MediaQueryList = class MediaQueryList extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.matches]() {
      return this.matches;
    }
    get [dartx.media]() {
      return this.media;
    }
    [dartx.addListener](...args) {
      return this.addListener.apply(this, args);
    }
    [dartx.removeListener](...args) {
      return this.removeListener.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.MediaQueryList.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MediaQueryList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaQueryList, [])}),
    fields: () => ({
      [dartx.matches]: core.bool,
      [dartx.media]: core.String
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.addListener]: dart.definiteFunctionType(dart.void, [html$.EventListener]),
      [dartx.removeListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.MediaQueryList, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.MediaQueryList, html$.MediaQueryList);
  dart.defineExtensionNames([
    'matches',
    'media'
  ]);
  html$.MediaQueryListEvent = class MediaQueryListEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaQueryListEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaQueryListEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaQueryListEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaQueryListEvent(type);
    }
    get [dartx.matches]() {
      return this.matches;
    }
    get [dartx.media]() {
      return this.media;
    }
  };
  dart.setSignature(html$.MediaQueryListEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaQueryListEvent, []),
      new: dart.definiteFunctionType(html$.MediaQueryListEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.matches]: core.bool,
      [dartx.media]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaQueryListEvent, html$.MediaQueryListEvent);
  dart.defineExtensionNames([
    'activate',
    'deactivate'
  ]);
  html$.MediaSession = class MediaSession extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MediaSession._create_1();
    }
    static _create_1() {
      return new MediaSession();
    }
    [dartx.activate](...args) {
      return this.activate.apply(this, args);
    }
    [dartx.deactivate](...args) {
      return this.deactivate.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaSession, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaSession, []),
      new: dart.definiteFunctionType(html$.MediaSession, [])
    }),
    methods: () => ({
      [dartx.activate]: dart.definiteFunctionType(dart.void, []),
      [dartx.deactivate]: dart.definiteFunctionType(dart.void, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaSession, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.MediaSession, html$.MediaSession);
  dart.defineExtensionNames([
    'addSourceBuffer',
    'endOfStream',
    'removeSourceBuffer',
    'activeSourceBuffers',
    'duration',
    'readyState',
    'sourceBuffers'
  ]);
  html$.MediaSource = class MediaSource extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MediaSource._create_1();
    }
    static _create_1() {
      return new MediaSource();
    }
    static get supported() {
      return !!window.MediaSource;
    }
    get [dartx.activeSourceBuffers]() {
      return this.activeSourceBuffers;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    set [dartx.duration](value) {
      this.duration = value;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.sourceBuffers]() {
      return this.sourceBuffers;
    }
    [dartx.addSourceBuffer](...args) {
      return this.addSourceBuffer.apply(this, args);
    }
    [dartx.endOfStream](...args) {
      return this.endOfStream.apply(this, args);
    }
    [dartx.removeSourceBuffer](...args) {
      return this.removeSourceBuffer.apply(this, args);
    }
  };
  dart.setSignature(html$.MediaSource, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaSource, []),
      new: dart.definiteFunctionType(html$.MediaSource, [])
    }),
    fields: () => ({
      [dartx.activeSourceBuffers]: html$.SourceBufferList,
      [dartx.duration]: core.num,
      [dartx.readyState]: core.String,
      [dartx.sourceBuffers]: html$.SourceBufferList
    }),
    methods: () => ({
      [dartx.addSourceBuffer]: dart.definiteFunctionType(html$.SourceBuffer, [core.String]),
      [dartx.endOfStream]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.removeSourceBuffer]: dart.definiteFunctionType(dart.void, [html$.SourceBuffer])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaSource, []),
      isTypeSupported: dart.definiteFunctionType(core.bool, [core.String])
    }),
    names: ['_create_1', 'isTypeSupported']
  });
  dart.registerExtension(dart.global.MediaSource, html$.MediaSource);
  dart.defineExtensionNames([
    'addTrack',
    'clone',
    'getAudioTracks',
    'getTrackById',
    'getTracks',
    'getVideoTracks',
    'removeTrack',
    'stop',
    'onAddTrack',
    'onEnded',
    'onRemoveTrack',
    'active',
    'ended',
    'id',
    'label'
  ]);
  html$.MediaStream = class MediaStream extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(stream_OR_tracks) {
      if (stream_OR_tracks === void 0) stream_OR_tracks = null;
      if (stream_OR_tracks == null) {
        return html$.MediaStream._create_1();
      }
      if (html$.MediaStream.is(stream_OR_tracks) || stream_OR_tracks == null) {
        return html$.MediaStream._create_2(stream_OR_tracks);
      }
      if (ListOfMediaStreamTrack().is(stream_OR_tracks) || stream_OR_tracks == null) {
        return html$.MediaStream._create_3(stream_OR_tracks);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new MediaStream();
    }
    static _create_2(stream_OR_tracks) {
      return new MediaStream(stream_OR_tracks);
    }
    static _create_3(stream_OR_tracks) {
      return new MediaStream(stream_OR_tracks);
    }
    get [dartx.active]() {
      return this.active;
    }
    get [dartx.ended]() {
      return this.ended;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.label]() {
      return this.label;
    }
    [dartx.addTrack](...args) {
      return this.addTrack.apply(this, args);
    }
    [dartx.clone](...args) {
      return this.clone.apply(this, args);
    }
    [dartx.getAudioTracks](...args) {
      return this.getAudioTracks.apply(this, args);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    [dartx.getTracks](...args) {
      return this.getTracks.apply(this, args);
    }
    [dartx.getVideoTracks](...args) {
      return this.getVideoTracks.apply(this, args);
    }
    [dartx.removeTrack](...args) {
      return this.removeTrack.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onAddTrack]() {
      return html$.MediaStream.addTrackEvent.forTarget(this);
    }
    get [dartx.onEnded]() {
      return html$.MediaStream.endedEvent.forTarget(this);
    }
    get [dartx.onRemoveTrack]() {
      return html$.MediaStream.removeTrackEvent.forTarget(this);
    }
    static get supported() {
      return !!(html$.window[dartx.navigator].getUserMedia || html$.window[dartx.navigator].webkitGetUserMedia || html$.window[dartx.navigator].mozGetUserMedia || html$.window[dartx.navigator].msGetUserMedia);
    }
  };
  dart.setSignature(html$.MediaStream, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaStream, []),
      new: dart.definiteFunctionType(html$.MediaStream, [], [dart.dynamic])
    }),
    fields: () => ({
      [dartx.active]: core.bool,
      [dartx.ended]: core.bool,
      [dartx.id]: core.String,
      [dartx.label]: core.String
    }),
    getters: () => ({
      [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRemoveTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.addTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
      [dartx.clone]: dart.definiteFunctionType(html$.MediaStream, []),
      [dartx.getAudioTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.MediaStreamTrack, [core.String]),
      [dartx.getTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
      [dartx.getVideoTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
      [dartx.removeTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      addTrackEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      removeTrackEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaStream, []),
      _create_2: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.defineLazy(html$.MediaStream, {
    get addTrackEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('addtrack'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get removeTrackEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('removetrack'));
    }
  });
  dart.registerExtension(dart.global.MediaStream, html$.MediaStream);
  dart.defineExtensionNames([
    'stream'
  ]);
  html$.MediaStreamEvent = class MediaStreamEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MediaStreamEvent._create_1(type, eventInitDict_1);
      }
      return html$.MediaStreamEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MediaStreamEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MediaStreamEvent(type);
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('MediaStreamEvent');
    }
    get [dartx.stream]() {
      return this.stream;
    }
  };
  dart.setSignature(html$.MediaStreamEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MediaStreamEvent, []),
      new: dart.definiteFunctionType(html$.MediaStreamEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.stream]: html$.MediaStream}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MediaStreamEvent, html$.MediaStreamEvent);
  dart.defineExtensionNames([
    'clone',
    'stop',
    'onEnded',
    'onMute',
    'onUnmute',
    'enabled',
    'id',
    'kind',
    'label',
    'muted',
    'readyState'
  ]);
  html$.MediaStreamTrack = class MediaStreamTrack extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.enabled]() {
      return this.enabled;
    }
    set [dartx.enabled](value) {
      this.enabled = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.muted]() {
      return this.muted;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    [dartx.clone](...args) {
      return this.clone.apply(this, args);
    }
    static getSources() {
      let completer = CompleterOfListOfSourceInfo().new();
      html$.MediaStreamTrack._getSources(dart.fn(value => {
        completer.complete(value);
      }, ListOfSourceInfoTovoid()));
      return completer.future;
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onEnded]() {
      return html$.MediaStreamTrack.endedEvent.forTarget(this);
    }
    get [dartx.onMute]() {
      return html$.MediaStreamTrack.muteEvent.forTarget(this);
    }
    get [dartx.onUnmute]() {
      return html$.MediaStreamTrack.unmuteEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MediaStreamTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrack, [])}),
    fields: () => ({
      [dartx.enabled]: core.bool,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.muted]: core.bool,
      [dartx.readyState]: core.String
    }),
    getters: () => ({
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMute]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onUnmute]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.clone]: dart.definiteFunctionType(html$.MediaStreamTrack, []),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      endedEvent: EventStreamProviderOfEvent(),
      muteEvent: EventStreamProviderOfEvent(),
      unmuteEvent: EventStreamProviderOfEvent()
    }),
    statics: () => ({
      _getSources: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrackSourcesCallback]),
      getSources: dart.definiteFunctionType(async.Future$(core.List$(html$.SourceInfo)), [])
    }),
    names: ['_getSources', 'getSources']
  });
  dart.defineLazy(html$.MediaStreamTrack, {
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get muteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('mute'));
    },
    get unmuteEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unmute'));
    }
  });
  dart.registerExtension(dart.global.MediaStreamTrack, html$.MediaStreamTrack);
  dart.defineExtensionNames([
    'track'
  ]);
  html$.MediaStreamTrackEvent = class MediaStreamTrackEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('MediaStreamTrackEvent');
    }
    get [dartx.track]() {
      return this.track;
    }
  };
  dart.setSignature(html$.MediaStreamTrackEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrackEvent, [])}),
    fields: () => ({[dartx.track]: html$.MediaStreamTrack}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.MediaStreamTrackEvent, html$.MediaStreamTrackEvent);
  html$.MediaStreamTrackSourcesCallback = dart.typedef('MediaStreamTrackSourcesCallback', () => dart.functionType(dart.void, [ListOfSourceInfo()]));
  dart.defineExtensionNames([
    'jsHeapSizeLimit',
    'totalJSHeapSize',
    'usedJSHeapSize'
  ]);
  html$.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.jsHeapSizeLimit]() {
      return this.jsHeapSizeLimit;
    }
    get [dartx.totalJSHeapSize]() {
      return this.totalJSHeapSize;
    }
    get [dartx.usedJSHeapSize]() {
      return this.usedJSHeapSize;
    }
  };
  dart.setSignature(html$.MemoryInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MemoryInfo, [])}),
    fields: () => ({
      [dartx.jsHeapSizeLimit]: core.int,
      [dartx.totalJSHeapSize]: core.int,
      [dartx.usedJSHeapSize]: core.int
    })
  });
  dart.registerExtension(dart.global.MemoryInfo, html$.MemoryInfo);
  dart.defineExtensionNames([
    'label',
    'type'
  ]);
  html$.MenuElement = class MenuElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MenuElement._check(html$.document[dartx.createElement]("menu"));
    }
    created() {
      this[dartx.label] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.MenuElement, 'created');
  dart.setSignature(html$.MenuElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MenuElement, []),
      new: dart.definiteFunctionType(html$.MenuElement, []),
      created: dart.definiteFunctionType(html$.MenuElement, [])
    }),
    fields: () => ({
      [dartx.label]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMenuElement, html$.MenuElement);
  dart.defineExtensionNames([
    'checked',
    'defaultValue',
    'disabled',
    'icon',
    'label',
    'radiogroup',
    'type'
  ]);
  html$.MenuItemElement = class MenuItemElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.checked] = null;
      this[dartx.defaultValue] = null;
      this[dartx.disabled] = null;
      this[dartx.icon] = null;
      this[dartx.label] = null;
      this[dartx.radiogroup] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.checked]() {
      return this.checked;
    }
    set [dartx.checked](value) {
      this.checked = value;
    }
    get [dartx.defaultValue]() {
      return this.default;
    }
    set [dartx.defaultValue](value) {
      this.default = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.icon]() {
      return this.icon;
    }
    set [dartx.icon](value) {
      this.icon = value;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.radiogroup]() {
      return this.radiogroup;
    }
    set [dartx.radiogroup](value) {
      this.radiogroup = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.MenuItemElement, 'created');
  dart.setSignature(html$.MenuItemElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MenuItemElement, []),
      created: dart.definiteFunctionType(html$.MenuItemElement, [])
    }),
    fields: () => ({
      [dartx.checked]: core.bool,
      [dartx.defaultValue]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.icon]: core.String,
      [dartx.label]: core.String,
      [dartx.radiogroup]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMenuItemElement, html$.MenuItemElement);
  dart.defineExtensionNames([
    'port1',
    'port2'
  ]);
  html$.MessageChannel = class MessageChannel extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.port1]() {
      return this.port1;
    }
    get [dartx.port2]() {
      return this.port2;
    }
  };
  dart.setSignature(html$.MessageChannel, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MessageChannel, [])}),
    fields: () => ({
      [dartx.port1]: html$.MessagePort,
      [dartx.port2]: html$.MessagePort
    })
  });
  dart.registerExtension(dart.global.MessageChannel, html$.MessageChannel);
  const _initMessageEvent = Symbol('_initMessageEvent');
  const _get_data = Symbol('_get_data');
  const _get_source = Symbol('_get_source');
  dart.defineExtensionNames([
    'data',
    'source',
    'lastEventId',
    'origin'
  ]);
  html$.MessageEvent = class MessageEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let data = opts && 'data' in opts ? opts.data : null;
      let origin = opts && 'origin' in opts ? opts.origin : null;
      let lastEventId = opts && 'lastEventId' in opts ? opts.lastEventId : null;
      let source = opts && 'source' in opts ? opts.source : null;
      let messagePorts = opts && 'messagePorts' in opts ? opts.messagePorts : null;
      if (source == null) {
        source = html$.window;
      }
      if (!dart.test(html_common.Device.isIE)) {
        return new MessageEvent(type, {bubbles: canBubble, cancelable: cancelable, data: data, origin: origin, lastEventId: lastEventId, source: source, ports: messagePorts});
      }
      let event = html$.MessageEvent._check(html$.document[_createEvent]("MessageEvent"));
      event[_initMessageEvent](type, canBubble, cancelable, data, origin, lastEventId, source, messagePorts);
      return event;
    }
    get [dartx.data]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
    }
    get [_get_data]() {
      return this.data;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.MessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MessageEvent(type);
    }
    get [dartx.lastEventId]() {
      return this.lastEventId;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.source]() {
      return html$._convertNativeToDart_EventTarget(this[_get_source]);
    }
    get [_get_source]() {
      return this.source;
    }
    [_initMessageEvent](...args) {
      return this.initMessageEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.MessageEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.MessageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, data: core.Object, origin: core.String, lastEventId: core.String, source: html$.Window, messagePorts: ListOfMessagePort()}),
      _: dart.definiteFunctionType(html$.MessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_get_data]: dart.dynamic,
      [dartx.lastEventId]: core.String,
      [dartx.origin]: core.String,
      [_get_source]: dart.dynamic
    }),
    getters: () => ({
      [dartx.data]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.source]: dart.definiteFunctionType(html$.EventTarget, [])
    }),
    methods: () => ({[_initMessageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html$.Window, ListOfMessagePort()])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MessageEvent, html$.MessageEvent);
  dart.defineExtensionNames([
    'close',
    'postMessage',
    'start',
    'onMessage'
  ]);
  html$.MessagePort = class MessagePort extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.MessagePort.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MessagePort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MessagePort, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.start]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.MessagePort, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.MessagePort, html$.MessagePort);
  dart.defineExtensionNames([
    'content',
    'httpEquiv',
    'name'
  ]);
  html$.MetaElement = class MetaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MetaElement._check(html$.document[dartx.createElement]("meta"));
    }
    created() {
      this[dartx.content] = null;
      this[dartx.httpEquiv] = null;
      this[dartx.name] = null;
      super.created();
    }
    get [dartx.content]() {
      return this.content;
    }
    set [dartx.content](value) {
      this.content = value;
    }
    get [dartx.httpEquiv]() {
      return this.httpEquiv;
    }
    set [dartx.httpEquiv](value) {
      this.httpEquiv = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
  };
  dart.defineNamedConstructor(html$.MetaElement, 'created');
  dart.setSignature(html$.MetaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MetaElement, []),
      new: dart.definiteFunctionType(html$.MetaElement, []),
      created: dart.definiteFunctionType(html$.MetaElement, [])
    }),
    fields: () => ({
      [dartx.content]: core.String,
      [dartx.httpEquiv]: core.String,
      [dartx.name]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLMetaElement, html$.MetaElement);
  const _get_modificationTime = Symbol('_get_modificationTime');
  dart.defineExtensionNames([
    'modificationTime',
    'size'
  ]);
  html$.Metadata = class Metadata extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.modificationTime]() {
      return html_common.convertNativeToDart_DateTime(this[_get_modificationTime]);
    }
    get [_get_modificationTime]() {
      return this.modificationTime;
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.Metadata, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Metadata, [])}),
    fields: () => ({
      [_get_modificationTime]: dart.dynamic,
      [dartx.size]: core.int
    }),
    getters: () => ({[dartx.modificationTime]: dart.definiteFunctionType(core.DateTime, [])})
  });
  dart.registerExtension(dart.global.Metadata, html$.Metadata);
  html$.MetadataCallback = dart.typedef('MetadataCallback', () => dart.functionType(dart.void, [html$.Metadata]));
  dart.defineExtensionNames([
    'high',
    'labels',
    'low',
    'max',
    'min',
    'optimum',
    'value'
  ]);
  html$.MeterElement = class MeterElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.MeterElement._check(html$.document[dartx.createElement]("meter"));
    }
    created() {
      this[dartx.high] = null;
      this[dartx.labels] = null;
      this[dartx.low] = null;
      this[dartx.max] = null;
      this[dartx.min] = null;
      this[dartx.optimum] = null;
      this[dartx.value] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('meter');
    }
    get [dartx.high]() {
      return this.high;
    }
    set [dartx.high](value) {
      this.high = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.low]() {
      return this.low;
    }
    set [dartx.low](value) {
      this.low = value;
    }
    get [dartx.max]() {
      return this.max;
    }
    set [dartx.max](value) {
      this.max = value;
    }
    get [dartx.min]() {
      return this.min;
    }
    set [dartx.min](value) {
      this.min = value;
    }
    get [dartx.optimum]() {
      return this.optimum;
    }
    set [dartx.optimum](value) {
      this.optimum = value;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.MeterElement, 'created');
  dart.setSignature(html$.MeterElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MeterElement, []),
      new: dart.definiteFunctionType(html$.MeterElement, []),
      created: dart.definiteFunctionType(html$.MeterElement, [])
    }),
    fields: () => ({
      [dartx.high]: core.num,
      [dartx.labels]: ListOfNode(),
      [dartx.low]: core.num,
      [dartx.max]: core.num,
      [dartx.min]: core.num,
      [dartx.optimum]: core.num,
      [dartx.value]: core.num
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLMeterElement, html$.MeterElement);
  dart.defineExtensionNames([
    'inputs',
    'outputs',
    'sysexEnabled'
  ]);
  html$.MidiAccess = class MidiAccess extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.inputs]() {
      return this.inputs;
    }
    get [dartx.outputs]() {
      return this.outputs;
    }
    get [dartx.sysexEnabled]() {
      return this.sysexEnabled;
    }
  };
  dart.setSignature(html$.MidiAccess, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiAccess, [])}),
    fields: () => ({
      [dartx.inputs]: html$.MidiInputMap,
      [dartx.outputs]: html$.MidiOutputMap,
      [dartx.sysexEnabled]: core.bool
    })
  });
  dart.registerExtension(dart.global.MIDIAccess, html$.MidiAccess);
  dart.defineExtensionNames([
    'port'
  ]);
  html$.MidiConnectionEvent = class MidiConnectionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MidiConnectionEvent._create_1(type, eventInitDict_1);
      }
      return html$.MidiConnectionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MIDIConnectionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MIDIConnectionEvent(type);
    }
    get [dartx.port]() {
      return this.port;
    }
  };
  dart.setSignature(html$.MidiConnectionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MidiConnectionEvent, []),
      new: dart.definiteFunctionType(html$.MidiConnectionEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.port]: html$.MidiPort}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MIDIConnectionEvent, html$.MidiConnectionEvent);
  dart.defineExtensionNames([
    'close',
    'open',
    'connection',
    'id',
    'manufacturer',
    'name',
    'state',
    'type',
    'version'
  ]);
  html$.MidiPort = class MidiPort extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connection]() {
      return this.connection;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.manufacturer]() {
      return this.manufacturer;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.state]() {
      return this.state;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.version]() {
      return this.version;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.open](...args) {
      return this.open.apply(this, args);
    }
  };
  dart.setSignature(html$.MidiPort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiPort, [])}),
    fields: () => ({
      [dartx.connection]: core.String,
      [dartx.id]: core.String,
      [dartx.manufacturer]: core.String,
      [dartx.name]: core.String,
      [dartx.state]: core.String,
      [dartx.type]: core.String,
      [dartx.version]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(async.Future, []),
      [dartx.open]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.MIDIPort, html$.MidiPort);
  dart.defineExtensionNames([
    'onMidiMessage'
  ]);
  html$.MidiInput = class MidiInput extends html$.MidiPort {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.onMidiMessage]() {
      return html$.MidiInput.midiMessageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.MidiInput, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiInput, [])}),
    getters: () => ({[dartx.onMidiMessage]: dart.definiteFunctionType(async.Stream$(html$.MidiMessageEvent), [])}),
    sfields: () => ({midiMessageEvent: EventStreamProviderOfMidiMessageEvent()})
  });
  dart.defineLazy(html$.MidiInput, {
    get midiMessageEvent() {
      return dart.const(new (EventStreamProviderOfMidiMessageEvent())('midimessage'));
    }
  });
  dart.registerExtension(dart.global.MIDIInput, html$.MidiInput);
  dart.defineExtensionNames([
    'size'
  ]);
  html$.MidiInputMap = class MidiInputMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.MidiInputMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiInputMap, [])}),
    fields: () => ({[dartx.size]: core.int})
  });
  dart.registerExtension(dart.global.MIDIInputMap, html$.MidiInputMap);
  dart.defineExtensionNames([
    'data',
    'receivedTime'
  ]);
  html$.MidiMessageEvent = class MidiMessageEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MidiMessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.MidiMessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MIDIMessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MIDIMessageEvent(type);
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.receivedTime]() {
      return this.receivedTime;
    }
  };
  dart.setSignature(html$.MidiMessageEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.MidiMessageEvent, []),
      new: dart.definiteFunctionType(html$.MidiMessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.data]: typed_data.Uint8List,
      [dartx.receivedTime]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MIDIMessageEvent, html$.MidiMessageEvent);
  dart.defineExtensionNames([
    'send'
  ]);
  html$.MidiOutput = class MidiOutput extends html$.MidiPort {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
  };
  dart.setSignature(html$.MidiOutput, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutput, [])}),
    methods: () => ({[dartx.send]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List], [core.num])})
  });
  dart.registerExtension(dart.global.MIDIOutput, html$.MidiOutput);
  dart.defineExtensionNames([
    'size'
  ]);
  html$.MidiOutputMap = class MidiOutputMap extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.size]() {
      return this.size;
    }
  };
  dart.setSignature(html$.MidiOutputMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutputMap, [])}),
    fields: () => ({[dartx.size]: core.int})
  });
  dart.registerExtension(dart.global.MIDIOutputMap, html$.MidiOutputMap);
  dart.defineExtensionNames([
    'description',
    'enabledPlugin',
    'suffixes',
    'type'
  ]);
  html$.MimeType = class MimeType extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.description]() {
      return this.description;
    }
    get [dartx.enabledPlugin]() {
      return this.enabledPlugin;
    }
    get [dartx.suffixes]() {
      return this.suffixes;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.MimeType, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MimeType, [])}),
    fields: () => ({
      [dartx.description]: core.String,
      [dartx.enabledPlugin]: html$.Plugin,
      [dartx.suffixes]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.MimeType, html$.MimeType);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item',
    'namedItem'
  ]);
  html$.MimeTypeArray = class MimeTypeArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.MimeType), html$.ImmutableListMixin$(html$.MimeType)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  html$.MimeTypeArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfMimeType()];
  dart.setSignature(html$.MimeTypeArray, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MimeTypeArray, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.MimeType, []),
      [dartx.last]: dart.definiteFunctionType(html$.MimeType, []),
      [dartx.single]: dart.definiteFunctionType(html$.MimeType, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.MimeType]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
    })
  });
  dart.registerExtension(dart.global.MimeTypeArray, html$.MimeTypeArray);
  dart.defineExtensionNames([
    'cite',
    'dateTime'
  ]);
  html$.ModElement = class ModElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.cite] = null;
      this[dartx.dateTime] = null;
      super.created();
    }
    get [dartx.cite]() {
      return this.cite;
    }
    set [dartx.cite](value) {
      this.cite = value;
    }
    get [dartx.dateTime]() {
      return this.dateTime;
    }
    set [dartx.dateTime](value) {
      this.dateTime = value;
    }
  };
  dart.defineNamedConstructor(html$.ModElement, 'created');
  dart.setSignature(html$.ModElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ModElement, []),
      created: dart.definiteFunctionType(html$.ModElement, [])
    }),
    fields: () => ({
      [dartx.cite]: core.String,
      [dartx.dateTime]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLModElement, html$.ModElement);
  const _initMouseEvent = Symbol('_initMouseEvent');
  const _clientX = Symbol('_clientX');
  const _clientY = Symbol('_clientY');
  const _layerX = Symbol('_layerX');
  const _layerY = Symbol('_layerY');
  const _movementX = Symbol('_movementX');
  const _movementY = Symbol('_movementY');
  const _pageX = Symbol('_pageX');
  const _pageY = Symbol('_pageY');
  const _screenX = Symbol('_screenX');
  const _screenY = Symbol('_screenY');
  const _webkitMovementX = Symbol('_webkitMovementX');
  const _webkitMovementY = Symbol('_webkitMovementY');
  const _initMouseEvent_1 = Symbol('_initMouseEvent_1');
  dart.defineExtensionNames([
    'relatedTarget',
    'client',
    'movement',
    'offset',
    'screen',
    'layer',
    'page',
    'altKey',
    'button',
    'buttons',
    'ctrlKey',
    'dataTransfer',
    'fromElement',
    'metaKey',
    'region',
    'shiftKey',
    'toElement'
  ]);
  html$.MouseEvent = class MouseEvent extends html$.UIEvent {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let detail = opts && 'detail' in opts ? opts.detail : 0;
      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
      let button = opts && 'button' in opts ? opts.button : 0;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
      if (view == null) {
        view = html$.window;
      }
      let event = html$.MouseEvent._check(html$.document[_createEvent]('MouseEvent'));
      event[_initMouseEvent](type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
      return event;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.MouseEvent._create_1(type, eventInitDict_1);
      }
      return html$.MouseEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new MouseEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new MouseEvent(type);
    }
    get [dartx.altKey]() {
      return this.altKey;
    }
    get [dartx.button]() {
      return this.button;
    }
    get [dartx.buttons]() {
      return this.buttons;
    }
    get [_clientX]() {
      return this.clientX;
    }
    get [_clientY]() {
      return this.clientY;
    }
    get [dartx.ctrlKey]() {
      return this.ctrlKey;
    }
    get [dartx.dataTransfer]() {
      return this.dataTransfer;
    }
    get [dartx.fromElement]() {
      return this.fromElement;
    }
    get [_layerX]() {
      return this.layerX;
    }
    get [_layerY]() {
      return this.layerY;
    }
    get [dartx.metaKey]() {
      return this.metaKey;
    }
    get [_movementX]() {
      return this.movementX;
    }
    get [_movementY]() {
      return this.movementY;
    }
    get [_pageX]() {
      return this.pageX;
    }
    get [_pageY]() {
      return this.pageY;
    }
    get [dartx.region]() {
      return this.region;
    }
    get [dartx.relatedTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
    }
    get [_get_relatedTarget]() {
      return this.relatedTarget;
    }
    get [_screenX]() {
      return this.screenX;
    }
    get [_screenY]() {
      return this.screenY;
    }
    get [dartx.shiftKey]() {
      return this.shiftKey;
    }
    get [dartx.toElement]() {
      return this.toElement;
    }
    get [_webkitMovementX]() {
      return this.webkitMovementX;
    }
    get [_webkitMovementY]() {
      return this.webkitMovementY;
    }
    [_initMouseEvent](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
      let relatedTarget_1 = html$._convertDartToNative_EventTarget(relatedTarget);
      this[_initMouseEvent_1](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
      return;
    }
    [_initMouseEvent_1](...args) {
      return this.initMouseEvent.apply(this, args);
    }
    get [dartx.client]() {
      return new (PointOfnum())(this[_clientX], this[_clientY]);
    }
    get [dartx.movement]() {
      return new (PointOfnum())(this[_webkitMovementX], this[_webkitMovementY]);
    }
    get [dartx.offset]() {
      if (!!this.offsetX) {
        let x = this.offsetX;
        let y = this.offsetY;
        return new (PointOfnum())(x, y);
      } else {
        if (!html$.Element.is(this[dartx.target])) {
          dart.throw(new core.UnsupportedError('offsetX is only supported on elements'));
        }
        let target = html$.Element._check(this[dartx.target]);
        let point = this[dartx.client]['-'](target[dartx.getBoundingClientRect]()[dartx.topLeft]);
        return new (PointOfnum())(point.x[dartx.toInt](), point.y[dartx.toInt]());
      }
    }
    get [dartx.screen]() {
      return new (PointOfnum())(this[_screenX], this[_screenY]);
    }
    get [dartx.layer]() {
      return new (PointOfnum())(this[_layerX], this[_layerY]);
    }
    get [dartx.page]() {
      return new (PointOfnum())(this[_pageX], this[_pageY]);
    }
  };
  dart.setSignature(html$.MouseEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.MouseEvent, [core.String], {view: html$.Window, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
      _: dart.definiteFunctionType(html$.MouseEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.altKey]: core.bool,
      [dartx.button]: core.int,
      [dartx.buttons]: core.int,
      [_clientX]: core.int,
      [_clientY]: core.int,
      [dartx.ctrlKey]: core.bool,
      [dartx.dataTransfer]: html$.DataTransfer,
      [dartx.fromElement]: html$.Node,
      [_layerX]: core.int,
      [_layerY]: core.int,
      [dartx.metaKey]: core.bool,
      [_movementX]: core.int,
      [_movementY]: core.int,
      [_pageX]: core.int,
      [_pageY]: core.int,
      [dartx.region]: core.String,
      [_get_relatedTarget]: dart.dynamic,
      [_screenX]: core.int,
      [_screenY]: core.int,
      [dartx.shiftKey]: core.bool,
      [dartx.toElement]: html$.Node,
      [_webkitMovementX]: core.int,
      [_webkitMovementY]: core.int
    }),
    getters: () => ({
      [dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, []),
      [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.movement]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.offset]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.layer]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), [])
    }),
    methods: () => ({
      [_initMouseEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget]),
      [_initMouseEvent_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.MouseEvent, html$.MouseEvent);
  dart.registerExtension(dart.global.DragEvent, html$.MouseEvent);
  html$.MutationCallback = dart.typedef('MutationCallback', () => dart.functionType(dart.void, [ListOfMutationRecord(), html$.MutationObserver]));
  const _observe_1 = Symbol('_observe_1');
  const _observe = Symbol('_observe');
  const _call = Symbol('_call');
  dart.defineExtensionNames([
    'disconnect',
    'takeRecords',
    'observe'
  ]);
  html$.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
    [dartx.disconnect](...args) {
      return this.disconnect.apply(this, args);
    }
    [_observe](target, options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      this[_observe_1](target, options_1);
      return;
    }
    [_observe_1](...args) {
      return this.observe.apply(this, args);
    }
    [dartx.takeRecords](...args) {
      return this.takeRecords.apply(this, args);
    }
    static get supported() {
      return !!(window.MutationObserver || window.WebKitMutationObserver);
    }
    [dartx.observe](target, opts) {
      let childList = opts && 'childList' in opts ? opts.childList : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let characterData = opts && 'characterData' in opts ? opts.characterData : null;
      let subtree = opts && 'subtree' in opts ? opts.subtree : null;
      let attributeOldValue = opts && 'attributeOldValue' in opts ? opts.attributeOldValue : null;
      let characterDataOldValue = opts && 'characterDataOldValue' in opts ? opts.characterDataOldValue : null;
      let attributeFilter = opts && 'attributeFilter' in opts ? opts.attributeFilter : null;
      let parsedOptions = html$.MutationObserver._createDict();
      function override(key, value) {
        if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
      }
      dart.fn(override, dynamicAnddynamicTodynamic$());
      override('childList', childList);
      override('attributes', attributes);
      override('characterData', characterData);
      override('subtree', subtree);
      override('attributeOldValue', attributeOldValue);
      override('characterDataOldValue', characterDataOldValue);
      if (attributeFilter != null) {
        override('attributeFilter', html$.MutationObserver._fixupList(attributeFilter));
      }
      this[_call](target, parsedOptions);
    }
    static _createDict() {
      return {};
    }
    static _add(m, key, value) {
      m[key] = value;
    }
    static _fixupList(list) {
      return list;
    }
    [_call](...args) {
      return this.observe.apply(this, args);
    }
    static new(callback) {
      0;
      return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(html$._wrapZoneBinaryCallback)(html$._wrapBinaryZone(dart.dynamic, dart.dynamic, dart.dynamic)(callback), 2));
    }
  };
  dart.setSignature(html$.MutationObserver, {
    constructors: () => ({new: dart.definiteFunctionType(html$.MutationObserver, [html$.MutationCallback])}),
    methods: () => ({
      [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
      [_observe]: dart.definiteFunctionType(dart.void, [html$.Node, core.Map]),
      [_observe_1]: dart.definiteFunctionType(dart.void, [html$.Node, dart.dynamic]),
      [dartx.takeRecords]: dart.definiteFunctionType(core.List$(html$.MutationRecord), []),
      [dartx.observe]: dart.definiteFunctionType(dart.void, [html$.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: ListOfString()}),
      [_call]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
    }),
    sfields: () => ({_boolKeys: MapOfString$bool()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _createDict: dart.definiteFunctionType(dart.dynamic, []),
      _add: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
      _fixupList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    }),
    names: ['_createDict', '_add', '_fixupList']
  });
  html$.MutationObserver._boolKeys = dart.const(dart.map({childList: true, attributes: true, characterData: true, subtree: true, attributeOldValue: true, characterDataOldValue: true}, core.String, core.bool));
  dart.registerExtension(dart.global.MutationObserver, html$.MutationObserver);
  dart.registerExtension(dart.global.WebKitMutationObserver, html$.MutationObserver);
  dart.defineExtensionNames([
    'addedNodes',
    'attributeName',
    'attributeNamespace',
    'nextSibling',
    'oldValue',
    'previousSibling',
    'removedNodes',
    'target',
    'type'
  ]);
  html$.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.addedNodes]() {
      return this.addedNodes;
    }
    get [dartx.attributeName]() {
      return this.attributeName;
    }
    get [dartx.attributeNamespace]() {
      return this.attributeNamespace;
    }
    get [dartx.nextSibling]() {
      return this.nextSibling;
    }
    get [dartx.oldValue]() {
      return this.oldValue;
    }
    get [dartx.previousSibling]() {
      return this.previousSibling;
    }
    get [dartx.removedNodes]() {
      return this.removedNodes;
    }
    get [dartx.target]() {
      return this.target;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.MutationRecord, {
    constructors: () => ({_: dart.definiteFunctionType(html$.MutationRecord, [])}),
    fields: () => ({
      [dartx.addedNodes]: ListOfNode(),
      [dartx.attributeName]: core.String,
      [dartx.attributeNamespace]: core.String,
      [dartx.nextSibling]: html$.Node,
      [dartx.oldValue]: core.String,
      [dartx.previousSibling]: html$.Node,
      [dartx.removedNodes]: ListOfNode(),
      [dartx.target]: html$.Node,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.MutationRecord, html$.MutationRecord);
  const _ensureGetUserMedia = Symbol('_ensureGetUserMedia');
  const _getUserMedia = Symbol('_getUserMedia');
  const _requestMidiAccess_1 = Symbol('_requestMidiAccess_1');
  const _requestMidiAccess_2 = Symbol('_requestMidiAccess_2');
  dart.defineExtensionNames([
    'language',
    'getUserMedia',
    'getBattery',
    'getGamepads',
    'getVRDevices',
    'registerProtocolHandler',
    'requestMidiAccess',
    'requestMediaKeySystemAccess',
    'sendBeacon',
    'getStorageUpdates',
    'bluetooth',
    'connection',
    'credentials',
    'doNotTrack',
    'geolocation',
    'maxTouchPoints',
    'mediaDevices',
    'mimeTypes',
    'permissions',
    'presentation',
    'productSub',
    'serviceWorker',
    'services',
    'storageQuota',
    'vendor',
    'vendorSub',
    'persistentStorage',
    'temporaryStorage',
    'hardwareConcurrency',
    'appCodeName',
    'appName',
    'appVersion',
    'dartEnabled',
    'platform',
    'product',
    'userAgent',
    'languages',
    'onLine',
    'cookieEnabled'
  ]);
  html$.Navigator = class Navigator extends _interceptors.Interceptor {
    get [dartx.language]() {
      return this.language || this.userLanguage;
    }
    [dartx.getUserMedia](opts) {
      let audio = opts && 'audio' in opts ? opts.audio : false;
      let video = opts && 'video' in opts ? opts.video : false;
      let completer = CompleterOfMediaStream().new();
      let options = dart.map({audio: audio, video: video}, core.String, dart.dynamic);
      this[_ensureGetUserMedia]();
      this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
        completer.complete(stream);
      }, MediaStreamTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, NavigatorUserMediaErrorTovoid()));
      return completer.future;
    }
    [_ensureGetUserMedia]() {
      if (!this.getUserMedia) {
        this.getUserMedia = this.getUserMedia || this.webkitGetUserMedia || this.mozGetUserMedia || this.msGetUserMedia;
      }
    }
    [_getUserMedia](...args) {
      return this.getUserMedia.apply(this, args);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bluetooth]() {
      return this.bluetooth;
    }
    get [dartx.connection]() {
      return this.connection;
    }
    get [dartx.credentials]() {
      return this.credentials;
    }
    get [dartx.doNotTrack]() {
      return this.doNotTrack;
    }
    get [dartx.geolocation]() {
      return this.geolocation;
    }
    get [dartx.maxTouchPoints]() {
      return this.maxTouchPoints;
    }
    get [dartx.mediaDevices]() {
      return this.mediaDevices;
    }
    get [dartx.mimeTypes]() {
      return this.mimeTypes;
    }
    get [dartx.permissions]() {
      return this.permissions;
    }
    get [dartx.presentation]() {
      return this.presentation;
    }
    get [dartx.productSub]() {
      return this.productSub;
    }
    get [dartx.serviceWorker]() {
      return this.serviceWorker;
    }
    get [dartx.services]() {
      return this.services;
    }
    get [dartx.storageQuota]() {
      return this.storageQuota;
    }
    get [dartx.vendor]() {
      return this.vendor;
    }
    get [dartx.vendorSub]() {
      return this.vendorSub;
    }
    get [dartx.persistentStorage]() {
      return this.webkitPersistentStorage;
    }
    get [dartx.temporaryStorage]() {
      return this.webkitTemporaryStorage;
    }
    [dartx.getBattery](...args) {
      return this.getBattery.apply(this, args);
    }
    [dartx.getGamepads](...args) {
      return this.getGamepads.apply(this, args);
    }
    [dartx.getVRDevices](...args) {
      return this.getVRDevices.apply(this, args);
    }
    [dartx.registerProtocolHandler](...args) {
      return this.registerProtocolHandler.apply(this, args);
    }
    [dartx.requestMidiAccess](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_requestMidiAccess_1](options_1);
      }
      return this[_requestMidiAccess_2]();
    }
    [_requestMidiAccess_1](...args) {
      return this.requestMIDIAccess.apply(this, args);
    }
    [_requestMidiAccess_2](...args) {
      return this.requestMIDIAccess.apply(this, args);
    }
    [dartx.requestMediaKeySystemAccess](...args) {
      return this.requestMediaKeySystemAccess.apply(this, args);
    }
    [dartx.sendBeacon](...args) {
      return this.sendBeacon.apply(this, args);
    }
    get [dartx.hardwareConcurrency]() {
      return this.hardwareConcurrency;
    }
    get [dartx.appCodeName]() {
      return this.appCodeName;
    }
    get [dartx.appName]() {
      return this.appName;
    }
    get [dartx.appVersion]() {
      return this.appVersion;
    }
    get [dartx.dartEnabled]() {
      return this.dartEnabled;
    }
    get [dartx.platform]() {
      return this.platform;
    }
    get [dartx.product]() {
      return this.product;
    }
    get [dartx.userAgent]() {
      return this.userAgent;
    }
    get [dartx.languages]() {
      return this.languages;
    }
    get [dartx.onLine]() {
      return this.onLine;
    }
    get [dartx.cookieEnabled]() {
      return this.cookieEnabled;
    }
    [dartx.getStorageUpdates](...args) {
      return this.getStorageUpdates.apply(this, args);
    }
  };
  html$.Navigator[dart.implements] = () => [html$.NavigatorStorageUtils, html$.NavigatorCpu, html$.NavigatorLanguage, html$.NavigatorOnLine, html$.NavigatorID];
  dart.setSignature(html$.Navigator, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Navigator, [])}),
    fields: () => ({
      [dartx.bluetooth]: html$.Bluetooth,
      [dartx.connection]: html$.NetworkInformation,
      [dartx.credentials]: html$.CredentialsContainer,
      [dartx.doNotTrack]: core.String,
      [dartx.geolocation]: html$.Geolocation,
      [dartx.maxTouchPoints]: core.int,
      [dartx.mediaDevices]: html$.MediaDevices,
      [dartx.mimeTypes]: html$.MimeTypeArray,
      [dartx.permissions]: html$.Permissions,
      [dartx.presentation]: html$.Presentation,
      [dartx.productSub]: core.String,
      [dartx.serviceWorker]: html$.ServiceWorkerContainer,
      [dartx.services]: html$.ServicePortCollection,
      [dartx.storageQuota]: html$.StorageQuota,
      [dartx.vendor]: core.String,
      [dartx.vendorSub]: core.String,
      [dartx.persistentStorage]: html$.DeprecatedStorageQuota,
      [dartx.temporaryStorage]: html$.DeprecatedStorageQuota,
      [dartx.hardwareConcurrency]: core.int,
      [dartx.appCodeName]: core.String,
      [dartx.appName]: core.String,
      [dartx.appVersion]: core.String,
      [dartx.dartEnabled]: core.bool,
      [dartx.platform]: core.String,
      [dartx.product]: core.String,
      [dartx.userAgent]: core.String,
      [dartx.languages]: ListOfString(),
      [dartx.onLine]: core.bool,
      [dartx.cookieEnabled]: core.bool
    }),
    getters: () => ({[dartx.language]: dart.definiteFunctionType(core.String, [])}),
    methods: () => ({
      [dartx.getUserMedia]: dart.definiteFunctionType(async.Future$(html$.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
      [_ensureGetUserMedia]: dart.definiteFunctionType(dart.dynamic, []),
      [_getUserMedia]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$._NavigatorUserMediaSuccessCallback, html$._NavigatorUserMediaErrorCallback]),
      [dartx.getBattery]: dart.definiteFunctionType(async.Future, []),
      [dartx.getGamepads]: dart.definiteFunctionType(core.List$(html$.Gamepad), []),
      [dartx.getVRDevices]: dart.definiteFunctionType(async.Future, []),
      [dartx.registerProtocolHandler]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.requestMidiAccess]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_requestMidiAccess_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_requestMidiAccess_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.requestMediaKeySystemAccess]: dart.definiteFunctionType(async.Future, [core.String, ListOfMap()]),
      [dartx.sendBeacon]: dart.definiteFunctionType(core.bool, [core.String, core.Object]),
      [dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.Navigator, html$.Navigator);
  dart.defineExtensionNames([
    'hardwareConcurrency'
  ]);
  html$.NavigatorCpu = class NavigatorCpu extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get hardwareConcurrency() {
      return this[hardwareConcurrency];
    }
    set hardwareConcurrency(value) {
      super.hardwareConcurrency = value;
    }
  };
  const hardwareConcurrency = Symbol(html$.NavigatorCpu.name + "." + 'hardwareConcurrency'.toString());
  dart.setSignature(html$.NavigatorCpu, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorCpu, [])}),
    fields: () => ({hardwareConcurrency: core.int})
  });
  dart.defineExtensionMembers(html$.NavigatorCpu, ['hardwareConcurrency']);
  dart.defineExtensionNames([
    'appCodeName',
    'appName',
    'appVersion',
    'dartEnabled',
    'platform',
    'product',
    'userAgent'
  ]);
  html$.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get appCodeName() {
      return this[appCodeName];
    }
    set appCodeName(value) {
      super.appCodeName = value;
    }
    get appName() {
      return this[appName];
    }
    set appName(value) {
      super.appName = value;
    }
    get appVersion() {
      return this[appVersion];
    }
    set appVersion(value) {
      super.appVersion = value;
    }
    get dartEnabled() {
      return this[dartEnabled];
    }
    set dartEnabled(value) {
      super.dartEnabled = value;
    }
    get platform() {
      return this[platform];
    }
    set platform(value) {
      super.platform = value;
    }
    get product() {
      return this[product];
    }
    set product(value) {
      super.product = value;
    }
    get userAgent() {
      return this[userAgent];
    }
    set userAgent(value) {
      super.userAgent = value;
    }
  };
  const appCodeName = Symbol(html$.NavigatorID.name + "." + 'appCodeName'.toString());
  const appName = Symbol(html$.NavigatorID.name + "." + 'appName'.toString());
  const appVersion = Symbol(html$.NavigatorID.name + "." + 'appVersion'.toString());
  const dartEnabled = Symbol(html$.NavigatorID.name + "." + 'dartEnabled'.toString());
  const platform = Symbol(html$.NavigatorID.name + "." + 'platform'.toString());
  const product = Symbol(html$.NavigatorID.name + "." + 'product'.toString());
  const userAgent = Symbol(html$.NavigatorID.name + "." + 'userAgent'.toString());
  dart.setSignature(html$.NavigatorID, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorID, [])}),
    fields: () => ({
      appCodeName: core.String,
      appName: core.String,
      appVersion: core.String,
      dartEnabled: core.bool,
      platform: core.String,
      product: core.String,
      userAgent: core.String
    })
  });
  dart.defineExtensionMembers(html$.NavigatorID, [
    'appCodeName',
    'appName',
    'appVersion',
    'dartEnabled',
    'platform',
    'product',
    'userAgent'
  ]);
  dart.defineExtensionNames([
    'language',
    'languages'
  ]);
  html$.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get language() {
      return this[language];
    }
    set language(value) {
      super.language = value;
    }
    get languages() {
      return this[languages];
    }
    set languages(value) {
      super.languages = value;
    }
  };
  const language = Symbol(html$.NavigatorLanguage.name + "." + 'language'.toString());
  const languages = Symbol(html$.NavigatorLanguage.name + "." + 'languages'.toString());
  dart.setSignature(html$.NavigatorLanguage, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorLanguage, [])}),
    fields: () => ({
      language: core.String,
      languages: ListOfString()
    })
  });
  dart.defineExtensionMembers(html$.NavigatorLanguage, ['language', 'languages']);
  dart.defineExtensionNames([
    'onLine'
  ]);
  html$.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onLine() {
      return this[onLine];
    }
    set onLine(value) {
      super.onLine = value;
    }
  };
  const onLine = Symbol(html$.NavigatorOnLine.name + "." + 'onLine'.toString());
  dart.setSignature(html$.NavigatorOnLine, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorOnLine, [])}),
    fields: () => ({onLine: core.bool})
  });
  dart.defineExtensionMembers(html$.NavigatorOnLine, ['onLine']);
  dart.defineExtensionNames([
    'getStorageUpdates',
    'cookieEnabled'
  ]);
  html$.NavigatorStorageUtils = class NavigatorStorageUtils extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.cookieEnabled]() {
      return this.cookieEnabled;
    }
    [dartx.getStorageUpdates](...args) {
      return this.getStorageUpdates.apply(this, args);
    }
  };
  dart.setSignature(html$.NavigatorStorageUtils, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorStorageUtils, [])}),
    fields: () => ({[dartx.cookieEnabled]: core.bool}),
    methods: () => ({[dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])})
  });
  dart.registerExtension(dart.global.NavigatorStorageUtils, html$.NavigatorStorageUtils);
  dart.defineExtensionNames([
    'constraintName',
    'message',
    'name'
  ]);
  html$.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.constraintName]() {
      return this.constraintName;
    }
    get [dartx.message]() {
      return this.message;
    }
    get [dartx.name]() {
      return this.name;
    }
  };
  dart.setSignature(html$.NavigatorUserMediaError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorUserMediaError, [])}),
    fields: () => ({
      [dartx.constraintName]: core.String,
      [dartx.message]: core.String,
      [dartx.name]: core.String
    })
  });
  dart.registerExtension(dart.global.NavigatorUserMediaError, html$.NavigatorUserMediaError);
  html$._NavigatorUserMediaErrorCallback = dart.typedef('_NavigatorUserMediaErrorCallback', () => dart.functionType(dart.void, [html$.NavigatorUserMediaError]));
  html$._NavigatorUserMediaSuccessCallback = dart.typedef('_NavigatorUserMediaSuccessCallback', () => dart.functionType(dart.void, [html$.MediaStream]));
  dart.defineExtensionNames([
    'type'
  ]);
  html$.NetworkInformation = class NetworkInformation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.NetworkInformation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NetworkInformation, [])}),
    fields: () => ({[dartx.type]: core.String})
  });
  dart.registerExtension(dart.global.NetworkInformation, html$.NetworkInformation);
  html$._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html$.Node) {
    new(this$) {
      this[_this] = this$;
    }
    get first() {
      let result = this[_this].firstChild;
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get last() {
      let result = this[_this].lastChild;
      if (result == null) dart.throw(new core.StateError("No elements"));
      return result;
    }
    get single() {
      let l = this.length;
      if (l == 0) dart.throw(new core.StateError("No elements"));
      if (dart.notNull(l) > 1) dart.throw(new core.StateError("More than one element"));
      return this[_this].firstChild;
    }
    add(value) {
      this[_this][dartx.append](value);
    }
    addAll(iterable) {
      if (html$._ChildNodeListLazy.is(iterable)) {
        let otherList = iterable;
        if (!core.identical(otherList[_this], this[_this])) {
          for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
            this[_this][dartx.append](otherList[_this][dartx.firstChild]);
          }
        }
        return;
      }
      for (let node of iterable) {
        this[_this][dartx.append](node);
      }
    }
    insert(index, node) {
      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
        dart.throw(new core.RangeError.range(index, 0, this.length));
      }
      if (index == this.length) {
        this[_this][dartx.append](node);
      } else {
        this[_this][dartx.insertBefore](node, this._get(index));
      }
    }
    insertAll(index, iterable) {
      if (index == this.length) {
        this.addAll(iterable);
      } else {
        let item = this._get(index);
        this[_this][dartx.insertAllBefore](iterable, item);
      }
    }
    setAll(index, iterable) {
      dart.throw(new core.UnsupportedError("Cannot setAll on Node list"));
    }
    removeLast() {
      let result = this.last;
      if (result != null) {
        this[_this][_removeChild](result);
      }
      return result;
    }
    removeAt(index) {
      let result = this._get(index);
      if (result != null) {
        this[_this][_removeChild](result);
      }
      return result;
    }
    remove(object) {
      if (!html$.Node.is(object)) return false;
      let node = html$.Node._check(object);
      if (!core.identical(this[_this], node[dartx.parentNode])) return false;
      this[_this][_removeChild](node);
      return true;
    }
    [_filter$](test, removeMatching) {
      let child = this[_this][dartx.firstChild];
      while (child != null) {
        let nextChild = child[dartx.nextNode];
        if (test(child) == removeMatching) {
          this[_this][_removeChild](child);
        }
        child = nextChild;
      }
    }
    removeWhere(test) {
      this[_filter$](test, true);
    }
    retainWhere(test) {
      this[_filter$](test, false);
    }
    clear() {
      this[_this][_clearChildren]();
    }
    _set(index, value) {
      this[_this][_replaceChild](value, this._get(index));
      return value;
    }
    get iterator() {
      return this[_this][dartx.childNodes][dartx.iterator];
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError("Cannot sort Node list"));
    }
    shuffle(random) {
      if (random === void 0) random = null;
      dart.throw(new core.UnsupportedError("Cannot shuffle Node list"));
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError("Cannot setRange on Node list"));
    }
    fillRange(start, end, fill) {
      if (fill === void 0) fill = null;
      dart.throw(new core.UnsupportedError("Cannot fillRange on Node list"));
    }
    get length() {
      return this[_this][dartx.childNodes][dartx.length];
    }
    set length(value) {
      dart.throw(new core.UnsupportedError("Cannot set length on immutable List."));
    }
    _get(index) {
      return this[_this][dartx.childNodes][dartx._get](index);
    }
    get rawList() {
      return this[_this][dartx.childNodes];
    }
  };
  dart.addSimpleTypeTests(html$._ChildNodeListLazy);
  html$._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setSignature(html$._ChildNodeListLazy, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ChildNodeListLazy, [html$.Node])}),
    fields: () => ({[_this]: html$.Node}),
    getters: () => ({
      first: dart.definiteFunctionType(html$.Node, []),
      last: dart.definiteFunctionType(html$.Node, []),
      single: dart.definiteFunctionType(html$.Node, []),
      iterator: dart.definiteFunctionType(core.Iterator$(html$.Node), []),
      length: dart.definiteFunctionType(core.int, []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [html$.Node]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfNode()]),
      insert: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfNode()]),
      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfNode()]),
      removeLast: dart.definiteFunctionType(html$.Node, []),
      removeAt: dart.definiteFunctionType(html$.Node, [core.int]),
      [_filter$]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
      removeWhere: dart.definiteFunctionType(dart.void, [NodeTobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [NodeTobool()]),
      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfNode()]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfNode()], [core.int]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.Node]),
      _get: dart.definiteFunctionType(html$.Node, [core.int])
    })
  });
  dart.defineExtensionMembers(html$._ChildNodeListLazy, [
    'add',
    'addAll',
    'insert',
    'insertAll',
    'setAll',
    'removeLast',
    'removeAt',
    'remove',
    'removeWhere',
    'retainWhere',
    'clear',
    '_set',
    'sort',
    'shuffle',
    'setRange',
    'fillRange',
    '_get',
    'first',
    'last',
    'single',
    'iterator',
    'length',
    'length'
  ]);
  html$.NodeFilter = class NodeFilter extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.NodeFilter, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NodeFilter, [])}),
    sfields: () => ({
      FILTER_ACCEPT: core.int,
      FILTER_REJECT: core.int,
      FILTER_SKIP: core.int,
      SHOW_ALL: core.int,
      SHOW_COMMENT: core.int,
      SHOW_DOCUMENT: core.int,
      SHOW_DOCUMENT_FRAGMENT: core.int,
      SHOW_DOCUMENT_TYPE: core.int,
      SHOW_ELEMENT: core.int,
      SHOW_PROCESSING_INSTRUCTION: core.int,
      SHOW_TEXT: core.int
    })
  });
  html$.NodeFilter.FILTER_ACCEPT = 1;
  html$.NodeFilter.FILTER_REJECT = 2;
  html$.NodeFilter.FILTER_SKIP = 3;
  html$.NodeFilter.SHOW_ALL = 4294967295;
  html$.NodeFilter.SHOW_COMMENT = 128;
  html$.NodeFilter.SHOW_DOCUMENT = 256;
  html$.NodeFilter.SHOW_DOCUMENT_FRAGMENT = 1024;
  html$.NodeFilter.SHOW_DOCUMENT_TYPE = 512;
  html$.NodeFilter.SHOW_ELEMENT = 1;
  html$.NodeFilter.SHOW_PROCESSING_INSTRUCTION = 64;
  html$.NodeFilter.SHOW_TEXT = 4;
  dart.registerExtension(dart.global.NodeFilter, html$.NodeFilter);
  dart.defineExtensionNames([
    'detach',
    'nextNode',
    'previousNode',
    'pointerBeforeReferenceNode',
    'referenceNode',
    'root',
    'whatToShow'
  ]);
  html$.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
    static new(root, whatToShow) {
      return html$.document[_createNodeIterator](root, whatToShow, null);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.pointerBeforeReferenceNode]() {
      return this.pointerBeforeReferenceNode;
    }
    get [dartx.referenceNode]() {
      return this.referenceNode;
    }
    get [dartx.root]() {
      return this.root;
    }
    get [dartx.whatToShow]() {
      return this.whatToShow;
    }
    [dartx.detach](...args) {
      return this.detach.apply(this, args);
    }
    [dartx.nextNode](...args) {
      return this.nextNode.apply(this, args);
    }
    [dartx.previousNode](...args) {
      return this.previousNode.apply(this, args);
    }
  };
  dart.setSignature(html$.NodeIterator, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.NodeIterator, [html$.Node, core.int]),
      _: dart.definiteFunctionType(html$.NodeIterator, [])
    }),
    fields: () => ({
      [dartx.pointerBeforeReferenceNode]: core.bool,
      [dartx.referenceNode]: html$.Node,
      [dartx.root]: html$.Node,
      [dartx.whatToShow]: core.int
    }),
    methods: () => ({
      [dartx.detach]: dart.definiteFunctionType(dart.void, []),
      [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.previousNode]: dart.definiteFunctionType(html$.Node, [])
    })
  });
  dart.registerExtension(dart.global.NodeIterator, html$.NodeIterator);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt'
  ]);
  html$.NodeList = class NodeList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [_item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.NodeList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
  dart.setSignature(html$.NodeList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NodeList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Node, []),
      [dartx.last]: dart.definiteFunctionType(html$.Node, []),
      [dartx.single]: dart.definiteFunctionType(html$.Node, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Node, [core.int]),
      [_item]: dart.definiteFunctionType(html$.Node, [core.int])
    })
  });
  dart.registerExtension(dart.global.NodeList, html$.NodeList);
  dart.registerExtension(dart.global.RadioNodeList, html$.NodeList);
  dart.defineExtensionNames([
    'nextElementSibling',
    'previousElementSibling'
  ]);
  html$.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.nextElementSibling]() {
      return this.nextElementSibling;
    }
    get [dartx.previousElementSibling]() {
      return this.previousElementSibling;
    }
  };
  dart.setSignature(html$.NonDocumentTypeChildNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NonDocumentTypeChildNode, [])}),
    fields: () => ({
      [dartx.nextElementSibling]: html$.Element,
      [dartx.previousElementSibling]: html$.Element
    })
  });
  dart.registerExtension(dart.global.NonDocumentTypeChildNode, html$.NonDocumentTypeChildNode);
  dart.defineExtensionNames([
    'getElementById'
  ]);
  html$.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
  };
  dart.setSignature(html$.NonElementParentNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.NonElementParentNode, [])}),
    methods: () => ({[dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String])})
  });
  dart.registerExtension(dart.global.NonElementParentNode, html$.NonElementParentNode);
  dart.defineExtensionNames([
    'close',
    'onClick',
    'onClose',
    'onError',
    'onShow',
    'body',
    'data',
    'dir',
    'icon',
    'lang',
    'permission',
    'silent',
    'tag',
    'title',
    'vibrate'
  ]);
  html$.Notification = class Notification extends html$.EventTarget {
    static new(title, opts) {
      let dir = opts && 'dir' in opts ? opts.dir : null;
      let body = opts && 'body' in opts ? opts.body : null;
      let lang = opts && 'lang' in opts ? opts.lang : null;
      let tag = opts && 'tag' in opts ? opts.tag : null;
      let icon = opts && 'icon' in opts ? opts.icon : null;
      let parsedOptions = dart.map();
      if (dir != null) parsedOptions[dartx._set]('dir', dir);
      if (body != null) parsedOptions[dartx._set]('body', body);
      if (lang != null) parsedOptions[dartx._set]('lang', lang);
      if (tag != null) parsedOptions[dartx._set]('tag', tag);
      if (icon != null) parsedOptions[dartx._set]('icon', icon);
      return html$.Notification._factoryNotification(title, parsedOptions);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static _factoryNotification(title, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return html$.Notification._create_1(title, options_1);
      }
      return html$.Notification._create_2(title);
    }
    static _create_1(title, options) {
      return new Notification(title, options);
    }
    static _create_2(title) {
      return new Notification(title);
    }
    static get supported() {
      return !!window.Notification;
    }
    get [dartx.body]() {
      return this.body;
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.dir]() {
      return this.dir;
    }
    get [dartx.icon]() {
      return this.icon;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    get [dartx.permission]() {
      return this.permission;
    }
    get [dartx.silent]() {
      return this.silent;
    }
    get [dartx.tag]() {
      return this.tag;
    }
    get [dartx.title]() {
      return this.title;
    }
    get [dartx.vibrate]() {
      return this.vibrate;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    static requestPermission() {
      let completer = CompleterOfString().new();
      html$.Notification._requestPermission(dart.fn(value => {
        completer.complete(value);
      }, StringTovoid$()));
      return completer.future;
    }
    get [dartx.onClick]() {
      return html$.Notification.clickEvent.forTarget(this);
    }
    get [dartx.onClose]() {
      return html$.Notification.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.Notification.errorEvent.forTarget(this);
    }
    get [dartx.onShow]() {
      return html$.Notification.showEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.Notification, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Notification, [core.String], {dir: core.String, body: core.String, lang: core.String, tag: core.String, icon: core.String}),
      _: dart.definiteFunctionType(html$.Notification, [])
    }),
    fields: () => ({
      [dartx.body]: core.String,
      [dartx.data]: core.Object,
      [dartx.dir]: core.String,
      [dartx.icon]: core.String,
      [dartx.lang]: core.String,
      [dartx.permission]: core.String,
      [dartx.silent]: core.bool,
      [dartx.tag]: core.String,
      [dartx.title]: core.String,
      [dartx.vibrate]: ListOfint()
    }),
    getters: () => ({
      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onShow]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
    sfields: () => ({
      clickEvent: EventStreamProviderOfEvent(),
      closeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      showEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _factoryNotification: dart.definiteFunctionType(html$.Notification, [core.String], [core.Map]),
      _create_1: dart.definiteFunctionType(html$.Notification, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.Notification, [dart.dynamic]),
      _requestPermission: dart.definiteFunctionType(dart.void, [], [html$._NotificationPermissionCallback]),
      requestPermission: dart.definiteFunctionType(async.Future$(core.String), [])
    }),
    names: ['_factoryNotification', '_create_1', '_create_2', '_requestPermission', 'requestPermission']
  });
  dart.defineLazy(html$.Notification, {
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('click'));
    },
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get showEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('show'));
    }
  });
  dart.registerExtension(dart.global.Notification, html$.Notification);
  dart.defineExtensionNames([
    'notification'
  ]);
  html$.NotificationEvent = class NotificationEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.NotificationEvent._create_1(type, eventInitDict_1);
      }
      return html$.NotificationEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new NotificationEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new NotificationEvent(type);
    }
    get [dartx.notification]() {
      return this.notification;
    }
  };
  dart.setSignature(html$.NotificationEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.NotificationEvent, []),
      new: dart.definiteFunctionType(html$.NotificationEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.notification]: html$.Notification}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.NotificationEvent, html$.NotificationEvent);
  html$._NotificationPermissionCallback = dart.typedef('_NotificationPermissionCallback', () => dart.functionType(dart.void, [core.String]));
  dart.defineExtensionNames([
    'reversed',
    'start',
    'type'
  ]);
  html$.OListElement = class OListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.OListElement._check(html$.document[dartx.createElement]("ol"));
    }
    created() {
      this[dartx.reversed] = null;
      this[dartx.start] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.reversed]() {
      return this.reversed;
    }
    set [dartx.reversed](value) {
      this.reversed = value;
    }
    get [dartx.start]() {
      return this.start;
    }
    set [dartx.start](value) {
      this.start = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.OListElement, 'created');
  dart.setSignature(html$.OListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.OListElement, []),
      new: dart.definiteFunctionType(html$.OListElement, []),
      created: dart.definiteFunctionType(html$.OListElement, [])
    }),
    fields: () => ({
      [dartx.reversed]: core.bool,
      [dartx.start]: core.int,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLOListElement, html$.OListElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'data',
    'form',
    'height',
    'name',
    'type',
    'useMap',
    'validationMessage',
    'validity',
    'width',
    'willValidate'
  ]);
  html$.ObjectElement = class ObjectElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ObjectElement._check(html$.document[dartx.createElement]("object"));
    }
    created() {
      this[dartx.data] = null;
      this[dartx.form] = null;
      this[dartx.height] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.useMap] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.width] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('object');
    }
    get [dartx.data]() {
      return this.data;
    }
    set [dartx.data](value) {
      this.data = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.useMap]() {
      return this.useMap;
    }
    set [dartx.useMap](value) {
      this.useMap = value;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ObjectElement, 'created');
  dart.setSignature(html$.ObjectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ObjectElement, []),
      new: dart.definiteFunctionType(html$.ObjectElement, []),
      created: dart.definiteFunctionType(html$.ObjectElement, [])
    }),
    fields: () => ({
      [dartx.data]: core.String,
      [dartx.form]: html$.FormElement,
      [dartx.height]: core.String,
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.useMap]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.width]: core.String,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLObjectElement, html$.ObjectElement);
  dart.defineExtensionNames([
    'disabled',
    'label'
  ]);
  html$.OptGroupElement = class OptGroupElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.OptGroupElement._check(html$.document[dartx.createElement]("optgroup"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.label] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
  };
  dart.defineNamedConstructor(html$.OptGroupElement, 'created');
  dart.setSignature(html$.OptGroupElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.OptGroupElement, []),
      new: dart.definiteFunctionType(html$.OptGroupElement, []),
      created: dart.definiteFunctionType(html$.OptGroupElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.label]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLOptGroupElement, html$.OptGroupElement);
  dart.defineExtensionNames([
    'defaultSelected',
    'disabled',
    'form',
    'index',
    'label',
    'selected',
    'value'
  ]);
  html$.OptionElement = class OptionElement extends html$.HtmlElement {
    static new(opts) {
      let data = opts && 'data' in opts ? opts.data : '';
      let value = opts && 'value' in opts ? opts.value : '';
      let selected = opts && 'selected' in opts ? opts.selected : false;
      return html$.OptionElement._(data, value, null, selected);
    }
    static _(data, value, defaultSelected, selected) {
      if (data === void 0) data = null;
      if (value === void 0) value = null;
      if (defaultSelected === void 0) defaultSelected = null;
      if (selected === void 0) selected = null;
      if (selected != null) {
        return html$.OptionElement._create_1(data, value, defaultSelected, selected);
      }
      if (defaultSelected != null) {
        return html$.OptionElement._create_2(data, value, defaultSelected);
      }
      if (value != null) {
        return html$.OptionElement._create_3(data, value);
      }
      if (data != null) {
        return html$.OptionElement._create_4(data);
      }
      return html$.OptionElement._create_5();
    }
    static _create_1(data, value, defaultSelected, selected) {
      return new Option(data, value, defaultSelected, selected);
    }
    static _create_2(data, value, defaultSelected) {
      return new Option(data, value, defaultSelected);
    }
    static _create_3(data, value) {
      return new Option(data, value);
    }
    static _create_4(data) {
      return new Option(data);
    }
    static _create_5() {
      return new Option();
    }
    created() {
      this[dartx.defaultSelected] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.index] = null;
      this[dartx.label] = null;
      this[dartx.selected] = null;
      this[dartx.value] = null;
      super.created();
    }
    get [dartx.defaultSelected]() {
      return this.defaultSelected;
    }
    set [dartx.defaultSelected](value) {
      this.defaultSelected = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.index]() {
      return this.index;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.selected]() {
      return this.selected;
    }
    set [dartx.selected](value) {
      this.selected = value;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.OptionElement, 'created');
  dart.setSignature(html$.OptionElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.OptionElement, [], {data: core.String, value: core.String, selected: core.bool}),
      _: dart.definiteFunctionType(html$.OptionElement, [], [core.String, core.String, core.bool, core.bool]),
      created: dart.definiteFunctionType(html$.OptionElement, [])
    }),
    fields: () => ({
      [dartx.defaultSelected]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.index]: core.int,
      [dartx.label]: core.String,
      [dartx.selected]: core.bool,
      [dartx.value]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$.OptionElement, [])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
  });
  dart.registerExtension(dart.global.HTMLOptionElement, html$.OptionElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'setCustomValidity',
    'defaultValue',
    'form',
    'htmlFor',
    'labels',
    'name',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate'
  ]);
  html$.OutputElement = class OutputElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.OutputElement._check(html$.document[dartx.createElement]("output"));
    }
    created() {
      this[dartx.defaultValue] = null;
      this[dartx.form] = null;
      this[dartx.htmlFor] = null;
      this[dartx.labels] = null;
      this[dartx.name] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('output');
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    set [dartx.defaultValue](value) {
      this.defaultValue = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.htmlFor]() {
      return this.htmlFor;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.OutputElement, 'created');
  dart.setSignature(html$.OutputElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.OutputElement, []),
      new: dart.definiteFunctionType(html$.OutputElement, []),
      created: dart.definiteFunctionType(html$.OutputElement, [])
    }),
    fields: () => ({
      [dartx.defaultValue]: core.String,
      [dartx.form]: html$.FormElement,
      [dartx.htmlFor]: html$.DomSettableTokenList,
      [dartx.labels]: ListOfNode(),
      [dartx.name]: core.String,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLOutputElement, html$.OutputElement);
  dart.defineExtensionNames([
    'persisted'
  ]);
  html$.PageTransitionEvent = class PageTransitionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PageTransitionEvent._create_1(type, eventInitDict_1);
      }
      return html$.PageTransitionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PageTransitionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PageTransitionEvent(type);
    }
    get [dartx.persisted]() {
      return this.persisted;
    }
  };
  dart.setSignature(html$.PageTransitionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PageTransitionEvent, []),
      new: dart.definiteFunctionType(html$.PageTransitionEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.persisted]: core.bool}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PageTransitionEvent, html$.PageTransitionEvent);
  html$.ParagraphElement = class ParagraphElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ParagraphElement._check(html$.document[dartx.createElement]("p"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.ParagraphElement, 'created');
  dart.setSignature(html$.ParagraphElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ParagraphElement, []),
      new: dart.definiteFunctionType(html$.ParagraphElement, []),
      created: dart.definiteFunctionType(html$.ParagraphElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLParagraphElement, html$.ParagraphElement);
  dart.defineExtensionNames([
    'name',
    'value'
  ]);
  html$.ParamElement = class ParamElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ParamElement._check(html$.document[dartx.createElement]("param"));
    }
    created() {
      this[dartx.name] = null;
      this[dartx.value] = null;
      super.created();
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.ParamElement, 'created');
  dart.setSignature(html$.ParamElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ParamElement, []),
      new: dart.definiteFunctionType(html$.ParamElement, []),
      created: dart.definiteFunctionType(html$.ParamElement, [])
    }),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.value]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLParamElement, html$.ParamElement);
  html$.ParentNode = class ParentNode extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.ParentNode, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ParentNode, [])}),
    fields: () => ({
      [_childElementCount]: core.int,
      [_children]: ListOfNode(),
      [_firstElementChild]: html$.Element,
      [_lastElementChild]: html$.Element
    })
  });
  dart.defineExtensionNames([
    'formData',
    'password'
  ]);
  html$.PasswordCredential = class PasswordCredential extends html$.Credential {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(id, password, name, iconURL) {
      if (name === void 0) name = null;
      if (iconURL === void 0) iconURL = null;
      if (iconURL != null) {
        return html$.PasswordCredential._create_1(id, password, name, iconURL);
      }
      if (name != null) {
        return html$.PasswordCredential._create_2(id, password, name);
      }
      return html$.PasswordCredential._create_3(id, password);
    }
    static _create_1(id, password, name, iconURL) {
      return new PasswordCredential(id, password, name, iconURL);
    }
    static _create_2(id, password, name) {
      return new PasswordCredential(id, password, name);
    }
    static _create_3(id, password) {
      return new PasswordCredential(id, password);
    }
    get [dartx.formData]() {
      return this.formData;
    }
    get [dartx.password]() {
      return this.password;
    }
  };
  dart.setSignature(html$.PasswordCredential, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PasswordCredential, []),
      new: dart.definiteFunctionType(html$.PasswordCredential, [core.String, core.String], [core.String, core.String])
    }),
    fields: () => ({
      [dartx.formData]: html$.FormData,
      [dartx.password]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.PasswordCredential, html$.PasswordCredential);
  dart.defineExtensionNames([
    'addPath',
    'arc',
    'arcTo',
    'bezierCurveTo',
    'closePath',
    'ellipse',
    'lineTo',
    'moveTo',
    'quadraticCurveTo',
    'rect'
  ]);
  html$.Path2D = class Path2D extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(path_OR_text) {
      if (path_OR_text === void 0) path_OR_text = null;
      if (path_OR_text == null) {
        return html$.Path2D._create_1();
      }
      if (html$.Path2D.is(path_OR_text) || path_OR_text == null) {
        return html$.Path2D._create_2(path_OR_text);
      }
      if (typeof path_OR_text == 'string' || path_OR_text == null) {
        return html$.Path2D._create_3(path_OR_text);
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    static _create_1() {
      return new Path2D();
    }
    static _create_2(path_OR_text) {
      return new Path2D(path_OR_text);
    }
    static _create_3(path_OR_text) {
      return new Path2D(path_OR_text);
    }
    [dartx.addPath](...args) {
      return this.addPath.apply(this, args);
    }
    [dartx.arc](...args) {
      return this.arc.apply(this, args);
    }
    [dartx.arcTo](...args) {
      return this.arcTo.apply(this, args);
    }
    [dartx.bezierCurveTo](...args) {
      return this.bezierCurveTo.apply(this, args);
    }
    [dartx.closePath](...args) {
      return this.closePath.apply(this, args);
    }
    [dartx.ellipse](...args) {
      return this.ellipse.apply(this, args);
    }
    [dartx.lineTo](...args) {
      return this.lineTo.apply(this, args);
    }
    [dartx.moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.quadraticCurveTo](...args) {
      return this.quadraticCurveTo.apply(this, args);
    }
    [dartx.rect](...args) {
      return this.rect.apply(this, args);
    }
  };
  html$.Path2D[dart.implements] = () => [html$._CanvasPathMethods];
  dart.setSignature(html$.Path2D, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Path2D, []),
      new: dart.definiteFunctionType(html$.Path2D, [], [dart.dynamic])
    }),
    methods: () => ({
      [dartx.addPath]: dart.definiteFunctionType(dart.void, [html$.Path2D], [svg$.Matrix]),
      [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
      [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
      [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
      [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.Path2D, []),
      _create_2: dart.definiteFunctionType(html$.Path2D, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.Path2D, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.Path2D, html$.Path2D);
  dart.defineExtensionNames([
    'clearFrameTimings',
    'clearMarks',
    'clearMeasures',
    'getEntries',
    'getEntriesByName',
    'getEntriesByType',
    'mark',
    'measure',
    'now',
    'setFrameTimingBufferSize',
    'clearResourceTimings',
    'setResourceTimingBufferSize',
    'onResourceTimingBufferFull',
    'memory',
    'navigation',
    'timing'
  ]);
  html$.Performance = class Performance extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.performance;
    }
    get [dartx.memory]() {
      return this.memory;
    }
    get [dartx.navigation]() {
      return this.navigation;
    }
    get [dartx.timing]() {
      return this.timing;
    }
    [dartx.clearFrameTimings](...args) {
      return this.clearFrameTimings.apply(this, args);
    }
    [dartx.clearMarks](...args) {
      return this.clearMarks.apply(this, args);
    }
    [dartx.clearMeasures](...args) {
      return this.clearMeasures.apply(this, args);
    }
    [dartx.getEntries](...args) {
      return this.getEntries.apply(this, args);
    }
    [dartx.getEntriesByName](...args) {
      return this.getEntriesByName.apply(this, args);
    }
    [dartx.getEntriesByType](...args) {
      return this.getEntriesByType.apply(this, args);
    }
    [dartx.mark](...args) {
      return this.mark.apply(this, args);
    }
    [dartx.measure](...args) {
      return this.measure.apply(this, args);
    }
    [dartx.now](...args) {
      return this.now.apply(this, args);
    }
    [dartx.setFrameTimingBufferSize](...args) {
      return this.setFrameTimingBufferSize.apply(this, args);
    }
    [dartx.clearResourceTimings](...args) {
      return this.webkitClearResourceTimings.apply(this, args);
    }
    [dartx.setResourceTimingBufferSize](...args) {
      return this.webkitSetResourceTimingBufferSize.apply(this, args);
    }
    get [dartx.onResourceTimingBufferFull]() {
      return html$.Performance.resourceTimingBufferFullEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.Performance, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Performance, [])}),
    fields: () => ({
      [dartx.memory]: html$.MemoryInfo,
      [dartx.navigation]: html$.PerformanceNavigation,
      [dartx.timing]: html$.PerformanceTiming
    }),
    getters: () => ({[dartx.onResourceTimingBufferFull]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.clearFrameTimings]: dart.definiteFunctionType(dart.void, []),
      [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
      [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
      [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
      [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.now]: dart.definiteFunctionType(core.double, []),
      [dartx.setFrameTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
      [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
    }),
    sfields: () => ({resourceTimingBufferFullEvent: EventStreamProviderOfEvent()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineLazy(html$.Performance, {
    get resourceTimingBufferFullEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('webkitresourcetimingbufferfull'));
    }
  });
  dart.registerExtension(dart.global.Performance, html$.Performance);
  dart.defineExtensionNames([
    'duration',
    'entryType',
    'name',
    'startTime'
  ]);
  html$.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.entryType]() {
      return this.entryType;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.startTime]() {
      return this.startTime;
    }
  };
  dart.setSignature(html$.PerformanceEntry, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceEntry, [])}),
    fields: () => ({
      [dartx.duration]: core.double,
      [dartx.entryType]: core.String,
      [dartx.name]: core.String,
      [dartx.startTime]: core.double
    })
  });
  dart.registerExtension(dart.global.PerformanceEntry, html$.PerformanceEntry);
  dart.defineExtensionNames([
    'sourceFrame'
  ]);
  html$.PerformanceCompositeTiming = class PerformanceCompositeTiming extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sourceFrame]() {
      return this.sourceFrame;
    }
  };
  dart.setSignature(html$.PerformanceCompositeTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceCompositeTiming, [])}),
    fields: () => ({[dartx.sourceFrame]: core.int})
  });
  dart.registerExtension(dart.global.PerformanceCompositeTiming, html$.PerformanceCompositeTiming);
  html$.PerformanceMark = class PerformanceMark extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.PerformanceMark, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMark, [])})
  });
  dart.registerExtension(dart.global.PerformanceMark, html$.PerformanceMark);
  html$.PerformanceMeasure = class PerformanceMeasure extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.PerformanceMeasure, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMeasure, [])})
  });
  dart.registerExtension(dart.global.PerformanceMeasure, html$.PerformanceMeasure);
  dart.defineExtensionNames([
    'redirectCount',
    'type'
  ]);
  html$.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.redirectCount]() {
      return this.redirectCount;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.PerformanceNavigation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceNavigation, [])}),
    fields: () => ({
      [dartx.redirectCount]: core.int,
      [dartx.type]: core.int
    }),
    sfields: () => ({
      TYPE_BACK_FORWARD: core.int,
      TYPE_NAVIGATE: core.int,
      TYPE_RELOAD: core.int,
      TYPE_RESERVED: core.int
    })
  });
  html$.PerformanceNavigation.TYPE_BACK_FORWARD = 2;
  html$.PerformanceNavigation.TYPE_NAVIGATE = 0;
  html$.PerformanceNavigation.TYPE_RELOAD = 1;
  html$.PerformanceNavigation.TYPE_RESERVED = 255;
  dart.registerExtension(dart.global.PerformanceNavigation, html$.PerformanceNavigation);
  dart.defineExtensionNames([
    'sourceFrame'
  ]);
  html$.PerformanceRenderTiming = class PerformanceRenderTiming extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sourceFrame]() {
      return this.sourceFrame;
    }
  };
  dart.setSignature(html$.PerformanceRenderTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceRenderTiming, [])}),
    fields: () => ({[dartx.sourceFrame]: core.int})
  });
  dart.registerExtension(dart.global.PerformanceRenderTiming, html$.PerformanceRenderTiming);
  dart.defineExtensionNames([
    'connectEnd',
    'connectStart',
    'domainLookupEnd',
    'domainLookupStart',
    'fetchStart',
    'initiatorType',
    'redirectEnd',
    'redirectStart',
    'requestStart',
    'responseEnd',
    'responseStart',
    'secureConnectionStart',
    'workerStart'
  ]);
  html$.PerformanceResourceTiming = class PerformanceResourceTiming extends html$.PerformanceEntry {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connectEnd]() {
      return this.connectEnd;
    }
    get [dartx.connectStart]() {
      return this.connectStart;
    }
    get [dartx.domainLookupEnd]() {
      return this.domainLookupEnd;
    }
    get [dartx.domainLookupStart]() {
      return this.domainLookupStart;
    }
    get [dartx.fetchStart]() {
      return this.fetchStart;
    }
    get [dartx.initiatorType]() {
      return this.initiatorType;
    }
    get [dartx.redirectEnd]() {
      return this.redirectEnd;
    }
    get [dartx.redirectStart]() {
      return this.redirectStart;
    }
    get [dartx.requestStart]() {
      return this.requestStart;
    }
    get [dartx.responseEnd]() {
      return this.responseEnd;
    }
    get [dartx.responseStart]() {
      return this.responseStart;
    }
    get [dartx.secureConnectionStart]() {
      return this.secureConnectionStart;
    }
    get [dartx.workerStart]() {
      return this.workerStart;
    }
  };
  dart.setSignature(html$.PerformanceResourceTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceResourceTiming, [])}),
    fields: () => ({
      [dartx.connectEnd]: core.double,
      [dartx.connectStart]: core.double,
      [dartx.domainLookupEnd]: core.double,
      [dartx.domainLookupStart]: core.double,
      [dartx.fetchStart]: core.double,
      [dartx.initiatorType]: core.String,
      [dartx.redirectEnd]: core.double,
      [dartx.redirectStart]: core.double,
      [dartx.requestStart]: core.double,
      [dartx.responseEnd]: core.double,
      [dartx.responseStart]: core.double,
      [dartx.secureConnectionStart]: core.double,
      [dartx.workerStart]: core.double
    })
  });
  dart.registerExtension(dart.global.PerformanceResourceTiming, html$.PerformanceResourceTiming);
  dart.defineExtensionNames([
    'connectEnd',
    'connectStart',
    'domComplete',
    'domContentLoadedEventEnd',
    'domContentLoadedEventStart',
    'domInteractive',
    'domLoading',
    'domainLookupEnd',
    'domainLookupStart',
    'fetchStart',
    'loadEventEnd',
    'loadEventStart',
    'navigationStart',
    'redirectEnd',
    'redirectStart',
    'requestStart',
    'responseEnd',
    'responseStart',
    'secureConnectionStart',
    'unloadEventEnd',
    'unloadEventStart'
  ]);
  html$.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.connectEnd]() {
      return this.connectEnd;
    }
    get [dartx.connectStart]() {
      return this.connectStart;
    }
    get [dartx.domComplete]() {
      return this.domComplete;
    }
    get [dartx.domContentLoadedEventEnd]() {
      return this.domContentLoadedEventEnd;
    }
    get [dartx.domContentLoadedEventStart]() {
      return this.domContentLoadedEventStart;
    }
    get [dartx.domInteractive]() {
      return this.domInteractive;
    }
    get [dartx.domLoading]() {
      return this.domLoading;
    }
    get [dartx.domainLookupEnd]() {
      return this.domainLookupEnd;
    }
    get [dartx.domainLookupStart]() {
      return this.domainLookupStart;
    }
    get [dartx.fetchStart]() {
      return this.fetchStart;
    }
    get [dartx.loadEventEnd]() {
      return this.loadEventEnd;
    }
    get [dartx.loadEventStart]() {
      return this.loadEventStart;
    }
    get [dartx.navigationStart]() {
      return this.navigationStart;
    }
    get [dartx.redirectEnd]() {
      return this.redirectEnd;
    }
    get [dartx.redirectStart]() {
      return this.redirectStart;
    }
    get [dartx.requestStart]() {
      return this.requestStart;
    }
    get [dartx.responseEnd]() {
      return this.responseEnd;
    }
    get [dartx.responseStart]() {
      return this.responseStart;
    }
    get [dartx.secureConnectionStart]() {
      return this.secureConnectionStart;
    }
    get [dartx.unloadEventEnd]() {
      return this.unloadEventEnd;
    }
    get [dartx.unloadEventStart]() {
      return this.unloadEventStart;
    }
  };
  dart.setSignature(html$.PerformanceTiming, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceTiming, [])}),
    fields: () => ({
      [dartx.connectEnd]: core.int,
      [dartx.connectStart]: core.int,
      [dartx.domComplete]: core.int,
      [dartx.domContentLoadedEventEnd]: core.int,
      [dartx.domContentLoadedEventStart]: core.int,
      [dartx.domInteractive]: core.int,
      [dartx.domLoading]: core.int,
      [dartx.domainLookupEnd]: core.int,
      [dartx.domainLookupStart]: core.int,
      [dartx.fetchStart]: core.int,
      [dartx.loadEventEnd]: core.int,
      [dartx.loadEventStart]: core.int,
      [dartx.navigationStart]: core.int,
      [dartx.redirectEnd]: core.int,
      [dartx.redirectStart]: core.int,
      [dartx.requestStart]: core.int,
      [dartx.responseEnd]: core.int,
      [dartx.responseStart]: core.int,
      [dartx.secureConnectionStart]: core.int,
      [dartx.unloadEventEnd]: core.int,
      [dartx.unloadEventStart]: core.int
    })
  });
  dart.registerExtension(dart.global.PerformanceTiming, html$.PerformanceTiming);
  dart.defineExtensionNames([
    'registration'
  ]);
  html$.PeriodicSyncEvent = class PeriodicSyncEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, init) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return html$.PeriodicSyncEvent._create_1(type, init_1);
    }
    static _create_1(type, init) {
      return new PeriodicSyncEvent(type, init);
    }
    get [dartx.registration]() {
      return this.registration;
    }
  };
  dart.setSignature(html$.PeriodicSyncEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PeriodicSyncEvent, []),
      new: dart.definiteFunctionType(html$.PeriodicSyncEvent, [core.String, core.Map])
    }),
    fields: () => ({[dartx.registration]: html$.PeriodicSyncRegistration}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.PeriodicSyncEvent, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.PeriodicSyncEvent, html$.PeriodicSyncEvent);
  const _register_1 = Symbol('_register_1');
  const _register_2 = Symbol('_register_2');
  dart.defineExtensionNames([
    'getRegistration',
    'getRegistrations',
    'permissionState',
    'register',
    'minPossiblePeriod'
  ]);
  html$.PeriodicSyncManager = class PeriodicSyncManager extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.minPossiblePeriod]() {
      return this.minPossiblePeriod;
    }
    [dartx.getRegistration](...args) {
      return this.getRegistration.apply(this, args);
    }
    [dartx.getRegistrations](...args) {
      return this.getRegistrations.apply(this, args);
    }
    [dartx.permissionState](...args) {
      return this.permissionState.apply(this, args);
    }
    [dartx.register](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_register_1](options_1);
      }
      return this[_register_2]();
    }
    [_register_1](...args) {
      return this.register.apply(this, args);
    }
    [_register_2](...args) {
      return this.register.apply(this, args);
    }
  };
  dart.setSignature(html$.PeriodicSyncManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncManager, [])}),
    fields: () => ({[dartx.minPossiblePeriod]: core.int}),
    methods: () => ({
      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
      [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
      [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_register_2]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.PeriodicSyncManager, html$.PeriodicSyncManager);
  dart.defineExtensionNames([
    'unregister',
    'minPeriod',
    'networkState',
    'powerState',
    'tag'
  ]);
  html$.PeriodicSyncRegistration = class PeriodicSyncRegistration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.minPeriod]() {
      return this.minPeriod;
    }
    get [dartx.networkState]() {
      return this.networkState;
    }
    get [dartx.powerState]() {
      return this.powerState;
    }
    get [dartx.tag]() {
      return this.tag;
    }
    [dartx.unregister](...args) {
      return this.unregister.apply(this, args);
    }
  };
  dart.setSignature(html$.PeriodicSyncRegistration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncRegistration, [])}),
    fields: () => ({
      [dartx.minPeriod]: core.int,
      [dartx.networkState]: core.String,
      [dartx.powerState]: core.String,
      [dartx.tag]: core.String
    }),
    methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.PeriodicSyncRegistration, html$.PeriodicSyncRegistration);
  dart.defineExtensionNames([
    'onChange',
    'state',
    'status'
  ]);
  html$.PermissionStatus = class PermissionStatus extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.state]() {
      return this.state;
    }
    get [dartx.status]() {
      return this.status;
    }
    get [dartx.onChange]() {
      return html$.PermissionStatus.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.PermissionStatus, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PermissionStatus, [])}),
    fields: () => ({
      [dartx.state]: core.String,
      [dartx.status]: core.String
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.PermissionStatus, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.PermissionStatus, html$.PermissionStatus);
  dart.defineExtensionNames([
    'query'
  ]);
  html$.Permissions = class Permissions extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.query](...args) {
      return this.query.apply(this, args);
    }
  };
  dart.setSignature(html$.Permissions, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Permissions, [])}),
    methods: () => ({[dartx.query]: dart.definiteFunctionType(async.Future, [core.Object])})
  });
  dart.registerExtension(dart.global.Permissions, html$.Permissions);
  html$.PictureElement = class PictureElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.PictureElement, 'created');
  dart.setSignature(html$.PictureElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PictureElement, []),
      created: dart.definiteFunctionType(html$.PictureElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLPictureElement, html$.PictureElement);
  dart.defineExtensionNames([
    'item',
    'namedItem',
    'description',
    'filename',
    'length',
    'name'
  ]);
  html$.Plugin = class Plugin extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.description]() {
      return this.description;
    }
    get [dartx.filename]() {
      return this.filename;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.name]() {
      return this.name;
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
  };
  dart.setSignature(html$.Plugin, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Plugin, [])}),
    fields: () => ({
      [dartx.description]: core.String,
      [dartx.filename]: core.String,
      [dartx.length]: core.int,
      [dartx.name]: core.String
    }),
    methods: () => ({
      [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
    })
  });
  dart.registerExtension(dart.global.Plugin, html$.Plugin);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item',
    'namedItem',
    'refresh'
  ]);
  html$.PluginArray = class PluginArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Plugin), html$.ImmutableListMixin$(html$.Plugin)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
    [dartx.refresh](...args) {
      return this.refresh.apply(this, args);
    }
  };
  html$.PluginArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfPlugin()];
  dart.setSignature(html$.PluginArray, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PluginArray, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Plugin, []),
      [dartx.last]: dart.definiteFunctionType(html$.Plugin, []),
      [dartx.single]: dart.definiteFunctionType(html$.Plugin, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Plugin, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Plugin]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Plugin, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Plugin, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.Plugin, [core.String]),
      [dartx.refresh]: dart.definiteFunctionType(dart.void, [core.bool])
    })
  });
  dart.registerExtension(dart.global.PluginArray, html$.PluginArray);
  dart.defineExtensionNames([
    'createdCallback',
    'closeable',
    'message'
  ]);
  html$.PluginPlaceholderElement = class PluginPlaceholderElement extends html$.DivElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.closeable] = null;
      this[dartx.message] = null;
      super.created();
    }
    get [dartx.closeable]() {
      return this.closeable;
    }
    set [dartx.closeable](value) {
      this.closeable = value;
    }
    get [dartx.message]() {
      return this.message;
    }
    set [dartx.message](value) {
      this.message = value;
    }
    [dartx.createdCallback](...args) {
      return this.createdCallback.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.PluginPlaceholderElement, 'created');
  dart.setSignature(html$.PluginPlaceholderElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PluginPlaceholderElement, []),
      created: dart.definiteFunctionType(html$.PluginPlaceholderElement, [])
    }),
    fields: () => ({
      [dartx.closeable]: core.bool,
      [dartx.message]: core.String
    }),
    methods: () => ({[dartx.createdCallback]: dart.definiteFunctionType(dart.void, [])})
  });
  dart.registerExtension(dart.global.PluginPlaceholderElement, html$.PluginPlaceholderElement);
  dart.defineExtensionNames([
    'height',
    'isPrimary',
    'pointerId',
    'pointerType',
    'pressure',
    'tiltX',
    'tiltY',
    'width'
  ]);
  html$.PointerEvent = class PointerEvent extends html$.MouseEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PointerEvent._create_1(type, eventInitDict_1);
      }
      return html$.PointerEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PointerEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PointerEvent(type);
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.isPrimary]() {
      return this.isPrimary;
    }
    get [dartx.pointerId]() {
      return this.pointerId;
    }
    get [dartx.pointerType]() {
      return this.pointerType;
    }
    get [dartx.pressure]() {
      return this.pressure;
    }
    get [dartx.tiltX]() {
      return this.tiltX;
    }
    get [dartx.tiltY]() {
      return this.tiltY;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.PointerEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PointerEvent, []),
      new: dart.definiteFunctionType(html$.PointerEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.height]: core.double,
      [dartx.isPrimary]: core.bool,
      [dartx.pointerId]: core.int,
      [dartx.pointerType]: core.String,
      [dartx.pressure]: core.double,
      [dartx.tiltX]: core.int,
      [dartx.tiltY]: core.int,
      [dartx.width]: core.double
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PointerEvent, html$.PointerEvent);
  dart.defineExtensionNames([
    'state'
  ]);
  html$.PopStateEvent = class PopStateEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PopStateEvent._create_1(type, eventInitDict_1);
      }
      return html$.PopStateEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PopStateEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PopStateEvent(type);
    }
    get [dartx.state]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
    }
    get [_get_state]() {
      return this.state;
    }
  };
  dart.setSignature(html$.PopStateEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PopStateEvent, []),
      new: dart.definiteFunctionType(html$.PopStateEvent, [core.String], [core.Map])
    }),
    fields: () => ({[_get_state]: dart.dynamic}),
    getters: () => ({[dartx.state]: dart.definiteFunctionType(dart.dynamic, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PopStateEvent, html$.PopStateEvent);
  html$._PositionCallback = dart.typedef('_PositionCallback', () => dart.functionType(dart.void, [html$.Geoposition]));
  dart.defineExtensionNames([
    'code',
    'message'
  ]);
  html$.PositionError = class PositionError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(html$.PositionError, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PositionError, [])}),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.message]: core.String
    }),
    sfields: () => ({
      PERMISSION_DENIED: core.int,
      POSITION_UNAVAILABLE: core.int,
      TIMEOUT: core.int
    })
  });
  html$.PositionError.PERMISSION_DENIED = 1;
  html$.PositionError.POSITION_UNAVAILABLE = 2;
  html$.PositionError.TIMEOUT = 3;
  dart.registerExtension(dart.global.PositionError, html$.PositionError);
  html$._PositionErrorCallback = dart.typedef('_PositionErrorCallback', () => dart.functionType(dart.void, [html$.PositionError]));
  dart.defineExtensionNames([
    'getImmediateState',
    'getState',
    'resetSensor'
  ]);
  html$.PositionSensorVRDevice = class PositionSensorVRDevice extends html$.VRDevice {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getImmediateState](...args) {
      return this.getImmediateState.apply(this, args);
    }
    [dartx.getState](...args) {
      return this.getState.apply(this, args);
    }
    [dartx.resetSensor](...args) {
      return this.resetSensor.apply(this, args);
    }
  };
  dart.setSignature(html$.PositionSensorVRDevice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PositionSensorVRDevice, [])}),
    methods: () => ({
      [dartx.getImmediateState]: dart.definiteFunctionType(html$.VRPositionState, []),
      [dartx.getState]: dart.definiteFunctionType(html$.VRPositionState, []),
      [dartx.resetSensor]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.PositionSensorVRDevice, html$.PositionSensorVRDevice);
  html$.PreElement = class PreElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.PreElement._check(html$.document[dartx.createElement]("pre"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.PreElement, 'created');
  dart.setSignature(html$.PreElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PreElement, []),
      new: dart.definiteFunctionType(html$.PreElement, []),
      created: dart.definiteFunctionType(html$.PreElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLPreElement, html$.PreElement);
  dart.defineExtensionNames([
    'getAvailability',
    'joinSession',
    'startSession',
    'session'
  ]);
  html$.Presentation = class Presentation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.session]() {
      return this.session;
    }
    [dartx.getAvailability](...args) {
      return this.getAvailability.apply(this, args);
    }
    [dartx.joinSession](...args) {
      return this.joinSession.apply(this, args);
    }
    [dartx.startSession](...args) {
      return this.startSession.apply(this, args);
    }
  };
  dart.setSignature(html$.Presentation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Presentation, [])}),
    fields: () => ({[dartx.session]: html$.PresentationSession}),
    methods: () => ({
      [dartx.getAvailability]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.joinSession]: dart.definiteFunctionType(async.Future, [core.String, core.String]),
      [dartx.startSession]: dart.definiteFunctionType(async.Future, [core.String])
    })
  });
  dart.registerExtension(dart.global.Presentation, html$.Presentation);
  dart.defineExtensionNames([
    'onChange',
    'value'
  ]);
  html$.PresentationAvailability = class PresentationAvailability extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return this.value;
    }
    get [dartx.onChange]() {
      return html$.PresentationAvailability.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.PresentationAvailability, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PresentationAvailability, [])}),
    fields: () => ({[dartx.value]: core.bool}),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.PresentationAvailability, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.PresentationAvailability, html$.PresentationAvailability);
  dart.defineExtensionNames([
    'close',
    'send',
    'onMessage',
    'binaryType',
    'id',
    'state'
  ]);
  html$.PresentationSession = class PresentationSession extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.binaryType]() {
      return this.binaryType;
    }
    set [dartx.binaryType](value) {
      this.binaryType = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.state]() {
      return this.state;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.PresentationSession.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.PresentationSession, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PresentationSession, [])}),
    fields: () => ({
      [dartx.binaryType]: core.String,
      [dartx.id]: core.String,
      [dartx.state]: core.String
    }),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.PresentationSession, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.PresentationSession, html$.PresentationSession);
  dart.defineExtensionNames([
    'sheet',
    'target'
  ]);
  html$.ProcessingInstruction = class ProcessingInstruction extends html$.CharacterData {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.target]() {
      return this.target;
    }
  };
  dart.setSignature(html$.ProcessingInstruction, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ProcessingInstruction, [])}),
    fields: () => ({
      [dartx.sheet]: html$.StyleSheet,
      [dartx.target]: core.String
    })
  });
  dart.registerExtension(dart.global.ProcessingInstruction, html$.ProcessingInstruction);
  dart.defineExtensionNames([
    'labels',
    'max',
    'position',
    'value'
  ]);
  html$.ProgressElement = class ProgressElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ProgressElement._check(html$.document[dartx.createElement]("progress"));
    }
    created() {
      this[dartx.labels] = null;
      this[dartx.max] = null;
      this[dartx.position] = null;
      this[dartx.value] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('progress');
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.max]() {
      return this.max;
    }
    set [dartx.max](value) {
      this.max = value;
    }
    get [dartx.position]() {
      return this.position;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.defineNamedConstructor(html$.ProgressElement, 'created');
  dart.setSignature(html$.ProgressElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ProgressElement, []),
      new: dart.definiteFunctionType(html$.ProgressElement, []),
      created: dart.definiteFunctionType(html$.ProgressElement, [])
    }),
    fields: () => ({
      [dartx.labels]: ListOfNode(),
      [dartx.max]: core.num,
      [dartx.position]: core.double,
      [dartx.value]: core.num
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLProgressElement, html$.ProgressElement);
  dart.defineExtensionNames([
    'lengthComputable',
    'loaded',
    'total'
  ]);
  html$.ProgressEvent = class ProgressEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ProgressEvent._create_1(type, eventInitDict_1);
      }
      return html$.ProgressEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ProgressEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ProgressEvent(type);
    }
    get [dartx.lengthComputable]() {
      return this.lengthComputable;
    }
    get [dartx.loaded]() {
      return this.loaded;
    }
    get [dartx.total]() {
      return this.total;
    }
  };
  dart.setSignature(html$.ProgressEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ProgressEvent, []),
      new: dart.definiteFunctionType(html$.ProgressEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.lengthComputable]: core.bool,
      [dartx.loaded]: core.int,
      [dartx.total]: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ProgressEvent, html$.ProgressEvent);
  dart.defineExtensionNames([
    'promise',
    'reason'
  ]);
  html$.PromiseRejectionEvent = class PromiseRejectionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PromiseRejectionEvent._create_1(type, eventInitDict_1);
      }
      return html$.PromiseRejectionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PromiseRejectionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PromiseRejectionEvent(type);
    }
    get [dartx.promise]() {
      return this.promise;
    }
    get [dartx.reason]() {
      return this.reason;
    }
  };
  dart.setSignature(html$.PromiseRejectionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PromiseRejectionEvent, []),
      new: dart.definiteFunctionType(html$.PromiseRejectionEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.promise]: async.Future,
      [dartx.reason]: core.Object
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PromiseRejectionEvent, html$.PromiseRejectionEvent);
  dart.defineExtensionNames([
    'data'
  ]);
  html$.PushEvent = class PushEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.PushEvent._create_1(type, eventInitDict_1);
      }
      return html$.PushEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new PushEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new PushEvent(type);
    }
    get [dartx.data]() {
      return this.data;
    }
  };
  dart.setSignature(html$.PushEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PushEvent, []),
      new: dart.definiteFunctionType(html$.PushEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.data]: html$.PushMessageData}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.PushEvent, html$.PushEvent);
  const _permissionState_1 = Symbol('_permissionState_1');
  const _permissionState_2 = Symbol('_permissionState_2');
  const _subscribe_1 = Symbol('_subscribe_1');
  const _subscribe_2 = Symbol('_subscribe_2');
  dart.defineExtensionNames([
    'getSubscription',
    'permissionState',
    'subscribe'
  ]);
  html$.PushManager = class PushManager extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getSubscription](...args) {
      return this.getSubscription.apply(this, args);
    }
    [dartx.permissionState](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_permissionState_1](options_1);
      }
      return this[_permissionState_2]();
    }
    [_permissionState_1](...args) {
      return this.permissionState.apply(this, args);
    }
    [_permissionState_2](...args) {
      return this.permissionState.apply(this, args);
    }
    [dartx.subscribe](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_subscribe_1](options_1);
      }
      return this[_subscribe_2]();
    }
    [_subscribe_1](...args) {
      return this.subscribe.apply(this, args);
    }
    [_subscribe_2](...args) {
      return this.subscribe.apply(this, args);
    }
  };
  dart.setSignature(html$.PushManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PushManager, [])}),
    methods: () => ({
      [dartx.getSubscription]: dart.definiteFunctionType(async.Future, []),
      [dartx.permissionState]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_permissionState_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_permissionState_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.subscribe]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_subscribe_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_subscribe_2]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.PushManager, html$.PushManager);
  dart.defineExtensionNames([
    'arrayBuffer',
    'blob',
    'json',
    'text'
  ]);
  html$.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(message) {
      return html$.PushMessageData._create_1(message);
    }
    static _create_1(message) {
      return new PushMessageData(message);
    }
    [dartx.arrayBuffer](...args) {
      return this.arrayBuffer.apply(this, args);
    }
    [dartx.blob](...args) {
      return this.blob.apply(this, args);
    }
    [dartx.json](...args) {
      return this.json.apply(this, args);
    }
    [dartx.text](...args) {
      return this.text.apply(this, args);
    }
  };
  dart.setSignature(html$.PushMessageData, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.PushMessageData, []),
      new: dart.definiteFunctionType(html$.PushMessageData, [core.String])
    }),
    methods: () => ({
      [dartx.arrayBuffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
      [dartx.blob]: dart.definiteFunctionType(html$.Blob, []),
      [dartx.json]: dart.definiteFunctionType(core.Object, []),
      [dartx.text]: dart.definiteFunctionType(core.String, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.PushMessageData, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.PushMessageData, html$.PushMessageData);
  dart.defineExtensionNames([
    'unsubscribe',
    'endpoint'
  ]);
  html$.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.endpoint]() {
      return this.endpoint;
    }
    [dartx.unsubscribe](...args) {
      return this.unsubscribe.apply(this, args);
    }
  };
  dart.setSignature(html$.PushSubscription, {
    constructors: () => ({_: dart.definiteFunctionType(html$.PushSubscription, [])}),
    fields: () => ({[dartx.endpoint]: core.String}),
    methods: () => ({[dartx.unsubscribe]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.PushSubscription, html$.PushSubscription);
  dart.defineExtensionNames([
    'cite'
  ]);
  html$.QuoteElement = class QuoteElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.QuoteElement._check(html$.document[dartx.createElement]("q"));
    }
    created() {
      this[dartx.cite] = null;
      super.created();
    }
    get [dartx.cite]() {
      return this.cite;
    }
    set [dartx.cite](value) {
      this.cite = value;
    }
  };
  dart.defineNamedConstructor(html$.QuoteElement, 'created');
  dart.setSignature(html$.QuoteElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.QuoteElement, []),
      new: dart.definiteFunctionType(html$.QuoteElement, []),
      created: dart.definiteFunctionType(html$.QuoteElement, [])
    }),
    fields: () => ({[dartx.cite]: core.String})
  });
  dart.registerExtension(dart.global.HTMLQuoteElement, html$.QuoteElement);
  html$._RtcErrorCallback = dart.typedef('_RtcErrorCallback', () => dart.functionType(dart.void, [core.String]));
  html$._RtcSessionDescriptionCallback = dart.typedef('_RtcSessionDescriptionCallback', () => dart.functionType(dart.void, [html$.RtcSessionDescription]));
  html$.RtcStatsCallback = dart.typedef('RtcStatsCallback', () => dart.functionType(dart.void, [html$.RtcStatsResponse]));
  dart.defineExtensionNames([
    'cloneContents',
    'cloneRange',
    'collapse',
    'compareBoundaryPoints',
    'comparePoint',
    'createContextualFragment',
    'deleteContents',
    'detach',
    'expand',
    'extractContents',
    'getBoundingClientRect',
    'getClientRects',
    'insertNode',
    'isPointInRange',
    'selectNode',
    'selectNodeContents',
    'setEnd',
    'setEndAfter',
    'setEndBefore',
    'setStart',
    'setStartAfter',
    'setStartBefore',
    'surroundContents',
    'collapsed',
    'commonAncestorContainer',
    'endContainer',
    'endOffset',
    'startContainer',
    'startOffset'
  ]);
  html$.Range = class Range extends _interceptors.Interceptor {
    static new() {
      return html$.document[dartx.createRange]();
    }
    static fromPoint(point) {
      return html$.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.collapsed]() {
      return this.collapsed;
    }
    get [dartx.commonAncestorContainer]() {
      return this.commonAncestorContainer;
    }
    get [dartx.endContainer]() {
      return this.endContainer;
    }
    get [dartx.endOffset]() {
      return this.endOffset;
    }
    get [dartx.startContainer]() {
      return this.startContainer;
    }
    get [dartx.startOffset]() {
      return this.startOffset;
    }
    [dartx.cloneContents](...args) {
      return this.cloneContents.apply(this, args);
    }
    [dartx.cloneRange](...args) {
      return this.cloneRange.apply(this, args);
    }
    [dartx.collapse](...args) {
      return this.collapse.apply(this, args);
    }
    [dartx.compareBoundaryPoints](...args) {
      return this.compareBoundaryPoints.apply(this, args);
    }
    [dartx.comparePoint](...args) {
      return this.comparePoint.apply(this, args);
    }
    [dartx.createContextualFragment](...args) {
      return this.createContextualFragment.apply(this, args);
    }
    [dartx.deleteContents](...args) {
      return this.deleteContents.apply(this, args);
    }
    [dartx.detach](...args) {
      return this.detach.apply(this, args);
    }
    [dartx.expand](...args) {
      return this.expand.apply(this, args);
    }
    [dartx.extractContents](...args) {
      return this.extractContents.apply(this, args);
    }
    [dartx.getBoundingClientRect](...args) {
      return this.getBoundingClientRect.apply(this, args);
    }
    [dartx.getClientRects](...args) {
      return this.getClientRects.apply(this, args);
    }
    [dartx.insertNode](...args) {
      return this.insertNode.apply(this, args);
    }
    [dartx.isPointInRange](...args) {
      return this.isPointInRange.apply(this, args);
    }
    [dartx.selectNode](...args) {
      return this.selectNode.apply(this, args);
    }
    [dartx.selectNodeContents](...args) {
      return this.selectNodeContents.apply(this, args);
    }
    [dartx.setEnd](...args) {
      return this.setEnd.apply(this, args);
    }
    [dartx.setEndAfter](...args) {
      return this.setEndAfter.apply(this, args);
    }
    [dartx.setEndBefore](...args) {
      return this.setEndBefore.apply(this, args);
    }
    [dartx.setStart](...args) {
      return this.setStart.apply(this, args);
    }
    [dartx.setStartAfter](...args) {
      return this.setStartAfter.apply(this, args);
    }
    [dartx.setStartBefore](...args) {
      return this.setStartBefore.apply(this, args);
    }
    [dartx.surroundContents](...args) {
      return this.surroundContents.apply(this, args);
    }
    static get supportsCreateContextualFragment() {
      return "createContextualFragment" in window.Range.prototype;
    }
  };
  dart.setSignature(html$.Range, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.Range, []),
      fromPoint: dart.definiteFunctionType(html$.Range, [PointOfnum()]),
      _: dart.definiteFunctionType(html$.Range, [])
    }),
    fields: () => ({
      [dartx.collapsed]: core.bool,
      [dartx.commonAncestorContainer]: html$.Node,
      [dartx.endContainer]: html$.Node,
      [dartx.endOffset]: core.int,
      [dartx.startContainer]: html$.Node,
      [dartx.startOffset]: core.int
    }),
    methods: () => ({
      [dartx.cloneContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
      [dartx.cloneRange]: dart.definiteFunctionType(html$.Range, []),
      [dartx.collapse]: dart.definiteFunctionType(dart.void, [], [core.bool]),
      [dartx.compareBoundaryPoints]: dart.definiteFunctionType(core.int, [core.int, html$.Range]),
      [dartx.comparePoint]: dart.definiteFunctionType(core.int, [html$.Node, core.int]),
      [dartx.createContextualFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String]),
      [dartx.deleteContents]: dart.definiteFunctionType(dart.void, []),
      [dartx.detach]: dart.definiteFunctionType(dart.void, []),
      [dartx.expand]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.extractContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
      [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
      [dartx.insertNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.isPointInRange]: dart.definiteFunctionType(core.bool, [html$.Node, core.int]),
      [dartx.selectNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.selectNodeContents]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setEnd]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
      [dartx.setEndAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setEndBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setStart]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
      [dartx.setStartAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setStartBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.surroundContents]: dart.definiteFunctionType(dart.void, [html$.Node])
    }),
    sfields: () => ({
      END_TO_END: core.int,
      END_TO_START: core.int,
      START_TO_END: core.int,
      START_TO_START: core.int
    }),
    sgetters: () => ({supportsCreateContextualFragment: dart.definiteFunctionType(core.bool, [])})
  });
  html$.Range.END_TO_END = 2;
  html$.Range.END_TO_START = 3;
  html$.Range.START_TO_END = 1;
  html$.Range.START_TO_START = 0;
  dart.registerExtension(dart.global.Range, html$.Range);
  dart.defineExtensionNames([
    'cancel',
    'getReader'
  ]);
  html$.ReadableByteStream = class ReadableByteStream extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.getReader](...args) {
      return this.getReader.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableByteStream, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStream, [])}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.getReader]: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])
    })
  });
  dart.registerExtension(dart.global.ReadableByteStream, html$.ReadableByteStream);
  dart.defineExtensionNames([
    'cancel',
    'read',
    'releaseLock',
    'closed'
  ]);
  html$.ReadableByteStreamReader = class ReadableByteStreamReader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.closed]() {
      return this.closed;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.read](...args) {
      return this.read.apply(this, args);
    }
    [dartx.releaseLock](...args) {
      return this.releaseLock.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableByteStreamReader, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])}),
    fields: () => ({[dartx.closed]: async.Future}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.read]: dart.definiteFunctionType(async.Future, []),
      [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.ReadableByteStreamReader, html$.ReadableByteStreamReader);
  dart.defineExtensionNames([
    'cancel',
    'getReader'
  ]);
  html$.ReadableStream = class ReadableStream extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.getReader](...args) {
      return this.getReader.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableStream, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStream, [])}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.getReader]: dart.definiteFunctionType(html$.ReadableStreamReader, [])
    })
  });
  dart.registerExtension(dart.global.ReadableStream, html$.ReadableStream);
  dart.defineExtensionNames([
    'cancel',
    'read',
    'releaseLock',
    'closed'
  ]);
  html$.ReadableStreamReader = class ReadableStreamReader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.closed]() {
      return this.closed;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.read](...args) {
      return this.read.apply(this, args);
    }
    [dartx.releaseLock](...args) {
      return this.releaseLock.apply(this, args);
    }
  };
  dart.setSignature(html$.ReadableStreamReader, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStreamReader, [])}),
    fields: () => ({[dartx.closed]: async.Future}),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
      [dartx.read]: dart.definiteFunctionType(async.Future, []),
      [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.ReadableStreamReader, html$.ReadableStreamReader);
  dart.defineExtensionNames([
    'relatedTarget'
  ]);
  html$.RelatedEvent = class RelatedEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.RelatedEvent._create_1(type, eventInitDict_1);
      }
      return html$.RelatedEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new RelatedEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new RelatedEvent(type);
    }
    get [dartx.relatedTarget]() {
      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
    }
    get [_get_relatedTarget]() {
      return this.relatedTarget;
    }
  };
  dart.setSignature(html$.RelatedEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.RelatedEvent, []),
      new: dart.definiteFunctionType(html$.RelatedEvent, [core.String], [core.Map])
    }),
    fields: () => ({[_get_relatedTarget]: dart.dynamic}),
    getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.RelatedEvent, html$.RelatedEvent);
  html$.RequestAnimationFrameCallback = dart.typedef('RequestAnimationFrameCallback', () => dart.functionType(dart.void, [core.num]));
  dart.defineExtensionNames([
    'url'
  ]);
  html$.ResourceProgressEvent = class ResourceProgressEvent extends html$.ProgressEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.url]() {
      return this.url;
    }
  };
  dart.setSignature(html$.ResourceProgressEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ResourceProgressEvent, [])}),
    fields: () => ({[dartx.url]: core.String})
  });
  dart.registerExtension(dart.global.ResourceProgressEvent, html$.ResourceProgressEvent);
  dart.defineExtensionNames([
    'close',
    'send',
    'sendBlob',
    'sendByteBuffer',
    'sendString',
    'sendTypedData',
    'onClose',
    'onError',
    'onMessage',
    'onOpen',
    'binaryType',
    'bufferedAmount',
    'id',
    'label',
    'maxRetransmitTime',
    'maxRetransmits',
    'negotiated',
    'ordered',
    'protocol',
    'readyState',
    'reliable'
  ]);
  html$.RtcDataChannel = class RtcDataChannel extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.binaryType]() {
      return this.binaryType;
    }
    set [dartx.binaryType](value) {
      this.binaryType = value;
    }
    get [dartx.bufferedAmount]() {
      return this.bufferedAmount;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.maxRetransmitTime]() {
      return this.maxRetransmitTime;
    }
    get [dartx.maxRetransmits]() {
      return this.maxRetransmits;
    }
    get [dartx.negotiated]() {
      return this.negotiated;
    }
    get [dartx.ordered]() {
      return this.ordered;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.reliable]() {
      return this.reliable;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendBlob](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendByteBuffer](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendString](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendTypedData](...args) {
      return this.send.apply(this, args);
    }
    get [dartx.onClose]() {
      return html$.RtcDataChannel.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.RtcDataChannel.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.RtcDataChannel.messageEvent.forTarget(this);
    }
    get [dartx.onOpen]() {
      return html$.RtcDataChannel.openEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.RtcDataChannel, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannel, [])}),
    fields: () => ({
      [dartx.binaryType]: core.String,
      [dartx.bufferedAmount]: core.int,
      [dartx.id]: core.int,
      [dartx.label]: core.String,
      [dartx.maxRetransmitTime]: core.int,
      [dartx.maxRetransmits]: core.int,
      [dartx.negotiated]: core.bool,
      [dartx.ordered]: core.bool,
      [dartx.protocol]: core.String,
      [dartx.readyState]: core.String,
      [dartx.reliable]: core.bool
    }),
    getters: () => ({
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
      [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
    }),
    sfields: () => ({
      closeEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      openEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.RtcDataChannel, {
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get openEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('open'));
    }
  });
  dart.registerExtension(dart.global.RTCDataChannel, html$.RtcDataChannel);
  dart.registerExtension(dart.global.DataChannel, html$.RtcDataChannel);
  dart.defineExtensionNames([
    'channel'
  ]);
  html$.RtcDataChannelEvent = class RtcDataChannelEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.channel]() {
      return this.channel;
    }
  };
  dart.setSignature(html$.RtcDataChannelEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannelEvent, [])}),
    fields: () => ({[dartx.channel]: html$.RtcDataChannel})
  });
  dart.registerExtension(dart.global.RTCDataChannelEvent, html$.RtcDataChannelEvent);
  dart.defineExtensionNames([
    'insertDtmf',
    'onToneChange',
    'canInsertDtmf',
    'duration',
    'interToneGap',
    'toneBuffer',
    'track'
  ]);
  html$.RtcDtmfSender = class RtcDtmfSender extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.canInsertDtmf]() {
      return this.canInsertDTMF;
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.interToneGap]() {
      return this.interToneGap;
    }
    get [dartx.toneBuffer]() {
      return this.toneBuffer;
    }
    get [dartx.track]() {
      return this.track;
    }
    [dartx.insertDtmf](...args) {
      return this.insertDTMF.apply(this, args);
    }
    get [dartx.onToneChange]() {
      return html$.RtcDtmfSender.toneChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.RtcDtmfSender, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDtmfSender, [])}),
    fields: () => ({
      [dartx.canInsertDtmf]: core.bool,
      [dartx.duration]: core.int,
      [dartx.interToneGap]: core.int,
      [dartx.toneBuffer]: core.String,
      [dartx.track]: html$.MediaStreamTrack
    }),
    getters: () => ({[dartx.onToneChange]: dart.definiteFunctionType(async.Stream$(html$.RtcDtmfToneChangeEvent), [])}),
    methods: () => ({[dartx.insertDtmf]: dart.definiteFunctionType(dart.void, [core.String], [core.int, core.int])}),
    sfields: () => ({toneChangeEvent: EventStreamProviderOfRtcDtmfToneChangeEvent()})
  });
  dart.defineLazy(html$.RtcDtmfSender, {
    get toneChangeEvent() {
      return dart.const(new (EventStreamProviderOfRtcDtmfToneChangeEvent())('tonechange'));
    }
  });
  dart.registerExtension(dart.global.RTCDTMFSender, html$.RtcDtmfSender);
  dart.defineExtensionNames([
    'tone'
  ]);
  html$.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
      return html$.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
    }
    static _create_1(type, eventInitDict) {
      return new RTCDTMFToneChangeEvent(type, eventInitDict);
    }
    get [dartx.tone]() {
      return this.tone;
    }
  };
  dart.setSignature(html$.RtcDtmfToneChangeEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, []),
      new: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [core.String, core.Map])
    }),
    fields: () => ({[dartx.tone]: core.String}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.RTCDTMFToneChangeEvent, html$.RtcDtmfToneChangeEvent);
  dart.defineExtensionNames([
    'candidate',
    'sdpMLineIndex',
    'sdpMid'
  ]);
  html$.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
    static new(dictionary) {
      let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCIceCandidate` : 'RTCIceCandidate'];
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.candidate]() {
      return this.candidate;
    }
    set [dartx.candidate](value) {
      this.candidate = value;
    }
    get [dartx.sdpMLineIndex]() {
      return this.sdpMLineIndex;
    }
    set [dartx.sdpMLineIndex](value) {
      this.sdpMLineIndex = value;
    }
    get [dartx.sdpMid]() {
      return this.sdpMid;
    }
    set [dartx.sdpMid](value) {
      this.sdpMid = value;
    }
  };
  dart.setSignature(html$.RtcIceCandidate, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.RtcIceCandidate, [core.Map]),
      _: dart.definiteFunctionType(html$.RtcIceCandidate, [])
    }),
    fields: () => ({
      [dartx.candidate]: core.String,
      [dartx.sdpMLineIndex]: core.int,
      [dartx.sdpMid]: core.String
    })
  });
  dart.registerExtension(dart.global.RTCIceCandidate, html$.RtcIceCandidate);
  dart.registerExtension(dart.global.mozRTCIceCandidate, html$.RtcIceCandidate);
  dart.defineExtensionNames([
    'candidate'
  ]);
  html$.RtcIceCandidateEvent = class RtcIceCandidateEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.candidate]() {
      return this.candidate;
    }
  };
  dart.setSignature(html$.RtcIceCandidateEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcIceCandidateEvent, [])}),
    fields: () => ({[dartx.candidate]: html$.RtcIceCandidate})
  });
  dart.registerExtension(dart.global.RTCIceCandidateEvent, html$.RtcIceCandidateEvent);
  dart.registerExtension(dart.global.RTCPeerConnectionIceEvent, html$.RtcIceCandidateEvent);
  const _createOffer = Symbol('_createOffer');
  const _createAnswer = Symbol('_createAnswer');
  const _getStats = Symbol('_getStats');
  const _addStream_1 = Symbol('_addStream_1');
  const _addStream_2 = Symbol('_addStream_2');
  const _createAnswer_1 = Symbol('_createAnswer_1');
  const _createAnswer_2 = Symbol('_createAnswer_2');
  const _createDataChannel_1 = Symbol('_createDataChannel_1');
  const _createDataChannel_2 = Symbol('_createDataChannel_2');
  const _createOffer_1 = Symbol('_createOffer_1');
  const _createOffer_2 = Symbol('_createOffer_2');
  const _setLocalDescription = Symbol('_setLocalDescription');
  const _setRemoteDescription = Symbol('_setRemoteDescription');
  const _updateIce_1 = Symbol('_updateIce_1');
  const _updateIce_2 = Symbol('_updateIce_2');
  const _updateIce_3 = Symbol('_updateIce_3');
  dart.defineExtensionNames([
    'createOffer',
    'createAnswer',
    'getStats',
    'addIceCandidate',
    'addStream',
    'close',
    'createDtmfSender',
    'createDataChannel',
    'getLocalStreams',
    'getRemoteStreams',
    'getStreamById',
    'removeStream',
    'setLocalDescription',
    'setRemoteDescription',
    'updateIce',
    'onAddStream',
    'onDataChannel',
    'onIceCandidate',
    'onIceConnectionStateChange',
    'onNegotiationNeeded',
    'onRemoveStream',
    'onSignalingStateChange',
    'iceConnectionState',
    'iceGatheringState',
    'localDescription',
    'remoteDescription',
    'signalingState'
  ]);
  html$.RtcPeerConnection = class RtcPeerConnection extends html$.EventTarget {
    static new(rtcIceServers, mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      let constructorName = window[dart.str`${html_common.Device.propertyPrefix}RTCPeerConnection`];
      if (mediaConstraints != null) {
        return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers), html_common.convertDartToNative_SerializedScriptValue(mediaConstraints));
      } else {
        return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers));
      }
    }
    static get supported() {
      try {
        html$.RtcPeerConnection.new(dart.map({iceServers: JSArrayOfMapOfString$String().of([dart.map({url: "stun:localhost"}, core.String, core.String)])}, core.String, ListOfMapOfString$String()));
        return true;
      } catch (_) {
        return false;
      }

      return false;
    }
    [dartx.createOffer](mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      let completer = CompleterOfRtcSessionDescription().new();
      this[_createOffer](dart.fn(value => {
        completer.complete(value);
      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()), mediaConstraints);
      return completer.future;
    }
    [dartx.createAnswer](mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      let completer = CompleterOfRtcSessionDescription().new();
      this[_createAnswer](dart.fn(value => {
        completer.complete(value);
      }, RtcSessionDescriptionTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()), mediaConstraints);
      return completer.future;
    }
    [dartx.getStats](selector) {
      let completer = CompleterOfRtcStatsResponse().new();
      this[_getStats](dart.fn(value => {
        completer.complete(value);
      }, RtcStatsResponseTovoid()), selector);
      return completer.future;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.iceConnectionState]() {
      return this.iceConnectionState;
    }
    get [dartx.iceGatheringState]() {
      return this.iceGatheringState;
    }
    get [dartx.localDescription]() {
      return this.localDescription;
    }
    get [dartx.remoteDescription]() {
      return this.remoteDescription;
    }
    get [dartx.signalingState]() {
      return this.signalingState;
    }
    [dartx.addIceCandidate](...args) {
      return this.addIceCandidate.apply(this, args);
    }
    [dartx.addStream](stream, mediaConstraints) {
      if (mediaConstraints === void 0) mediaConstraints = null;
      if (mediaConstraints != null) {
        let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
        this[_addStream_1](stream, mediaConstraints_1);
        return;
      }
      this[_addStream_2](stream);
      return;
    }
    [_addStream_1](...args) {
      return this.addStream.apply(this, args);
    }
    [_addStream_2](...args) {
      return this.addStream.apply(this, args);
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [_createAnswer](successCallback, failureCallback, mediaConstraints) {
      if (failureCallback === void 0) failureCallback = null;
      if (mediaConstraints === void 0) mediaConstraints = null;
      if (mediaConstraints != null) {
        let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
        this[_createAnswer_1](successCallback, failureCallback, mediaConstraints_1);
        return;
      }
      this[_createAnswer_2](successCallback, failureCallback);
      return;
    }
    [_createAnswer_1](...args) {
      return this.createAnswer.apply(this, args);
    }
    [_createAnswer_2](...args) {
      return this.createAnswer.apply(this, args);
    }
    [dartx.createDtmfSender](...args) {
      return this.createDTMFSender.apply(this, args);
    }
    [dartx.createDataChannel](label, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_createDataChannel_1](label, options_1);
      }
      return this[_createDataChannel_2](label);
    }
    [_createDataChannel_1](...args) {
      return this.createDataChannel.apply(this, args);
    }
    [_createDataChannel_2](...args) {
      return this.createDataChannel.apply(this, args);
    }
    [_createOffer](successCallback, failureCallback, rtcOfferOptions) {
      if (failureCallback === void 0) failureCallback = null;
      if (rtcOfferOptions === void 0) rtcOfferOptions = null;
      if (rtcOfferOptions != null) {
        let rtcOfferOptions_1 = html_common.convertDartToNative_Dictionary(rtcOfferOptions);
        this[_createOffer_1](successCallback, failureCallback, rtcOfferOptions_1);
        return;
      }
      this[_createOffer_2](successCallback, failureCallback);
      return;
    }
    [_createOffer_1](...args) {
      return this.createOffer.apply(this, args);
    }
    [_createOffer_2](...args) {
      return this.createOffer.apply(this, args);
    }
    [dartx.getLocalStreams](...args) {
      return this.getLocalStreams.apply(this, args);
    }
    [dartx.getRemoteStreams](...args) {
      return this.getRemoteStreams.apply(this, args);
    }
    [_getStats](...args) {
      return this.getStats.apply(this, args);
    }
    [dartx.getStreamById](...args) {
      return this.getStreamById.apply(this, args);
    }
    [dartx.removeStream](...args) {
      return this.removeStream.apply(this, args);
    }
    [_setLocalDescription](...args) {
      return this.setLocalDescription.apply(this, args);
    }
    [dartx.setLocalDescription](description) {
      let completer = async.Completer.new();
      this[_setLocalDescription](description, dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()));
      return completer.future;
    }
    [_setRemoteDescription](...args) {
      return this.setRemoteDescription.apply(this, args);
    }
    [dartx.setRemoteDescription](description) {
      let completer = async.Completer.new();
      this[_setRemoteDescription](description, dart.fn(() => {
        completer.complete();
      }, VoidTovoid$()), dart.fn(error => {
        completer.completeError(error);
      }, StringTovoid$()));
      return completer.future;
    }
    [dartx.updateIce](configuration, mediaConstraints) {
      if (configuration === void 0) configuration = null;
      if (mediaConstraints === void 0) mediaConstraints = null;
      if (mediaConstraints != null) {
        let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
        let mediaConstraints_2 = html_common.convertDartToNative_Dictionary(mediaConstraints);
        this[_updateIce_1](configuration_1, mediaConstraints_2);
        return;
      }
      if (configuration != null) {
        let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
        this[_updateIce_2](configuration_1);
        return;
      }
      this[_updateIce_3]();
      return;
    }
    [_updateIce_1](...args) {
      return this.updateIce.apply(this, args);
    }
    [_updateIce_2](...args) {
      return this.updateIce.apply(this, args);
    }
    [_updateIce_3](...args) {
      return this.updateIce.apply(this, args);
    }
    get [dartx.onAddStream]() {
      return html$.RtcPeerConnection.addStreamEvent.forTarget(this);
    }
    get [dartx.onDataChannel]() {
      return html$.RtcPeerConnection.dataChannelEvent.forTarget(this);
    }
    get [dartx.onIceCandidate]() {
      return html$.RtcPeerConnection.iceCandidateEvent.forTarget(this);
    }
    get [dartx.onIceConnectionStateChange]() {
      return html$.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
    }
    get [dartx.onNegotiationNeeded]() {
      return html$.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
    }
    get [dartx.onRemoveStream]() {
      return html$.RtcPeerConnection.removeStreamEvent.forTarget(this);
    }
    get [dartx.onSignalingStateChange]() {
      return html$.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.RtcPeerConnection, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.RtcPeerConnection, [core.Map], [core.Map]),
      _: dart.definiteFunctionType(html$.RtcPeerConnection, [])
    }),
    fields: () => ({
      [dartx.iceConnectionState]: core.String,
      [dartx.iceGatheringState]: core.String,
      [dartx.localDescription]: html$.RtcSessionDescription,
      [dartx.remoteDescription]: html$.RtcSessionDescription,
      [dartx.signalingState]: core.String
    }),
    getters: () => ({
      [dartx.onAddStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
      [dartx.onDataChannel]: dart.definiteFunctionType(async.Stream$(html$.RtcDataChannelEvent), []),
      [dartx.onIceCandidate]: dart.definiteFunctionType(async.Stream$(html$.RtcIceCandidateEvent), []),
      [dartx.onIceConnectionStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onNegotiationNeeded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRemoveStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
      [dartx.onSignalingStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.createOffer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
      [dartx.createAnswer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
      [dartx.getStats]: dart.definiteFunctionType(async.Future$(html$.RtcStatsResponse), [html$.MediaStreamTrack]),
      [dartx.addIceCandidate]: dart.definiteFunctionType(dart.void, [html$.RtcIceCandidate, html$.VoidCallback, html$._RtcErrorCallback]),
      [dartx.addStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream], [core.Map]),
      [_addStream_1]: dart.definiteFunctionType(dart.void, [html$.MediaStream, dart.dynamic]),
      [_addStream_2]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [_createAnswer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
      [_createAnswer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
      [_createAnswer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
      [dartx.createDtmfSender]: dart.definiteFunctionType(html$.RtcDtmfSender, [html$.MediaStreamTrack]),
      [dartx.createDataChannel]: dart.definiteFunctionType(html$.RtcDataChannel, [core.String], [core.Map]),
      [_createDataChannel_1]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic, dart.dynamic]),
      [_createDataChannel_2]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic]),
      [_createOffer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
      [_createOffer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
      [_createOffer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
      [dartx.getLocalStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
      [dartx.getRemoteStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
      [_getStats]: dart.definiteFunctionType(dart.void, [html$.RtcStatsCallback, html$.MediaStreamTrack]),
      [dartx.getStreamById]: dart.definiteFunctionType(html$.MediaStream, [core.String]),
      [dartx.removeStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
      [_setLocalDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
      [dartx.setLocalDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
      [_setRemoteDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
      [dartx.setRemoteDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
      [dartx.updateIce]: dart.definiteFunctionType(dart.void, [], [core.Map, core.Map]),
      [_updateIce_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [_updateIce_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_updateIce_3]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      addStreamEvent: EventStreamProviderOfMediaStreamEvent(),
      dataChannelEvent: EventStreamProviderOfRtcDataChannelEvent(),
      iceCandidateEvent: EventStreamProviderOfRtcIceCandidateEvent(),
      iceConnectionStateChangeEvent: EventStreamProviderOfEvent(),
      negotiationNeededEvent: EventStreamProviderOfEvent(),
      removeStreamEvent: EventStreamProviderOfMediaStreamEvent(),
      signalingStateChangeEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineLazy(html$.RtcPeerConnection, {
    get addStreamEvent() {
      return dart.const(new (EventStreamProviderOfMediaStreamEvent())('addstream'));
    },
    get dataChannelEvent() {
      return dart.const(new (EventStreamProviderOfRtcDataChannelEvent())('datachannel'));
    },
    get iceCandidateEvent() {
      return dart.const(new (EventStreamProviderOfRtcIceCandidateEvent())('icecandidate'));
    },
    get iceConnectionStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('iceconnectionstatechange'));
    },
    get negotiationNeededEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('negotiationneeded'));
    },
    get removeStreamEvent() {
      return dart.const(new (EventStreamProviderOfMediaStreamEvent())('removestream'));
    },
    get signalingStateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('signalingstatechange'));
    }
  });
  dart.registerExtension(dart.global.RTCPeerConnection, html$.RtcPeerConnection);
  dart.registerExtension(dart.global.mozRTCPeerConnection, html$.RtcPeerConnection);
  dart.defineExtensionNames([
    'sdp',
    'type'
  ]);
  html$.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
    static new(dictionary) {
      let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCSessionDescription` : 'RTCSessionDescription'];
      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.sdp]() {
      return this.sdp;
    }
    set [dartx.sdp](value) {
      this.sdp = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.setSignature(html$.RtcSessionDescription, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.RtcSessionDescription, [core.Map]),
      _: dart.definiteFunctionType(html$.RtcSessionDescription, [])
    }),
    fields: () => ({
      [dartx.sdp]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.RTCSessionDescription, html$.RtcSessionDescription);
  dart.registerExtension(dart.global.mozRTCSessionDescription, html$.RtcSessionDescription);
  const _get_timestamp = Symbol('_get_timestamp');
  dart.defineExtensionNames([
    'timestamp',
    'names',
    'stat',
    'id',
    'type'
  ]);
  html$.RtcStatsReport = class RtcStatsReport extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.timestamp]() {
      return html_common.convertNativeToDart_DateTime(this[_get_timestamp]);
    }
    get [_get_timestamp]() {
      return this.timestamp;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.names](...args) {
      return this.names.apply(this, args);
    }
    [dartx.stat](...args) {
      return this.stat.apply(this, args);
    }
  };
  dart.setSignature(html$.RtcStatsReport, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsReport, [])}),
    fields: () => ({
      [dartx.id]: core.String,
      [_get_timestamp]: dart.dynamic,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.timestamp]: dart.definiteFunctionType(core.DateTime, [])}),
    methods: () => ({
      [dartx.names]: dart.definiteFunctionType(core.List$(core.String), []),
      [dartx.stat]: dart.definiteFunctionType(core.String, [core.String])
    })
  });
  dart.registerExtension(dart.global.RTCStatsReport, html$.RtcStatsReport);
  dart.defineExtensionNames([
    'namedItem',
    'result'
  ]);
  html$.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
    [dartx.result](...args) {
      return this.result.apply(this, args);
    }
  };
  dart.setSignature(html$.RtcStatsResponse, {
    constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsResponse, [])}),
    methods: () => ({
      [dartx.namedItem]: dart.definiteFunctionType(html$.RtcStatsReport, [core.String]),
      [dartx.result]: dart.definiteFunctionType(core.List$(html$.RtcStatsReport), [])
    })
  });
  dart.registerExtension(dart.global.RTCStatsResponse, html$.RtcStatsResponse);
  const _availLeft = Symbol('_availLeft');
  const _availTop = Symbol('_availTop');
  const _availWidth = Symbol('_availWidth');
  const _availHeight = Symbol('_availHeight');
  dart.defineExtensionNames([
    'available',
    'colorDepth',
    'height',
    'orientation',
    'pixelDepth',
    'width'
  ]);
  html$.Screen = class Screen extends _interceptors.Interceptor {
    get [dartx.available]() {
      return new (RectangleOfint())(this[_availLeft], this[_availTop], this[_availWidth], this[_availHeight]);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [_availHeight]() {
      return this.availHeight;
    }
    get [_availLeft]() {
      return this.availLeft;
    }
    get [_availTop]() {
      return this.availTop;
    }
    get [_availWidth]() {
      return this.availWidth;
    }
    get [dartx.colorDepth]() {
      return this.colorDepth;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.orientation]() {
      return this.orientation;
    }
    get [dartx.pixelDepth]() {
      return this.pixelDepth;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.Screen, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Screen, [])}),
    fields: () => ({
      [_availHeight]: core.int,
      [_availLeft]: core.int,
      [_availTop]: core.int,
      [_availWidth]: core.int,
      [dartx.colorDepth]: core.int,
      [dartx.height]: core.int,
      [dartx.orientation]: html$.ScreenOrientation,
      [dartx.pixelDepth]: core.int,
      [dartx.width]: core.int
    }),
    getters: () => ({[dartx.available]: dart.definiteFunctionType(math.Rectangle$(core.num), [])})
  });
  dart.registerExtension(dart.global.Screen, html$.Screen);
  dart.defineExtensionNames([
    'lock',
    'unlock',
    'onChange',
    'angle',
    'type'
  ]);
  html$.ScreenOrientation = class ScreenOrientation extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.lock](...args) {
      return this.lock.apply(this, args);
    }
    [dartx.unlock](...args) {
      return this.unlock.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.ScreenOrientation.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ScreenOrientation, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ScreenOrientation, [])}),
    fields: () => ({
      [dartx.angle]: core.int,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.lock]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.unlock]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.ScreenOrientation, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.ScreenOrientation, html$.ScreenOrientation);
  dart.defineExtensionNames([
    'async',
    'charset',
    'crossOrigin',
    'defer',
    'integrity',
    'nonce',
    'src',
    'type'
  ]);
  html$.ScriptElement = class ScriptElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ScriptElement._check(html$.document[dartx.createElement]("script"));
    }
    created() {
      this[dartx.async] = null;
      this[dartx.charset] = null;
      this[dartx.crossOrigin] = null;
      this[dartx.defer] = null;
      this[dartx.integrity] = null;
      this[dartx.nonce] = null;
      this[dartx.src] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.async]() {
      return this.async;
    }
    set [dartx.async](value) {
      this.async = value;
    }
    get [dartx.charset]() {
      return this.charset;
    }
    set [dartx.charset](value) {
      this.charset = value;
    }
    get [dartx.crossOrigin]() {
      return this.crossOrigin;
    }
    set [dartx.crossOrigin](value) {
      this.crossOrigin = value;
    }
    get [dartx.defer]() {
      return this.defer;
    }
    set [dartx.defer](value) {
      this.defer = value;
    }
    get [dartx.integrity]() {
      return this.integrity;
    }
    set [dartx.integrity](value) {
      this.integrity = value;
    }
    get [dartx.nonce]() {
      return this.nonce;
    }
    set [dartx.nonce](value) {
      this.nonce = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.ScriptElement, 'created');
  dart.setSignature(html$.ScriptElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ScriptElement, []),
      new: dart.definiteFunctionType(html$.ScriptElement, []),
      created: dart.definiteFunctionType(html$.ScriptElement, [])
    }),
    fields: () => ({
      [dartx.async]: core.bool,
      [dartx.charset]: core.String,
      [dartx.crossOrigin]: core.String,
      [dartx.defer]: core.bool,
      [dartx.integrity]: core.String,
      [dartx.nonce]: core.String,
      [dartx.src]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLScriptElement, html$.ScriptElement);
  dart.defineExtensionNames([
    'consumeDelta',
    'deltaGranularity',
    'deltaX',
    'deltaY',
    'fromUserInput',
    'inInertialPhase',
    'isBeginning',
    'isEnding',
    'shouldPropagate',
    'velocityX',
    'velocityY'
  ]);
  html$.ScrollState = class ScrollState extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
      if (deltaX === void 0) deltaX = null;
      if (deltaY === void 0) deltaY = null;
      if (deltaGranularity === void 0) deltaGranularity = null;
      if (velocityX === void 0) velocityX = null;
      if (velocityY === void 0) velocityY = null;
      if (inInertialPhase === void 0) inInertialPhase = null;
      if (isBeginning === void 0) isBeginning = null;
      if (isEnding === void 0) isEnding = null;
      if (isEnding != null) {
        return html$.ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
      }
      if (isBeginning != null) {
        return html$.ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
      }
      if (inInertialPhase != null) {
        return html$.ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
      }
      if (velocityY != null) {
        return html$.ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
      }
      if (velocityX != null) {
        return html$.ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
      }
      if (deltaGranularity != null) {
        return html$.ScrollState._create_6(deltaX, deltaY, deltaGranularity);
      }
      if (deltaY != null) {
        return html$.ScrollState._create_7(deltaX, deltaY);
      }
      if (deltaX != null) {
        return html$.ScrollState._create_8(deltaX);
      }
      return html$.ScrollState._create_9();
    }
    static _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
    }
    static _create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
    }
    static _create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
    }
    static _create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
    }
    static _create_5(deltaX, deltaY, deltaGranularity, velocityX) {
      return new ScrollState(deltaX, deltaY, deltaGranularity, velocityX);
    }
    static _create_6(deltaX, deltaY, deltaGranularity) {
      return new ScrollState(deltaX, deltaY, deltaGranularity);
    }
    static _create_7(deltaX, deltaY) {
      return new ScrollState(deltaX, deltaY);
    }
    static _create_8(deltaX) {
      return new ScrollState(deltaX);
    }
    static _create_9() {
      return new ScrollState();
    }
    get [dartx.deltaGranularity]() {
      return this.deltaGranularity;
    }
    get [dartx.deltaX]() {
      return this.deltaX;
    }
    get [dartx.deltaY]() {
      return this.deltaY;
    }
    get [dartx.fromUserInput]() {
      return this.fromUserInput;
    }
    get [dartx.inInertialPhase]() {
      return this.inInertialPhase;
    }
    get [dartx.isBeginning]() {
      return this.isBeginning;
    }
    get [dartx.isEnding]() {
      return this.isEnding;
    }
    get [dartx.shouldPropagate]() {
      return this.shouldPropagate;
    }
    get [dartx.velocityX]() {
      return this.velocityX;
    }
    get [dartx.velocityY]() {
      return this.velocityY;
    }
    [dartx.consumeDelta](...args) {
      return this.consumeDelta.apply(this, args);
    }
  };
  dart.setSignature(html$.ScrollState, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ScrollState, []),
      new: dart.definiteFunctionType(html$.ScrollState, [], [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool, core.bool])
    }),
    fields: () => ({
      [dartx.deltaGranularity]: core.double,
      [dartx.deltaX]: core.double,
      [dartx.deltaY]: core.double,
      [dartx.fromUserInput]: core.bool,
      [dartx.inInertialPhase]: core.bool,
      [dartx.isBeginning]: core.bool,
      [dartx.isEnding]: core.bool,
      [dartx.shouldPropagate]: core.bool,
      [dartx.velocityX]: core.double,
      [dartx.velocityY]: core.double
    }),
    methods: () => ({[dartx.consumeDelta]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_6: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_7: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic]),
      _create_8: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic]),
      _create_9: dart.definiteFunctionType(html$.ScrollState, [])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6', '_create_7', '_create_8', '_create_9']
  });
  dart.registerExtension(dart.global.ScrollState, html$.ScrollState);
  dart.defineExtensionNames([
    'blockedUri',
    'columnNumber',
    'documentUri',
    'effectiveDirective',
    'lineNumber',
    'originalPolicy',
    'referrer',
    'sourceFile',
    'statusCode',
    'violatedDirective'
  ]);
  html$.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
      }
      return html$.SecurityPolicyViolationEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new SecurityPolicyViolationEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new SecurityPolicyViolationEvent(type);
    }
    get [dartx.blockedUri]() {
      return this.blockedURI;
    }
    get [dartx.columnNumber]() {
      return this.columnNumber;
    }
    get [dartx.documentUri]() {
      return this.documentURI;
    }
    get [dartx.effectiveDirective]() {
      return this.effectiveDirective;
    }
    get [dartx.lineNumber]() {
      return this.lineNumber;
    }
    get [dartx.originalPolicy]() {
      return this.originalPolicy;
    }
    get [dartx.referrer]() {
      return this.referrer;
    }
    get [dartx.sourceFile]() {
      return this.sourceFile;
    }
    get [dartx.statusCode]() {
      return this.statusCode;
    }
    get [dartx.violatedDirective]() {
      return this.violatedDirective;
    }
  };
  dart.setSignature(html$.SecurityPolicyViolationEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, []),
      new: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.blockedUri]: core.String,
      [dartx.columnNumber]: core.int,
      [dartx.documentUri]: core.String,
      [dartx.effectiveDirective]: core.String,
      [dartx.lineNumber]: core.int,
      [dartx.originalPolicy]: core.String,
      [dartx.referrer]: core.String,
      [dartx.sourceFile]: core.String,
      [dartx.statusCode]: core.int,
      [dartx.violatedDirective]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.SecurityPolicyViolationEvent, html$.SecurityPolicyViolationEvent);
  dart.defineExtensionNames([
    'add',
    'checkValidity',
    'item',
    'namedItem',
    'reportValidity',
    'setCustomValidity',
    'options',
    'selectedOptions',
    'autofocus',
    'disabled',
    'form',
    'labels',
    'length',
    'multiple',
    'name',
    'required',
    'selectedIndex',
    'size',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate'
  ]);
  html$.SelectElement = class SelectElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SelectElement._check(html$.document[dartx.createElement]("select"));
    }
    created() {
      this[dartx.autofocus] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.labels] = null;
      this[dartx.length] = null;
      this[dartx.multiple] = null;
      this[dartx.name] = null;
      this[dartx.required] = null;
      this[dartx.selectedIndex] = null;
      this[dartx.size] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      super.created();
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.length]() {
      return this.length;
    }
    set [dartx.length](value) {
      this.length = value;
    }
    get [dartx.multiple]() {
      return this.multiple;
    }
    set [dartx.multiple](value) {
      this.multiple = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.required]() {
      return this.required;
    }
    set [dartx.required](value) {
      this.required = value;
    }
    get [dartx.selectedIndex]() {
      return this.selectedIndex;
    }
    set [dartx.selectedIndex](value) {
      this.selectedIndex = value;
    }
    get [dartx.size]() {
      return this.size;
    }
    set [dartx.size](value) {
      this.size = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.namedItem](...args) {
      return this.namedItem.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
    get [dartx.options]() {
      let options = ListOfOptionElement().from(this[dartx.querySelectorAll](html$.Element)('option'));
      return new (UnmodifiableListViewOfOptionElement())(options);
    }
    get [dartx.selectedOptions]() {
      if (dart.test(this[dartx.multiple])) {
        let options = this[dartx.options][dartx.where](dart.fn(o => o[dartx.selected], OptionElementTobool()))[dartx.toList]();
        return new (UnmodifiableListViewOfOptionElement())(options);
      } else {
        return JSArrayOfOptionElement().of([this[dartx.options][dartx._get](this[dartx.selectedIndex])]);
      }
    }
  };
  dart.defineNamedConstructor(html$.SelectElement, 'created');
  dart.setSignature(html$.SelectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SelectElement, []),
      new: dart.definiteFunctionType(html$.SelectElement, []),
      created: dart.definiteFunctionType(html$.SelectElement, [])
    }),
    fields: () => ({
      [dartx.autofocus]: core.bool,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.labels]: ListOfNode(),
      [dartx.length]: core.int,
      [dartx.multiple]: core.bool,
      [dartx.name]: core.String,
      [dartx.required]: core.bool,
      [dartx.selectedIndex]: core.int,
      [dartx.size]: core.int,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool
    }),
    getters: () => ({
      [dartx.options]: dart.definiteFunctionType(core.List$(html$.OptionElement), []),
      [dartx.selectedOptions]: dart.definiteFunctionType(core.List$(html$.OptionElement), [])
    }),
    methods: () => ({
      [__setter__]: dart.definiteFunctionType(dart.void, [core.int, html$.OptionElement]),
      [dartx.add]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
      [dartx.namedItem]: dart.definiteFunctionType(html$.OptionElement, [core.String]),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLSelectElement, html$.SelectElement);
  dart.defineExtensionNames([
    'addRange',
    'collapse',
    'collapseToEnd',
    'collapseToStart',
    'containsNode',
    'deleteFromDocument',
    'empty',
    'extend',
    'getRangeAt',
    'modify',
    'removeAllRanges',
    'selectAllChildren',
    'setBaseAndExtent',
    'setPosition',
    'anchorNode',
    'anchorOffset',
    'baseNode',
    'baseOffset',
    'extentNode',
    'extentOffset',
    'focusNode',
    'focusOffset',
    'isCollapsed',
    'rangeCount',
    'type'
  ]);
  html$.Selection = class Selection extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.anchorNode]() {
      return this.anchorNode;
    }
    get [dartx.anchorOffset]() {
      return this.anchorOffset;
    }
    get [dartx.baseNode]() {
      return this.baseNode;
    }
    get [dartx.baseOffset]() {
      return this.baseOffset;
    }
    get [dartx.extentNode]() {
      return this.extentNode;
    }
    get [dartx.extentOffset]() {
      return this.extentOffset;
    }
    get [dartx.focusNode]() {
      return this.focusNode;
    }
    get [dartx.focusOffset]() {
      return this.focusOffset;
    }
    get [dartx.isCollapsed]() {
      return this.isCollapsed;
    }
    get [dartx.rangeCount]() {
      return this.rangeCount;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.addRange](...args) {
      return this.addRange.apply(this, args);
    }
    [dartx.collapse](...args) {
      return this.collapse.apply(this, args);
    }
    [dartx.collapseToEnd](...args) {
      return this.collapseToEnd.apply(this, args);
    }
    [dartx.collapseToStart](...args) {
      return this.collapseToStart.apply(this, args);
    }
    [dartx.containsNode](...args) {
      return this.containsNode.apply(this, args);
    }
    [dartx.deleteFromDocument](...args) {
      return this.deleteFromDocument.apply(this, args);
    }
    [dartx.empty](...args) {
      return this.empty.apply(this, args);
    }
    [dartx.extend](...args) {
      return this.extend.apply(this, args);
    }
    [dartx.getRangeAt](...args) {
      return this.getRangeAt.apply(this, args);
    }
    [dartx.modify](...args) {
      return this.modify.apply(this, args);
    }
    [dartx.removeAllRanges](...args) {
      return this.removeAllRanges.apply(this, args);
    }
    [dartx.selectAllChildren](...args) {
      return this.selectAllChildren.apply(this, args);
    }
    [dartx.setBaseAndExtent](...args) {
      return this.setBaseAndExtent.apply(this, args);
    }
    [dartx.setPosition](...args) {
      return this.setPosition.apply(this, args);
    }
  };
  dart.setSignature(html$.Selection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Selection, [])}),
    fields: () => ({
      [dartx.anchorNode]: html$.Node,
      [dartx.anchorOffset]: core.int,
      [dartx.baseNode]: html$.Node,
      [dartx.baseOffset]: core.int,
      [dartx.extentNode]: html$.Node,
      [dartx.extentOffset]: core.int,
      [dartx.focusNode]: html$.Node,
      [dartx.focusOffset]: core.int,
      [dartx.isCollapsed]: core.bool,
      [dartx.rangeCount]: core.int,
      [dartx.type]: core.String
    }),
    methods: () => ({
      [dartx.addRange]: dart.definiteFunctionType(dart.void, [html$.Range]),
      [dartx.collapse]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
      [dartx.collapseToEnd]: dart.definiteFunctionType(dart.void, []),
      [dartx.collapseToStart]: dart.definiteFunctionType(dart.void, []),
      [dartx.containsNode]: dart.definiteFunctionType(core.bool, [html$.Node, core.bool]),
      [dartx.deleteFromDocument]: dart.definiteFunctionType(dart.void, []),
      [dartx.empty]: dart.definiteFunctionType(dart.void, []),
      [dartx.extend]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
      [dartx.getRangeAt]: dart.definiteFunctionType(html$.Range, [core.int]),
      [dartx.modify]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.removeAllRanges]: dart.definiteFunctionType(dart.void, []),
      [dartx.selectAllChildren]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.setBaseAndExtent]: dart.definiteFunctionType(dart.void, [html$.Node, core.int, html$.Node, core.int]),
      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int])
    })
  });
  dart.registerExtension(dart.global.Selection, html$.Selection);
  dart.defineExtensionNames([
    'close',
    'postMessage',
    'data',
    'name',
    'targetUrl'
  ]);
  html$.ServicePort = class ServicePort extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.data]() {
      return this.data;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.targetUrl]() {
      return this.targetURL;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
  };
  dart.setSignature(html$.ServicePort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServicePort, [])}),
    fields: () => ({
      [dartx.data]: core.Object,
      [dartx.name]: core.String,
      [dartx.targetUrl]: core.String
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.ServicePort, html$.ServicePort);
  const _connect_1 = Symbol('_connect_1');
  const _connect_2 = Symbol('_connect_2');
  dart.defineExtensionNames([
    'connect',
    'match',
    'matchAll',
    'onMessage'
  ]);
  html$.ServicePortCollection = class ServicePortCollection extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.connect](url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_connect_1](url, options_1);
      }
      return this[_connect_2](url);
    }
    [_connect_1](...args) {
      return this.connect.apply(this, args);
    }
    [_connect_2](...args) {
      return this.connect.apply(this, args);
    }
    [dartx.match](options) {
      let options_1 = html_common.convertDartToNative_Dictionary(options);
      return this[_match_1](options_1);
    }
    [_match_1](...args) {
      return this.match.apply(this, args);
    }
    [dartx.matchAll](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_matchAll_1](options_1);
      }
      return this[_matchAll_2]();
    }
    [_matchAll_1](...args) {
      return this.matchAll.apply(this, args);
    }
    [_matchAll_2](...args) {
      return this.matchAll.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.ServicePortCollection.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ServicePortCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServicePortCollection, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.connect]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
      [_connect_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_connect_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.match]: dart.definiteFunctionType(async.Future, [core.Map]),
      [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_matchAll_2]: dart.definiteFunctionType(async.Future, [])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.ServicePortCollection, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.ServicePortCollection, html$.ServicePortCollection);
  dart.defineExtensionNames([
    'respondWith',
    'origin',
    'targetUrl'
  ]);
  html$.ServicePortConnectEvent = class ServicePortConnectEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ServicePortConnectEvent._create_1(type, eventInitDict_1);
      }
      return html$.ServicePortConnectEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ServicePortConnectEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ServicePortConnectEvent(type);
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.targetUrl]() {
      return this.targetURL;
    }
    [dartx.respondWith](...args) {
      return this.respondWith.apply(this, args);
    }
  };
  dart.setSignature(html$.ServicePortConnectEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ServicePortConnectEvent, []),
      new: dart.definiteFunctionType(html$.ServicePortConnectEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.origin]: core.String,
      [dartx.targetUrl]: core.String
    }),
    methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(async.Future, [async.Future])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ServicePortConnectEvent, html$.ServicePortConnectEvent);
  dart.defineExtensionNames([
    'getRegistration',
    'getRegistrations',
    'register',
    'onMessage',
    'controller',
    'ready'
  ]);
  html$.ServiceWorkerContainer = class ServiceWorkerContainer extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.controller]() {
      return this.controller;
    }
    get [dartx.ready]() {
      return this.ready;
    }
    [dartx.getRegistration](...args) {
      return this.getRegistration.apply(this, args);
    }
    [dartx.getRegistrations](...args) {
      return this.getRegistrations.apply(this, args);
    }
    [dartx.register](url, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_register_1](url, options_1);
      }
      return this[_register_2](url);
    }
    [_register_1](...args) {
      return this.register.apply(this, args);
    }
    [_register_2](...args) {
      return this.register.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.ServiceWorkerContainer.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ServiceWorkerContainer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerContainer, [])}),
    fields: () => ({
      [dartx.controller]: html$._ServiceWorker,
      [dartx.ready]: async.Future
    }),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({
      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [], [core.String]),
      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
      [dartx.register]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_register_2]: dart.definiteFunctionType(async.Future, [dart.dynamic])
    }),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.ServiceWorkerContainer, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.ServiceWorkerContainer, html$.ServiceWorkerContainer);
  dart.defineExtensionNames([
    'skipWaiting',
    'onMessage',
    'clients',
    'ports',
    'registration'
  ]);
  html$.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.clients]() {
      return this.clients;
    }
    get [dartx.ports]() {
      return this.ports;
    }
    get [dartx.registration]() {
      return this.registration;
    }
    [dartx.skipWaiting](...args) {
      return this.skipWaiting.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.ServiceWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerGlobalScope, [])}),
    fields: () => ({
      [dartx.clients]: html$.Clients,
      [dartx.ports]: html$.StashedPortCollection,
      [dartx.registration]: html$.ServiceWorkerRegistration
    }),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({[dartx.skipWaiting]: dart.definiteFunctionType(async.Future, [])}),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.ServiceWorkerGlobalScope, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.ServiceWorkerGlobalScope, html$.ServiceWorkerGlobalScope);
  dart.defineExtensionNames([
    'data',
    'lastEventId',
    'origin',
    'ports',
    'source'
  ]);
  html$.ServiceWorkerMessageEvent = class ServiceWorkerMessageEvent extends html$.Event {
    get [dartx.data]() {
      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
    }
    get [_get_data]() {
      return this.data;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
      }
      return html$.ServiceWorkerMessageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new ServiceWorkerMessageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new ServiceWorkerMessageEvent(type);
    }
    get [dartx.lastEventId]() {
      return this.lastEventId;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.ports]() {
      return this.ports;
    }
    get [dartx.source]() {
      return this.source;
    }
  };
  dart.setSignature(html$.ServiceWorkerMessageEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, []),
      new: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_get_data]: dart.dynamic,
      [dartx.lastEventId]: core.String,
      [dartx.origin]: core.String,
      [dartx.ports]: ListOfMessagePort(),
      [dartx.source]: core.Object
    }),
    getters: () => ({[dartx.data]: dart.definiteFunctionType(dart.dynamic, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.ServiceWorkerMessageEvent, html$.ServiceWorkerMessageEvent);
  const _getNotifications_1 = Symbol('_getNotifications_1');
  const _getNotifications_2 = Symbol('_getNotifications_2');
  const _showNotification_1 = Symbol('_showNotification_1');
  const _showNotification_2 = Symbol('_showNotification_2');
  dart.defineExtensionNames([
    'getNotifications',
    'showNotification',
    'unregister',
    'update',
    'active',
    'geofencing',
    'installing',
    'periodicSync',
    'pushManager',
    'scope',
    'sync',
    'waiting'
  ]);
  html$.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.active]() {
      return this.active;
    }
    get [dartx.geofencing]() {
      return this.geofencing;
    }
    get [dartx.installing]() {
      return this.installing;
    }
    get [dartx.periodicSync]() {
      return this.periodicSync;
    }
    get [dartx.pushManager]() {
      return this.pushManager;
    }
    get [dartx.scope]() {
      return this.scope;
    }
    get [dartx.sync]() {
      return this.sync;
    }
    get [dartx.waiting]() {
      return this.waiting;
    }
    [dartx.getNotifications](filter) {
      if (filter === void 0) filter = null;
      if (filter != null) {
        let filter_1 = html_common.convertDartToNative_Dictionary(filter);
        return this[_getNotifications_1](filter_1);
      }
      return this[_getNotifications_2]();
    }
    [_getNotifications_1](...args) {
      return this.getNotifications.apply(this, args);
    }
    [_getNotifications_2](...args) {
      return this.getNotifications.apply(this, args);
    }
    [dartx.showNotification](title, options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_showNotification_1](title, options_1);
      }
      return this[_showNotification_2](title);
    }
    [_showNotification_1](...args) {
      return this.showNotification.apply(this, args);
    }
    [_showNotification_2](...args) {
      return this.showNotification.apply(this, args);
    }
    [dartx.unregister](...args) {
      return this.unregister.apply(this, args);
    }
    [dartx.update](...args) {
      return this.update.apply(this, args);
    }
  };
  dart.setSignature(html$.ServiceWorkerRegistration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerRegistration, [])}),
    fields: () => ({
      [dartx.active]: html$._ServiceWorker,
      [dartx.geofencing]: html$.Geofencing,
      [dartx.installing]: html$._ServiceWorker,
      [dartx.periodicSync]: html$.PeriodicSyncManager,
      [dartx.pushManager]: html$.PushManager,
      [dartx.scope]: core.String,
      [dartx.sync]: html$.SyncManager,
      [dartx.waiting]: html$._ServiceWorker
    }),
    methods: () => ({
      [dartx.getNotifications]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_getNotifications_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_getNotifications_2]: dart.definiteFunctionType(async.Future, []),
      [dartx.showNotification]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
      [_showNotification_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_showNotification_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.unregister]: dart.definiteFunctionType(async.Future, []),
      [dartx.update]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.ServiceWorkerRegistration, html$.ServiceWorkerRegistration);
  dart.defineExtensionNames([
    'getDistributedNodes'
  ]);
  html$.ShadowElement = class ShadowElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.ShadowElement._check(html$.document[dartx.createElement]("shadow"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('shadow');
    }
    [dartx.getDistributedNodes](...args) {
      return this.getDistributedNodes.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.ShadowElement, 'created');
  dart.setSignature(html$.ShadowElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.ShadowElement, []),
      new: dart.definiteFunctionType(html$.ShadowElement, []),
      created: dart.definiteFunctionType(html$.ShadowElement, [])
    }),
    methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLShadowElement, html$.ShadowElement);
  dart.defineExtensionNames([
    'clone',
    'elementFromPoint',
    'elementsFromPoint',
    'getSelection',
    'resetStyleInheritance',
    'resetStyleInheritance',
    'applyAuthorStyles',
    'applyAuthorStyles',
    'activeElement',
    'delegatesFocus',
    'host',
    'innerHtml',
    'olderShadowRoot',
    'styleSheets'
  ]);
  html$.ShadowRoot = class ShadowRoot extends html$.DocumentFragment {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.activeElement]() {
      return this.activeElement;
    }
    get [dartx.delegatesFocus]() {
      return this.delegatesFocus;
    }
    get [dartx.host]() {
      return this.host;
    }
    get [dartx.innerHtml]() {
      return this.innerHTML;
    }
    set [dartx.innerHtml](value) {
      this.innerHTML = value;
    }
    get [dartx.olderShadowRoot]() {
      return this.olderShadowRoot;
    }
    get [dartx.styleSheets]() {
      return this.styleSheets;
    }
    [dartx.clone](...args) {
      return this.cloneNode.apply(this, args);
    }
    [dartx.elementFromPoint](...args) {
      return this.elementFromPoint.apply(this, args);
    }
    [dartx.elementsFromPoint](...args) {
      return this.elementsFromPoint.apply(this, args);
    }
    [dartx.getSelection](...args) {
      return this.getSelection.apply(this, args);
    }
    static get supported() {
      return !!(Element.prototype.createShadowRoot || Element.prototype.webkitCreateShadowRoot);
    }
    static _shadowRootDeprecationReport() {
      if (!dart.test(html$.ShadowRoot._shadowRootDeprecationReported)) {
        html$.window[dartx.console].warn('ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n');
        html$.ShadowRoot._shadowRootDeprecationReported = true;
      }
    }
    get [dartx.resetStyleInheritance]() {
      html$.ShadowRoot._shadowRootDeprecationReport();
      return false;
    }
    set [dartx.resetStyleInheritance](value) {
      html$.ShadowRoot._shadowRootDeprecationReport();
    }
    get [dartx.applyAuthorStyles]() {
      html$.ShadowRoot._shadowRootDeprecationReport();
      return false;
    }
    set [dartx.applyAuthorStyles](value) {
      html$.ShadowRoot._shadowRootDeprecationReport();
    }
  };
  const innerHtml = Symbol(html$.ShadowRoot.name + "." + dartx.innerHtml.toString());
  dart.setSignature(html$.ShadowRoot, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ShadowRoot, [])}),
    fields: () => ({
      [dartx.activeElement]: html$.Element,
      [dartx.delegatesFocus]: core.bool,
      [dartx.host]: html$.Element,
      [dartx.innerHtml]: core.String,
      [dartx.olderShadowRoot]: html$.ShadowRoot,
      [dartx.styleSheets]: ListOfStyleSheet()
    }),
    getters: () => ({
      [dartx.resetStyleInheritance]: dart.definiteFunctionType(core.bool, []),
      [dartx.applyAuthorStyles]: dart.definiteFunctionType(core.bool, [])
    }),
    setters: () => ({
      [dartx.resetStyleInheritance]: dart.definiteFunctionType(dart.void, [core.bool]),
      [dartx.applyAuthorStyles]: dart.definiteFunctionType(dart.void, [core.bool])
    }),
    methods: () => ({
      [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
      [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
      [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, [])
    }),
    sfields: () => ({_shadowRootDeprecationReported: core.bool}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_shadowRootDeprecationReport: dart.definiteFunctionType(dart.void, [])}),
    names: ['_shadowRootDeprecationReport']
  });
  html$.ShadowRoot._shadowRootDeprecationReported = false;
  dart.registerExtension(dart.global.ShadowRoot, html$.ShadowRoot);
  dart.defineExtensionNames([
    'byteLength'
  ]);
  html$.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.byteLength]() {
      return this.byteLength;
    }
  };
  dart.setSignature(html$.SharedArrayBuffer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SharedArrayBuffer, [])}),
    fields: () => ({[dartx.byteLength]: core.int})
  });
  dart.registerExtension(dart.global.SharedArrayBuffer, html$.SharedArrayBuffer);
  dart.defineExtensionNames([
    'onError',
    'port',
    'workerStart'
  ]);
  html$.SharedWorker = class SharedWorker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(scriptURL, name) {
      if (name === void 0) name = null;
      if (name != null) {
        return html$.SharedWorker._create_1(scriptURL, name);
      }
      return html$.SharedWorker._create_2(scriptURL);
    }
    static _create_1(scriptURL, name) {
      return new SharedWorker(scriptURL, name);
    }
    static _create_2(scriptURL) {
      return new SharedWorker(scriptURL);
    }
    get [dartx.port]() {
      return this.port;
    }
    get [dartx.workerStart]() {
      return this.workerStart;
    }
    get [dartx.onError]() {
      return html$.SharedWorker.errorEvent.forTarget(this);
    }
  };
  html$.SharedWorker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$.SharedWorker, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SharedWorker, []),
      new: dart.definiteFunctionType(html$.SharedWorker, [core.String], [core.String])
    }),
    fields: () => ({
      [dartx.port]: html$.MessagePort,
      [dartx.workerStart]: core.double
    }),
    getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({errorEvent: EventStreamProviderOfEvent()}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.defineLazy(html$.SharedWorker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    }
  });
  dart.registerExtension(dart.global.SharedWorker, html$.SharedWorker);
  dart.defineExtensionNames([
    'onConnect',
    'name'
  ]);
  html$.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html$.WorkerGlobalScope {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.onConnect]() {
      return html$.SharedWorkerGlobalScope.connectEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.SharedWorkerGlobalScope, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SharedWorkerGlobalScope, [])}),
    fields: () => ({[dartx.name]: core.String}),
    getters: () => ({[dartx.onConnect]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    sfields: () => ({connectEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.SharedWorkerGlobalScope, {
    get connectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('connect'));
    }
  });
  dart.registerExtension(dart.global.SharedWorkerGlobalScope, html$.SharedWorkerGlobalScope);
  dart.defineExtensionNames([
    'abort',
    'appendBuffer',
    'appendStream',
    'appendTypedData',
    'remove',
    'appendWindowEnd',
    'appendWindowStart',
    'buffered',
    'mode',
    'timestampOffset',
    'trackDefaults',
    'updating'
  ]);
  html$.SourceBuffer = class SourceBuffer extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.appendWindowEnd]() {
      return this.appendWindowEnd;
    }
    set [dartx.appendWindowEnd](value) {
      this.appendWindowEnd = value;
    }
    get [dartx.appendWindowStart]() {
      return this.appendWindowStart;
    }
    set [dartx.appendWindowStart](value) {
      this.appendWindowStart = value;
    }
    get [dartx.buffered]() {
      return this.buffered;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    set [dartx.mode](value) {
      this.mode = value;
    }
    get [dartx.timestampOffset]() {
      return this.timestampOffset;
    }
    set [dartx.timestampOffset](value) {
      this.timestampOffset = value;
    }
    get [dartx.trackDefaults]() {
      return this.trackDefaults;
    }
    set [dartx.trackDefaults](value) {
      this.trackDefaults = value;
    }
    get [dartx.updating]() {
      return this.updating;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.appendBuffer](...args) {
      return this.appendBuffer.apply(this, args);
    }
    [dartx.appendStream](...args) {
      return this.appendStream.apply(this, args);
    }
    [dartx.appendTypedData](...args) {
      return this.appendBuffer.apply(this, args);
    }
    [dartx.remove](...args) {
      return this.remove.apply(this, args);
    }
  };
  dart.setSignature(html$.SourceBuffer, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SourceBuffer, [])}),
    fields: () => ({
      [dartx.appendWindowEnd]: core.num,
      [dartx.appendWindowStart]: core.num,
      [dartx.buffered]: html$.TimeRanges,
      [dartx.mode]: core.String,
      [dartx.timestampOffset]: core.num,
      [dartx.trackDefaults]: html$.TrackDefaultList,
      [dartx.updating]: core.bool
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.appendBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
      [dartx.appendStream]: dart.definiteFunctionType(dart.void, [html$.FileStream], [core.int]),
      [dartx.appendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData]),
      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.SourceBuffer, html$.SourceBuffer);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.SourceBufferList = class SourceBufferList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.SourceBuffer), html$.ImmutableListMixin$(html$.SourceBuffer)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.SourceBufferList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSourceBuffer()];
  dart.setSignature(html$.SourceBufferList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SourceBufferList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.SourceBuffer, []),
      [dartx.last]: dart.definiteFunctionType(html$.SourceBuffer, []),
      [dartx.single]: dart.definiteFunctionType(html$.SourceBuffer, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SourceBuffer]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.SourceBuffer, [core.int])
    })
  });
  dart.registerExtension(dart.global.SourceBufferList, html$.SourceBufferList);
  dart.defineExtensionNames([
    'media',
    'sizes',
    'src',
    'srcset',
    'type'
  ]);
  html$.SourceElement = class SourceElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SourceElement._check(html$.document[dartx.createElement]("source"));
    }
    created() {
      this[dartx.media] = null;
      this[dartx.sizes] = null;
      this[dartx.src] = null;
      this[dartx.srcset] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.sizes]() {
      return this.sizes;
    }
    set [dartx.sizes](value) {
      this.sizes = value;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srcset]() {
      return this.srcset;
    }
    set [dartx.srcset](value) {
      this.srcset = value;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.SourceElement, 'created');
  dart.setSignature(html$.SourceElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SourceElement, []),
      new: dart.definiteFunctionType(html$.SourceElement, []),
      created: dart.definiteFunctionType(html$.SourceElement, [])
    }),
    fields: () => ({
      [dartx.media]: core.String,
      [dartx.sizes]: core.String,
      [dartx.src]: core.String,
      [dartx.srcset]: core.String,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLSourceElement, html$.SourceElement);
  dart.defineExtensionNames([
    'facing',
    'id',
    'kind',
    'label'
  ]);
  html$.SourceInfo = class SourceInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.facing]() {
      return this.facing;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
  };
  dart.setSignature(html$.SourceInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SourceInfo, [])}),
    fields: () => ({
      [dartx.facing]: core.String,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String
    })
  });
  dart.registerExtension(dart.global.SourceInfo, html$.SourceInfo);
  html$.SpanElement = class SpanElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SpanElement._check(html$.document[dartx.createElement]("span"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.SpanElement, 'created');
  dart.setSignature(html$.SpanElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpanElement, []),
      new: dart.definiteFunctionType(html$.SpanElement, []),
      created: dart.definiteFunctionType(html$.SpanElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLSpanElement, html$.SpanElement);
  dart.defineExtensionNames([
    'src',
    'weight'
  ]);
  html$.SpeechGrammar = class SpeechGrammar extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SpeechGrammar._create_1();
    }
    static _create_1() {
      return new SpeechGrammar();
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.weight]() {
      return this.weight;
    }
    set [dartx.weight](value) {
      this.weight = value;
    }
  };
  dart.setSignature(html$.SpeechGrammar, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechGrammar, []),
      new: dart.definiteFunctionType(html$.SpeechGrammar, [])
    }),
    fields: () => ({
      [dartx.src]: core.String,
      [dartx.weight]: core.num
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammar, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.SpeechGrammar, html$.SpeechGrammar);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'addFromString',
    'addFromUri',
    'item'
  ]);
  html$.SpeechGrammarList = class SpeechGrammarList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechGrammar), html$.ImmutableListMixin$(html$.SpeechGrammar)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.SpeechGrammarList._create_1();
    }
    static _create_1() {
      return new SpeechGrammarList();
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.addFromString](...args) {
      return this.addFromString.apply(this, args);
    }
    [dartx.addFromUri](...args) {
      return this.addFromUri.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.SpeechGrammarList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechGrammar()];
  dart.setSignature(html$.SpeechGrammarList, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechGrammarList, []),
      new: dart.definiteFunctionType(html$.SpeechGrammarList, [])
    }),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.SpeechGrammar, []),
      [dartx.last]: dart.definiteFunctionType(html$.SpeechGrammar, []),
      [dartx.single]: dart.definiteFunctionType(html$.SpeechGrammar, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechGrammar]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
      [dartx.addFromString]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
      [dartx.addFromUri]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
      [dartx.item]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammarList, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.SpeechGrammarList, html$.SpeechGrammarList);
  dart.defineExtensionNames([
    'abort',
    'start',
    'stop',
    'onAudioEnd',
    'onAudioStart',
    'onEnd',
    'onError',
    'onNoMatch',
    'onResult',
    'onSoundEnd',
    'onSoundStart',
    'onSpeechEnd',
    'onSpeechStart',
    'onStart',
    'audioTrack',
    'continuous',
    'grammars',
    'interimResults',
    'lang',
    'maxAlternatives',
    'serviceUri'
  ]);
  html$.SpeechRecognition = class SpeechRecognition extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
    }
    get [dartx.audioTrack]() {
      return this.audioTrack;
    }
    set [dartx.audioTrack](value) {
      this.audioTrack = value;
    }
    get [dartx.continuous]() {
      return this.continuous;
    }
    set [dartx.continuous](value) {
      this.continuous = value;
    }
    get [dartx.grammars]() {
      return this.grammars;
    }
    set [dartx.grammars](value) {
      this.grammars = value;
    }
    get [dartx.interimResults]() {
      return this.interimResults;
    }
    set [dartx.interimResults](value) {
      this.interimResults = value;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    set [dartx.lang](value) {
      this.lang = value;
    }
    get [dartx.maxAlternatives]() {
      return this.maxAlternatives;
    }
    set [dartx.maxAlternatives](value) {
      this.maxAlternatives = value;
    }
    get [dartx.serviceUri]() {
      return this.serviceURI;
    }
    set [dartx.serviceUri](value) {
      this.serviceURI = value;
    }
    [dartx.abort](...args) {
      return this.abort.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onAudioEnd]() {
      return html$.SpeechRecognition.audioEndEvent.forTarget(this);
    }
    get [dartx.onAudioStart]() {
      return html$.SpeechRecognition.audioStartEvent.forTarget(this);
    }
    get [dartx.onEnd]() {
      return html$.SpeechRecognition.endEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.SpeechRecognition.errorEvent.forTarget(this);
    }
    get [dartx.onNoMatch]() {
      return html$.SpeechRecognition.noMatchEvent.forTarget(this);
    }
    get [dartx.onResult]() {
      return html$.SpeechRecognition.resultEvent.forTarget(this);
    }
    get [dartx.onSoundEnd]() {
      return html$.SpeechRecognition.soundEndEvent.forTarget(this);
    }
    get [dartx.onSoundStart]() {
      return html$.SpeechRecognition.soundStartEvent.forTarget(this);
    }
    get [dartx.onSpeechEnd]() {
      return html$.SpeechRecognition.speechEndEvent.forTarget(this);
    }
    get [dartx.onSpeechStart]() {
      return html$.SpeechRecognition.speechStartEvent.forTarget(this);
    }
    get [dartx.onStart]() {
      return html$.SpeechRecognition.startEvent.forTarget(this);
    }
    static new() {
      return new (window.SpeechRecognition || window.webkitSpeechRecognition)();
    }
  };
  dart.setSignature(html$.SpeechRecognition, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechRecognition, []),
      new: dart.definiteFunctionType(html$.SpeechRecognition, [])
    }),
    fields: () => ({
      [dartx.audioTrack]: html$.MediaStreamTrack,
      [dartx.continuous]: core.bool,
      [dartx.grammars]: html$.SpeechGrammarList,
      [dartx.interimResults]: core.bool,
      [dartx.lang]: core.String,
      [dartx.maxAlternatives]: core.int,
      [dartx.serviceUri]: core.String
    }),
    getters: () => ({
      [dartx.onAudioEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onAudioStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionError), []),
      [dartx.onNoMatch]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
      [dartx.onResult]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
      [dartx.onSoundEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSoundStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSpeechEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSpeechStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
      [dartx.start]: dart.definiteFunctionType(dart.void, []),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      audioEndEvent: EventStreamProviderOfEvent(),
      audioStartEvent: EventStreamProviderOfEvent(),
      endEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfSpeechRecognitionError(),
      noMatchEvent: EventStreamProviderOfSpeechRecognitionEvent(),
      resultEvent: EventStreamProviderOfSpeechRecognitionEvent(),
      soundEndEvent: EventStreamProviderOfEvent(),
      soundStartEvent: EventStreamProviderOfEvent(),
      speechEndEvent: EventStreamProviderOfEvent(),
      speechStartEvent: EventStreamProviderOfEvent(),
      startEvent: EventStreamProviderOfEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.defineLazy(html$.SpeechRecognition, {
    get audioEndEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('audioend'));
    },
    get audioStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('audiostart'));
    },
    get endEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('end'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfSpeechRecognitionError())('error'));
    },
    get noMatchEvent() {
      return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('nomatch'));
    },
    get resultEvent() {
      return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('result'));
    },
    get soundEndEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('soundend'));
    },
    get soundStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('soundstart'));
    },
    get speechEndEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('speechend'));
    },
    get speechStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('speechstart'));
    },
    get startEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('start'));
    }
  });
  dart.registerExtension(dart.global.SpeechRecognition, html$.SpeechRecognition);
  dart.defineExtensionNames([
    'confidence',
    'transcript'
  ]);
  html$.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.confidence]() {
      return this.confidence;
    }
    get [dartx.transcript]() {
      return this.transcript;
    }
  };
  dart.setSignature(html$.SpeechRecognitionAlternative, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [])}),
    fields: () => ({
      [dartx.confidence]: core.double,
      [dartx.transcript]: core.String
    })
  });
  dart.registerExtension(dart.global.SpeechRecognitionAlternative, html$.SpeechRecognitionAlternative);
  dart.defineExtensionNames([
    'error',
    'message'
  ]);
  html$.SpeechRecognitionError = class SpeechRecognitionError extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, initDict) {
      if (initDict === void 0) initDict = null;
      if (initDict != null) {
        let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
        return html$.SpeechRecognitionError._create_1(type, initDict_1);
      }
      return html$.SpeechRecognitionError._create_2(type);
    }
    static _create_1(type, initDict) {
      return new SpeechRecognitionError(type, initDict);
    }
    static _create_2(type) {
      return new SpeechRecognitionError(type);
    }
    get [dartx.error]() {
      return this.error;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(html$.SpeechRecognitionError, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechRecognitionError, []),
      new: dart.definiteFunctionType(html$.SpeechRecognitionError, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.error]: core.String,
      [dartx.message]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.SpeechRecognitionError, html$.SpeechRecognitionError);
  dart.defineExtensionNames([
    'emma',
    'interpretation',
    'resultIndex',
    'results'
  ]);
  html$.SpeechRecognitionEvent = class SpeechRecognitionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, initDict) {
      if (initDict === void 0) initDict = null;
      if (initDict != null) {
        let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
        return html$.SpeechRecognitionEvent._create_1(type, initDict_1);
      }
      return html$.SpeechRecognitionEvent._create_2(type);
    }
    static _create_1(type, initDict) {
      return new SpeechRecognitionEvent(type, initDict);
    }
    static _create_2(type) {
      return new SpeechRecognitionEvent(type);
    }
    get [dartx.emma]() {
      return this.emma;
    }
    get [dartx.interpretation]() {
      return this.interpretation;
    }
    get [dartx.resultIndex]() {
      return this.resultIndex;
    }
    get [dartx.results]() {
      return this.results;
    }
  };
  dart.setSignature(html$.SpeechRecognitionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechRecognitionEvent, []),
      new: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.emma]: html$.Document,
      [dartx.interpretation]: html$.Document,
      [dartx.resultIndex]: core.int,
      [dartx.results]: ListOfSpeechRecognitionResult()
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.SpeechRecognitionEvent, html$.SpeechRecognitionEvent);
  dart.defineExtensionNames([
    'item',
    'isFinal',
    'length'
  ]);
  html$.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.isFinal]() {
      return this.isFinal;
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.SpeechRecognitionResult, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])}),
    fields: () => ({
      [dartx.isFinal]: core.bool,
      [dartx.length]: core.int
    }),
    methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [core.int])})
  });
  dart.registerExtension(dart.global.SpeechRecognitionResult, html$.SpeechRecognitionResult);
  dart.defineExtensionNames([
    'cancel',
    'getVoices',
    'pause',
    'resume',
    'speak',
    'paused',
    'pending',
    'speaking'
  ]);
  html$.SpeechSynthesis = class SpeechSynthesis extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.paused]() {
      return this.paused;
    }
    get [dartx.pending]() {
      return this.pending;
    }
    get [dartx.speaking]() {
      return this.speaking;
    }
    [dartx.cancel](...args) {
      return this.cancel.apply(this, args);
    }
    [dartx.getVoices](...args) {
      return this.getVoices.apply(this, args);
    }
    [dartx.pause](...args) {
      return this.pause.apply(this, args);
    }
    [dartx.resume](...args) {
      return this.resume.apply(this, args);
    }
    [dartx.speak](...args) {
      return this.speak.apply(this, args);
    }
  };
  dart.setSignature(html$.SpeechSynthesis, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesis, [])}),
    fields: () => ({
      [dartx.paused]: core.bool,
      [dartx.pending]: core.bool,
      [dartx.speaking]: core.bool
    }),
    methods: () => ({
      [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
      [dartx.getVoices]: dart.definiteFunctionType(core.List$(html$.SpeechSynthesisVoice), []),
      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
      [dartx.resume]: dart.definiteFunctionType(dart.void, []),
      [dartx.speak]: dart.definiteFunctionType(dart.void, [html$.SpeechSynthesisUtterance])
    })
  });
  dart.registerExtension(dart.global.SpeechSynthesis, html$.SpeechSynthesis);
  dart.defineExtensionNames([
    'charIndex',
    'elapsedTime',
    'name',
    'utterance'
  ]);
  html$.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.charIndex]() {
      return this.charIndex;
    }
    get [dartx.elapsedTime]() {
      return this.elapsedTime;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.utterance]() {
      return this.utterance;
    }
  };
  dart.setSignature(html$.SpeechSynthesisEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisEvent, [])}),
    fields: () => ({
      [dartx.charIndex]: core.int,
      [dartx.elapsedTime]: core.double,
      [dartx.name]: core.String,
      [dartx.utterance]: html$.SpeechSynthesisUtterance
    })
  });
  dart.registerExtension(dart.global.SpeechSynthesisEvent, html$.SpeechSynthesisEvent);
  dart.defineExtensionNames([
    'onBoundary',
    'onEnd',
    'onError',
    'onMark',
    'onPause',
    'onResume',
    'onStart',
    'lang',
    'pitch',
    'rate',
    'text',
    'voice',
    'volume'
  ]);
  html$.SpeechSynthesisUtterance = class SpeechSynthesisUtterance extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(text) {
      if (text === void 0) text = null;
      if (text != null) {
        return html$.SpeechSynthesisUtterance._create_1(text);
      }
      return html$.SpeechSynthesisUtterance._create_2();
    }
    static _create_1(text) {
      return new SpeechSynthesisUtterance(text);
    }
    static _create_2() {
      return new SpeechSynthesisUtterance();
    }
    get [dartx.lang]() {
      return this.lang;
    }
    set [dartx.lang](value) {
      this.lang = value;
    }
    get [dartx.pitch]() {
      return this.pitch;
    }
    set [dartx.pitch](value) {
      this.pitch = value;
    }
    get [dartx.rate]() {
      return this.rate;
    }
    set [dartx.rate](value) {
      this.rate = value;
    }
    get [dartx.text]() {
      return this.text;
    }
    set [dartx.text](value) {
      this.text = value;
    }
    get [dartx.voice]() {
      return this.voice;
    }
    set [dartx.voice](value) {
      this.voice = value;
    }
    get [dartx.volume]() {
      return this.volume;
    }
    set [dartx.volume](value) {
      this.volume = value;
    }
    get [dartx.onBoundary]() {
      return html$.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
    }
    get [dartx.onEnd]() {
      return html$.SpeechSynthesisUtterance.endEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.SpeechSynthesisUtterance.errorEvent.forTarget(this);
    }
    get [dartx.onMark]() {
      return html$.SpeechSynthesisUtterance.markEvent.forTarget(this);
    }
    get [dartx.onPause]() {
      return html$.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
    }
    get [dartx.onResume]() {
      return html$.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
    }
    get [dartx.onStart]() {
      return html$.SpeechSynthesisUtterance.startEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.SpeechSynthesisUtterance, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, []),
      new: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [], [core.String])
    }),
    fields: () => ({
      [dartx.lang]: core.String,
      [dartx.pitch]: core.num,
      [dartx.rate]: core.num,
      [dartx.text]: core.String,
      [dartx.voice]: html$.SpeechSynthesisVoice,
      [dartx.volume]: core.num
    }),
    getters: () => ({
      [dartx.onBoundary]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMark]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onResume]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
      [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), [])
    }),
    sfields: () => ({
      boundaryEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      endEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      markEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      resumeEvent: EventStreamProviderOfSpeechSynthesisEvent(),
      startEvent: EventStreamProviderOfSpeechSynthesisEvent()
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.defineLazy(html$.SpeechSynthesisUtterance, {
    get boundaryEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('boundary'));
    },
    get endEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('end'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get markEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('mark'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get resumeEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('resume'));
    },
    get startEvent() {
      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('start'));
    }
  });
  dart.registerExtension(dart.global.SpeechSynthesisUtterance, html$.SpeechSynthesisUtterance);
  dart.defineExtensionNames([
    'defaultValue',
    'lang',
    'localService',
    'name',
    'voiceUri'
  ]);
  html$.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.defaultValue]() {
      return this.default;
    }
    get [dartx.lang]() {
      return this.lang;
    }
    get [dartx.localService]() {
      return this.localService;
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.voiceUri]() {
      return this.voiceURI;
    }
  };
  dart.setSignature(html$.SpeechSynthesisVoice, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisVoice, [])}),
    fields: () => ({
      [dartx.defaultValue]: core.bool,
      [dartx.lang]: core.String,
      [dartx.localService]: core.bool,
      [dartx.name]: core.String,
      [dartx.voiceUri]: core.String
    })
  });
  dart.registerExtension(dart.global.SpeechSynthesisVoice, html$.SpeechSynthesisVoice);
  dart.defineExtensionNames([
    'name'
  ]);
  html$.StashedMessagePort = class StashedMessagePort extends html$.MessagePort {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
  };
  dart.setSignature(html$.StashedMessagePort, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StashedMessagePort, [])}),
    fields: () => ({[dartx.name]: core.String})
  });
  dart.registerExtension(dart.global.StashedMessagePort, html$.StashedMessagePort);
  dart.defineExtensionNames([
    'add',
    'onMessage'
  ]);
  html$.StashedPortCollection = class StashedPortCollection extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.add](...args) {
      return this.add.apply(this, args);
    }
    get [dartx.onMessage]() {
      return html$.StashedPortCollection.messageEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.StashedPortCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StashedPortCollection, [])}),
    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
    methods: () => ({[dartx.add]: dart.definiteFunctionType(html$.StashedMessagePort, [core.String, html$.MessagePort])}),
    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
  });
  dart.defineLazy(html$.StashedPortCollection, {
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.StashedPortCollection, html$.StashedPortCollection);
  const _getItem = Symbol('_getItem');
  const _setItem = Symbol('_setItem');
  const _removeItem = Symbol('_removeItem');
  const _key = Symbol('_key');
  const _length$2 = Symbol('_length');
  const __delete__ = Symbol('__delete__');
  dart.defineExtensionNames([
    'addAll',
    'containsValue',
    'containsKey',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  html$.Storage = class Storage extends _interceptors.Interceptor {
    [dartx.addAll](other) {
      other[dartx.forEach](dart.fn((k, v) => {
        this[dartx._set](k, v);
      }, StringAndStringTovoid$()));
    }
    [dartx.containsValue](value) {
      return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
    }
    [dartx.containsKey](key) {
      return this[_getItem](core.String._check(key)) != null;
    }
    [dartx._get](key) {
      return this[_getItem](core.String._check(key));
    }
    [dartx._set](key, value) {
      this[_setItem](key, value);
      return value;
    }
    [dartx.putIfAbsent](key, ifAbsent) {
      if (!dart.test(this[dartx.containsKey](key))) this[dartx._set](key, ifAbsent());
      return this[dartx._get](key);
    }
    [dartx.remove](key) {
      let value = this[dartx._get](key);
      this[_removeItem](core.String._check(key));
      return value;
    }
    [dartx.clear]() {
      return this[_clear$1]();
    }
    [dartx.forEach](f) {
      for (let i = 0; true; i++) {
        let key = this[_key](i);
        if (key == null) return;
        f(key, this[dartx._get](key));
      }
    }
    get [dartx.keys]() {
      let keys = JSArrayOfString().of([]);
      this[dartx.forEach](dart.fn((k, v) => keys[dartx.add](k), StringAndStringTovoid$()));
      return keys;
    }
    get [dartx.values]() {
      let values = JSArrayOfString().of([]);
      this[dartx.forEach](dart.fn((k, v) => values[dartx.add](v), StringAndStringTovoid$()));
      return values;
    }
    get [dartx.length]() {
      return this[_length$2];
    }
    get [dartx.isEmpty]() {
      return this[_key](0) == null;
    }
    get [dartx.isNotEmpty]() {
      return !dart.test(this[dartx.isEmpty]);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [_length$2]() {
      return this.length;
    }
    [__delete__](...args) {
      return this.__delete__.apply(this, args);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [__setter__](...args) {
      return this.__setter__.apply(this, args);
    }
    [_clear$1](...args) {
      return this.clear.apply(this, args);
    }
    [_getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [_key](...args) {
      return this.key.apply(this, args);
    }
    [_removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [_setItem](...args) {
      return this.setItem.apply(this, args);
    }
  };
  html$.Storage[dart.implements] = () => [MapOfString$String()];
  dart.setSignature(html$.Storage, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Storage, [])}),
    fields: () => ({[_length$2]: core.int}),
    getters: () => ({
      [dartx.keys]: dart.definiteFunctionType(core.Iterable$(core.String), []),
      [dartx.values]: dart.definiteFunctionType(core.Iterable$(core.String), []),
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      [dartx.addAll]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      [dartx.containsValue]: dart.definiteFunctionType(core.bool, [core.Object]),
      [dartx.containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
      [dartx._get]: dart.definiteFunctionType(core.String, [core.Object]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.putIfAbsent]: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
      [dartx.remove]: dart.definiteFunctionType(core.String, [core.Object]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.forEach]: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
      [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
      [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
      [_clear$1]: dart.definiteFunctionType(dart.void, []),
      [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
      [_key]: dart.definiteFunctionType(core.String, [core.int]),
      [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
      [_setItem]: dart.definiteFunctionType(dart.void, [core.String, core.String])
    })
  });
  dart.registerExtension(dart.global.Storage, html$.Storage);
  html$.StorageErrorCallback = dart.typedef('StorageErrorCallback', () => dart.functionType(dart.void, [html$.DomError]));
  const _initStorageEvent = Symbol('_initStorageEvent');
  dart.defineExtensionNames([
    'key',
    'newValue',
    'oldValue',
    'storageArea',
    'url'
  ]);
  html$.StorageEvent = class StorageEvent extends html$.Event {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let key = opts && 'key' in opts ? opts.key : null;
      let oldValue = opts && 'oldValue' in opts ? opts.oldValue : null;
      let newValue = opts && 'newValue' in opts ? opts.newValue : null;
      let url = opts && 'url' in opts ? opts.url : null;
      let storageArea = opts && 'storageArea' in opts ? opts.storageArea : null;
      let e = html$.StorageEvent._check(html$.document[_createEvent]("StorageEvent"));
      e[_initStorageEvent](type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
      return e;
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.StorageEvent._create_1(type, eventInitDict_1);
      }
      return html$.StorageEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new StorageEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new StorageEvent(type);
    }
    get [dartx.key]() {
      return this.key;
    }
    get [dartx.newValue]() {
      return this.newValue;
    }
    get [dartx.oldValue]() {
      return this.oldValue;
    }
    get [dartx.storageArea]() {
      return this.storageArea;
    }
    get [dartx.url]() {
      return this.url;
    }
    [_initStorageEvent](...args) {
      return this.initStorageEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.StorageEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.StorageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, key: core.String, oldValue: core.String, newValue: core.String, url: core.String, storageArea: html$.Storage}),
      _: dart.definiteFunctionType(html$.StorageEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.key]: core.String,
      [dartx.newValue]: core.String,
      [dartx.oldValue]: core.String,
      [dartx.storageArea]: html$.Storage,
      [dartx.url]: core.String
    }),
    methods: () => ({[_initStorageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html$.Storage])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.StorageEvent, html$.StorageEvent);
  dart.defineExtensionNames([
    'quota',
    'usage'
  ]);
  html$.StorageInfo = class StorageInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.quota]() {
      return this.quota;
    }
    get [dartx.usage]() {
      return this.usage;
    }
  };
  dart.setSignature(html$.StorageInfo, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StorageInfo, [])}),
    fields: () => ({
      [dartx.quota]: core.int,
      [dartx.usage]: core.int
    })
  });
  dart.registerExtension(dart.global.StorageInfo, html$.StorageInfo);
  dart.defineExtensionNames([
    'queryInfo',
    'requestPersistentQuota',
    'supportedTypes'
  ]);
  html$.StorageQuota = class StorageQuota extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.supportedTypes]() {
      return this.supportedTypes;
    }
    [dartx.queryInfo](...args) {
      return this.queryInfo.apply(this, args);
    }
    [dartx.requestPersistentQuota](...args) {
      return this.requestPersistentQuota.apply(this, args);
    }
  };
  dart.setSignature(html$.StorageQuota, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StorageQuota, [])}),
    fields: () => ({[dartx.supportedTypes]: ListOfString()}),
    methods: () => ({
      [dartx.queryInfo]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.requestPersistentQuota]: dart.definiteFunctionType(async.Future, [core.int])
    })
  });
  dart.registerExtension(dart.global.StorageQuota, html$.StorageQuota);
  html$.StorageQuotaCallback = dart.typedef('StorageQuotaCallback', () => dart.functionType(dart.void, [core.int]));
  html$.StorageUsageCallback = dart.typedef('StorageUsageCallback', () => dart.functionType(dart.void, [core.int, core.int]));
  html$._StringCallback = dart.typedef('_StringCallback', () => dart.functionType(dart.void, [core.String]));
  dart.defineExtensionNames([
    'disabled',
    'media',
    'sheet',
    'type'
  ]);
  html$.StyleElement = class StyleElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.StyleElement._check(html$.document[dartx.createElement]("style"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.media] = null;
      this[dartx.sheet] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(html$.StyleElement, 'created');
  dart.setSignature(html$.StyleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.StyleElement, []),
      new: dart.definiteFunctionType(html$.StyleElement, []),
      created: dart.definiteFunctionType(html$.StyleElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.media]: core.String,
      [dartx.sheet]: html$.StyleSheet,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.HTMLStyleElement, html$.StyleElement);
  dart.defineExtensionNames([
    'matchMedium',
    'type'
  ]);
  html$.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.matchMedium](...args) {
      return this.matchMedium.apply(this, args);
    }
  };
  dart.setSignature(html$.StyleMedia, {
    constructors: () => ({_: dart.definiteFunctionType(html$.StyleMedia, [])}),
    fields: () => ({[dartx.type]: core.String}),
    methods: () => ({[dartx.matchMedium]: dart.definiteFunctionType(core.bool, [core.String])})
  });
  dart.registerExtension(dart.global.StyleMedia, html$.StyleMedia);
  dart.defineExtensionNames([
    'registration'
  ]);
  html$.SyncEvent = class SyncEvent extends html$.ExtendableEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, init) {
      let init_1 = html_common.convertDartToNative_Dictionary(init);
      return html$.SyncEvent._create_1(type, init_1);
    }
    static _create_1(type, init) {
      return new SyncEvent(type, init);
    }
    get [dartx.registration]() {
      return this.registration;
    }
  };
  dart.setSignature(html$.SyncEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.SyncEvent, []),
      new: dart.definiteFunctionType(html$.SyncEvent, [core.String, core.Map])
    }),
    fields: () => ({[dartx.registration]: html$.SyncRegistration}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.SyncEvent, [dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.SyncEvent, html$.SyncEvent);
  dart.defineExtensionNames([
    'getRegistration',
    'getRegistrations',
    'permissionState',
    'register'
  ]);
  html$.SyncManager = class SyncManager extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getRegistration](...args) {
      return this.getRegistration.apply(this, args);
    }
    [dartx.getRegistrations](...args) {
      return this.getRegistrations.apply(this, args);
    }
    [dartx.permissionState](...args) {
      return this.permissionState.apply(this, args);
    }
    [dartx.register](options) {
      if (options === void 0) options = null;
      if (options != null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options);
        return this[_register_1](options_1);
      }
      return this[_register_2]();
    }
    [_register_1](...args) {
      return this.register.apply(this, args);
    }
    [_register_2](...args) {
      return this.register.apply(this, args);
    }
  };
  dart.setSignature(html$.SyncManager, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SyncManager, [])}),
    methods: () => ({
      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
      [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
      [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [_register_2]: dart.definiteFunctionType(async.Future, [])
    })
  });
  dart.registerExtension(dart.global.SyncManager, html$.SyncManager);
  dart.defineExtensionNames([
    'unregister',
    'tag'
  ]);
  html$.SyncRegistration = class SyncRegistration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.tag]() {
      return this.tag;
    }
    [dartx.unregister](...args) {
      return this.unregister.apply(this, args);
    }
  };
  dart.setSignature(html$.SyncRegistration, {
    constructors: () => ({_: dart.definiteFunctionType(html$.SyncRegistration, [])}),
    fields: () => ({[dartx.tag]: core.String}),
    methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.SyncRegistration, html$.SyncRegistration);
  html$.TableCaptionElement = class TableCaptionElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableCaptionElement._check(html$.document[dartx.createElement]("caption"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.TableCaptionElement, 'created');
  dart.setSignature(html$.TableCaptionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableCaptionElement, []),
      new: dart.definiteFunctionType(html$.TableCaptionElement, []),
      created: dart.definiteFunctionType(html$.TableCaptionElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLTableCaptionElement, html$.TableCaptionElement);
  dart.defineExtensionNames([
    'cellIndex',
    'colSpan',
    'headers',
    'rowSpan'
  ]);
  html$.TableCellElement = class TableCellElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableCellElement._check(html$.document[dartx.createElement]("td"));
    }
    created() {
      this[dartx.cellIndex] = null;
      this[dartx.colSpan] = null;
      this[dartx.headers] = null;
      this[dartx.rowSpan] = null;
      super.created();
    }
    get [dartx.cellIndex]() {
      return this.cellIndex;
    }
    get [dartx.colSpan]() {
      return this.colSpan;
    }
    set [dartx.colSpan](value) {
      this.colSpan = value;
    }
    get [dartx.headers]() {
      return this.headers;
    }
    set [dartx.headers](value) {
      this.headers = value;
    }
    get [dartx.rowSpan]() {
      return this.rowSpan;
    }
    set [dartx.rowSpan](value) {
      this.rowSpan = value;
    }
  };
  dart.defineNamedConstructor(html$.TableCellElement, 'created');
  dart.setSignature(html$.TableCellElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableCellElement, []),
      new: dart.definiteFunctionType(html$.TableCellElement, []),
      created: dart.definiteFunctionType(html$.TableCellElement, [])
    }),
    fields: () => ({
      [dartx.cellIndex]: core.int,
      [dartx.colSpan]: core.int,
      [dartx.headers]: core.String,
      [dartx.rowSpan]: core.int
    })
  });
  dart.registerExtension(dart.global.HTMLTableCellElement, html$.TableCellElement);
  dart.registerExtension(dart.global.HTMLTableDataCellElement, html$.TableCellElement);
  dart.registerExtension(dart.global.HTMLTableHeaderCellElement, html$.TableCellElement);
  dart.defineExtensionNames([
    'span'
  ]);
  html$.TableColElement = class TableColElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableColElement._check(html$.document[dartx.createElement]("col"));
    }
    created() {
      this[dartx.span] = null;
      super.created();
    }
    get [dartx.span]() {
      return this.span;
    }
    set [dartx.span](value) {
      this.span = value;
    }
  };
  dart.defineNamedConstructor(html$.TableColElement, 'created');
  dart.setSignature(html$.TableColElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableColElement, []),
      new: dart.definiteFunctionType(html$.TableColElement, []),
      created: dart.definiteFunctionType(html$.TableColElement, [])
    }),
    fields: () => ({[dartx.span]: core.int})
  });
  dart.registerExtension(dart.global.HTMLTableColElement, html$.TableColElement);
  const _tBodies = Symbol('_tBodies');
  const _rows = Symbol('_rows');
  const _createCaption = Symbol('_createCaption');
  const _createTBody = Symbol('_createTBody');
  const _createTFoot = Symbol('_createTFoot');
  const _createTHead = Symbol('_createTHead');
  const _insertRow = Symbol('_insertRow');
  const _nativeCreateTBody = Symbol('_nativeCreateTBody');
  dart.defineExtensionNames([
    'tBodies',
    'rows',
    'addRow',
    'createCaption',
    'createTBody',
    'createTFoot',
    'createTHead',
    'insertRow',
    'createFragment',
    'deleteCaption',
    'deleteRow',
    'deleteTFoot',
    'deleteTHead',
    'caption',
    'tFoot',
    'tHead'
  ]);
  html$.TableElement = class TableElement extends html$.HtmlElement {
    get [dartx.tBodies]() {
      return new (_WrappedListOfTableSectionElement())(this[_tBodies]);
    }
    get [dartx.rows]() {
      return new (_WrappedListOfTableRowElement())(this[_rows]);
    }
    [dartx.addRow]() {
      return this[dartx.insertRow](-1);
    }
    [dartx.createCaption]() {
      return html$.TableCaptionElement._check(this[_createCaption]());
    }
    [dartx.createTBody]() {
      return this[_createTBody]();
    }
    [dartx.createTFoot]() {
      return html$.TableSectionElement._check(this[_createTFoot]());
    }
    [dartx.createTHead]() {
      return html$.TableSectionElement._check(this[_createTHead]());
    }
    [dartx.insertRow](index) {
      return html$.TableRowElement._check(this[_insertRow](index));
    }
    [_createTBody]() {
      if (!!this.createTBody) {
        return this[_nativeCreateTBody]();
      }
      let tbody = html$.Element.tag('tbody');
      this[dartx.children][dartx.add](tbody);
      return html$.TableSectionElement._check(tbody);
    }
    [_nativeCreateTBody](...args) {
      return this.createTBody.apply(this, args);
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      }
      let contextualHtml = dart.str`<table>${html}</table>`;
      let table = html$.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
      let fragment = html$.DocumentFragment.new();
      fragment[dartx.nodes][dartx.addAll](table[dartx.nodes]);
      return fragment;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableElement._check(html$.document[dartx.createElement]("table"));
    }
    created() {
      this[dartx.caption] = null;
      this[_rows] = null;
      this[_tBodies] = null;
      this[dartx.tFoot] = null;
      this[dartx.tHead] = null;
      super.created();
    }
    get [dartx.caption]() {
      return this.caption;
    }
    set [dartx.caption](value) {
      this.caption = value;
    }
    get [_rows]() {
      return this.rows;
    }
    get [_tBodies]() {
      return this.tBodies;
    }
    get [dartx.tFoot]() {
      return this.tFoot;
    }
    set [dartx.tFoot](value) {
      this.tFoot = value;
    }
    get [dartx.tHead]() {
      return this.tHead;
    }
    set [dartx.tHead](value) {
      this.tHead = value;
    }
    [_createCaption](...args) {
      return this.createCaption.apply(this, args);
    }
    [_createTFoot](...args) {
      return this.createTFoot.apply(this, args);
    }
    [_createTHead](...args) {
      return this.createTHead.apply(this, args);
    }
    [dartx.deleteCaption](...args) {
      return this.deleteCaption.apply(this, args);
    }
    [dartx.deleteRow](...args) {
      return this.deleteRow.apply(this, args);
    }
    [dartx.deleteTFoot](...args) {
      return this.deleteTFoot.apply(this, args);
    }
    [dartx.deleteTHead](...args) {
      return this.deleteTHead.apply(this, args);
    }
    [_insertRow](...args) {
      return this.insertRow.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TableElement, 'created');
  dart.setSignature(html$.TableElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableElement, []),
      new: dart.definiteFunctionType(html$.TableElement, []),
      created: dart.definiteFunctionType(html$.TableElement, [])
    }),
    fields: () => ({
      [dartx.caption]: html$.TableCaptionElement,
      [_rows]: ListOfNode(),
      [_tBodies]: ListOfNode(),
      [dartx.tFoot]: html$.TableSectionElement,
      [dartx.tHead]: html$.TableSectionElement
    }),
    getters: () => ({
      [dartx.tBodies]: dart.definiteFunctionType(core.List$(html$.TableSectionElement), []),
      [dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])
    }),
    methods: () => ({
      [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
      [dartx.createCaption]: dart.definiteFunctionType(html$.TableCaptionElement, []),
      [dartx.createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [dartx.createTFoot]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [dartx.createTHead]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
      [_createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [_nativeCreateTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
      [_createCaption]: dart.definiteFunctionType(html$.HtmlElement, []),
      [_createTFoot]: dart.definiteFunctionType(html$.HtmlElement, []),
      [_createTHead]: dart.definiteFunctionType(html$.HtmlElement, []),
      [dartx.deleteCaption]: dart.definiteFunctionType(dart.void, []),
      [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.deleteTFoot]: dart.definiteFunctionType(dart.void, []),
      [dartx.deleteTHead]: dart.definiteFunctionType(dart.void, []),
      [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLTableElement, html$.TableElement);
  const _cells = Symbol('_cells');
  const _insertCell = Symbol('_insertCell');
  dart.defineExtensionNames([
    'cells',
    'addCell',
    'insertCell',
    'createFragment',
    'deleteCell',
    'rowIndex',
    'sectionRowIndex'
  ]);
  html$.TableRowElement = class TableRowElement extends html$.HtmlElement {
    get [dartx.cells]() {
      return new (_WrappedListOfTableCellElement())(this[_cells]);
    }
    [dartx.addCell]() {
      return this[dartx.insertCell](-1);
    }
    [dartx.insertCell](index) {
      return html$.TableCellElement._check(this[_insertCell](index));
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      }
      let fragment = html$.DocumentFragment.new();
      let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
      let row = section[dartx.nodes][dartx.single];
      fragment[dartx.nodes][dartx.addAll](row[dartx.nodes]);
      return fragment;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TableRowElement._check(html$.document[dartx.createElement]("tr"));
    }
    created() {
      this[_cells] = null;
      this[dartx.rowIndex] = null;
      this[dartx.sectionRowIndex] = null;
      super.created();
    }
    get [_cells]() {
      return this.cells;
    }
    get [dartx.rowIndex]() {
      return this.rowIndex;
    }
    get [dartx.sectionRowIndex]() {
      return this.sectionRowIndex;
    }
    [dartx.deleteCell](...args) {
      return this.deleteCell.apply(this, args);
    }
    [_insertCell](...args) {
      return this.insertCell.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TableRowElement, 'created');
  dart.setSignature(html$.TableRowElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableRowElement, []),
      new: dart.definiteFunctionType(html$.TableRowElement, []),
      created: dart.definiteFunctionType(html$.TableRowElement, [])
    }),
    fields: () => ({
      [_cells]: ListOfNode(),
      [dartx.rowIndex]: core.int,
      [dartx.sectionRowIndex]: core.int
    }),
    getters: () => ({[dartx.cells]: dart.definiteFunctionType(core.List$(html$.TableCellElement), [])}),
    methods: () => ({
      [dartx.addCell]: dart.definiteFunctionType(html$.TableCellElement, []),
      [dartx.insertCell]: dart.definiteFunctionType(html$.TableCellElement, [core.int]),
      [dartx.deleteCell]: dart.definiteFunctionType(dart.void, [core.int]),
      [_insertCell]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLTableRowElement, html$.TableRowElement);
  dart.defineExtensionNames([
    'rows',
    'addRow',
    'insertRow',
    'createFragment',
    'deleteRow'
  ]);
  html$.TableSectionElement = class TableSectionElement extends html$.HtmlElement {
    get [dartx.rows]() {
      return new (_WrappedListOfTableRowElement())(this[_rows]);
    }
    [dartx.addRow]() {
      return this[dartx.insertRow](-1);
    }
    [dartx.insertRow](index) {
      return html$.TableRowElement._check(this[_insertRow](index));
    }
    [dartx.createFragment](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      }
      let fragment = html$.DocumentFragment.new();
      let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
      fragment[dartx.nodes][dartx.addAll](section[dartx.nodes]);
      return fragment;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[_rows] = null;
      super.created();
    }
    get [_rows]() {
      return this.rows;
    }
    [dartx.deleteRow](...args) {
      return this.deleteRow.apply(this, args);
    }
    [_insertRow](...args) {
      return this.insertRow.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TableSectionElement, 'created');
  dart.setSignature(html$.TableSectionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TableSectionElement, []),
      created: dart.definiteFunctionType(html$.TableSectionElement, [])
    }),
    fields: () => ({[_rows]: ListOfNode()}),
    getters: () => ({[dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])}),
    methods: () => ({
      [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
      [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
      [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
      [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
    })
  });
  dart.registerExtension(dart.global.HTMLTableSectionElement, html$.TableSectionElement);
  dart.defineExtensionNames([
    'setInnerHtml',
    'content'
  ]);
  html$.TemplateElement = class TemplateElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TemplateElement._check(html$.document[dartx.createElement]("template"));
    }
    created() {
      this[dartx.content] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('template');
    }
    get [dartx.content]() {
      return this.content;
    }
    [dartx.setInnerHtml](html, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      this[dartx.text] = null;
      let fragment = this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
      this[dartx.content][dartx.append](fragment);
    }
  };
  dart.defineNamedConstructor(html$.TemplateElement, 'created');
  dart.setSignature(html$.TemplateElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TemplateElement, []),
      new: dart.definiteFunctionType(html$.TemplateElement, []),
      created: dart.definiteFunctionType(html$.TemplateElement, [])
    }),
    fields: () => ({[dartx.content]: html$.DocumentFragment}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.HTMLTemplateElement, html$.TemplateElement);
  dart.defineExtensionNames([
    'checkValidity',
    'reportValidity',
    'select',
    'setCustomValidity',
    'setRangeText',
    'setSelectionRange',
    'autocapitalize',
    'autofocus',
    'cols',
    'defaultValue',
    'dirName',
    'disabled',
    'form',
    'inputMode',
    'labels',
    'maxLength',
    'minLength',
    'name',
    'placeholder',
    'readOnly',
    'required',
    'rows',
    'selectionDirection',
    'selectionEnd',
    'selectionStart',
    'textLength',
    'type',
    'validationMessage',
    'validity',
    'value',
    'willValidate',
    'wrap'
  ]);
  html$.TextAreaElement = class TextAreaElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TextAreaElement._check(html$.document[dartx.createElement]("textarea"));
    }
    created() {
      this[dartx.autocapitalize] = null;
      this[dartx.autofocus] = null;
      this[dartx.cols] = null;
      this[dartx.defaultValue] = null;
      this[dartx.dirName] = null;
      this[dartx.disabled] = null;
      this[dartx.form] = null;
      this[dartx.inputMode] = null;
      this[dartx.labels] = null;
      this[dartx.maxLength] = null;
      this[dartx.minLength] = null;
      this[dartx.name] = null;
      this[dartx.placeholder] = null;
      this[dartx.readOnly] = null;
      this[dartx.required] = null;
      this[dartx.rows] = null;
      this[dartx.selectionDirection] = null;
      this[dartx.selectionEnd] = null;
      this[dartx.selectionStart] = null;
      this[dartx.textLength] = null;
      this[dartx.type] = null;
      this[dartx.validationMessage] = null;
      this[dartx.validity] = null;
      this[dartx.value] = null;
      this[dartx.willValidate] = null;
      this[dartx.wrap] = null;
      super.created();
    }
    get [dartx.autocapitalize]() {
      return this.autocapitalize;
    }
    set [dartx.autocapitalize](value) {
      this.autocapitalize = value;
    }
    get [dartx.autofocus]() {
      return this.autofocus;
    }
    set [dartx.autofocus](value) {
      this.autofocus = value;
    }
    get [dartx.cols]() {
      return this.cols;
    }
    set [dartx.cols](value) {
      this.cols = value;
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    set [dartx.defaultValue](value) {
      this.defaultValue = value;
    }
    get [dartx.dirName]() {
      return this.dirName;
    }
    set [dartx.dirName](value) {
      this.dirName = value;
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.form]() {
      return this.form;
    }
    get [dartx.inputMode]() {
      return this.inputMode;
    }
    set [dartx.inputMode](value) {
      this.inputMode = value;
    }
    get [dartx.labels]() {
      return this.labels;
    }
    get [dartx.maxLength]() {
      return this.maxLength;
    }
    set [dartx.maxLength](value) {
      this.maxLength = value;
    }
    get [dartx.minLength]() {
      return this.minLength;
    }
    set [dartx.minLength](value) {
      this.minLength = value;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.placeholder]() {
      return this.placeholder;
    }
    set [dartx.placeholder](value) {
      this.placeholder = value;
    }
    get [dartx.readOnly]() {
      return this.readOnly;
    }
    set [dartx.readOnly](value) {
      this.readOnly = value;
    }
    get [dartx.required]() {
      return this.required;
    }
    set [dartx.required](value) {
      this.required = value;
    }
    get [dartx.rows]() {
      return this.rows;
    }
    set [dartx.rows](value) {
      this.rows = value;
    }
    get [dartx.selectionDirection]() {
      return this.selectionDirection;
    }
    set [dartx.selectionDirection](value) {
      this.selectionDirection = value;
    }
    get [dartx.selectionEnd]() {
      return this.selectionEnd;
    }
    set [dartx.selectionEnd](value) {
      this.selectionEnd = value;
    }
    get [dartx.selectionStart]() {
      return this.selectionStart;
    }
    set [dartx.selectionStart](value) {
      this.selectionStart = value;
    }
    get [dartx.textLength]() {
      return this.textLength;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.validationMessage]() {
      return this.validationMessage;
    }
    get [dartx.validity]() {
      return this.validity;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.willValidate]() {
      return this.willValidate;
    }
    get [dartx.wrap]() {
      return this.wrap;
    }
    set [dartx.wrap](value) {
      this.wrap = value;
    }
    [dartx.checkValidity](...args) {
      return this.checkValidity.apply(this, args);
    }
    [dartx.reportValidity](...args) {
      return this.reportValidity.apply(this, args);
    }
    [dartx.select](...args) {
      return this.select.apply(this, args);
    }
    [dartx.setCustomValidity](...args) {
      return this.setCustomValidity.apply(this, args);
    }
    [dartx.setRangeText](...args) {
      return this.setRangeText.apply(this, args);
    }
    [dartx.setSelectionRange](...args) {
      return this.setSelectionRange.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.TextAreaElement, 'created');
  dart.setSignature(html$.TextAreaElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TextAreaElement, []),
      new: dart.definiteFunctionType(html$.TextAreaElement, []),
      created: dart.definiteFunctionType(html$.TextAreaElement, [])
    }),
    fields: () => ({
      [dartx.autocapitalize]: core.String,
      [dartx.autofocus]: core.bool,
      [dartx.cols]: core.int,
      [dartx.defaultValue]: core.String,
      [dartx.dirName]: core.String,
      [dartx.disabled]: core.bool,
      [dartx.form]: html$.FormElement,
      [dartx.inputMode]: core.String,
      [dartx.labels]: ListOfNode(),
      [dartx.maxLength]: core.int,
      [dartx.minLength]: core.int,
      [dartx.name]: core.String,
      [dartx.placeholder]: core.String,
      [dartx.readOnly]: core.bool,
      [dartx.required]: core.bool,
      [dartx.rows]: core.int,
      [dartx.selectionDirection]: core.String,
      [dartx.selectionEnd]: core.int,
      [dartx.selectionStart]: core.int,
      [dartx.textLength]: core.int,
      [dartx.type]: core.String,
      [dartx.validationMessage]: core.String,
      [dartx.validity]: html$.ValidityState,
      [dartx.value]: core.String,
      [dartx.willValidate]: core.bool,
      [dartx.wrap]: core.String
    }),
    methods: () => ({
      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
      [dartx.select]: dart.definiteFunctionType(dart.void, []),
      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
      [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String])
    })
  });
  dart.registerExtension(dart.global.HTMLTextAreaElement, html$.TextAreaElement);
  const _initTextEvent = Symbol('_initTextEvent');
  dart.defineExtensionNames([
    'data'
  ]);
  html$.TextEvent = class TextEvent extends html$.UIEvent {
    static new(type, opts) {
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
      let view = opts && 'view' in opts ? opts.view : null;
      let data = opts && 'data' in opts ? opts.data : null;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.TextEvent._check(html$.document[_createEvent]("TextEvent"));
      e[_initTextEvent](type, canBubble, cancelable, view, data);
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.data]() {
      return this.data;
    }
    [_initTextEvent](...args) {
      return this.initTextEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.TextEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TextEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String}),
      _: dart.definiteFunctionType(html$.TextEvent, [])
    }),
    fields: () => ({[dartx.data]: core.String}),
    methods: () => ({[_initTextEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])})
  });
  dart.registerExtension(dart.global.TextEvent, html$.TextEvent);
  dart.defineExtensionNames([
    'actualBoundingBoxAscent',
    'actualBoundingBoxDescent',
    'actualBoundingBoxLeft',
    'actualBoundingBoxRight',
    'alphabeticBaseline',
    'emHeightAscent',
    'emHeightDescent',
    'fontBoundingBoxAscent',
    'fontBoundingBoxDescent',
    'hangingBaseline',
    'ideographicBaseline',
    'width'
  ]);
  html$.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.actualBoundingBoxAscent]() {
      return this.actualBoundingBoxAscent;
    }
    get [dartx.actualBoundingBoxDescent]() {
      return this.actualBoundingBoxDescent;
    }
    get [dartx.actualBoundingBoxLeft]() {
      return this.actualBoundingBoxLeft;
    }
    get [dartx.actualBoundingBoxRight]() {
      return this.actualBoundingBoxRight;
    }
    get [dartx.alphabeticBaseline]() {
      return this.alphabeticBaseline;
    }
    get [dartx.emHeightAscent]() {
      return this.emHeightAscent;
    }
    get [dartx.emHeightDescent]() {
      return this.emHeightDescent;
    }
    get [dartx.fontBoundingBoxAscent]() {
      return this.fontBoundingBoxAscent;
    }
    get [dartx.fontBoundingBoxDescent]() {
      return this.fontBoundingBoxDescent;
    }
    get [dartx.hangingBaseline]() {
      return this.hangingBaseline;
    }
    get [dartx.ideographicBaseline]() {
      return this.ideographicBaseline;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  dart.setSignature(html$.TextMetrics, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextMetrics, [])}),
    fields: () => ({
      [dartx.actualBoundingBoxAscent]: core.double,
      [dartx.actualBoundingBoxDescent]: core.double,
      [dartx.actualBoundingBoxLeft]: core.double,
      [dartx.actualBoundingBoxRight]: core.double,
      [dartx.alphabeticBaseline]: core.double,
      [dartx.emHeightAscent]: core.double,
      [dartx.emHeightDescent]: core.double,
      [dartx.fontBoundingBoxAscent]: core.double,
      [dartx.fontBoundingBoxDescent]: core.double,
      [dartx.hangingBaseline]: core.double,
      [dartx.ideographicBaseline]: core.double,
      [dartx.width]: core.double
    })
  });
  dart.registerExtension(dart.global.TextMetrics, html$.TextMetrics);
  dart.defineExtensionNames([
    'addCue',
    'addRegion',
    'removeCue',
    'removeRegion',
    'onCueChange',
    'activeCues',
    'cues',
    'id',
    'kind',
    'label',
    'language',
    'mode',
    'regions'
  ]);
  html$.TextTrack = class TextTrack extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.activeCues]() {
      return this.activeCues;
    }
    get [dartx.cues]() {
      return this.cues;
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    set [dartx.mode](value) {
      this.mode = value;
    }
    get [dartx.regions]() {
      return this.regions;
    }
    [dartx.addCue](...args) {
      return this.addCue.apply(this, args);
    }
    [dartx.addRegion](...args) {
      return this.addRegion.apply(this, args);
    }
    [dartx.removeCue](...args) {
      return this.removeCue.apply(this, args);
    }
    [dartx.removeRegion](...args) {
      return this.removeRegion.apply(this, args);
    }
    get [dartx.onCueChange]() {
      return html$.TextTrack.cueChangeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.TextTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrack, [])}),
    fields: () => ({
      [dartx.activeCues]: html$.TextTrackCueList,
      [dartx.cues]: html$.TextTrackCueList,
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.language]: core.String,
      [dartx.mode]: core.String,
      [dartx.regions]: html$.VttRegionList
    }),
    getters: () => ({[dartx.onCueChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.addCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
      [dartx.addRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion]),
      [dartx.removeCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
      [dartx.removeRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion])
    }),
    sfields: () => ({cueChangeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.TextTrack, {
    get cueChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('cuechange'));
    }
  });
  dart.registerExtension(dart.global.TextTrack, html$.TextTrack);
  dart.defineExtensionNames([
    'onEnter',
    'onExit',
    'endTime',
    'id',
    'pauseOnExit',
    'startTime',
    'track'
  ]);
  html$.TextTrackCue = class TextTrackCue extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.endTime]() {
      return this.endTime;
    }
    set [dartx.endTime](value) {
      this.endTime = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    set [dartx.id](value) {
      this.id = value;
    }
    get [dartx.pauseOnExit]() {
      return this.pauseOnExit;
    }
    set [dartx.pauseOnExit](value) {
      this.pauseOnExit = value;
    }
    get [dartx.startTime]() {
      return this.startTime;
    }
    set [dartx.startTime](value) {
      this.startTime = value;
    }
    get [dartx.track]() {
      return this.track;
    }
    get [dartx.onEnter]() {
      return html$.TextTrackCue.enterEvent.forTarget(this);
    }
    get [dartx.onExit]() {
      return html$.TextTrackCue.exitEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.TextTrackCue, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCue, [])}),
    fields: () => ({
      [dartx.endTime]: core.num,
      [dartx.id]: core.String,
      [dartx.pauseOnExit]: core.bool,
      [dartx.startTime]: core.num,
      [dartx.track]: html$.TextTrack
    }),
    getters: () => ({
      [dartx.onEnter]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onExit]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      enterEvent: EventStreamProviderOfEvent(),
      exitEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.TextTrackCue, {
    get enterEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('enter'));
    },
    get exitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('exit'));
    }
  });
  dart.registerExtension(dart.global.TextTrackCue, html$.TextTrackCue);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'getCueById',
    'item'
  ]);
  html$.TextTrackCueList = class TextTrackCueList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.TextTrackCue), html$.ImmutableListMixin$(html$.TextTrackCue)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.getCueById](...args) {
      return this.getCueById.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), _js_helper.JavaScriptIndexingBehavior];
  dart.setSignature(html$.TextTrackCueList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCueList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.TextTrackCue, []),
      [dartx.last]: dart.definiteFunctionType(html$.TextTrackCue, []),
      [dartx.single]: dart.definiteFunctionType(html$.TextTrackCue, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrackCue]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
      [dartx.getCueById]: dart.definiteFunctionType(html$.TextTrackCue, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.TextTrackCue, [core.int])
    })
  });
  dart.registerExtension(dart.global.TextTrackCueList, html$.TextTrackCueList);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'getTrackById',
    'item',
    'onAddTrack',
    'onChange'
  ]);
  html$.TextTrackList = class TextTrackList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.TextTrack), html$.ImmutableListMixin$(html$.TextTrack)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    get [dartx.onAddTrack]() {
      return html$.TextTrackList.addTrackEvent.forTarget(this);
    }
    get [dartx.onChange]() {
      return html$.TextTrackList.changeEvent.forTarget(this);
    }
  };
  html$.TextTrackList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTextTrack()];
  dart.setSignature(html$.TextTrackList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.TextTrack, []),
      [dartx.last]: dart.definiteFunctionType(html$.TextTrack, []),
      [dartx.single]: dart.definiteFunctionType(html$.TextTrack, []),
      [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.TrackEvent), []),
      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrack]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.TextTrack, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.TextTrack, [core.int])
    }),
    sfields: () => ({
      addTrackEvent: EventStreamProviderOfTrackEvent(),
      changeEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(html$.TextTrackList, {
    get addTrackEvent() {
      return dart.const(new (EventStreamProviderOfTrackEvent())('addtrack'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.TextTrackList, html$.TextTrackList);
  dart.defineExtensionNames([
    'end',
    'start',
    'length'
  ]);
  html$.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.end](...args) {
      return this.end.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
  };
  dart.setSignature(html$.TimeRanges, {
    constructors: () => ({_: dart.definiteFunctionType(html$.TimeRanges, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.end]: dart.definiteFunctionType(core.double, [core.int]),
      [dartx.start]: dart.definiteFunctionType(core.double, [core.int])
    })
  });
  dart.registerExtension(dart.global.TimeRanges, html$.TimeRanges);
  html$.TimeoutHandler = dart.typedef('TimeoutHandler', () => dart.functionType(dart.void, []));
  html$.TitleElement = class TitleElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TitleElement._check(html$.document[dartx.createElement]("title"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.TitleElement, 'created');
  dart.setSignature(html$.TitleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TitleElement, []),
      new: dart.definiteFunctionType(html$.TitleElement, []),
      created: dart.definiteFunctionType(html$.TitleElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLTitleElement, html$.TitleElement);
  const _radiusX = Symbol('_radiusX');
  const _radiusY = Symbol('_radiusY');
  const __clientX = Symbol('__clientX');
  const __clientY = Symbol('__clientY');
  const __screenX = Symbol('__screenX');
  const __screenY = Symbol('__screenY');
  const __pageX = Symbol('__pageX');
  const __pageY = Symbol('__pageY');
  const __radiusX = Symbol('__radiusX');
  const __radiusY = Symbol('__radiusY');
  dart.defineExtensionNames([
    'target',
    'client',
    'page',
    'screen',
    'radiusX',
    'radiusY',
    'force',
    'identifier',
    'rotationAngle'
  ]);
  html$.Touch = class Touch extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [_clientX]() {
      return this.clientX;
    }
    get [_clientY]() {
      return this.clientY;
    }
    get [dartx.force]() {
      return this.force;
    }
    get [dartx.identifier]() {
      return this.identifier;
    }
    get [_pageX]() {
      return this.pageX;
    }
    get [_pageY]() {
      return this.pageY;
    }
    get [_radiusX]() {
      return this.radiusX;
    }
    get [_radiusY]() {
      return this.radiusY;
    }
    get [dartx.rotationAngle]() {
      return this.rotationAngle;
    }
    get [_screenX]() {
      return this.screenX;
    }
    get [_screenY]() {
      return this.screenY;
    }
    get [dartx.target]() {
      return html$._convertNativeToDart_EventTarget(this[_get_target]);
    }
    get [_get_target]() {
      return this.target;
    }
    get [__clientX]() {
      return this.clientX[dartx.round]();
    }
    get [__clientY]() {
      return this.clientY[dartx.round]();
    }
    get [__screenX]() {
      return this.screenX[dartx.round]();
    }
    get [__screenY]() {
      return this.screenY[dartx.round]();
    }
    get [__pageX]() {
      return this.pageX[dartx.round]();
    }
    get [__pageY]() {
      return this.pageY[dartx.round]();
    }
    get [__radiusX]() {
      return this.radiusX[dartx.round]();
    }
    get [__radiusY]() {
      return this.radiusY[dartx.round]();
    }
    get [dartx.client]() {
      return new (PointOfnum())(this[__clientX], this[__clientY]);
    }
    get [dartx.page]() {
      return new (PointOfnum())(this[__pageX], this[__pageY]);
    }
    get [dartx.screen]() {
      return new (PointOfnum())(this[__screenX], this[__screenY]);
    }
    get [dartx.radiusX]() {
      return this[__radiusX];
    }
    get [dartx.radiusY]() {
      return this[__radiusY];
    }
  };
  dart.setSignature(html$.Touch, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Touch, [])}),
    fields: () => ({
      [_clientX]: core.double,
      [_clientY]: core.double,
      [dartx.force]: core.double,
      [dartx.identifier]: core.int,
      [_pageX]: core.double,
      [_pageY]: core.double,
      [_radiusX]: core.double,
      [_radiusY]: core.double,
      [dartx.rotationAngle]: core.double,
      [_screenX]: core.double,
      [_screenY]: core.double,
      [_get_target]: dart.dynamic
    }),
    getters: () => ({
      [dartx.target]: dart.definiteFunctionType(html$.EventTarget, []),
      [__clientX]: dart.definiteFunctionType(core.int, []),
      [__clientY]: dart.definiteFunctionType(core.int, []),
      [__screenX]: dart.definiteFunctionType(core.int, []),
      [__screenY]: dart.definiteFunctionType(core.int, []),
      [__pageX]: dart.definiteFunctionType(core.int, []),
      [__pageY]: dart.definiteFunctionType(core.int, []),
      [__radiusX]: dart.definiteFunctionType(core.int, []),
      [__radiusY]: dart.definiteFunctionType(core.int, []),
      [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.radiusX]: dart.definiteFunctionType(core.int, []),
      [dartx.radiusY]: dart.definiteFunctionType(core.int, [])
    })
  });
  dart.registerExtension(dart.global.Touch, html$.Touch);
  const _initTouchEvent = Symbol('_initTouchEvent');
  dart.defineExtensionNames([
    'altKey',
    'changedTouches',
    'ctrlKey',
    'metaKey',
    'shiftKey',
    'targetTouches',
    'touches'
  ]);
  html$.TouchEvent = class TouchEvent extends html$.UIEvent {
    static new(touches, targetTouches, changedTouches, type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      if (view == null) {
        view = html$.window;
      }
      let e = html$.TouchEvent._check(html$.document[_createEvent]("TouchEvent"));
      e[_initTouchEvent](touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
      return e;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.altKey]() {
      return this.altKey;
    }
    get [dartx.changedTouches]() {
      return this.changedTouches;
    }
    get [dartx.ctrlKey]() {
      return this.ctrlKey;
    }
    get [dartx.metaKey]() {
      return this.metaKey;
    }
    get [dartx.shiftKey]() {
      return this.shiftKey;
    }
    get [dartx.targetTouches]() {
      return this.targetTouches;
    }
    get [dartx.touches]() {
      return this.touches;
    }
    [_initTouchEvent](...args) {
      return this.initTouchEvent.apply(this, args);
    }
    static get supported() {
      return html_common.Device.isEventTypeSupported('TouchEvent');
    }
  };
  dart.setSignature(html$.TouchEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TouchEvent, [html$.TouchList, html$.TouchList, html$.TouchList, core.String], {view: html$.Window, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
      _: dart.definiteFunctionType(html$.TouchEvent, [])
    }),
    fields: () => ({
      [dartx.altKey]: core.bool,
      [dartx.changedTouches]: html$.TouchList,
      [dartx.ctrlKey]: core.bool,
      [dartx.metaKey]: core.bool,
      [dartx.shiftKey]: core.bool,
      [dartx.targetTouches]: html$.TouchList,
      [dartx.touches]: html$.TouchList
    }),
    methods: () => ({[_initTouchEvent]: dart.definiteFunctionType(dart.void, [html$.TouchList, html$.TouchList, html$.TouchList, core.String, html$.Window, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.TouchEvent, html$.TouchEvent);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$.TouchList = class TouchList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Touch), html$.ImmutableListMixin$(html$.Touch)) {
    static new() {
      return null;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!document.createTouchList;
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$.TouchList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTouch()];
  dart.setSignature(html$.TouchList, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TouchList, []),
      _: dart.definiteFunctionType(html$.TouchList, [])
    }),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Touch, []),
      [dartx.last]: dart.definiteFunctionType(html$.Touch, []),
      [dartx.single]: dart.definiteFunctionType(html$.Touch, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Touch, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Touch]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Touch, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Touch, [core.int])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.TouchList, html$.TouchList);
  dart.defineExtensionNames([
    'byteStreamTrackID',
    'kinds',
    'label',
    'language',
    'type'
  ]);
  html$.TrackDefault = class TrackDefault extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, language, label, kinds, byteStreamTrackID) {
      if (byteStreamTrackID === void 0) byteStreamTrackID = null;
      if (byteStreamTrackID != null) {
        let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
        return html$.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
      }
      let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
      return html$.TrackDefault._create_2(type, language, label, kinds_1);
    }
    static _create_1(type, language, label, kinds, byteStreamTrackID) {
      return new TrackDefault(type, language, label, kinds, byteStreamTrackID);
    }
    static _create_2(type, language, label, kinds) {
      return new TrackDefault(type, language, label, kinds);
    }
    get [dartx.byteStreamTrackID]() {
      return this.byteStreamTrackID;
    }
    get [dartx.kinds]() {
      return this.kinds;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(html$.TrackDefault, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackDefault, []),
      new: dart.definiteFunctionType(html$.TrackDefault, [core.String, core.String, core.String, ListOfString()], [core.String])
    }),
    fields: () => ({
      [dartx.byteStreamTrackID]: core.String,
      [dartx.kinds]: ListOfString(),
      [dartx.label]: core.String,
      [dartx.language]: core.String,
      [dartx.type]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TrackDefault, html$.TrackDefault);
  dart.defineExtensionNames([
    'item',
    'length'
  ]);
  html$.TrackDefaultList = class TrackDefaultList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(trackDefaults) {
      if (trackDefaults === void 0) trackDefaults = null;
      if (trackDefaults != null) {
        return html$.TrackDefaultList._create_1(trackDefaults);
      }
      return html$.TrackDefaultList._create_2();
    }
    static _create_1(trackDefaults) {
      return new TrackDefaultList(trackDefaults);
    }
    static _create_2() {
      return new TrackDefaultList();
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.TrackDefaultList, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackDefaultList, []),
      new: dart.definiteFunctionType(html$.TrackDefaultList, [], [ListOfTrackDefault()])
    }),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.TrackDefault, [core.int])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TrackDefaultList, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TrackDefaultList, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TrackDefaultList, html$.TrackDefaultList);
  dart.defineExtensionNames([
    'defaultValue',
    'kind',
    'label',
    'readyState',
    'src',
    'srclang',
    'track'
  ]);
  html$.TrackElement = class TrackElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.TrackElement._check(html$.document[dartx.createElement]("track"));
    }
    created() {
      this[dartx.defaultValue] = null;
      this[dartx.kind] = null;
      this[dartx.label] = null;
      this[dartx.readyState] = null;
      this[dartx.src] = null;
      this[dartx.srclang] = null;
      this[dartx.track] = null;
      super.created();
    }
    static get supported() {
      return html$.Element.isTagSupported('track');
    }
    get [dartx.defaultValue]() {
      return this.default;
    }
    set [dartx.defaultValue](value) {
      this.default = value;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    set [dartx.kind](value) {
      this.kind = value;
    }
    get [dartx.label]() {
      return this.label;
    }
    set [dartx.label](value) {
      this.label = value;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.src]() {
      return this.src;
    }
    set [dartx.src](value) {
      this.src = value;
    }
    get [dartx.srclang]() {
      return this.srclang;
    }
    set [dartx.srclang](value) {
      this.srclang = value;
    }
    get [dartx.track]() {
      return this.track;
    }
  };
  dart.defineNamedConstructor(html$.TrackElement, 'created');
  dart.setSignature(html$.TrackElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackElement, []),
      new: dart.definiteFunctionType(html$.TrackElement, []),
      created: dart.definiteFunctionType(html$.TrackElement, [])
    }),
    fields: () => ({
      [dartx.defaultValue]: core.bool,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.readyState]: core.int,
      [dartx.src]: core.String,
      [dartx.srclang]: core.String,
      [dartx.track]: html$.TextTrack
    }),
    sfields: () => ({
      ERROR: core.int,
      LOADED: core.int,
      LOADING: core.int,
      NONE: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  html$.TrackElement.ERROR = 3;
  html$.TrackElement.LOADED = 2;
  html$.TrackElement.LOADING = 1;
  html$.TrackElement.NONE = 0;
  dart.registerExtension(dart.global.HTMLTrackElement, html$.TrackElement);
  dart.defineExtensionNames([
    'track'
  ]);
  html$.TrackEvent = class TrackEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.TrackEvent._create_1(type, eventInitDict_1);
      }
      return html$.TrackEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new TrackEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new TrackEvent(type);
    }
    get [dartx.track]() {
      return this.track;
    }
  };
  dart.setSignature(html$.TrackEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TrackEvent, []),
      new: dart.definiteFunctionType(html$.TrackEvent, [core.String], [core.Map])
    }),
    fields: () => ({[dartx.track]: core.Object}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TrackEvent, html$.TrackEvent);
  dart.defineExtensionNames([
    'elapsedTime',
    'propertyName',
    'pseudoElement'
  ]);
  html$.TransitionEvent = class TransitionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.TransitionEvent._create_1(type, eventInitDict_1);
      }
      return html$.TransitionEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new TransitionEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new TransitionEvent(type);
    }
    get [dartx.elapsedTime]() {
      return this.elapsedTime;
    }
    get [dartx.propertyName]() {
      return this.propertyName;
    }
    get [dartx.pseudoElement]() {
      return this.pseudoElement;
    }
  };
  dart.setSignature(html$.TransitionEvent, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.TransitionEvent, []),
      new: dart.definiteFunctionType(html$.TransitionEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [dartx.elapsedTime]: core.double,
      [dartx.propertyName]: core.String,
      [dartx.pseudoElement]: core.String
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.TransitionEvent, html$.TransitionEvent);
  dart.registerExtension(dart.global.WebKitTransitionEvent, html$.TransitionEvent);
  dart.defineExtensionNames([
    'firstChild',
    'lastChild',
    'nextNode',
    'nextSibling',
    'parentNode',
    'previousNode',
    'previousSibling',
    'currentNode',
    'filter',
    'root',
    'whatToShow'
  ]);
  html$.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
    static new(root, whatToShow) {
      return html$.document[_createTreeWalker](root, whatToShow, null);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.currentNode]() {
      return this.currentNode;
    }
    set [dartx.currentNode](value) {
      this.currentNode = value;
    }
    get [dartx.filter]() {
      return this.filter;
    }
    get [dartx.root]() {
      return this.root;
    }
    get [dartx.whatToShow]() {
      return this.whatToShow;
    }
    [dartx.firstChild](...args) {
      return this.firstChild.apply(this, args);
    }
    [dartx.lastChild](...args) {
      return this.lastChild.apply(this, args);
    }
    [dartx.nextNode](...args) {
      return this.nextNode.apply(this, args);
    }
    [dartx.nextSibling](...args) {
      return this.nextSibling.apply(this, args);
    }
    [dartx.parentNode](...args) {
      return this.parentNode.apply(this, args);
    }
    [dartx.previousNode](...args) {
      return this.previousNode.apply(this, args);
    }
    [dartx.previousSibling](...args) {
      return this.previousSibling.apply(this, args);
    }
  };
  dart.setSignature(html$.TreeWalker, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.TreeWalker, [html$.Node, core.int]),
      _: dart.definiteFunctionType(html$.TreeWalker, [])
    }),
    fields: () => ({
      [dartx.currentNode]: html$.Node,
      [dartx.filter]: html$.NodeFilter,
      [dartx.root]: html$.Node,
      [dartx.whatToShow]: core.int
    }),
    methods: () => ({
      [dartx.firstChild]: dart.definiteFunctionType(html$.Node, []),
      [dartx.lastChild]: dart.definiteFunctionType(html$.Node, []),
      [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.nextSibling]: dart.definiteFunctionType(html$.Node, []),
      [dartx.parentNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.previousNode]: dart.definiteFunctionType(html$.Node, []),
      [dartx.previousSibling]: dart.definiteFunctionType(html$.Node, [])
    })
  });
  dart.registerExtension(dart.global.TreeWalker, html$.TreeWalker);
  html$.UListElement = class UListElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.UListElement._check(html$.document[dartx.createElement]("ul"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.UListElement, 'created');
  dart.setSignature(html$.UListElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.UListElement, []),
      new: dart.definiteFunctionType(html$.UListElement, []),
      created: dart.definiteFunctionType(html$.UListElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLUListElement, html$.UListElement);
  html$.UnknownElement = class UnknownElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$.UnknownElement, 'created');
  dart.setSignature(html$.UnknownElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.UnknownElement, []),
      created: dart.definiteFunctionType(html$.UnknownElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLUnknownElement, html$.UnknownElement);
  dart.defineExtensionNames([
    'toString',
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.Url = class Url extends _interceptors.Interceptor {
    static createObjectUrl(blob_OR_source_OR_stream) {
      return (self.URL || self.webkitURL).createObjectURL(blob_OR_source_OR_stream);
    }
    static createObjectUrlFromSource(source) {
      return (self.URL || self.webkitURL).createObjectURL(source);
    }
    static createObjectUrlFromStream(stream) {
      return (self.URL || self.webkitURL).createObjectURL(stream);
    }
    static createObjectUrlFromBlob(blob) {
      return (self.URL || self.webkitURL).createObjectURL(blob);
    }
    static revokeObjectUrl(url) {
      return (self.URL || self.webkitURL).revokeObjectURL(url);
    }
    [dartx.toString]() {
      return String(this);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.hash]() {
      return this.hash;
    }
    set [dartx.hash](value) {
      this.hash = value;
    }
    get [dartx.host]() {
      return this.host;
    }
    set [dartx.host](value) {
      this.host = value;
    }
    get [dartx.hostname]() {
      return this.hostname;
    }
    set [dartx.hostname](value) {
      this.hostname = value;
    }
    get [dartx.href]() {
      return this.href;
    }
    set [dartx.href](value) {
      this.href = value;
    }
    get [dartx.origin]() {
      return this.origin;
    }
    get [dartx.password]() {
      return this.password;
    }
    set [dartx.password](value) {
      this.password = value;
    }
    get [dartx.pathname]() {
      return this.pathname;
    }
    set [dartx.pathname](value) {
      this.pathname = value;
    }
    get [dartx.port]() {
      return this.port;
    }
    set [dartx.port](value) {
      this.port = value;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    set [dartx.protocol](value) {
      this.protocol = value;
    }
    get [dartx.search]() {
      return this.search;
    }
    set [dartx.search](value) {
      this.search = value;
    }
    get [dartx.username]() {
      return this.username;
    }
    set [dartx.username](value) {
      this.username = value;
    }
  };
  html$.Url[dart.implements] = () => [html$.UrlUtils];
  dart.setSignature(html$.Url, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Url, [])}),
    fields: () => ({
      [dartx.hash]: core.String,
      [dartx.host]: core.String,
      [dartx.hostname]: core.String,
      [dartx.href]: core.String,
      [dartx.origin]: core.String,
      [dartx.password]: core.String,
      [dartx.pathname]: core.String,
      [dartx.port]: core.String,
      [dartx.protocol]: core.String,
      [dartx.search]: core.String,
      [dartx.username]: core.String
    }),
    statics: () => ({
      createObjectUrl: dart.definiteFunctionType(core.String, [dart.dynamic]),
      createObjectUrlFromSource: dart.definiteFunctionType(core.String, [html$.MediaSource]),
      createObjectUrlFromStream: dart.definiteFunctionType(core.String, [html$.MediaStream]),
      createObjectUrlFromBlob: dart.definiteFunctionType(core.String, [html$.Blob]),
      revokeObjectUrl: dart.definiteFunctionType(dart.void, [core.String])
    }),
    names: ['createObjectUrl', 'createObjectUrlFromSource', 'createObjectUrlFromStream', 'createObjectUrlFromBlob', 'revokeObjectUrl']
  });
  dart.registerExtension(dart.global.URL, html$.Url);
  dart.defineExtensionNames([
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'password',
    'pathname',
    'port',
    'protocol',
    'search',
    'username'
  ]);
  html$.UrlUtils = class UrlUtils extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get hash() {
      return this[hash];
    }
    set hash(value) {
      this[hash] = value;
    }
    get host() {
      return this[host];
    }
    set host(value) {
      this[host] = value;
    }
    get hostname() {
      return this[hostname];
    }
    set hostname(value) {
      this[hostname] = value;
    }
    get href() {
      return this[href];
    }
    set href(value) {
      this[href] = value;
    }
    get origin() {
      return this[origin];
    }
    set origin(value) {
      super.origin = value;
    }
    get password() {
      return this[password];
    }
    set password(value) {
      this[password] = value;
    }
    get pathname() {
      return this[pathname];
    }
    set pathname(value) {
      this[pathname] = value;
    }
    get port() {
      return this[port];
    }
    set port(value) {
      this[port] = value;
    }
    get protocol() {
      return this[protocol];
    }
    set protocol(value) {
      this[protocol] = value;
    }
    get search() {
      return this[search];
    }
    set search(value) {
      this[search] = value;
    }
    get username() {
      return this[username];
    }
    set username(value) {
      this[username] = value;
    }
  };
  const hash = Symbol(html$.UrlUtils.name + "." + 'hash'.toString());
  const host = Symbol(html$.UrlUtils.name + "." + 'host'.toString());
  const hostname = Symbol(html$.UrlUtils.name + "." + 'hostname'.toString());
  const href = Symbol(html$.UrlUtils.name + "." + 'href'.toString());
  const origin = Symbol(html$.UrlUtils.name + "." + 'origin'.toString());
  const password = Symbol(html$.UrlUtils.name + "." + 'password'.toString());
  const pathname = Symbol(html$.UrlUtils.name + "." + 'pathname'.toString());
  const port = Symbol(html$.UrlUtils.name + "." + 'port'.toString());
  const protocol = Symbol(html$.UrlUtils.name + "." + 'protocol'.toString());
  const search = Symbol(html$.UrlUtils.name + "." + 'search'.toString());
  const username = Symbol(html$.UrlUtils.name + "." + 'username'.toString());
  dart.setSignature(html$.UrlUtils, {
    constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtils, [])}),
    fields: () => ({
      hash: core.String,
      host: core.String,
      hostname: core.String,
      href: core.String,
      origin: core.String,
      password: core.String,
      pathname: core.String,
      port: core.String,
      protocol: core.String,
      search: core.String,
      username: core.String
    })
  });
  dart.defineExtensionMembers(html$.UrlUtils, [
    'hash',
    'hash',
    'host',
    'host',
    'hostname',
    'hostname',
    'href',
    'href',
    'origin',
    'password',
    'password',
    'pathname',
    'pathname',
    'port',
    'port',
    'protocol',
    'protocol',
    'search',
    'search',
    'username',
    'username'
  ]);
  dart.defineExtensionNames([
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'pathname',
    'port',
    'protocol',
    'search'
  ]);
  html$.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get hash() {
      return this[hash$];
    }
    set hash(value) {
      super.hash = value;
    }
    get host() {
      return this[host$];
    }
    set host(value) {
      super.host = value;
    }
    get hostname() {
      return this[hostname$];
    }
    set hostname(value) {
      super.hostname = value;
    }
    get href() {
      return this[href$];
    }
    set href(value) {
      super.href = value;
    }
    get origin() {
      return this[origin$];
    }
    set origin(value) {
      super.origin = value;
    }
    get pathname() {
      return this[pathname$];
    }
    set pathname(value) {
      super.pathname = value;
    }
    get port() {
      return this[port$];
    }
    set port(value) {
      super.port = value;
    }
    get protocol() {
      return this[protocol$];
    }
    set protocol(value) {
      super.protocol = value;
    }
    get search() {
      return this[search$];
    }
    set search(value) {
      super.search = value;
    }
  };
  const hash$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hash'.toString());
  const host$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'host'.toString());
  const hostname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hostname'.toString());
  const href$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'href'.toString());
  const origin$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'origin'.toString());
  const pathname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'pathname'.toString());
  const port$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'port'.toString());
  const protocol$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'protocol'.toString());
  const search$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'search'.toString());
  dart.setSignature(html$.UrlUtilsReadOnly, {
    constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtilsReadOnly, [])}),
    fields: () => ({
      hash: core.String,
      host: core.String,
      hostname: core.String,
      href: core.String,
      origin: core.String,
      pathname: core.String,
      port: core.String,
      protocol: core.String,
      search: core.String
    })
  });
  dart.defineExtensionMembers(html$.UrlUtilsReadOnly, [
    'hash',
    'host',
    'hostname',
    'href',
    'origin',
    'pathname',
    'port',
    'protocol',
    'search'
  ]);
  dart.defineExtensionNames([
    'currentFieldOfView',
    'eyeTranslation',
    'maximumFieldOfView',
    'minimumFieldOfView',
    'recommendedFieldOfView',
    'renderRect'
  ]);
  html$.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.currentFieldOfView]() {
      return this.currentFieldOfView;
    }
    get [dartx.eyeTranslation]() {
      return this.eyeTranslation;
    }
    get [dartx.maximumFieldOfView]() {
      return this.maximumFieldOfView;
    }
    get [dartx.minimumFieldOfView]() {
      return this.minimumFieldOfView;
    }
    get [dartx.recommendedFieldOfView]() {
      return this.recommendedFieldOfView;
    }
    get [dartx.renderRect]() {
      return this.renderRect;
    }
  };
  dart.setSignature(html$.VREyeParameters, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VREyeParameters, [])}),
    fields: () => ({
      [dartx.currentFieldOfView]: html$.VRFieldOfView,
      [dartx.eyeTranslation]: html$.DomPoint,
      [dartx.maximumFieldOfView]: html$.VRFieldOfView,
      [dartx.minimumFieldOfView]: html$.VRFieldOfView,
      [dartx.recommendedFieldOfView]: html$.VRFieldOfView,
      [dartx.renderRect]: html$._DomRect
    })
  });
  dart.registerExtension(dart.global.VREyeParameters, html$.VREyeParameters);
  dart.defineExtensionNames([
    'downDegrees',
    'leftDegrees',
    'rightDegrees',
    'upDegrees'
  ]);
  html$.VRFieldOfView = class VRFieldOfView extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(fov) {
      if (fov === void 0) fov = null;
      if (fov != null) {
        let fov_1 = html_common.convertDartToNative_Dictionary(fov);
        return html$.VRFieldOfView._create_1(fov_1);
      }
      return html$.VRFieldOfView._create_2();
    }
    static _create_1(fov) {
      return new VRFieldOfView(fov);
    }
    static _create_2() {
      return new VRFieldOfView();
    }
    get [dartx.downDegrees]() {
      return this.downDegrees;
    }
    set [dartx.downDegrees](value) {
      this.downDegrees = value;
    }
    get [dartx.leftDegrees]() {
      return this.leftDegrees;
    }
    set [dartx.leftDegrees](value) {
      this.leftDegrees = value;
    }
    get [dartx.rightDegrees]() {
      return this.rightDegrees;
    }
    set [dartx.rightDegrees](value) {
      this.rightDegrees = value;
    }
    get [dartx.upDegrees]() {
      return this.upDegrees;
    }
    set [dartx.upDegrees](value) {
      this.upDegrees = value;
    }
  };
  dart.setSignature(html$.VRFieldOfView, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VRFieldOfView, []),
      new: dart.definiteFunctionType(html$.VRFieldOfView, [], [core.Map])
    }),
    fields: () => ({
      [dartx.downDegrees]: core.num,
      [dartx.leftDegrees]: core.num,
      [dartx.rightDegrees]: core.num,
      [dartx.upDegrees]: core.num
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.VRFieldOfView, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.VRFieldOfView, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.VRFieldOfView, html$.VRFieldOfView);
  dart.defineExtensionNames([
    'angularAcceleration',
    'angularVelocity',
    'linearAcceleration',
    'linearVelocity',
    'orientation',
    'position',
    'timeStamp'
  ]);
  html$.VRPositionState = class VRPositionState extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angularAcceleration]() {
      return this.angularAcceleration;
    }
    get [dartx.angularVelocity]() {
      return this.angularVelocity;
    }
    get [dartx.linearAcceleration]() {
      return this.linearAcceleration;
    }
    get [dartx.linearVelocity]() {
      return this.linearVelocity;
    }
    get [dartx.orientation]() {
      return this.orientation;
    }
    get [dartx.position]() {
      return this.position;
    }
    get [dartx.timeStamp]() {
      return this.timeStamp;
    }
  };
  dart.setSignature(html$.VRPositionState, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VRPositionState, [])}),
    fields: () => ({
      [dartx.angularAcceleration]: html$.DomPoint,
      [dartx.angularVelocity]: html$.DomPoint,
      [dartx.linearAcceleration]: html$.DomPoint,
      [dartx.linearVelocity]: html$.DomPoint,
      [dartx.orientation]: html$.DomPoint,
      [dartx.position]: html$.DomPoint,
      [dartx.timeStamp]: core.double
    })
  });
  dart.registerExtension(dart.global.VRPositionState, html$.VRPositionState);
  dart.defineExtensionNames([
    'badInput',
    'customError',
    'patternMismatch',
    'rangeOverflow',
    'rangeUnderflow',
    'stepMismatch',
    'tooLong',
    'tooShort',
    'typeMismatch',
    'valid',
    'valueMissing'
  ]);
  html$.ValidityState = class ValidityState extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.badInput]() {
      return this.badInput;
    }
    get [dartx.customError]() {
      return this.customError;
    }
    get [dartx.patternMismatch]() {
      return this.patternMismatch;
    }
    get [dartx.rangeOverflow]() {
      return this.rangeOverflow;
    }
    get [dartx.rangeUnderflow]() {
      return this.rangeUnderflow;
    }
    get [dartx.stepMismatch]() {
      return this.stepMismatch;
    }
    get [dartx.tooLong]() {
      return this.tooLong;
    }
    get [dartx.tooShort]() {
      return this.tooShort;
    }
    get [dartx.typeMismatch]() {
      return this.typeMismatch;
    }
    get [dartx.valid]() {
      return this.valid;
    }
    get [dartx.valueMissing]() {
      return this.valueMissing;
    }
  };
  dart.setSignature(html$.ValidityState, {
    constructors: () => ({_: dart.definiteFunctionType(html$.ValidityState, [])}),
    fields: () => ({
      [dartx.badInput]: core.bool,
      [dartx.customError]: core.bool,
      [dartx.patternMismatch]: core.bool,
      [dartx.rangeOverflow]: core.bool,
      [dartx.rangeUnderflow]: core.bool,
      [dartx.stepMismatch]: core.bool,
      [dartx.tooLong]: core.bool,
      [dartx.tooShort]: core.bool,
      [dartx.typeMismatch]: core.bool,
      [dartx.valid]: core.bool,
      [dartx.valueMissing]: core.bool
    })
  });
  dart.registerExtension(dart.global.ValidityState, html$.ValidityState);
  dart.defineExtensionNames([
    'getVideoPlaybackQuality',
    'enterFullscreen',
    'exitFullscreen',
    'height',
    'poster',
    'videoHeight',
    'videoWidth',
    'decodedFrameCount',
    'droppedFrameCount',
    'width'
  ]);
  html$.VideoElement = class VideoElement extends html$.MediaElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.VideoElement._check(html$.document[dartx.createElement]("video"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.poster] = null;
      this[dartx.videoHeight] = null;
      this[dartx.videoWidth] = null;
      this[dartx.decodedFrameCount] = null;
      this[dartx.droppedFrameCount] = null;
      this[dartx.width] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.poster]() {
      return this.poster;
    }
    set [dartx.poster](value) {
      this.poster = value;
    }
    get [dartx.videoHeight]() {
      return this.videoHeight;
    }
    get [dartx.videoWidth]() {
      return this.videoWidth;
    }
    get [dartx.decodedFrameCount]() {
      return this.webkitDecodedFrameCount;
    }
    get [dartx.droppedFrameCount]() {
      return this.webkitDroppedFrameCount;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    [dartx.getVideoPlaybackQuality](...args) {
      return this.getVideoPlaybackQuality.apply(this, args);
    }
    [dartx.enterFullscreen](...args) {
      return this.webkitEnterFullscreen.apply(this, args);
    }
    [dartx.exitFullscreen](...args) {
      return this.webkitExitFullscreen.apply(this, args);
    }
  };
  dart.defineNamedConstructor(html$.VideoElement, 'created');
  html$.VideoElement[dart.implements] = () => [html$.CanvasImageSource];
  dart.setSignature(html$.VideoElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VideoElement, []),
      new: dart.definiteFunctionType(html$.VideoElement, []),
      created: dart.definiteFunctionType(html$.VideoElement, [])
    }),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.poster]: core.String,
      [dartx.videoHeight]: core.int,
      [dartx.videoWidth]: core.int,
      [dartx.decodedFrameCount]: core.int,
      [dartx.droppedFrameCount]: core.int,
      [dartx.width]: core.int
    }),
    methods: () => ({
      [dartx.getVideoPlaybackQuality]: dart.definiteFunctionType(html$.VideoPlaybackQuality, []),
      [dartx.enterFullscreen]: dart.definiteFunctionType(dart.void, []),
      [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.HTMLVideoElement, html$.VideoElement);
  dart.defineExtensionNames([
    'corruptedVideoFrames',
    'creationTime',
    'droppedVideoFrames',
    'totalVideoFrames'
  ]);
  html$.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.corruptedVideoFrames]() {
      return this.corruptedVideoFrames;
    }
    get [dartx.creationTime]() {
      return this.creationTime;
    }
    get [dartx.droppedVideoFrames]() {
      return this.droppedVideoFrames;
    }
    get [dartx.totalVideoFrames]() {
      return this.totalVideoFrames;
    }
  };
  dart.setSignature(html$.VideoPlaybackQuality, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VideoPlaybackQuality, [])}),
    fields: () => ({
      [dartx.corruptedVideoFrames]: core.int,
      [dartx.creationTime]: core.double,
      [dartx.droppedVideoFrames]: core.int,
      [dartx.totalVideoFrames]: core.int
    })
  });
  dart.registerExtension(dart.global.VideoPlaybackQuality, html$.VideoPlaybackQuality);
  dart.defineExtensionNames([
    'id',
    'kind',
    'label',
    'language',
    'selected'
  ]);
  html$.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.id]() {
      return this.id;
    }
    get [dartx.kind]() {
      return this.kind;
    }
    get [dartx.label]() {
      return this.label;
    }
    get [dartx.language]() {
      return this.language;
    }
    get [dartx.selected]() {
      return this.selected;
    }
    set [dartx.selected](value) {
      this.selected = value;
    }
  };
  dart.setSignature(html$.VideoTrack, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrack, [])}),
    fields: () => ({
      [dartx.id]: core.String,
      [dartx.kind]: core.String,
      [dartx.label]: core.String,
      [dartx.language]: core.String,
      [dartx.selected]: core.bool
    })
  });
  dart.registerExtension(dart.global.VideoTrack, html$.VideoTrack);
  dart.defineExtensionNames([
    'getTrackById',
    'onChange',
    'length',
    'selectedIndex'
  ]);
  html$.VideoTrackList = class VideoTrackList extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.selectedIndex]() {
      return this.selectedIndex;
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.getTrackById](...args) {
      return this.getTrackById.apply(this, args);
    }
    get [dartx.onChange]() {
      return html$.VideoTrackList.changeEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.VideoTrackList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrackList, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [dartx.selectedIndex]: core.int
    }),
    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [__getter__]: dart.definiteFunctionType(html$.VideoTrack, [core.int]),
      [dartx.getTrackById]: dart.definiteFunctionType(html$.VideoTrack, [core.String])
    }),
    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
  });
  dart.defineLazy(html$.VideoTrackList, {
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    }
  });
  dart.registerExtension(dart.global.VideoTrackList, html$.VideoTrackList);
  html$.VoidCallback = dart.typedef('VoidCallback', () => dart.functionType(dart.void, []));
  dart.defineExtensionNames([
    'getCueAsHtml',
    'align',
    'line',
    'position',
    'regionId',
    'size',
    'snapToLines',
    'text',
    'vertical'
  ]);
  html$.VttCue = class VttCue extends html$.TextTrackCue {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(startTime, endTime, text) {
      return html$.VttCue._create_1(startTime, endTime, text);
    }
    static _create_1(startTime, endTime, text) {
      return new VTTCue(startTime, endTime, text);
    }
    get [dartx.align]() {
      return this.align;
    }
    set [dartx.align](value) {
      this.align = value;
    }
    get [dartx.line]() {
      return this.line;
    }
    set [dartx.line](value) {
      this.line = value;
    }
    get [dartx.position]() {
      return this.position;
    }
    set [dartx.position](value) {
      this.position = value;
    }
    get [dartx.regionId]() {
      return this.regionId;
    }
    set [dartx.regionId](value) {
      this.regionId = value;
    }
    get [dartx.size]() {
      return this.size;
    }
    set [dartx.size](value) {
      this.size = value;
    }
    get [dartx.snapToLines]() {
      return this.snapToLines;
    }
    set [dartx.snapToLines](value) {
      this.snapToLines = value;
    }
    get [dartx.text]() {
      return this.text;
    }
    set [dartx.text](value) {
      this.text = value;
    }
    get [dartx.vertical]() {
      return this.vertical;
    }
    set [dartx.vertical](value) {
      this.vertical = value;
    }
    [dartx.getCueAsHtml](...args) {
      return this.getCueAsHTML.apply(this, args);
    }
  };
  dart.setSignature(html$.VttCue, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VttCue, []),
      new: dart.definiteFunctionType(html$.VttCue, [core.num, core.num, core.String])
    }),
    fields: () => ({
      [dartx.align]: core.String,
      [dartx.line]: core.Object,
      [dartx.position]: core.Object,
      [dartx.regionId]: core.String,
      [dartx.size]: core.num,
      [dartx.snapToLines]: core.bool,
      [dartx.text]: core.String,
      [dartx.vertical]: core.String
    }),
    methods: () => ({[dartx.getCueAsHtml]: dart.definiteFunctionType(html$.DocumentFragment, [])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.VttCue, [dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.VTTCue, html$.VttCue);
  dart.defineExtensionNames([
    'height',
    'id',
    'regionAnchorX',
    'regionAnchorY',
    'scroll',
    'track',
    'viewportAnchorX',
    'viewportAnchorY',
    'width'
  ]);
  html$.VttRegion = class VttRegion extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.VttRegion._create_1();
    }
    static _create_1() {
      return new VTTRegion();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.id]() {
      return this.id;
    }
    set [dartx.id](value) {
      this.id = value;
    }
    get [dartx.regionAnchorX]() {
      return this.regionAnchorX;
    }
    set [dartx.regionAnchorX](value) {
      this.regionAnchorX = value;
    }
    get [dartx.regionAnchorY]() {
      return this.regionAnchorY;
    }
    set [dartx.regionAnchorY](value) {
      this.regionAnchorY = value;
    }
    get [dartx.scroll]() {
      return this.scroll;
    }
    set [dartx.scroll](value) {
      this.scroll = value;
    }
    get [dartx.track]() {
      return this.track;
    }
    get [dartx.viewportAnchorX]() {
      return this.viewportAnchorX;
    }
    set [dartx.viewportAnchorX](value) {
      this.viewportAnchorX = value;
    }
    get [dartx.viewportAnchorY]() {
      return this.viewportAnchorY;
    }
    set [dartx.viewportAnchorY](value) {
      this.viewportAnchorY = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
  };
  dart.setSignature(html$.VttRegion, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.VttRegion, []),
      new: dart.definiteFunctionType(html$.VttRegion, [])
    }),
    fields: () => ({
      [dartx.height]: core.int,
      [dartx.id]: core.String,
      [dartx.regionAnchorX]: core.num,
      [dartx.regionAnchorY]: core.num,
      [dartx.scroll]: core.String,
      [dartx.track]: html$.TextTrack,
      [dartx.viewportAnchorX]: core.num,
      [dartx.viewportAnchorY]: core.num,
      [dartx.width]: core.num
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.VttRegion, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.VTTRegion, html$.VttRegion);
  dart.defineExtensionNames([
    'getRegionById',
    'item',
    'length'
  ]);
  html$.VttRegionList = class VttRegionList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx.getRegionById](...args) {
      return this.getRegionById.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$.VttRegionList, {
    constructors: () => ({_: dart.definiteFunctionType(html$.VttRegionList, [])}),
    fields: () => ({[dartx.length]: core.int}),
    methods: () => ({
      [dartx.getRegionById]: dart.definiteFunctionType(html$.VttRegion, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.VttRegion, [core.int])
    })
  });
  dart.registerExtension(dart.global.VTTRegionList, html$.VttRegionList);
  dart.defineExtensionNames([
    'close',
    'send',
    'sendBlob',
    'sendByteBuffer',
    'sendString',
    'sendTypedData',
    'onClose',
    'onError',
    'onMessage',
    'onOpen',
    'binaryType',
    'bufferedAmount',
    'extensions',
    'protocol',
    'readyState',
    'url'
  ]);
  html$.WebSocket = class WebSocket extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(url, protocols) {
      if (protocols === void 0) protocols = null;
      if (protocols != null) {
        return html$.WebSocket._create_1(url, protocols);
      }
      return html$.WebSocket._create_2(url);
    }
    static _create_1(url, protocols) {
      return new WebSocket(url, protocols);
    }
    static _create_2(url) {
      return new WebSocket(url);
    }
    static get supported() {
      return typeof window.WebSocket != "undefined";
    }
    get [dartx.binaryType]() {
      return this.binaryType;
    }
    set [dartx.binaryType](value) {
      this.binaryType = value;
    }
    get [dartx.bufferedAmount]() {
      return this.bufferedAmount;
    }
    get [dartx.extensions]() {
      return this.extensions;
    }
    get [dartx.protocol]() {
      return this.protocol;
    }
    get [dartx.readyState]() {
      return this.readyState;
    }
    get [dartx.url]() {
      return this.url;
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.send](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendBlob](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendByteBuffer](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendString](...args) {
      return this.send.apply(this, args);
    }
    [dartx.sendTypedData](...args) {
      return this.send.apply(this, args);
    }
    get [dartx.onClose]() {
      return html$.WebSocket.closeEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.WebSocket.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.WebSocket.messageEvent.forTarget(this);
    }
    get [dartx.onOpen]() {
      return html$.WebSocket.openEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.WebSocket, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.WebSocket, []),
      new: dart.definiteFunctionType(html$.WebSocket, [core.String], [core.Object])
    }),
    fields: () => ({
      [dartx.binaryType]: core.String,
      [dartx.bufferedAmount]: core.int,
      [dartx.extensions]: core.String,
      [dartx.protocol]: core.String,
      [dartx.readyState]: core.int,
      [dartx.url]: core.String
    }),
    getters: () => ({
      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.CloseEvent), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    methods: () => ({
      [dartx.close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
      [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
      [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
    }),
    sfields: () => ({
      closeEvent: EventStreamProviderOfCloseEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      openEvent: EventStreamProviderOfEvent(),
      CLOSED: core.int,
      CLOSING: core.int,
      CONNECTING: core.int,
      OPEN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.WebSocket.CLOSED = 3;
  html$.WebSocket.CLOSING = 2;
  html$.WebSocket.CONNECTING = 0;
  html$.WebSocket.OPEN = 1;
  dart.defineLazy(html$.WebSocket, {
    get closeEvent() {
      return dart.const(new (EventStreamProviderOfCloseEvent())('close'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get openEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('open'));
    }
  });
  dart.registerExtension(dart.global.WebSocket, html$.WebSocket);
  const _deltaX = Symbol('_deltaX');
  const _deltaY = Symbol('_deltaY');
  const _wheelDelta = Symbol('_wheelDelta');
  const _wheelDeltaX = Symbol('_wheelDeltaX');
  const _hasInitMouseScrollEvent = Symbol('_hasInitMouseScrollEvent');
  const _initMouseScrollEvent = Symbol('_initMouseScrollEvent');
  const _hasInitWheelEvent = Symbol('_hasInitWheelEvent');
  const _initWheelEvent = Symbol('_initWheelEvent');
  dart.defineExtensionNames([
    'deltaY',
    'deltaX',
    'deltaMode',
    'deltaZ'
  ]);
  html$.WheelEvent = class WheelEvent extends html$.MouseEvent {
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let deltaX = opts && 'deltaX' in opts ? opts.deltaX : 0;
      let deltaY = opts && 'deltaY' in opts ? opts.deltaY : 0;
      let deltaZ = opts && 'deltaZ' in opts ? opts.deltaZ : 0;
      let deltaMode = opts && 'deltaMode' in opts ? opts.deltaMode : 0;
      let detail = opts && 'detail' in opts ? opts.detail : 0;
      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
      let button = opts && 'button' in opts ? opts.button : 0;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
      let options = dart.map({view: view, deltaMode: deltaMode, deltaX: deltaX, deltaY: deltaY, deltaZ: deltaZ, detail: detail, screenX: screenX, screenY: screenY, clientX: clientX, clientY: clientY, button: button, bubbles: canBubble, cancelable: cancelable, ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey, metaKey: metaKey, relatedTarget: relatedTarget}, core.String, core.Object);
      if (view == null) {
        view = html$.window;
      }
      return new WheelEvent(type, html_common.convertDartToNative_Dictionary(options));
    }
    static _(type, eventInitDict) {
      if (eventInitDict === void 0) eventInitDict = null;
      if (eventInitDict != null) {
        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
        return html$.WheelEvent._create_1(type, eventInitDict_1);
      }
      return html$.WheelEvent._create_2(type);
    }
    static _create_1(type, eventInitDict) {
      return new WheelEvent(type, eventInitDict);
    }
    static _create_2(type) {
      return new WheelEvent(type);
    }
    get [_deltaX]() {
      return this.deltaX;
    }
    get [_deltaY]() {
      return this.deltaY;
    }
    get [dartx.deltaZ]() {
      return this.deltaZ;
    }
    get [dartx.deltaY]() {
      if (this.deltaY !== undefined) {
        return this[_deltaY];
      }
      dart.throw(new core.UnsupportedError('deltaY is not supported'));
    }
    get [dartx.deltaX]() {
      if (this.deltaX !== undefined) {
        return this[_deltaX];
      }
      dart.throw(new core.UnsupportedError('deltaX is not supported'));
    }
    get [dartx.deltaMode]() {
      if (!!this.deltaMode) {
        return this.deltaMode;
      }
      return 0;
    }
    get [_wheelDelta]() {
      return this.wheelDelta;
    }
    get [_wheelDeltaX]() {
      return this.wheelDeltaX;
    }
    get [_detail]() {
      return this.detail;
    }
    get [_hasInitMouseScrollEvent]() {
      return !!this.initMouseScrollEvent;
    }
    [_initMouseScrollEvent](...args) {
      return this.initMouseScrollEvent.apply(this, args);
    }
    get [_hasInitWheelEvent]() {
      return !!this.initWheelEvent;
    }
    [_initWheelEvent](...args) {
      return this.initWheelEvent.apply(this, args);
    }
  };
  dart.setSignature(html$.WheelEvent, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.WheelEvent, [core.String], {view: html$.Window, deltaX: core.num, deltaY: core.num, deltaZ: core.num, deltaMode: core.int, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
      _: dart.definiteFunctionType(html$.WheelEvent, [core.String], [core.Map])
    }),
    fields: () => ({
      [_deltaX]: core.double,
      [_deltaY]: core.double,
      [dartx.deltaZ]: core.double
    }),
    getters: () => ({
      [dartx.deltaY]: dart.definiteFunctionType(core.num, []),
      [dartx.deltaX]: dart.definiteFunctionType(core.num, []),
      [dartx.deltaMode]: dart.definiteFunctionType(core.int, []),
      [_wheelDelta]: dart.definiteFunctionType(core.num, []),
      [_wheelDeltaX]: dart.definiteFunctionType(core.num, []),
      [_detail]: dart.definiteFunctionType(core.num, []),
      [_hasInitMouseScrollEvent]: dart.definiteFunctionType(core.bool, []),
      [_hasInitWheelEvent]: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      [_initMouseScrollEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget, core.int]),
      [_initWheelEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.int, html$.EventTarget, core.String, core.int, core.int, core.int, core.int])
    }),
    sfields: () => ({
      DOM_DELTA_LINE: core.int,
      DOM_DELTA_PAGE: core.int,
      DOM_DELTA_PIXEL: core.int
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  html$.WheelEvent.DOM_DELTA_LINE = 1;
  html$.WheelEvent.DOM_DELTA_PAGE = 2;
  html$.WheelEvent.DOM_DELTA_PIXEL = 0;
  dart.registerExtension(dart.global.WheelEvent, html$.WheelEvent);
  const _open2 = Symbol('_open2');
  const _open3 = Symbol('_open3');
  const _location = Symbol('_location');
  const _ensureRequestAnimationFrame = Symbol('_ensureRequestAnimationFrame');
  const _requestAnimationFrame = Symbol('_requestAnimationFrame');
  const _cancelAnimationFrame = Symbol('_cancelAnimationFrame');
  const _requestFileSystem = Symbol('_requestFileSystem');
  const _get_opener = Symbol('_get_opener');
  const _pageXOffset = Symbol('_pageXOffset');
  const _pageYOffset = Symbol('_pageYOffset');
  const _get_parent = Symbol('_get_parent');
  const _get_self = Symbol('_get_self');
  const _get_top = Symbol('_get_top');
  const __getter___1 = Symbol('__getter___1');
  const __getter___2 = Symbol('__getter___2');
  const _scroll_4 = Symbol('_scroll_4');
  const _scroll_5 = Symbol('_scroll_5');
  const _scrollBy_4 = Symbol('_scrollBy_4');
  const _scrollBy_5 = Symbol('_scrollBy_5');
  const _scrollTo_4 = Symbol('_scrollTo_4');
  const _scrollTo_5 = Symbol('_scrollTo_5');
  const __requestFileSystem = Symbol('__requestFileSystem');
  const _resolveLocalFileSystemUrl = Symbol('_resolveLocalFileSystemUrl');
  dart.defineExtensionNames([
    'animationFrame',
    'document',
    'open',
    'location',
    'location',
    'requestAnimationFrame',
    'cancelAnimationFrame',
    'indexedDB',
    'console',
    'requestFileSystem',
    'opener',
    'opener',
    'parent',
    'self',
    'top',
    'window',
    'alert',
    'close',
    'confirm',
    'fetch',
    'find',
    'getMatchedCssRules',
    'getSelection',
    'matchMedia',
    'moveBy',
    'openDatabase',
    'postMessage',
    'print',
    'resizeBy',
    'resizeTo',
    'scroll',
    'scrollBy',
    'scrollTo',
    'stop',
    'resolveLocalFileSystemUrl',
    'atob',
    'btoa',
    'onContentLoaded',
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDeviceMotion',
    'onDeviceOrientation',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onHashChange',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onLoadStart',
    'onMessage',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onOffline',
    'onOnline',
    'onPageHide',
    'onPageShow',
    'onPause',
    'onPlay',
    'onPlaying',
    'onPopState',
    'onProgress',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSearch',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onStorage',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onTouchCancel',
    'onTouchEnd',
    'onTouchMove',
    'onTouchStart',
    'onTransitionEnd',
    'onUnload',
    'onVolumeChange',
    'onWaiting',
    'onAnimationEnd',
    'onAnimationIteration',
    'onAnimationStart',
    'onBeforeUnload',
    'moveTo',
    'pageXOffset',
    'pageYOffset',
    'scrollX',
    'scrollY',
    'applicationCache',
    'caches',
    'closed',
    'crypto',
    'defaultStatus',
    'defaultstatus',
    'devicePixelRatio',
    'history',
    'innerHeight',
    'innerWidth',
    'localStorage',
    'locationbar',
    'menubar',
    'name',
    'navigator',
    'offscreenBuffering',
    'orientation',
    'outerHeight',
    'outerWidth',
    'performance',
    'screen',
    'screenLeft',
    'screenTop',
    'screenX',
    'screenY',
    'scrollbars',
    'sessionStorage',
    'speechSynthesis',
    'status',
    'statusbar',
    'styleMedia',
    'toolbar'
  ]);
  html$.Window = class Window extends html$.EventTarget {
    get [dartx.animationFrame]() {
      let completer = CompleterOfnum().sync();
      this[dartx.requestAnimationFrame](dart.fn(time => {
        completer.complete(time);
      }, numTovoid()));
      return completer.future;
    }
    get [dartx.document]() {
      return this.document;
    }
    [_open2](url, name) {
      return this.open(url, name);
    }
    [_open3](url, name, options) {
      return this.open(url, name, options);
    }
    [dartx.open](url, name, options) {
      if (options === void 0) options = null;
      if (options == null) {
        return html$._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
      } else {
        return html$._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
      }
    }
    get [dartx.location]() {
      return html$.Location._check(this[_location]);
    }
    set [dartx.location](value) {
      this[_location] = value;
    }
    get [_location]() {
      return this.location;
    }
    set [_location](value) {
      this.location = value;
    }
    [dartx.requestAnimationFrame](callback) {
      this[_ensureRequestAnimationFrame]();
      return this[_requestAnimationFrame](html$._wrapZone(core.num, dart.dynamic)(callback));
    }
    [dartx.cancelAnimationFrame](id) {
      this[_ensureRequestAnimationFrame]();
      this[_cancelAnimationFrame](id);
    }
    [_requestAnimationFrame](...args) {
      return this.requestAnimationFrame.apply(this, args);
    }
    [_cancelAnimationFrame](...args) {
      return this.cancelAnimationFrame.apply(this, args);
    }
    [_ensureRequestAnimationFrame]() {
      if (!!(this.requestAnimationFrame && this.cancelAnimationFrame)) return;
      (function($this) {
        var vendors = ['ms', 'moz', 'webkit', 'o'];
        for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
          $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
          $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
        }
        if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
        $this.requestAnimationFrame = function(callback) {
          return window.setTimeout(function() {
            callback(Date.now());
          }, 16);
        };
        $this.cancelAnimationFrame = function(id) {
          clearTimeout(id);
        };
      })(this);
    }
    get [dartx.indexedDB]() {
      return this.indexedDB || this.webkitIndexedDB || this.mozIndexedDB;
    }
    get [dartx.console]() {
      return html$.Console._safeConsole;
    }
    [dartx.requestFileSystem](size, opts) {
      let persistent = opts && 'persistent' in opts ? opts.persistent : false;
      return this[_requestFileSystem](dart.test(persistent) ? 1 : 0, size);
    }
    static get supportsPointConversions() {
      return html$.DomPoint.supported;
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.applicationCache]() {
      return this.applicationCache;
    }
    get [dartx.caches]() {
      return this.caches;
    }
    get [dartx.closed]() {
      return this.closed;
    }
    get [dartx.crypto]() {
      return this.crypto;
    }
    get [dartx.defaultStatus]() {
      return this.defaultStatus;
    }
    set [dartx.defaultStatus](value) {
      this.defaultStatus = value;
    }
    get [dartx.defaultstatus]() {
      return this.defaultstatus;
    }
    set [dartx.defaultstatus](value) {
      this.defaultstatus = value;
    }
    get [dartx.devicePixelRatio]() {
      return this.devicePixelRatio;
    }
    get [dartx.history]() {
      return this.history;
    }
    get [dartx.innerHeight]() {
      return this.innerHeight;
    }
    get [dartx.innerWidth]() {
      return this.innerWidth;
    }
    get [dartx.localStorage]() {
      return this.localStorage;
    }
    get [dartx.locationbar]() {
      return this.locationbar;
    }
    get [dartx.menubar]() {
      return this.menubar;
    }
    get [dartx.name]() {
      return this.name;
    }
    set [dartx.name](value) {
      this.name = value;
    }
    get [dartx.navigator]() {
      return this.navigator;
    }
    get [dartx.offscreenBuffering]() {
      return this.offscreenBuffering;
    }
    get [dartx.opener]() {
      return html$._convertNativeToDart_Window(this[_get_opener]);
    }
    get [_get_opener]() {
      return this.opener;
    }
    set [dartx.opener](value) {
      this.opener = value;
    }
    get [dartx.orientation]() {
      return this.orientation;
    }
    get [dartx.outerHeight]() {
      return this.outerHeight;
    }
    get [dartx.outerWidth]() {
      return this.outerWidth;
    }
    get [_pageXOffset]() {
      return this.pageXOffset;
    }
    get [_pageYOffset]() {
      return this.pageYOffset;
    }
    get [dartx.parent]() {
      return html$._convertNativeToDart_Window(this[_get_parent]);
    }
    get [_get_parent]() {
      return this.parent;
    }
    get [dartx.performance]() {
      return this.performance;
    }
    get [dartx.screen]() {
      return this.screen;
    }
    get [dartx.screenLeft]() {
      return this.screenLeft;
    }
    get [dartx.screenTop]() {
      return this.screenTop;
    }
    get [dartx.screenX]() {
      return this.screenX;
    }
    get [dartx.screenY]() {
      return this.screenY;
    }
    get [dartx.scrollbars]() {
      return this.scrollbars;
    }
    get [dartx.self]() {
      return html$._convertNativeToDart_Window(this[_get_self]);
    }
    get [_get_self]() {
      return this.self;
    }
    get [dartx.sessionStorage]() {
      return this.sessionStorage;
    }
    get [dartx.speechSynthesis]() {
      return this.speechSynthesis;
    }
    get [dartx.status]() {
      return this.status;
    }
    set [dartx.status](value) {
      this.status = value;
    }
    get [dartx.statusbar]() {
      return this.statusbar;
    }
    get [dartx.styleMedia]() {
      return this.styleMedia;
    }
    get [dartx.toolbar]() {
      return this.toolbar;
    }
    get [dartx.top]() {
      return html$._convertNativeToDart_Window(this[_get_top]);
    }
    get [_get_top]() {
      return this.top;
    }
    get [dartx.window]() {
      return html$._convertNativeToDart_Window(this[_get_window]);
    }
    get [_get_window]() {
      return this.window;
    }
    [__getter__](index_OR_name) {
      if (typeof index_OR_name == 'number') {
        return html$._convertNativeToDart_Window(this[__getter___1](index_OR_name));
      }
      if (typeof index_OR_name == 'string') {
        return html$._convertNativeToDart_Window(this[__getter___2](index_OR_name));
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [__getter___1](...args) {
      return this.__getter__.apply(this, args);
    }
    [__getter___2](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.alert](...args) {
      return this.alert.apply(this, args);
    }
    [dartx.close](...args) {
      return this.close.apply(this, args);
    }
    [dartx.confirm](...args) {
      return this.confirm.apply(this, args);
    }
    [dartx.fetch](input, init) {
      if (init === void 0) init = null;
      if (init != null) {
        let init_1 = html_common.convertDartToNative_Dictionary(init);
        return this[_fetch_1](input, init_1);
      }
      return this[_fetch_2](input);
    }
    [_fetch_1](...args) {
      return this.fetch.apply(this, args);
    }
    [_fetch_2](...args) {
      return this.fetch.apply(this, args);
    }
    [dartx.find](...args) {
      return this.find.apply(this, args);
    }
    [_getComputedStyle](...args) {
      return this.getComputedStyle.apply(this, args);
    }
    [dartx.getMatchedCssRules](...args) {
      return this.getMatchedCSSRules.apply(this, args);
    }
    [dartx.getSelection](...args) {
      return this.getSelection.apply(this, args);
    }
    [dartx.matchMedia](...args) {
      return this.matchMedia.apply(this, args);
    }
    [dartx.moveBy](...args) {
      return this.moveBy.apply(this, args);
    }
    [_moveTo](...args) {
      return this.moveTo.apply(this, args);
    }
    [dartx.openDatabase](...args) {
      return this.openDatabase.apply(this, args);
    }
    [dartx.postMessage](message, targetOrigin, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, targetOrigin, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1, targetOrigin);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.print](...args) {
      return this.print.apply(this, args);
    }
    [dartx.resizeBy](...args) {
      return this.resizeBy.apply(this, args);
    }
    [dartx.resizeTo](...args) {
      return this.resizeTo.apply(this, args);
    }
    [dartx.scroll](options_OR_x, y, scrollOptions) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (scrollOptions === void 0) scrollOptions = null;
      if (options_OR_x == null && y == null && scrollOptions == null) {
        this[_scroll_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scroll_2](options_1);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scroll_3](options_OR_x, y);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scroll_4](options_OR_x, y);
        return;
      }
      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
        this[_scroll_5](options_OR_x, y, scrollOptions_1);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scroll_1](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_2](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_3](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_4](...args) {
      return this.scroll.apply(this, args);
    }
    [_scroll_5](...args) {
      return this.scroll.apply(this, args);
    }
    [dartx.scrollBy](options_OR_x, y, scrollOptions) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (scrollOptions === void 0) scrollOptions = null;
      if (options_OR_x == null && y == null && scrollOptions == null) {
        this[_scrollBy_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollBy_2](options_1);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollBy_3](options_OR_x, y);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollBy_4](options_OR_x, y);
        return;
      }
      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
        this[_scrollBy_5](options_OR_x, y, scrollOptions_1);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollBy_1](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_2](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_3](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_4](...args) {
      return this.scrollBy.apply(this, args);
    }
    [_scrollBy_5](...args) {
      return this.scrollBy.apply(this, args);
    }
    [dartx.scrollTo](options_OR_x, y, scrollOptions) {
      if (options_OR_x === void 0) options_OR_x = null;
      if (y === void 0) y = null;
      if (scrollOptions === void 0) scrollOptions = null;
      if (options_OR_x == null && y == null && scrollOptions == null) {
        this[_scrollTo_1]();
        return;
      }
      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
        this[_scrollTo_2](options_1);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollTo_3](options_OR_x, y);
        return;
      }
      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
        this[_scrollTo_4](options_OR_x, y);
        return;
      }
      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
        this[_scrollTo_5](options_OR_x, y, scrollOptions_1);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_scrollTo_1](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_2](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_3](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_4](...args) {
      return this.scrollTo.apply(this, args);
    }
    [_scrollTo_5](...args) {
      return this.scrollTo.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    [__requestFileSystem](...args) {
      return this.webkitRequestFileSystem.apply(this, args);
    }
    [_requestFileSystem](type, size) {
      let completer = CompleterOfFileSystem().new();
      this[__requestFileSystem](type, size, dart.fn(value => {
        completer.complete(value);
      }, FileSystemTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [_resolveLocalFileSystemUrl](...args) {
      return this.webkitResolveLocalFileSystemURL.apply(this, args);
    }
    [dartx.resolveLocalFileSystemUrl](url) {
      let completer = CompleterOfEntry().new();
      this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
        completer.complete(value);
      }, EntryTovoid()), dart.fn(error => {
        completer.completeError(error);
      }, FileErrorTovoid()));
      return completer.future;
    }
    [dartx.atob](...args) {
      return this.atob.apply(this, args);
    }
    [dartx.btoa](...args) {
      return this.btoa.apply(this, args);
    }
    [_setInterval_String](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout_String](...args) {
      return this.setTimeout.apply(this, args);
    }
    [_clearInterval](...args) {
      return this.clearInterval.apply(this, args);
    }
    [_clearTimeout](...args) {
      return this.clearTimeout.apply(this, args);
    }
    [_setInterval](...args) {
      return this.setInterval.apply(this, args);
    }
    [_setTimeout](...args) {
      return this.setTimeout.apply(this, args);
    }
    get [dartx.onContentLoaded]() {
      return html$.Window.contentLoadedEvent.forTarget(this);
    }
    get [dartx.onAbort]() {
      return html$.Element.abortEvent.forTarget(this);
    }
    get [dartx.onBlur]() {
      return html$.Element.blurEvent.forTarget(this);
    }
    get [dartx.onCanPlay]() {
      return html$.Element.canPlayEvent.forTarget(this);
    }
    get [dartx.onCanPlayThrough]() {
      return html$.Element.canPlayThroughEvent.forTarget(this);
    }
    get [dartx.onChange]() {
      return html$.Element.changeEvent.forTarget(this);
    }
    get [dartx.onClick]() {
      return html$.Element.clickEvent.forTarget(this);
    }
    get [dartx.onContextMenu]() {
      return html$.Element.contextMenuEvent.forTarget(this);
    }
    get [dartx.onDoubleClick]() {
      return html$.Element.doubleClickEvent.forTarget(this);
    }
    get [dartx.onDeviceMotion]() {
      return html$.Window.deviceMotionEvent.forTarget(this);
    }
    get [dartx.onDeviceOrientation]() {
      return html$.Window.deviceOrientationEvent.forTarget(this);
    }
    get [dartx.onDrag]() {
      return html$.Element.dragEvent.forTarget(this);
    }
    get [dartx.onDragEnd]() {
      return html$.Element.dragEndEvent.forTarget(this);
    }
    get [dartx.onDragEnter]() {
      return html$.Element.dragEnterEvent.forTarget(this);
    }
    get [dartx.onDragLeave]() {
      return html$.Element.dragLeaveEvent.forTarget(this);
    }
    get [dartx.onDragOver]() {
      return html$.Element.dragOverEvent.forTarget(this);
    }
    get [dartx.onDragStart]() {
      return html$.Element.dragStartEvent.forTarget(this);
    }
    get [dartx.onDrop]() {
      return html$.Element.dropEvent.forTarget(this);
    }
    get [dartx.onDurationChange]() {
      return html$.Element.durationChangeEvent.forTarget(this);
    }
    get [dartx.onEmptied]() {
      return html$.Element.emptiedEvent.forTarget(this);
    }
    get [dartx.onEnded]() {
      return html$.Element.endedEvent.forTarget(this);
    }
    get [dartx.onError]() {
      return html$.Element.errorEvent.forTarget(this);
    }
    get [dartx.onFocus]() {
      return html$.Element.focusEvent.forTarget(this);
    }
    get [dartx.onHashChange]() {
      return html$.Window.hashChangeEvent.forTarget(this);
    }
    get [dartx.onInput]() {
      return html$.Element.inputEvent.forTarget(this);
    }
    get [dartx.onInvalid]() {
      return html$.Element.invalidEvent.forTarget(this);
    }
    get [dartx.onKeyDown]() {
      return html$.Element.keyDownEvent.forTarget(this);
    }
    get [dartx.onKeyPress]() {
      return html$.Element.keyPressEvent.forTarget(this);
    }
    get [dartx.onKeyUp]() {
      return html$.Element.keyUpEvent.forTarget(this);
    }
    get [dartx.onLoad]() {
      return html$.Element.loadEvent.forTarget(this);
    }
    get [dartx.onLoadedData]() {
      return html$.Element.loadedDataEvent.forTarget(this);
    }
    get [dartx.onLoadedMetadata]() {
      return html$.Element.loadedMetadataEvent.forTarget(this);
    }
    get [dartx.onLoadStart]() {
      return html$.Window.loadStartEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.Window.messageEvent.forTarget(this);
    }
    get [dartx.onMouseDown]() {
      return html$.Element.mouseDownEvent.forTarget(this);
    }
    get [dartx.onMouseEnter]() {
      return html$.Element.mouseEnterEvent.forTarget(this);
    }
    get [dartx.onMouseLeave]() {
      return html$.Element.mouseLeaveEvent.forTarget(this);
    }
    get [dartx.onMouseMove]() {
      return html$.Element.mouseMoveEvent.forTarget(this);
    }
    get [dartx.onMouseOut]() {
      return html$.Element.mouseOutEvent.forTarget(this);
    }
    get [dartx.onMouseOver]() {
      return html$.Element.mouseOverEvent.forTarget(this);
    }
    get [dartx.onMouseUp]() {
      return html$.Element.mouseUpEvent.forTarget(this);
    }
    get [dartx.onMouseWheel]() {
      return html$.Element.mouseWheelEvent.forTarget(this);
    }
    get [dartx.onOffline]() {
      return html$.Window.offlineEvent.forTarget(this);
    }
    get [dartx.onOnline]() {
      return html$.Window.onlineEvent.forTarget(this);
    }
    get [dartx.onPageHide]() {
      return html$.Window.pageHideEvent.forTarget(this);
    }
    get [dartx.onPageShow]() {
      return html$.Window.pageShowEvent.forTarget(this);
    }
    get [dartx.onPause]() {
      return html$.Element.pauseEvent.forTarget(this);
    }
    get [dartx.onPlay]() {
      return html$.Element.playEvent.forTarget(this);
    }
    get [dartx.onPlaying]() {
      return html$.Element.playingEvent.forTarget(this);
    }
    get [dartx.onPopState]() {
      return html$.Window.popStateEvent.forTarget(this);
    }
    get [dartx.onProgress]() {
      return html$.Window.progressEvent.forTarget(this);
    }
    get [dartx.onRateChange]() {
      return html$.Element.rateChangeEvent.forTarget(this);
    }
    get [dartx.onReset]() {
      return html$.Element.resetEvent.forTarget(this);
    }
    get [dartx.onResize]() {
      return html$.Element.resizeEvent.forTarget(this);
    }
    get [dartx.onScroll]() {
      return html$.Element.scrollEvent.forTarget(this);
    }
    get [dartx.onSearch]() {
      return html$.Element.searchEvent.forTarget(this);
    }
    get [dartx.onSeeked]() {
      return html$.Element.seekedEvent.forTarget(this);
    }
    get [dartx.onSeeking]() {
      return html$.Element.seekingEvent.forTarget(this);
    }
    get [dartx.onSelect]() {
      return html$.Element.selectEvent.forTarget(this);
    }
    get [dartx.onStalled]() {
      return html$.Element.stalledEvent.forTarget(this);
    }
    get [dartx.onStorage]() {
      return html$.Window.storageEvent.forTarget(this);
    }
    get [dartx.onSubmit]() {
      return html$.Element.submitEvent.forTarget(this);
    }
    get [dartx.onSuspend]() {
      return html$.Element.suspendEvent.forTarget(this);
    }
    get [dartx.onTimeUpdate]() {
      return html$.Element.timeUpdateEvent.forTarget(this);
    }
    get [dartx.onTouchCancel]() {
      return html$.Element.touchCancelEvent.forTarget(this);
    }
    get [dartx.onTouchEnd]() {
      return html$.Element.touchEndEvent.forTarget(this);
    }
    get [dartx.onTouchMove]() {
      return html$.Element.touchMoveEvent.forTarget(this);
    }
    get [dartx.onTouchStart]() {
      return html$.Element.touchStartEvent.forTarget(this);
    }
    get [dartx.onTransitionEnd]() {
      return html$.Element.transitionEndEvent.forTarget(this);
    }
    get [dartx.onUnload]() {
      return html$.Window.unloadEvent.forTarget(this);
    }
    get [dartx.onVolumeChange]() {
      return html$.Element.volumeChangeEvent.forTarget(this);
    }
    get [dartx.onWaiting]() {
      return html$.Element.waitingEvent.forTarget(this);
    }
    get [dartx.onAnimationEnd]() {
      return html$.Window.animationEndEvent.forTarget(this);
    }
    get [dartx.onAnimationIteration]() {
      return html$.Window.animationIterationEvent.forTarget(this);
    }
    get [dartx.onAnimationStart]() {
      return html$.Window.animationStartEvent.forTarget(this);
    }
    get [dartx.onBeforeUnload]() {
      return html$.Window.beforeUnloadEvent.forTarget(this);
    }
    [dartx.moveTo](p) {
      this[_moveTo](dart.asInt(p.x), dart.asInt(p.y));
    }
    get [dartx.pageXOffset]() {
      return this.pageXOffset[dartx.round]();
    }
    get [dartx.pageYOffset]() {
      return this.pageYOffset[dartx.round]();
    }
    get [dartx.scrollX]() {
      return "scrollX" in this ? this.scrollX[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollLeft];
    }
    get [dartx.scrollY]() {
      return "scrollY" in this ? this.scrollY[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollTop];
    }
  };
  html$.Window[dart.implements] = () => [html$.WindowEventHandlers, html$.WindowBase, html$.GlobalEventHandlers, html$._WindowTimers, html$.WindowBase64];
  dart.setSignature(html$.Window, {
    constructors: () => ({_: dart.definiteFunctionType(html$.Window, [])}),
    fields: () => ({
      [dartx.applicationCache]: html$.ApplicationCache,
      [dartx.caches]: html$.CacheStorage,
      [dartx.closed]: core.bool,
      [dartx.crypto]: html$.Crypto,
      [dartx.defaultStatus]: core.String,
      [dartx.defaultstatus]: core.String,
      [dartx.devicePixelRatio]: core.double,
      [dartx.history]: html$.History,
      [dartx.innerHeight]: core.int,
      [dartx.innerWidth]: core.int,
      [dartx.localStorage]: html$.Storage,
      [dartx.locationbar]: html$.BarProp,
      [dartx.menubar]: html$.BarProp,
      [dartx.name]: core.String,
      [dartx.navigator]: html$.Navigator,
      [dartx.offscreenBuffering]: core.bool,
      [_get_opener]: dart.dynamic,
      [dartx.orientation]: core.int,
      [dartx.outerHeight]: core.int,
      [dartx.outerWidth]: core.int,
      [_pageXOffset]: core.double,
      [_pageYOffset]: core.double,
      [_get_parent]: dart.dynamic,
      [dartx.performance]: html$.Performance,
      [dartx.screen]: html$.Screen,
      [dartx.screenLeft]: core.int,
      [dartx.screenTop]: core.int,
      [dartx.screenX]: core.int,
      [dartx.screenY]: core.int,
      [dartx.scrollbars]: html$.BarProp,
      [_get_self]: dart.dynamic,
      [dartx.sessionStorage]: html$.Storage,
      [dartx.speechSynthesis]: html$.SpeechSynthesis,
      [dartx.status]: core.String,
      [dartx.statusbar]: html$.BarProp,
      [dartx.styleMedia]: html$.StyleMedia,
      [dartx.toolbar]: html$.BarProp,
      [_get_top]: dart.dynamic,
      [_get_window]: dart.dynamic
    }),
    getters: () => ({
      [dartx.animationFrame]: dart.definiteFunctionType(async.Future$(core.num), []),
      [dartx.document]: dart.definiteFunctionType(html$.Document, []),
      [dartx.location]: dart.definiteFunctionType(html$.Location, []),
      [_location]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.indexedDB]: dart.definiteFunctionType(indexed_db.IdbFactory, []),
      [dartx.console]: dart.definiteFunctionType(html$.Console, []),
      [dartx.opener]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.parent]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.self]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.top]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
      [dartx.onContentLoaded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onDeviceMotion]: dart.definiteFunctionType(async.Stream$(html$.DeviceMotionEvent), []),
      [dartx.onDeviceOrientation]: dart.definiteFunctionType(async.Stream$(html$.DeviceOrientationEvent), []),
      [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onHashChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
      [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
      [dartx.onOffline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onOnline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPageHide]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPageShow]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onPopState]: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onStorage]: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
      [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
      [dartx.onTransitionEnd]: dart.definiteFunctionType(async.Stream$(html$.TransitionEvent), []),
      [dartx.onUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onAnimationEnd]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
      [dartx.onAnimationIteration]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
      [dartx.onAnimationStart]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
      [dartx.onBeforeUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.pageXOffset]: dart.definiteFunctionType(core.int, []),
      [dartx.pageYOffset]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollX]: dart.definiteFunctionType(core.int, []),
      [dartx.scrollY]: dart.definiteFunctionType(core.int, [])
    }),
    setters: () => ({
      [dartx.location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.opener]: dart.definiteFunctionType(dart.void, [html$.Window])
    }),
    methods: () => ({
      [_open2]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic]),
      [_open3]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.open]: dart.definiteFunctionType(html$.WindowBase, [core.String, core.String], [core.String]),
      [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
      [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
      [_requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
      [_cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
      [_ensureRequestAnimationFrame]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int], {persistent: core.bool}),
      [__getter__]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic]),
      [__getter___1]: dart.definiteFunctionType(dart.dynamic, [core.int]),
      [__getter___2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
      [dartx.alert]: dart.definiteFunctionType(dart.void, [], [core.String]),
      [dartx.close]: dart.definiteFunctionType(dart.void, []),
      [dartx.confirm]: dart.definiteFunctionType(core.bool, [], [core.String]),
      [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
      [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
      [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
      [dartx.find]: dart.definiteFunctionType(core.bool, [core.String, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool]),
      [_getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [html$.Element, core.String]),
      [dartx.getMatchedCssRules]: dart.definiteFunctionType(core.List$(html$.CssRule), [html$.Element, core.String]),
      [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, []),
      [dartx.matchMedia]: dart.definiteFunctionType(html$.MediaQueryList, [core.String]),
      [dartx.moveBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_moveTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.openDatabase]: dart.definiteFunctionType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [html$.DatabaseCallback]),
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      [dartx.print]: dart.definiteFunctionType(dart.void, []),
      [dartx.resizeBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.resizeTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
      [_scroll_1]: dart.definiteFunctionType(dart.void, []),
      [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_scroll_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_scroll_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
      [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_scrollBy_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_scrollBy_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
      [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
      [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [_scrollTo_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [_scrollTo_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, []),
      [__requestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int, html$._FileSystemCallback], [html$._ErrorCallback]),
      [_requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
      [_resolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
      [dartx.resolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
      [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
      [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
      [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
      [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [PointOfnum()])
    }),
    sfields: () => ({
      contentLoadedEvent: EventStreamProviderOfEvent(),
      deviceMotionEvent: EventStreamProviderOfDeviceMotionEvent(),
      deviceOrientationEvent: EventStreamProviderOfDeviceOrientationEvent(),
      hashChangeEvent: EventStreamProviderOfEvent(),
      loadStartEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      offlineEvent: EventStreamProviderOfEvent(),
      onlineEvent: EventStreamProviderOfEvent(),
      pageHideEvent: EventStreamProviderOfEvent(),
      pageShowEvent: EventStreamProviderOfEvent(),
      popStateEvent: EventStreamProviderOfPopStateEvent(),
      progressEvent: EventStreamProviderOfEvent(),
      storageEvent: EventStreamProviderOfStorageEvent(),
      unloadEvent: EventStreamProviderOfEvent(),
      animationEndEvent: EventStreamProviderOfAnimationEvent(),
      animationIterationEvent: EventStreamProviderOfAnimationEvent(),
      animationStartEvent: EventStreamProviderOfAnimationEvent(),
      PERSISTENT: core.int,
      TEMPORARY: core.int,
      beforeUnloadEvent: EventStreamProviderOfBeforeUnloadEvent()
    }),
    sgetters: () => ({supportsPointConversions: dart.definiteFunctionType(core.bool, [])})
  });
  html$.Window.PERSISTENT = 1;
  html$.Window.TEMPORARY = 0;
  dart.defineLazy(html$.Window, {
    get contentLoadedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('DOMContentLoaded'));
    },
    get deviceMotionEvent() {
      return dart.const(new (EventStreamProviderOfDeviceMotionEvent())('devicemotion'));
    },
    get deviceOrientationEvent() {
      return dart.const(new (EventStreamProviderOfDeviceOrientationEvent())('deviceorientation'));
    },
    get hashChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
    },
    get loadStartEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadstart'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get offlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('offline'));
    },
    get onlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('online'));
    },
    get pageHideEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pagehide'));
    },
    get pageShowEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pageshow'));
    },
    get popStateEvent() {
      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
    },
    get progressEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('progress'));
    },
    get storageEvent() {
      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
    },
    get unloadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unload'));
    },
    get animationEndEvent() {
      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationEnd'));
    },
    get animationIterationEvent() {
      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationIteration'));
    },
    get animationStartEvent() {
      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationStart'));
    },
    get beforeUnloadEvent() {
      return dart.const(new html$._BeforeUnloadEventStreamProvider('beforeunload'));
    }
  });
  dart.registerExtension(dart.global.Window, html$.Window);
  dart.registerExtension(dart.global.DOMWindow, html$.Window);
  const _returnValue = Symbol('_returnValue');
  html$._WrappedEvent = class _WrappedEvent extends core.Object {
    new(wrapped) {
      this.wrapped = wrapped;
      this[_selector] = null;
    }
    get bubbles() {
      return this.wrapped[dartx.bubbles];
    }
    get cancelable() {
      return this.wrapped[dartx.cancelable];
    }
    get currentTarget() {
      return this.wrapped[dartx.currentTarget];
    }
    get defaultPrevented() {
      return this.wrapped[dartx.defaultPrevented];
    }
    get eventPhase() {
      return this.wrapped[dartx.eventPhase];
    }
    get target() {
      return this.wrapped[dartx.target];
    }
    get timeStamp() {
      return this.wrapped[dartx.timeStamp];
    }
    get type() {
      return this.wrapped[dartx.type];
    }
    [_initEvent](eventTypeArg, canBubbleArg, cancelableArg) {
      dart.throw(new core.UnsupportedError('Cannot initialize this Event.'));
    }
    preventDefault() {
      this.wrapped[dartx.preventDefault]();
    }
    stopImmediatePropagation() {
      this.wrapped[dartx.stopImmediatePropagation]();
    }
    stopPropagation() {
      this.wrapped[dartx.stopPropagation]();
    }
    get matchingTarget() {
      if (this[_selector] == null) {
        dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
      }
      let currentTarget = html$.Element._check(this.currentTarget);
      let target = html$.Element._check(this.target);
      let matchedTarget = null;
      do {
        if (dart.test(target[dartx.matches](this[_selector]))) return target;
        target = target[dartx.parent];
      } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
      dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
    }
    get path() {
      return ListOfNode()._check(this.wrapped[dartx.path]);
    }
    get [_get_currentTarget]() {
      return this.wrapped[_get_currentTarget];
    }
    get [_get_target]() {
      return this.wrapped[_get_target];
    }
  };
  html$._WrappedEvent[dart.implements] = () => [html$.Event];
  dart.setSignature(html$._WrappedEvent, {
    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedEvent, [html$.Event])}),
    fields: () => ({
      wrapped: html$.Event,
      [_selector]: core.String
    }),
    getters: () => ({
      bubbles: dart.definiteFunctionType(core.bool, []),
      cancelable: dart.definiteFunctionType(core.bool, []),
      currentTarget: dart.definiteFunctionType(html$.EventTarget, []),
      defaultPrevented: dart.definiteFunctionType(core.bool, []),
      eventPhase: dart.definiteFunctionType(core.int, []),
      target: dart.definiteFunctionType(html$.EventTarget, []),
      timeStamp: dart.definiteFunctionType(core.int, []),
      type: dart.definiteFunctionType(core.String, []),
      matchingTarget: dart.definiteFunctionType(html$.Element, []),
      path: dart.definiteFunctionType(core.List$(html$.Node), []),
      [_get_currentTarget]: dart.definiteFunctionType(dart.dynamic, []),
      [_get_target]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({
      [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
      preventDefault: dart.definiteFunctionType(dart.void, []),
      stopImmediatePropagation: dart.definiteFunctionType(dart.void, []),
      stopPropagation: dart.definiteFunctionType(dart.void, [])
    })
  });
  html$._BeforeUnloadEvent = class _BeforeUnloadEvent extends html$._WrappedEvent {
    new(base) {
      this[_returnValue] = null;
      super.new(base);
    }
    get returnValue() {
      return this[_returnValue];
    }
    set returnValue(value) {
      this[_returnValue] = value;
      if ("returnValue" in this.wrapped) {
        this.wrapped.returnValue = value;
      }
    }
  };
  html$._BeforeUnloadEvent[dart.implements] = () => [html$.BeforeUnloadEvent];
  dart.setSignature(html$._BeforeUnloadEvent, {
    constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEvent, [html$.Event])}),
    fields: () => ({[_returnValue]: core.String}),
    getters: () => ({returnValue: dart.definiteFunctionType(core.String, [])}),
    setters: () => ({returnValue: dart.definiteFunctionType(dart.void, [core.String])})
  });
  const _eventType = Symbol('_eventType');
  html$._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
    new(eventType) {
      this[_eventType] = eventType;
    }
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      let stream = new (_EventStreamOfEvent())(e, this[_eventType], useCapture);
      let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
      stream.listen(dart.fn(event => {
        let wrapped = new html$._BeforeUnloadEvent(event);
        controller.add(wrapped);
      }, EventTovoid$()));
      return controller.stream;
    }
    getEventType(target) {
      return this[_eventType];
    }
    forElement(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
    }
    [_forElementList](e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      return new (_ElementListEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
    }
  };
  html$._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
  dart.setSignature(html$._BeforeUnloadEventStreamProvider, {
    constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEventStreamProvider, [core.String])}),
    fields: () => ({[_eventType]: core.String}),
    methods: () => ({
      forTarget: dart.definiteFunctionType(async.Stream$(html$.BeforeUnloadEvent), [html$.EventTarget], {useCapture: core.bool}),
      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
      forElement: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.Element], {useCapture: core.bool}),
      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [ElementListOfElement()], {useCapture: core.bool})
    })
  });
  html$.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.WindowBase64, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WindowBase64, [])})
  });
  dart.defineExtensionNames([
    'focus',
    'focused',
    'visibilityState'
  ]);
  html$.WindowClient = class WindowClient extends html$.Client {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.focused]() {
      return this.focused;
    }
    get [dartx.visibilityState]() {
      return this.visibilityState;
    }
    [dartx.focus](...args) {
      return this.focus.apply(this, args);
    }
  };
  dart.setSignature(html$.WindowClient, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WindowClient, [])}),
    fields: () => ({
      [dartx.focused]: core.bool,
      [dartx.visibilityState]: core.String
    }),
    methods: () => ({[dartx.focus]: dart.definiteFunctionType(async.Future, [])})
  });
  dart.registerExtension(dart.global.WindowClient, html$.WindowClient);
  dart.defineExtensionNames([
    'onHashChange',
    'onMessage',
    'onOffline',
    'onOnline',
    'onPopState',
    'onStorage',
    'onUnload'
  ]);
  html$.WindowEventHandlers = class WindowEventHandlers extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get onHashChange() {
      return html$.WindowEventHandlers.hashChangeEvent.forTarget(this);
    }
    get onMessage() {
      return html$.WindowEventHandlers.messageEvent.forTarget(this);
    }
    get onOffline() {
      return html$.WindowEventHandlers.offlineEvent.forTarget(this);
    }
    get onOnline() {
      return html$.WindowEventHandlers.onlineEvent.forTarget(this);
    }
    get onPopState() {
      return html$.WindowEventHandlers.popStateEvent.forTarget(this);
    }
    get onStorage() {
      return html$.WindowEventHandlers.storageEvent.forTarget(this);
    }
    get onUnload() {
      return html$.WindowEventHandlers.unloadEvent.forTarget(this);
    }
  };
  dart.setSignature(html$.WindowEventHandlers, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WindowEventHandlers, [])}),
    getters: () => ({
      onHashChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onMessage: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
      onOffline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onOnline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      onPopState: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
      onStorage: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
      onUnload: dart.definiteFunctionType(async.Stream$(html$.Event), [])
    }),
    sfields: () => ({
      hashChangeEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent(),
      offlineEvent: EventStreamProviderOfEvent(),
      onlineEvent: EventStreamProviderOfEvent(),
      popStateEvent: EventStreamProviderOfPopStateEvent(),
      storageEvent: EventStreamProviderOfStorageEvent(),
      unloadEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineExtensionMembers(html$.WindowEventHandlers, [
    'onHashChange',
    'onMessage',
    'onOffline',
    'onOnline',
    'onPopState',
    'onStorage',
    'onUnload'
  ]);
  dart.defineLazy(html$.WindowEventHandlers, {
    get hashChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    },
    get offlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('offline'));
    },
    get onlineEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('online'));
    },
    get popStateEvent() {
      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
    },
    get storageEvent() {
      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
    },
    get unloadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('unload'));
    }
  });
  dart.defineExtensionNames([
    'postMessage',
    'terminate',
    'onError',
    'onMessage'
  ]);
  html$.Worker = class Worker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(scriptUrl) {
      return html$.Worker._create_1(scriptUrl);
    }
    static _create_1(scriptUrl) {
      return new Worker(scriptUrl);
    }
    static get supported() {
      return typeof window.Worker != "undefined";
    }
    [dartx.postMessage](message, transfer) {
      if (transfer === void 0) transfer = null;
      if (transfer != null) {
        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
        this[_postMessage_1](message_1, transfer);
        return;
      }
      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
      this[_postMessage_2](message_1);
      return;
    }
    [_postMessage_1](...args) {
      return this.postMessage.apply(this, args);
    }
    [_postMessage_2](...args) {
      return this.postMessage.apply(this, args);
    }
    [dartx.terminate](...args) {
      return this.terminate.apply(this, args);
    }
    get [dartx.onError]() {
      return html$.Worker.errorEvent.forTarget(this);
    }
    get [dartx.onMessage]() {
      return html$.Worker.messageEvent.forTarget(this);
    }
  };
  html$.Worker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$.Worker, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.Worker, []),
      new: dart.definiteFunctionType(html$.Worker, [core.String])
    }),
    getters: () => ({
      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
    }),
    methods: () => ({
      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      errorEvent: EventStreamProviderOfEvent(),
      messageEvent: EventStreamProviderOfMessageEvent()
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.Worker, [dart.dynamic])}),
    names: ['_create_1']
  });
  dart.defineLazy(html$.Worker, {
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get messageEvent() {
      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
    }
  });
  dart.registerExtension(dart.global.Worker, html$.Worker);
  html$.WorkerConsole = class WorkerConsole extends html$.ConsoleBase {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.WorkerConsole, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerConsole, [])})
  });
  dart.registerExtension(dart.global.WorkerConsole, html$.WorkerConsole);
  dart.defineExtensionNames([
    'clearMarks',
    'clearMeasures',
    'getEntries',
    'getEntriesByName',
    'getEntriesByType',
    'mark',
    'measure',
    'now',
    'clearResourceTimings',
    'setResourceTimingBufferSize',
    'memory'
  ]);
  html$.WorkerPerformance = class WorkerPerformance extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.memory]() {
      return this.memory;
    }
    [dartx.clearMarks](...args) {
      return this.clearMarks.apply(this, args);
    }
    [dartx.clearMeasures](...args) {
      return this.clearMeasures.apply(this, args);
    }
    [dartx.getEntries](...args) {
      return this.getEntries.apply(this, args);
    }
    [dartx.getEntriesByName](...args) {
      return this.getEntriesByName.apply(this, args);
    }
    [dartx.getEntriesByType](...args) {
      return this.getEntriesByType.apply(this, args);
    }
    [dartx.mark](...args) {
      return this.mark.apply(this, args);
    }
    [dartx.measure](...args) {
      return this.measure.apply(this, args);
    }
    [dartx.now](...args) {
      return this.now.apply(this, args);
    }
    [dartx.clearResourceTimings](...args) {
      return this.webkitClearResourceTimings.apply(this, args);
    }
    [dartx.setResourceTimingBufferSize](...args) {
      return this.webkitSetResourceTimingBufferSize.apply(this, args);
    }
  };
  dart.setSignature(html$.WorkerPerformance, {
    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerPerformance, [])}),
    fields: () => ({[dartx.memory]: html$.MemoryInfo}),
    methods: () => ({
      [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
      [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
      [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
      [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
      [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.now]: dart.definiteFunctionType(core.double, []),
      [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
      [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
    })
  });
  dart.registerExtension(dart.global.WorkerPerformance, html$.WorkerPerformance);
  dart.defineExtensionNames([
    'createExpression',
    'createNSResolver',
    'evaluate'
  ]);
  html$.XPathEvaluator = class XPathEvaluator extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.XPathEvaluator._create_1();
    }
    static _create_1() {
      return new XPathEvaluator();
    }
    [dartx.createExpression](...args) {
      return this.createExpression.apply(this, args);
    }
    [dartx.createNSResolver](...args) {
      return this.createNSResolver.apply(this, args);
    }
    [dartx.evaluate](...args) {
      return this.evaluate.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathEvaluator, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.XPathEvaluator, []),
      new: dart.definiteFunctionType(html$.XPathEvaluator, [])
    }),
    methods: () => ({
      [dartx.createExpression]: dart.definiteFunctionType(html$.XPathExpression, [core.String, html$.XPathNSResolver]),
      [dartx.createNSResolver]: dart.definiteFunctionType(html$.XPathNSResolver, [html$.Node]),
      [dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [core.String, html$.Node, html$.XPathNSResolver], [core.int, core.Object])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.XPathEvaluator, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.XPathEvaluator, html$.XPathEvaluator);
  dart.defineExtensionNames([
    'evaluate'
  ]);
  html$.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.evaluate](...args) {
      return this.evaluate.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathExpression, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XPathExpression, [])}),
    methods: () => ({[dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [html$.Node], [core.int, core.Object])})
  });
  dart.registerExtension(dart.global.XPathExpression, html$.XPathExpression);
  dart.defineExtensionNames([
    'lookupNamespaceUri'
  ]);
  html$.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.lookupNamespaceUri](...args) {
      return this.lookupNamespaceURI.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathNSResolver, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XPathNSResolver, [])}),
    methods: () => ({[dartx.lookupNamespaceUri]: dart.definiteFunctionType(core.String, [core.String])})
  });
  dart.registerExtension(dart.global.XPathNSResolver, html$.XPathNSResolver);
  dart.defineExtensionNames([
    'iterateNext',
    'snapshotItem',
    'booleanValue',
    'invalidIteratorState',
    'numberValue',
    'resultType',
    'singleNodeValue',
    'snapshotLength',
    'stringValue'
  ]);
  html$.XPathResult = class XPathResult extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.booleanValue]() {
      return this.booleanValue;
    }
    get [dartx.invalidIteratorState]() {
      return this.invalidIteratorState;
    }
    get [dartx.numberValue]() {
      return this.numberValue;
    }
    get [dartx.resultType]() {
      return this.resultType;
    }
    get [dartx.singleNodeValue]() {
      return this.singleNodeValue;
    }
    get [dartx.snapshotLength]() {
      return this.snapshotLength;
    }
    get [dartx.stringValue]() {
      return this.stringValue;
    }
    [dartx.iterateNext](...args) {
      return this.iterateNext.apply(this, args);
    }
    [dartx.snapshotItem](...args) {
      return this.snapshotItem.apply(this, args);
    }
  };
  dart.setSignature(html$.XPathResult, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XPathResult, [])}),
    fields: () => ({
      [dartx.booleanValue]: core.bool,
      [dartx.invalidIteratorState]: core.bool,
      [dartx.numberValue]: core.double,
      [dartx.resultType]: core.int,
      [dartx.singleNodeValue]: html$.Node,
      [dartx.snapshotLength]: core.int,
      [dartx.stringValue]: core.String
    }),
    methods: () => ({
      [dartx.iterateNext]: dart.definiteFunctionType(html$.Node, []),
      [dartx.snapshotItem]: dart.definiteFunctionType(html$.Node, [core.int])
    }),
    sfields: () => ({
      ANY_TYPE: core.int,
      ANY_UNORDERED_NODE_TYPE: core.int,
      BOOLEAN_TYPE: core.int,
      FIRST_ORDERED_NODE_TYPE: core.int,
      NUMBER_TYPE: core.int,
      ORDERED_NODE_ITERATOR_TYPE: core.int,
      ORDERED_NODE_SNAPSHOT_TYPE: core.int,
      STRING_TYPE: core.int,
      UNORDERED_NODE_ITERATOR_TYPE: core.int,
      UNORDERED_NODE_SNAPSHOT_TYPE: core.int
    })
  });
  html$.XPathResult.ANY_TYPE = 0;
  html$.XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
  html$.XPathResult.BOOLEAN_TYPE = 3;
  html$.XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
  html$.XPathResult.NUMBER_TYPE = 1;
  html$.XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
  html$.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
  html$.XPathResult.STRING_TYPE = 2;
  html$.XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
  html$.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
  dart.registerExtension(dart.global.XPathResult, html$.XPathResult);
  html$.XmlDocument = class XmlDocument extends html$.Document {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$.XmlDocument, {
    constructors: () => ({_: dart.definiteFunctionType(html$.XmlDocument, [])})
  });
  dart.registerExtension(dart.global.XMLDocument, html$.XmlDocument);
  dart.defineExtensionNames([
    'serializeToString'
  ]);
  html$.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.XmlSerializer._create_1();
    }
    static _create_1() {
      return new XMLSerializer();
    }
    [dartx.serializeToString](...args) {
      return this.serializeToString.apply(this, args);
    }
  };
  dart.setSignature(html$.XmlSerializer, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.XmlSerializer, []),
      new: dart.definiteFunctionType(html$.XmlSerializer, [])
    }),
    methods: () => ({[dartx.serializeToString]: dart.definiteFunctionType(core.String, [html$.Node])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.XmlSerializer, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.XMLSerializer, html$.XmlSerializer);
  dart.defineExtensionNames([
    'clearParameters',
    'getParameter',
    'importStylesheet',
    'removeParameter',
    'reset',
    'setParameter',
    'transformToDocument',
    'transformToFragment'
  ]);
  html$.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$.XsltProcessor._create_1();
    }
    static _create_1() {
      return new XSLTProcessor();
    }
    static get supported() {
      return !!window.XSLTProcessor;
    }
    [dartx.clearParameters](...args) {
      return this.clearParameters.apply(this, args);
    }
    [dartx.getParameter](...args) {
      return this.getParameter.apply(this, args);
    }
    [dartx.importStylesheet](...args) {
      return this.importStylesheet.apply(this, args);
    }
    [dartx.removeParameter](...args) {
      return this.removeParameter.apply(this, args);
    }
    [dartx.reset](...args) {
      return this.reset.apply(this, args);
    }
    [dartx.setParameter](...args) {
      return this.setParameter.apply(this, args);
    }
    [dartx.transformToDocument](...args) {
      return this.transformToDocument.apply(this, args);
    }
    [dartx.transformToFragment](...args) {
      return this.transformToFragment.apply(this, args);
    }
  };
  dart.setSignature(html$.XsltProcessor, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$.XsltProcessor, []),
      new: dart.definiteFunctionType(html$.XsltProcessor, [])
    }),
    methods: () => ({
      [dartx.clearParameters]: dart.definiteFunctionType(dart.void, []),
      [dartx.getParameter]: dart.definiteFunctionType(core.String, [core.String, core.String]),
      [dartx.importStylesheet]: dart.definiteFunctionType(dart.void, [html$.Node]),
      [dartx.removeParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      [dartx.reset]: dart.definiteFunctionType(dart.void, []),
      [dartx.setParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
      [dartx.transformToDocument]: dart.definiteFunctionType(html$.Document, [html$.Node]),
      [dartx.transformToFragment]: dart.definiteFunctionType(html$.DocumentFragment, [html$.Node, html$.Document])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({_create_1: dart.definiteFunctionType(html$.XsltProcessor, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.XSLTProcessor, html$.XsltProcessor);
  dart.defineExtensionNames([
    'name',
    'value'
  ]);
  html$._Attr = class _Attr extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.setSignature(html$._Attr, {
    constructors: () => ({_: dart.definiteFunctionType(html$._Attr, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.value]: core.String
    })
  });
  dart.registerExtension(dart.global.Attr, html$._Attr);
  html$._Cache = class _Cache extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._Cache, {
    constructors: () => ({_: dart.definiteFunctionType(html$._Cache, [])})
  });
  dart.registerExtension(dart.global.Cache, html$._Cache);
  html$._CanvasPathMethods = class _CanvasPathMethods extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._CanvasPathMethods, {
    constructors: () => ({_: dart.definiteFunctionType(html$._CanvasPathMethods, [])})
  });
  dart.defineExtensionNames([
    'toString',
    '==',
    'hashCode',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft',
    'bottom',
    'height',
    'left',
    'right',
    'top',
    'width'
  ]);
  html$._ClientRect = class _ClientRect extends _interceptors.Interceptor {
    [dartx.toString]() {
      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
    }
    [dartx['==']](other) {
      if (!RectangleOfnum().is(other)) return false;
      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
    }
    get [dartx.hashCode]() {
      return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
    }
    [dartx.intersection](other) {
      let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
      let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      if (dart.notNull(x0) <= dart.notNull(x1)) {
        let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
        let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        if (dart.notNull(y0) <= dart.notNull(y1)) {
          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
        }
      }
      return null;
    }
    [dartx.intersects](other) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    [dartx.boundingBox](other) {
      let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
      let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
    }
    [dartx.containsRectangle](another) {
      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
    }
    [dartx.containsPoint](another) {
      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
    }
    get [dartx.topLeft]() {
      return new (PointOfnum())(this[dartx.left], this[dartx.top]);
    }
    get [dartx.topRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
    }
    get [dartx.bottomRight]() {
      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    get [dartx.bottomLeft]() {
      return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bottom]() {
      return this.bottom;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.left]() {
      return this.left;
    }
    get [dartx.right]() {
      return this.right;
    }
    get [dartx.top]() {
      return this.top;
    }
    get [dartx.width]() {
      return this.width;
    }
  };
  html$._ClientRect[dart.implements] = () => [RectangleOfnum()];
  dart.setSignature(html$._ClientRect, {
    constructors: () => ({_: dart.definiteFunctionType(html$._ClientRect, [])}),
    fields: () => ({
      [dartx.bottom]: core.double,
      [dartx.height]: core.double,
      [dartx.left]: core.double,
      [dartx.right]: core.double,
      [dartx.top]: core.double,
      [dartx.width]: core.double
    }),
    getters: () => ({
      [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
      [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), [])
    }),
    methods: () => ({
      [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
    })
  });
  dart.registerExtension(dart.global.ClientRect, html$._ClientRect);
  html$._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
    static combine(hash, value) {
      hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
      hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
      return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
    }
    static finish(hash) {
      hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
      hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
      return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
    }
    static hash2(a, b) {
      return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
    }
    static hash4(a, b, c, d) {
      return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
    }
  };
  dart.setSignature(html$._JenkinsSmiHash, {
    statics: () => ({
      combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
      finish: dart.definiteFunctionType(core.int, [core.int]),
      hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
      hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
    }),
    names: ['combine', 'finish', 'hash2', 'hash4']
  });
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._ClientRectList = class _ClientRectList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(math.Rectangle$(core.num)), html$.ImmutableListMixin$(math.Rectangle$(core.num))) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.item](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._ClientRectList[dart.implements] = () => [ListOfRectangleOfnum()];
  dart.setSignature(html$._ClientRectList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._ClientRectList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.last]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
      [dartx.single]: dart.definiteFunctionType(math.Rectangle$(core.num), [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, RectangleOfnum()]),
      [dartx.elementAt]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
      [__getter__]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
      [dartx.item]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int])
    })
  });
  dart.registerExtension(dart.global.ClientRectList, html$._ClientRectList);
  dart.registerExtension(dart.global.DOMRectList, html$._ClientRectList);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._CssRuleList = class _CssRuleList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.CssRule), html$.ImmutableListMixin$(html$.CssRule)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._CssRuleList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfCssRule()];
  dart.setSignature(html$._CssRuleList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._CssRuleList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.CssRule, []),
      [dartx.last]: dart.definiteFunctionType(html$.CssRule, []),
      [dartx.single]: dart.definiteFunctionType(html$.CssRule, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.CssRule, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.CssRule]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.CssRule, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.CssRule, [core.int])
    })
  });
  dart.registerExtension(dart.global.CSSRuleList, html$._CssRuleList);
  html$._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._DOMFileSystemSync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DOMFileSystemSync, [])})
  });
  dart.registerExtension(dart.global.DOMFileSystemSync, html$._DOMFileSystemSync);
  html$._EntrySync = class _EntrySync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._EntrySync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._EntrySync, [])})
  });
  dart.registerExtension(dart.global.EntrySync, html$._EntrySync);
  html$._DirectoryEntrySync = class _DirectoryEntrySync extends html$._EntrySync {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._DirectoryEntrySync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryEntrySync, [])})
  });
  dart.registerExtension(dart.global.DirectoryEntrySync, html$._DirectoryEntrySync);
  html$._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._DirectoryReaderSync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryReaderSync, [])})
  });
  dart.registerExtension(dart.global.DirectoryReaderSync, html$._DirectoryReaderSync);
  html$._DocumentType = class _DocumentType extends html$.Node {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._DocumentType[dart.implements] = () => [html$.ChildNode];
  dart.setSignature(html$._DocumentType, {
    constructors: () => ({_: dart.definiteFunctionType(html$._DocumentType, [])})
  });
  dart.registerExtension(dart.global.DocumentType, html$._DocumentType);
  dart.defineExtensionNames([
    'height',
    'height',
    'width',
    'width',
    'x',
    'x',
    'y',
    'y'
  ]);
  html$._DomRect = class _DomRect extends html$.DomRectReadOnly {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(x, y, width, height) {
      if (x === void 0) x = null;
      if (y === void 0) y = null;
      if (width === void 0) width = null;
      if (height === void 0) height = null;
      if (height != null) {
        return html$._DomRect._create_1(x, y, width, height);
      }
      if (width != null) {
        return html$._DomRect._create_2(x, y, width);
      }
      if (y != null) {
        return html$._DomRect._create_3(x, y);
      }
      if (x != null) {
        return html$._DomRect._create_4(x);
      }
      return html$._DomRect._create_5();
    }
    static _create_1(x, y, width, height) {
      return new DOMRect(x, y, width, height);
    }
    static _create_2(x, y, width) {
      return new DOMRect(x, y, width);
    }
    static _create_3(x, y) {
      return new DOMRect(x, y);
    }
    static _create_4(x) {
      return new DOMRect(x);
    }
    static _create_5() {
      return new DOMRect();
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(html$._DomRect, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._DomRect, []),
      new: dart.definiteFunctionType(html$._DomRect, [], [core.num, core.num, core.num, core.num])
    }),
    setters: () => ({
      [dartx.height]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.width]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.y]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic]),
      _create_4: dart.definiteFunctionType(html$._DomRect, [dart.dynamic]),
      _create_5: dart.definiteFunctionType(html$._DomRect, [])
    }),
    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
  });
  dart.registerExtension(dart.global.DOMRect, html$._DomRect);
  html$._FileEntrySync = class _FileEntrySync extends html$._EntrySync {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._FileEntrySync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._FileEntrySync, [])})
  });
  dart.registerExtension(dart.global.FileEntrySync, html$._FileEntrySync);
  html$._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return html$._FileReaderSync._create_1();
    }
    static _create_1() {
      return new FileReaderSync();
    }
  };
  dart.setSignature(html$._FileReaderSync, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._FileReaderSync, []),
      new: dart.definiteFunctionType(html$._FileReaderSync, [])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(html$._FileReaderSync, [])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.FileReaderSync, html$._FileReaderSync);
  html$._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._FileWriterSync, {
    constructors: () => ({_: dart.definiteFunctionType(html$._FileWriterSync, [])})
  });
  dart.registerExtension(dart.global.FileWriterSync, html$._FileWriterSync);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._GamepadList = class _GamepadList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Gamepad), html$.ImmutableListMixin$(html$.Gamepad)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._GamepadList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfGamepad()];
  dart.setSignature(html$._GamepadList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._GamepadList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Gamepad, []),
      [dartx.last]: dart.definiteFunctionType(html$.Gamepad, []),
      [dartx.single]: dart.definiteFunctionType(html$.Gamepad, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Gamepad]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.Gamepad, [core.int])
    })
  });
  dart.registerExtension(dart.global.GamepadList, html$._GamepadList);
  html$._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [_item](...args) {
      return this.item.apply(this, args);
    }
  };
  dart.setSignature(html$._HTMLAllCollection, {
    constructors: () => ({_: dart.definiteFunctionType(html$._HTMLAllCollection, [])}),
    methods: () => ({[_item]: dart.definiteFunctionType(html$.Element, [core.int])})
  });
  dart.registerExtension(dart.global.HTMLAllCollection, html$._HTMLAllCollection);
  html$._HTMLAppletElement = class _HTMLAppletElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLAppletElement, 'created');
  dart.setSignature(html$._HTMLAppletElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLAppletElement, []),
      created: dart.definiteFunctionType(html$._HTMLAppletElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLAppletElement, html$._HTMLAppletElement);
  html$._HTMLDirectoryElement = class _HTMLDirectoryElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLDirectoryElement, 'created');
  dart.setSignature(html$._HTMLDirectoryElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLDirectoryElement, []),
      created: dart.definiteFunctionType(html$._HTMLDirectoryElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLDirectoryElement, html$._HTMLDirectoryElement);
  html$._HTMLFontElement = class _HTMLFontElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLFontElement, 'created');
  dart.setSignature(html$._HTMLFontElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLFontElement, []),
      created: dart.definiteFunctionType(html$._HTMLFontElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFontElement, html$._HTMLFontElement);
  html$._HTMLFrameElement = class _HTMLFrameElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLFrameElement, 'created');
  dart.setSignature(html$._HTMLFrameElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLFrameElement, []),
      created: dart.definiteFunctionType(html$._HTMLFrameElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFrameElement, html$._HTMLFrameElement);
  html$._HTMLFrameSetElement = class _HTMLFrameSetElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLFrameSetElement, 'created');
  html$._HTMLFrameSetElement[dart.implements] = () => [html$.WindowEventHandlers];
  dart.setSignature(html$._HTMLFrameSetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLFrameSetElement, []),
      created: dart.definiteFunctionType(html$._HTMLFrameSetElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLFrameSetElement, html$._HTMLFrameSetElement);
  html$._HTMLMarqueeElement = class _HTMLMarqueeElement extends html$.HtmlElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(html$._HTMLMarqueeElement, 'created');
  dart.setSignature(html$._HTMLMarqueeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._HTMLMarqueeElement, []),
      created: dart.definiteFunctionType(html$._HTMLMarqueeElement, [])
    })
  });
  dart.registerExtension(dart.global.HTMLMarqueeElement, html$._HTMLMarqueeElement);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'getNamedItem',
    'getNamedItemNS',
    'item',
    'removeNamedItem',
    'removeNamedItemNS',
    'setNamedItem',
    'setNamedItemNS'
  ]);
  html$._NamedNodeMap = class _NamedNodeMap extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.getNamedItem](...args) {
      return this.getNamedItem.apply(this, args);
    }
    [dartx.getNamedItemNS](...args) {
      return this.getNamedItemNS.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
    [dartx.removeNamedItem](...args) {
      return this.removeNamedItem.apply(this, args);
    }
    [dartx.removeNamedItemNS](...args) {
      return this.removeNamedItemNS.apply(this, args);
    }
    [dartx.setNamedItem](...args) {
      return this.setNamedItem.apply(this, args);
    }
    [dartx.setNamedItemNS](...args) {
      return this.setNamedItemNS.apply(this, args);
    }
  };
  html$._NamedNodeMap[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
  dart.setSignature(html$._NamedNodeMap, {
    constructors: () => ({_: dart.definiteFunctionType(html$._NamedNodeMap, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.Node, []),
      [dartx.last]: dart.definiteFunctionType(html$.Node, []),
      [dartx.single]: dart.definiteFunctionType(html$.Node, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.Node, [core.int]),
      [dartx.getNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
      [dartx.getNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
      [dartx.item]: dart.definiteFunctionType(html$._Attr, [core.int]),
      [dartx.removeNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
      [dartx.removeNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
      [dartx.setNamedItem]: dart.definiteFunctionType(html$._Attr, [html$._Attr]),
      [dartx.setNamedItemNS]: dart.definiteFunctionType(html$._Attr, [html$._Attr])
    })
  });
  dart.registerExtension(dart.global.NamedNodeMap, html$._NamedNodeMap);
  dart.registerExtension(dart.global.MozNamedAttrMap, html$._NamedNodeMap);
  html$._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._PagePopupController, {
    constructors: () => ({_: dart.definiteFunctionType(html$._PagePopupController, [])})
  });
  dart.registerExtension(dart.global.PagePopupController, html$._PagePopupController);
  dart.defineExtensionNames([
    'clone',
    'context',
    'credentials',
    'headers',
    'mode',
    'referrer',
    'url'
  ]);
  html$._Request = class _Request extends html$.Body {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(input, requestInitDict) {
      if (requestInitDict === void 0) requestInitDict = null;
      if (requestInitDict != null) {
        let requestInitDict_1 = html_common.convertDartToNative_Dictionary(requestInitDict);
        return html$._Request._create_1(input, requestInitDict_1);
      }
      return html$._Request._create_2(input);
    }
    static _create_1(input, requestInitDict) {
      return new Request(input, requestInitDict);
    }
    static _create_2(input) {
      return new Request(input);
    }
    get [dartx.context]() {
      return this.context;
    }
    get [dartx.credentials]() {
      return this.credentials;
    }
    get [dartx.headers]() {
      return this.headers;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    get [dartx.referrer]() {
      return this.referrer;
    }
    get [dartx.url]() {
      return this.url;
    }
    [dartx.clone](...args) {
      return this.clone.apply(this, args);
    }
  };
  dart.setSignature(html$._Request, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._Request, []),
      new: dart.definiteFunctionType(html$._Request, [core.Object], [core.Map])
    }),
    fields: () => ({
      [dartx.context]: core.String,
      [dartx.credentials]: core.String,
      [dartx.headers]: html$.Headers,
      [dartx.mode]: core.String,
      [dartx.referrer]: core.String,
      [dartx.url]: core.String
    }),
    methods: () => ({[dartx.clone]: dart.definiteFunctionType(html$._Request, [])}),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._Request, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._Request, [dart.dynamic])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.Request, html$._Request);
  html$._Response = class _Response extends html$.Body {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(body, responseInitDict) {
      if (body === void 0) body = null;
      if (responseInitDict === void 0) responseInitDict = null;
      if (responseInitDict != null) {
        let responseInitDict_1 = html_common.convertDartToNative_Dictionary(responseInitDict);
        return html$._Response._create_1(body, responseInitDict_1);
      }
      if (body != null) {
        return html$._Response._create_2(body);
      }
      return html$._Response._create_3();
    }
    static _create_1(body, responseInitDict) {
      return new Response(body, responseInitDict);
    }
    static _create_2(body) {
      return new Response(body);
    }
    static _create_3() {
      return new Response();
    }
  };
  dart.setSignature(html$._Response, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._Response, []),
      new: dart.definiteFunctionType(html$._Response, [], [core.Object, core.Map])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._Response, [dart.dynamic, dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._Response, [dart.dynamic]),
      _create_3: dart.definiteFunctionType(html$._Response, [])
    }),
    names: ['_create_1', '_create_2', '_create_3']
  });
  dart.registerExtension(dart.global.Response, html$._Response);
  html$._ServiceWorker = class _ServiceWorker extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._ServiceWorker[dart.implements] = () => [html$.AbstractWorker];
  dart.setSignature(html$._ServiceWorker, {
    constructors: () => ({_: dart.definiteFunctionType(html$._ServiceWorker, [])})
  });
  dart.registerExtension(dart.global.ServiceWorker, html$._ServiceWorker);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechRecognitionResult), html$.ImmutableListMixin$(html$.SpeechRecognitionResult)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._SpeechRecognitionResultList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechRecognitionResult()];
  dart.setSignature(html$._SpeechRecognitionResultList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._SpeechRecognitionResultList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.SpeechRecognitionResult, []),
      [dartx.last]: dart.definiteFunctionType(html$.SpeechRecognitionResult, []),
      [dartx.single]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechRecognitionResult]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
      [dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int])
    })
  });
  dart.registerExtension(dart.global.SpeechRecognitionResultList, html$._SpeechRecognitionResultList);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  html$._StyleSheetList = class _StyleSheetList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.StyleSheet), html$.ImmutableListMixin$(html$.StyleSheet)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[index];
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__getter__](...args) {
      return this.__getter__.apply(this, args);
    }
    [dartx.item](...args) {
      return this.item.apply(this, args);
    }
  };
  html$._StyleSheetList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfStyleSheet()];
  dart.setSignature(html$._StyleSheetList, {
    constructors: () => ({_: dart.definiteFunctionType(html$._StyleSheetList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(html$.StyleSheet, []),
      [dartx.last]: dart.definiteFunctionType(html$.StyleSheet, []),
      [dartx.single]: dart.definiteFunctionType(html$.StyleSheet, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.StyleSheet]),
      [dartx.elementAt]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
      [__getter__]: dart.definiteFunctionType(html$.CssStyleSheet, [core.String]),
      [dartx.item]: dart.definiteFunctionType(html$.StyleSheet, [core.int])
    })
  });
  dart.registerExtension(dart.global.StyleSheetList, html$._StyleSheetList);
  html$._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._SubtleCrypto, {
    constructors: () => ({_: dart.definiteFunctionType(html$._SubtleCrypto, [])})
  });
  dart.registerExtension(dart.global.SubtleCrypto, html$._SubtleCrypto);
  html$._WebKitCSSMatrix = class _WebKitCSSMatrix extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(cssValue) {
      if (cssValue === void 0) cssValue = null;
      if (cssValue != null) {
        return html$._WebKitCSSMatrix._create_1(cssValue);
      }
      return html$._WebKitCSSMatrix._create_2();
    }
    static _create_1(cssValue) {
      return new WebKitCSSMatrix(cssValue);
    }
    static _create_2() {
      return new WebKitCSSMatrix();
    }
  };
  dart.setSignature(html$._WebKitCSSMatrix, {
    constructors: () => ({
      _: dart.definiteFunctionType(html$._WebKitCSSMatrix, []),
      new: dart.definiteFunctionType(html$._WebKitCSSMatrix, [], [core.String])
    }),
    statics: () => ({
      _create_1: dart.definiteFunctionType(html$._WebKitCSSMatrix, [dart.dynamic]),
      _create_2: dart.definiteFunctionType(html$._WebKitCSSMatrix, [])
    }),
    names: ['_create_1', '_create_2']
  });
  dart.registerExtension(dart.global.WebKitCSSMatrix, html$._WebKitCSSMatrix);
  html$._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._WindowTimers, {
    constructors: () => ({_: dart.definiteFunctionType(html$._WindowTimers, [])})
  });
  html$._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._WorkerLocation[dart.implements] = () => [html$.UrlUtilsReadOnly];
  dart.setSignature(html$._WorkerLocation, {
    constructors: () => ({_: dart.definiteFunctionType(html$._WorkerLocation, [])})
  });
  dart.registerExtension(dart.global.WorkerLocation, html$._WorkerLocation);
  html$._WorkerNavigator = class _WorkerNavigator extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  html$._WorkerNavigator[dart.implements] = () => [html$.NavigatorCpu, html$.NavigatorOnLine, html$.NavigatorID];
  dart.setSignature(html$._WorkerNavigator, {
    constructors: () => ({_: dart.definiteFunctionType(html$._WorkerNavigator, [])})
  });
  dart.registerExtension(dart.global.WorkerNavigator, html$._WorkerNavigator);
  html$._XMLHttpRequestProgressEvent = class _XMLHttpRequestProgressEvent extends html$.ProgressEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(html$._XMLHttpRequestProgressEvent, {
    constructors: () => ({_: dart.definiteFunctionType(html$._XMLHttpRequestProgressEvent, [])})
  });
  dart.registerExtension(dart.global.XMLHttpRequestProgressEvent, html$._XMLHttpRequestProgressEvent);
  const _matches = Symbol('_matches');
  html$._AttributeMap = class _AttributeMap extends core.Object {
    new(element) {
      this[_element$] = element;
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((k, v) => {
        this._set(k, v);
      }, StringAndStringTovoid$()));
    }
    containsValue(value) {
      for (let v of this.values) {
        if (dart.equals(value, v)) {
          return true;
        }
      }
      return false;
    }
    putIfAbsent(key, ifAbsent) {
      if (!dart.test(this[dartx.containsKey](key))) {
        this._set(key, ifAbsent());
      }
      return this._get(key);
    }
    clear() {
      for (let key of this.keys) {
        this[dartx.remove](key);
      }
    }
    forEach(f) {
      for (let key of this.keys) {
        let value = this._get(key);
        f(key, value);
      }
    }
    get keys() {
      let attributes = this[_element$][_attributes$];
      let keys = JSArrayOfString().of([]);
      for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
        let attr = html$._Attr._check(attributes[dartx._get](i));
        if (dart.test(this[_matches](attr))) {
          keys[dartx.add](attr[dartx.name]);
        }
      }
      return keys;
    }
    get values() {
      let attributes = this[_element$][_attributes$];
      let values = JSArrayOfString().of([]);
      for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
        let attr = html$._Attr._check(attributes[dartx._get](i));
        if (dart.test(this[_matches](attr))) {
          values[dartx.add](attr[dartx.value]);
        }
      }
      return values;
    }
    get isEmpty() {
      return this[dartx.length] == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
  };
  html$._AttributeMap[dart.implements] = () => [MapOfString$String()];
  dart.setSignature(html$._AttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._AttributeMap, [html$.Element])}),
    fields: () => ({[_element$]: html$.Element}),
    getters: () => ({
      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
      values: dart.definiteFunctionType(core.Iterable$(core.String), []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()])
    })
  });
  dart.defineExtensionMembers(html$._AttributeMap, [
    'addAll',
    'containsValue',
    'putIfAbsent',
    'clear',
    'forEach',
    'keys',
    'values',
    'isEmpty',
    'isNotEmpty'
  ]);
  html$._ElementAttributeMap = class _ElementAttributeMap extends html$._AttributeMap {
    new(element) {
      super.new(element);
    }
    containsKey(key) {
      return this[_element$][_hasAttribute](core.String._check(key));
    }
    _get(key) {
      return this[_element$][dartx.getAttribute](core.String._check(key));
    }
    _set(key, value) {
      this[_element$][dartx.setAttribute](key, value);
      return value;
    }
    remove(key) {
      let value = this[_element$][dartx.getAttribute](core.String._check(key));
      this[_element$][_removeAttribute](core.String._check(key));
      return value;
    }
    get length() {
      return this.keys[dartx.length];
    }
    [_matches](node) {
      return node[_namespaceUri] == null;
    }
  };
  dart.setSignature(html$._ElementAttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ElementAttributeMap, [html$.Element])}),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(core.String, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      remove: dart.definiteFunctionType(core.String, [core.Object]),
      [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
    })
  });
  dart.defineExtensionMembers(html$._ElementAttributeMap, [
    'containsKey',
    '_get',
    '_set',
    'remove',
    'length'
  ]);
  const _namespace = Symbol('_namespace');
  html$._NamespacedAttributeMap = class _NamespacedAttributeMap extends html$._AttributeMap {
    new(element, namespace) {
      this[_namespace] = namespace;
      super.new(element);
    }
    containsKey(key) {
      return this[_element$][_hasAttributeNS](this[_namespace], core.String._check(key));
    }
    _get(key) {
      return this[_element$][dartx.getAttributeNS](this[_namespace], core.String._check(key));
    }
    _set(key, value) {
      this[_element$][dartx.setAttributeNS](this[_namespace], key, value);
      return value;
    }
    remove(key) {
      let value = this._get(key);
      this[_element$][_removeAttributeNS](this[_namespace], core.String._check(key));
      return value;
    }
    get length() {
      return this.keys[dartx.length];
    }
    [_matches](node) {
      return node[_namespaceUri] == this[_namespace];
    }
  };
  dart.setSignature(html$._NamespacedAttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._NamespacedAttributeMap, [html$.Element, core.String])}),
    fields: () => ({[_namespace]: core.String}),
    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(core.String, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      remove: dart.definiteFunctionType(core.String, [core.Object]),
      [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
    })
  });
  dart.defineExtensionMembers(html$._NamespacedAttributeMap, [
    'containsKey',
    '_get',
    '_set',
    'remove',
    'length'
  ]);
  const _attr = Symbol('_attr');
  const _strip = Symbol('_strip');
  const _toHyphenedName = Symbol('_toHyphenedName');
  const _toCamelCase = Symbol('_toCamelCase');
  html$._DataAttributeMap = class _DataAttributeMap extends core.Object {
    new(attributes) {
      this[_attributes$] = attributes;
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((k, v) => {
        this._set(k, v);
      }, StringAndStringTovoid$()));
    }
    containsValue(value) {
      return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
    }
    containsKey(key) {
      return this[_attributes$][dartx.containsKey](this[_attr](core.String._check(key)));
    }
    _get(key) {
      return this[_attributes$][dartx._get](this[_attr](core.String._check(key)));
    }
    _set(key, value) {
      this[_attributes$][dartx._set](this[_attr](key), value);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      return this[_attributes$][dartx.putIfAbsent](this[_attr](key), ifAbsent);
    }
    remove(key) {
      return this[_attributes$][dartx.remove](this[_attr](core.String._check(key)));
    }
    clear() {
      for (let key of this.keys) {
        this.remove(key);
      }
    }
    forEach(f) {
      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
        if (dart.test(this[_matches](key))) {
          f(this[_strip](key), value);
        }
      }, StringAndStringTovoid$()));
    }
    get keys() {
      let keys = JSArrayOfString().of([]);
      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
        if (dart.test(this[_matches](key))) {
          keys[dartx.add](this[_strip](key));
        }
      }, StringAndStringTovoid$()));
      return keys;
    }
    get values() {
      let values = JSArrayOfString().of([]);
      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
        if (dart.test(this[_matches](key))) {
          values[dartx.add](value);
        }
      }, StringAndStringTovoid$()));
      return values;
    }
    get length() {
      return this.keys[dartx.length];
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return !dart.test(this.isEmpty);
    }
    [_attr](key) {
      return dart.str`data-${this[_toHyphenedName](key)}`;
    }
    [_matches](key) {
      return key[dartx.startsWith]('data-');
    }
    [_strip](key) {
      return this[_toCamelCase](key[dartx.substring](5));
    }
    [_toCamelCase](hyphenedName, opts) {
      let startUppercase = opts && 'startUppercase' in opts ? opts.startUppercase : false;
      let segments = hyphenedName[dartx.split]('-');
      let start = dart.test(startUppercase) ? 0 : 1;
      for (let i = start; i < dart.notNull(segments[dartx.length]); i++) {
        let segment = segments[dartx._get](i);
        if (dart.notNull(segment[dartx.length]) > 0) {
          segments[dartx._set](i, dart.str`${segment[dartx._get](0)[dartx.toUpperCase]()}${segment[dartx.substring](1)}`);
        }
      }
      return segments[dartx.join]('');
    }
    [_toHyphenedName](word) {
      let sb = new core.StringBuffer();
      for (let i = 0; i < dart.notNull(word[dartx.length]); i++) {
        let lower = word[dartx._get](i)[dartx.toLowerCase]();
        if (word[dartx._get](i) != lower && i > 0) sb.write('-');
        sb.write(lower);
      }
      return sb.toString();
    }
  };
  html$._DataAttributeMap[dart.implements] = () => [MapOfString$String()];
  dart.setSignature(html$._DataAttributeMap, {
    constructors: () => ({new: dart.definiteFunctionType(html$._DataAttributeMap, [MapOfString$String()])}),
    fields: () => ({[_attributes$]: MapOfString$String()}),
    getters: () => ({
      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
      values: dart.definiteFunctionType(core.Iterable$(core.String), []),
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(core.String, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
      putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
      remove: dart.definiteFunctionType(core.String, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
      [_attr]: dart.definiteFunctionType(core.String, [core.String]),
      [_matches]: dart.definiteFunctionType(core.bool, [core.String]),
      [_strip]: dart.definiteFunctionType(core.String, [core.String]),
      [_toCamelCase]: dart.definiteFunctionType(core.String, [core.String], {startUppercase: core.bool}),
      [_toHyphenedName]: dart.definiteFunctionType(core.String, [core.String])
    })
  });
  dart.defineExtensionMembers(html$._DataAttributeMap, [
    'addAll',
    'containsValue',
    'containsKey',
    '_get',
    '_set',
    'putIfAbsent',
    'remove',
    'clear',
    'forEach',
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  html$.CanvasImageSource = class CanvasImageSource extends core.Object {};
  html$.WindowBase = class WindowBase extends core.Object {};
  html$.WindowBase[dart.implements] = () => [html$.EventTarget];
  html$.LocationBase = class LocationBase extends core.Object {};
  html$.HistoryBase = class HistoryBase extends core.Object {};
  html$.CssClassSet = class CssClassSet extends core.Object {};
  html$.CssClassSet[dart.implements] = () => [SetOfString()];
  const _addOrSubtractToBoxModel = Symbol('_addOrSubtractToBoxModel');
  html$.CssRect = class CssRect extends core.Object {
    new(element) {
      this[_element$] = element;
    }
    set height(newHeight) {
      dart.throw(new core.UnsupportedError("Can only set height for content rect."));
    }
    set width(newWidth) {
      dart.throw(new core.UnsupportedError("Can only set width for content rect."));
    }
    [_addOrSubtractToBoxModel](dimensions, augmentingMeasurement) {
      let styles = this[_element$][dartx.getComputedStyle]();
      let val = 0;
      for (let measurement of dimensions) {
        if (augmentingMeasurement == html$._MARGIN) {
          val = dart.notNull(val) + dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${augmentingMeasurement}-${measurement}`)).value);
        }
        if (augmentingMeasurement == html$._CONTENT) {
          val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${html$._PADDING}-${measurement}`)).value);
        }
        if (augmentingMeasurement != html$._MARGIN) {
          val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`border-${measurement}-width`)).value);
        }
      }
      return val;
    }
    get right() {
      return dart.notNull(this.left) + dart.notNull(this.width);
    }
    get bottom() {
      return dart.notNull(this.top) + dart.notNull(this.height);
    }
    toString() {
      return dart.str`Rectangle (${this.left}, ${this.top}) ${this.width} x ${this.height}`;
    }
    ['=='](other) {
      if (!RectangleOfnum().is(other)) return false;
      return dart.equals(this.left, dart.dload(other, 'left')) && dart.equals(this.top, dart.dload(other, 'top')) && dart.equals(this.right, dart.dload(other, 'right')) && dart.equals(this.bottom, dart.dload(other, 'bottom'));
    }
    get hashCode() {
      return html$._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
    }
    intersection(other) {
      let x0 = math.max(core.num)(this.left, other[dartx.left]);
      let x1 = math.min(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      if (dart.notNull(x0) <= dart.notNull(x1)) {
        let y0 = math.max(core.num)(this.top, other[dartx.top]);
        let y1 = math.min(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
        if (dart.notNull(y0) <= dart.notNull(y1)) {
          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
        }
      }
      return null;
    }
    intersects(other) {
      return dart.notNull(this.left) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(this.top) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this.top) + dart.notNull(this.height);
    }
    boundingBox(other) {
      let right = math.max(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
      let bottom = math.max(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
      let left = math.min(core.num)(this.left, other[dartx.left]);
      let top = math.min(core.num)(this.top, other[dartx.top]);
      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
    }
    containsRectangle(another) {
      return dart.notNull(this.left) <= dart.notNull(another[dartx.left]) && dart.notNull(this.left) + dart.notNull(this.width) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this.top) <= dart.notNull(another[dartx.top]) && dart.notNull(this.top) + dart.notNull(this.height) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
    }
    containsPoint(another) {
      return dart.notNull(another.x) >= dart.notNull(this.left) && dart.notNull(another.x) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(another.y) >= dart.notNull(this.top) && dart.notNull(another.y) <= dart.notNull(this.top) + dart.notNull(this.height);
    }
    get topLeft() {
      return new (PointOfnum())(this.left, this.top);
    }
    get topRight() {
      return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), this.top);
    }
    get bottomRight() {
      return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(this.top) + dart.notNull(this.height));
    }
    get bottomLeft() {
      return new (PointOfnum())(this.left, dart.notNull(this.top) + dart.notNull(this.height));
    }
  };
  html$.CssRect[dart.implements] = () => [RectangleOfnum()];
  dart.setSignature(html$.CssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$.CssRect, [html$.Element])}),
    fields: () => ({[_element$]: html$.Element}),
    getters: () => ({
      right: dart.definiteFunctionType(core.num, []),
      bottom: dart.definiteFunctionType(core.num, []),
      topLeft: dart.definiteFunctionType(math.Point$(core.num), []),
      topRight: dart.definiteFunctionType(math.Point$(core.num), []),
      bottomRight: dart.definiteFunctionType(math.Point$(core.num), []),
      bottomLeft: dart.definiteFunctionType(math.Point$(core.num), [])
    }),
    setters: () => ({
      height: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      width: dart.definiteFunctionType(dart.void, [dart.dynamic])
    }),
    methods: () => ({
      [_addOrSubtractToBoxModel]: dart.definiteFunctionType(core.num, [ListOfString(), core.String]),
      intersection: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      boundingBox: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
      containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
      containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
    })
  });
  dart.defineExtensionMembers(html$.CssRect, [
    'toString',
    '==',
    'intersection',
    'intersects',
    'boundingBox',
    'containsRectangle',
    'containsPoint',
    'right',
    'bottom',
    'hashCode',
    'topLeft',
    'topRight',
    'bottomRight',
    'bottomLeft'
  ]);
  html$._ContentCssRect = class _ContentCssRect extends html$.CssRect {
    new(element) {
      super.new(element);
    }
    get height() {
      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._CONTENT));
    }
    get width() {
      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._CONTENT));
    }
    set height(newHeight) {
      if (html$.Dimension.is(newHeight)) {
        if (dart.test(dart.dsend(dart.dload(newHeight, 'value'), '<', 0))) newHeight = new html$.Dimension.px(0);
        this[_element$][dartx.style][dartx.height] = dart.toString(newHeight);
      } else if (typeof newHeight == 'number') {
        if (dart.test(dart.dsend(newHeight, '<', 0))) newHeight = 0;
        this[_element$][dartx.style][dartx.height] = dart.str`${newHeight}px`;
      } else {
        dart.throw(new core.ArgumentError("newHeight is not a Dimension or num"));
      }
    }
    set width(newWidth) {
      if (html$.Dimension.is(newWidth)) {
        if (dart.test(dart.dsend(dart.dload(newWidth, 'value'), '<', 0))) newWidth = new html$.Dimension.px(0);
        this[_element$][dartx.style][dartx.width] = dart.toString(newWidth);
      } else if (typeof newWidth == 'number') {
        if (dart.test(dart.dsend(newWidth, '<', 0))) newWidth = 0;
        this[_element$][dartx.style][dartx.width] = dart.str`${newWidth}px`;
      } else {
        dart.throw(new core.ArgumentError("newWidth is not a Dimension or num"));
      }
    }
    get left() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._CONTENT));
    }
    get top() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._CONTENT));
    }
  };
  dart.setSignature(html$._ContentCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssRect, [html$.Element])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._ContentCssRect, ['height', 'width', 'left', 'top']);
  const _elementList = Symbol('_elementList');
  html$._ContentCssListRect = class _ContentCssListRect extends html$._ContentCssRect {
    new(elementList) {
      this[_elementList] = null;
      super.new(elementList[dartx.first]);
      this[_elementList] = elementList;
    }
    set height(newHeight) {
      this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].height = newHeight, ElementTovoid$()));
    }
    get height() {
      return super.height;
    }
    set width(newWidth) {
      this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].width = newWidth, ElementTovoid$()));
    }
    get width() {
      return super.width;
    }
  };
  dart.setSignature(html$._ContentCssListRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssListRect, [ListOfElement()])}),
    fields: () => ({[_elementList]: ListOfElement()})
  });
  html$._PaddingCssRect = class _PaddingCssRect extends html$.CssRect {
    new(element) {
      super.new(html$.Element._check(element));
    }
    get height() {
      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._PADDING));
    }
    set height(value) {
      super.height = value;
    }
    get width() {
      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._PADDING));
    }
    set width(value) {
      super.width = value;
    }
    get left() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._PADDING));
    }
    get top() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._PADDING));
    }
  };
  dart.setSignature(html$._PaddingCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._PaddingCssRect, [dart.dynamic])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._PaddingCssRect, ['height', 'width', 'left', 'top']);
  html$._BorderCssRect = class _BorderCssRect extends html$.CssRect {
    new(element) {
      super.new(html$.Element._check(element));
    }
    get height() {
      return this[_element$][dartx.offsetHeight];
    }
    set height(value) {
      super.height = value;
    }
    get width() {
      return this[_element$][dartx.offsetWidth];
    }
    set width(value) {
      super.width = value;
    }
    get left() {
      return this[_element$][dartx.getBoundingClientRect]()[dartx.left];
    }
    get top() {
      return this[_element$][dartx.getBoundingClientRect]()[dartx.top];
    }
  };
  dart.setSignature(html$._BorderCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._BorderCssRect, [dart.dynamic])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._BorderCssRect, ['height', 'width', 'left', 'top']);
  html$._MarginCssRect = class _MarginCssRect extends html$.CssRect {
    new(element) {
      super.new(html$.Element._check(element));
    }
    get height() {
      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._MARGIN));
    }
    set height(value) {
      super.height = value;
    }
    get width() {
      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._MARGIN));
    }
    set width(value) {
      super.width = value;
    }
    get left() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._MARGIN));
    }
    get top() {
      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._MARGIN));
    }
  };
  dart.setSignature(html$._MarginCssRect, {
    constructors: () => ({new: dart.definiteFunctionType(html$._MarginCssRect, [dart.dynamic])}),
    getters: () => ({
      height: dart.definiteFunctionType(core.num, []),
      width: dart.definiteFunctionType(core.num, []),
      left: dart.definiteFunctionType(core.num, []),
      top: dart.definiteFunctionType(core.num, [])
    })
  });
  dart.defineExtensionMembers(html$._MarginCssRect, ['height', 'width', 'left', 'top']);
  dart.defineLazy(html$, {
    get _HEIGHT() {
      return JSArrayOfString().of(['top', 'bottom']);
    }
  });
  dart.defineLazy(html$, {
    get _WIDTH() {
      return JSArrayOfString().of(['right', 'left']);
    }
  });
  html$._CONTENT = 'content';
  html$._PADDING = 'padding';
  html$._MARGIN = 'margin';
  const _sets = Symbol('_sets');
  const _validateToken = Symbol('_validateToken');
  html_common.CssClassSetImpl = class CssClassSetImpl extends core.Object {
    [_validateToken](value) {
      if (dart.test(html_common.CssClassSetImpl._validTokenRE.hasMatch(value))) return value;
      dart.throw(new core.ArgumentError.value(value, 'value', 'Not a valid class token'));
    }
    toString() {
      return this.readClasses().join(' ');
    }
    toggle(value, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      this[_validateToken](value);
      let s = this.readClasses();
      let result = false;
      if (shouldAdd == null) shouldAdd = !dart.test(s.contains(value));
      if (dart.test(shouldAdd)) {
        s.add(value);
        result = true;
      } else {
        s.remove(value);
      }
      this.writeClasses(s);
      return result;
    }
    get frozen() {
      return false;
    }
    get iterator() {
      return this.readClasses().iterator;
    }
    [Symbol.iterator]() {
      return new dart.JsIterator(this.iterator);
    }
    forEach(f) {
      this.readClasses().forEach(f);
    }
    join(separator) {
      if (separator === void 0) separator = "";
      return this.readClasses().join(separator);
    }
    map(T) {
      return f => {
        return this.readClasses().map(T)(f);
      };
    }
    where(f) {
      return this.readClasses().where(f);
    }
    expand(T) {
      return f => {
        return this.readClasses().expand(T)(f);
      };
    }
    every(f) {
      return this.readClasses().every(f);
    }
    any(f) {
      return this.readClasses().any(f);
    }
    get isEmpty() {
      return this.readClasses().isEmpty;
    }
    get isNotEmpty() {
      return this.readClasses().isNotEmpty;
    }
    get length() {
      return this.readClasses().length;
    }
    reduce(combine) {
      return this.readClasses().reduce(combine);
    }
    fold(T) {
      return (initialValue, combine) => {
        return this.readClasses().fold(T)(initialValue, combine);
      };
    }
    contains(value) {
      if (!(typeof value == 'string')) return false;
      this[_validateToken](core.String._check(value));
      return this.readClasses().contains(value);
    }
    lookup(value) {
      return core.String._check(dart.test(this.contains(value)) ? value : null);
    }
    add(value) {
      this[_validateToken](value);
      return core.bool._check(this.modify(dart.fn(s => s.add(value), SetOfStringTobool())));
    }
    remove(value) {
      this[_validateToken](core.String._check(value));
      if (!(typeof value == 'string')) return false;
      let s = this.readClasses();
      let result = s.remove(value);
      this.writeClasses(s);
      return result;
    }
    addAll(iterable) {
      this.modify(dart.fn(s => s.addAll(iterable[dartx.map](core.String)(dart.bind(this, _validateToken))), SetOfStringTovoid()));
    }
    removeAll(iterable) {
      this.modify(dart.fn(s => s.removeAll(iterable), SetOfStringTovoid()));
    }
    toggleAll(iterable, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      iterable[dartx.forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool$()));
    }
    retainAll(iterable) {
      this.modify(dart.fn(s => s.retainAll(iterable), SetOfStringTovoid()));
    }
    removeWhere(test) {
      this.modify(dart.fn(s => s.removeWhere(test), SetOfStringTovoid()));
    }
    retainWhere(test) {
      this.modify(dart.fn(s => s.retainWhere(test), SetOfStringTovoid()));
    }
    containsAll(collection) {
      return this.readClasses().containsAll(collection);
    }
    intersection(other) {
      return this.readClasses().intersection(other);
    }
    union(other) {
      return this.readClasses().union(other);
    }
    difference(other) {
      return this.readClasses().difference(other);
    }
    get first() {
      return this.readClasses().first;
    }
    get last() {
      return this.readClasses().last;
    }
    get single() {
      return this.readClasses().single;
    }
    toList(opts) {
      let growable = opts && 'growable' in opts ? opts.growable : true;
      return this.readClasses().toList({growable: growable});
    }
    toSet() {
      return this.readClasses().toSet();
    }
    take(n) {
      return this.readClasses().take(n);
    }
    takeWhile(test) {
      return this.readClasses().takeWhile(test);
    }
    skip(n) {
      return this.readClasses().skip(n);
    }
    skipWhile(test) {
      return this.readClasses().skipWhile(test);
    }
    firstWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      return this.readClasses().firstWhere(test, {orElse: orElse});
    }
    lastWhere(test, opts) {
      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
      return this.readClasses().lastWhere(test, {orElse: orElse});
    }
    singleWhere(test) {
      return this.readClasses().singleWhere(test);
    }
    elementAt(index) {
      return this.readClasses().elementAt(index);
    }
    clear() {
      this.modify(dart.fn(s => s.clear(), SetOfStringTovoid()));
    }
    modify(f) {
      let s = this.readClasses();
      let ret = f(s);
      this.writeClasses(s);
      return ret;
    }
  };
  html_common.CssClassSetImpl[dart.implements] = () => [html$.CssClassSet];
  dart.setSignature(html_common.CssClassSetImpl, {
    getters: () => ({
      frozen: dart.definiteFunctionType(core.bool, []),
      iterator: dart.definiteFunctionType(core.Iterator$(core.String), []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, []),
      length: dart.definiteFunctionType(core.int, []),
      first: dart.definiteFunctionType(core.String, []),
      last: dart.definiteFunctionType(core.String, []),
      single: dart.definiteFunctionType(core.String, [])
    }),
    methods: () => ({
      [_validateToken]: dart.definiteFunctionType(core.String, [core.String]),
      toggle: dart.definiteFunctionType(core.bool, [core.String], [core.bool]),
      forEach: dart.definiteFunctionType(dart.void, [StringTovoid()]),
      join: dart.definiteFunctionType(core.String, [], [core.String]),
      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [core.String])]]),
      where: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [core.String])]]),
      every: dart.definiteFunctionType(core.bool, [StringTobool()]),
      any: dart.definiteFunctionType(core.bool, [StringTobool()]),
      reduce: dart.definiteFunctionType(core.String, [StringAndStringToString()]),
      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, core.String])]]),
      contains: dart.definiteFunctionType(core.bool, [core.Object]),
      lookup: dart.definiteFunctionType(core.String, [core.Object]),
      add: dart.definiteFunctionType(core.bool, [core.String]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfString()]),
      removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
      toggleAll: dart.definiteFunctionType(dart.void, [IterableOfString()], [core.bool]),
      retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
      removeWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
      retainWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
      containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
      intersection: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
      union: dart.definiteFunctionType(core.Set$(core.String), [SetOfString()]),
      difference: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
      toList: dart.definiteFunctionType(core.List$(core.String), [], {growable: core.bool}),
      toSet: dart.definiteFunctionType(core.Set$(core.String), []),
      take: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
      takeWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
      skip: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
      skipWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
      firstWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
      lastWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
      singleWhere: dart.definiteFunctionType(core.String, [StringTobool()]),
      elementAt: dart.definiteFunctionType(core.String, [core.int]),
      clear: dart.definiteFunctionType(dart.void, []),
      modify: dart.definiteFunctionType(dart.dynamic, [SetOfStringTodynamic()])
    }),
    sfields: () => ({_validTokenRE: core.RegExp})
  });
  dart.defineExtensionMembers(html_common.CssClassSetImpl, [
    'toString',
    'forEach',
    'join',
    'map',
    'where',
    'expand',
    'every',
    'any',
    'reduce',
    'fold',
    'contains',
    'toList',
    'toSet',
    'take',
    'takeWhile',
    'skip',
    'skipWhile',
    'firstWhere',
    'lastWhere',
    'singleWhere',
    'elementAt',
    'iterator',
    'isEmpty',
    'isNotEmpty',
    'length',
    'first',
    'last',
    'single'
  ]);
  dart.defineLazy(html_common.CssClassSetImpl, {
    get _validTokenRE() {
      return core.RegExp.new('^\\S+$');
    }
  });
  html$._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
    static new(elements) {
      return new html$._MultiElementCssClassSet._(elements, ListOfCssClassSetImpl()._check(elements[dartx.map](html$.CssClassSet)(dart.fn(e => e[dartx.classes], ElementToCssClassSet()))[dartx.toList]()));
    }
    _(elementIterable, sets) {
      this[_elementIterable] = elementIterable;
      this[_sets] = sets;
    }
    readClasses() {
      let s = LinkedHashSetOfString().new();
      this[_sets][dartx.forEach](dart.fn(e => s.addAll(e.readClasses()), CssClassSetImplTovoid()));
      return s;
    }
    writeClasses(s) {
      let classes = s.join(' ');
      for (let e of this[_elementIterable]) {
        e[dartx.className] = classes;
      }
    }
    modify(f) {
      this[_sets][dartx.forEach](dart.fn(e => e.modify(f), CssClassSetImplTovoid()));
    }
    toggle(value, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.toggle(value, shouldAdd)) || dart.test(changed), boolAndCssClassSetImplTobool()));
    }
    remove(value) {
      return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.remove(value)) || dart.test(changed), boolAndCssClassSetImplTobool()));
    }
  };
  dart.defineNamedConstructor(html$._MultiElementCssClassSet, '_');
  dart.setSignature(html$._MultiElementCssClassSet, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement()]),
      _: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement(), ListOfCssClassSetImpl()])
    }),
    fields: () => ({
      [_elementIterable]: IterableOfElement(),
      [_sets]: ListOfCssClassSetImpl()
    }),
    methods: () => ({
      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
      writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
    })
  });
  html$._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
    new(element) {
      this[_element$] = element;
    }
    readClasses() {
      let s = LinkedHashSetOfString().new();
      let classname = this[_element$][dartx.className];
      for (let name of classname[dartx.split](' ')) {
        let trimmed = name[dartx.trim]();
        if (!dart.test(trimmed[dartx.isEmpty])) {
          s.add(trimmed);
        }
      }
      return s;
    }
    writeClasses(s) {
      this[_element$][dartx.className] = s.join(' ');
    }
    get length() {
      return html$._ElementCssClassSet._classListLength(html$._ElementCssClassSet._classListOf(this[_element$]));
    }
    get isEmpty() {
      return this.length == 0;
    }
    get isNotEmpty() {
      return this.length != 0;
    }
    clear() {
      this[_element$][dartx.className] = '';
    }
    contains(value) {
      return html$._ElementCssClassSet._contains(this[_element$], value);
    }
    add(value) {
      return html$._ElementCssClassSet._add(this[_element$], value);
    }
    remove(value) {
      return typeof value == 'string' && dart.test(html$._ElementCssClassSet._remove(this[_element$], value));
    }
    toggle(value, shouldAdd) {
      if (shouldAdd === void 0) shouldAdd = null;
      return html$._ElementCssClassSet._toggle(this[_element$], value, shouldAdd);
    }
    addAll(iterable) {
      html$._ElementCssClassSet._addAll(this[_element$], iterable);
    }
    removeAll(iterable) {
      html$._ElementCssClassSet._removeAll(this[_element$], IterableOfString()._check(iterable));
    }
    retainAll(iterable) {
      html$._ElementCssClassSet._removeWhere(this[_element$], dart.bind(iterable[dartx.toSet](), 'contains'), false);
    }
    removeWhere(test) {
      html$._ElementCssClassSet._removeWhere(this[_element$], test, true);
    }
    retainWhere(test) {
      html$._ElementCssClassSet._removeWhere(this[_element$], test, false);
    }
    static _contains(_element, value) {
      return typeof value == 'string' && dart.test(html$._ElementCssClassSet._classListContains(html$._ElementCssClassSet._classListOf(_element), value));
    }
    static _add(_element, value) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      let added = !dart.test(html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
      html$._ElementCssClassSet._classListAdd(list, value);
      return added;
    }
    static _remove(_element, value) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      let removed = html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
      html$._ElementCssClassSet._classListRemove(list, value);
      return removed;
    }
    static _toggle(_element, value, shouldAdd) {
      return shouldAdd == null ? html$._ElementCssClassSet._toggleDefault(_element, value) : html$._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
    }
    static _toggleDefault(_element, value) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      return html$._ElementCssClassSet._classListToggle1(list, value);
    }
    static _toggleOnOff(_element, value, shouldAdd) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      if (dart.test(shouldAdd)) {
        html$._ElementCssClassSet._classListAdd(list, value);
        return true;
      } else {
        html$._ElementCssClassSet._classListRemove(list, value);
        return false;
      }
    }
    static _addAll(_element, iterable) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      for (let value of iterable) {
        html$._ElementCssClassSet._classListAdd(list, value);
      }
    }
    static _removeAll(_element, iterable) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      for (let value of iterable) {
        html$._ElementCssClassSet._classListRemove(list, value);
      }
    }
    static _removeWhere(_element, test, doRemove) {
      let list = html$._ElementCssClassSet._classListOf(_element);
      let i = 0;
      while (i < dart.notNull(html$._ElementCssClassSet._classListLength(list))) {
        let item = list[dartx.item](i);
        if (doRemove == test(item)) {
          html$._ElementCssClassSet._classListRemove(list, item);
        } else {
          ++i;
        }
      }
    }
    static _classListOf(e) {
      return e.classList;
    }
    static _classListLength(list) {
      return list.length;
    }
    static _classListContains(list, value) {
      return list.contains(value);
    }
    static _classListContainsBeforeAddOrRemove(list, value) {
      return list.contains(value);
    }
    static _classListAdd(list, value) {
      list.add(value);
    }
    static _classListRemove(list, value) {
      list.remove(value);
    }
    static _classListToggle1(list, value) {
      return list.toggle(value);
    }
    static _classListToggle2(list, value, shouldAdd) {
      return list.toggle(value, shouldAdd);
    }
  };
  dart.setSignature(html$._ElementCssClassSet, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ElementCssClassSet, [html$.Element])}),
    fields: () => ({[_element$]: html$.Element}),
    methods: () => ({
      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
      writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
    }),
    statics: () => ({
      _contains: dart.definiteFunctionType(core.bool, [html$.Element, core.Object]),
      _add: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
      _remove: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
      _toggle: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
      _toggleDefault: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
      _toggleOnOff: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
      _addAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
      _removeAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
      _removeWhere: dart.definiteFunctionType(dart.void, [html$.Element, StringTobool(), core.bool]),
      _classListOf: dart.definiteFunctionType(html$.DomTokenList, [html$.Element]),
      _classListLength: dart.definiteFunctionType(core.int, [html$.DomTokenList]),
      _classListContains: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
      _classListContainsBeforeAddOrRemove: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
      _classListAdd: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
      _classListRemove: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
      _classListToggle1: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
      _classListToggle2: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String, core.bool])
    }),
    names: ['_contains', '_add', '_remove', '_toggle', '_toggleDefault', '_toggleOnOff', '_addAll', '_removeAll', '_removeWhere', '_classListOf', '_classListLength', '_classListContains', '_classListContainsBeforeAddOrRemove', '_classListAdd', '_classListRemove', '_classListToggle1', '_classListToggle2']
  });
  dart.defineExtensionMembers(html$._ElementCssClassSet, ['contains', 'length', 'isEmpty', 'isNotEmpty']);
  const _unit = Symbol('_unit');
  html$.Dimension = class Dimension extends core.Object {
    percent(value) {
      this[_value$1] = value;
      this[_unit] = '%';
    }
    px(value) {
      this[_value$1] = value;
      this[_unit] = 'px';
    }
    pc(value) {
      this[_value$1] = value;
      this[_unit] = 'pc';
    }
    pt(value) {
      this[_value$1] = value;
      this[_unit] = 'pt';
    }
    inch(value) {
      this[_value$1] = value;
      this[_unit] = 'in';
    }
    cm(value) {
      this[_value$1] = value;
      this[_unit] = 'cm';
    }
    mm(value) {
      this[_value$1] = value;
      this[_unit] = 'mm';
    }
    em(value) {
      this[_value$1] = value;
      this[_unit] = 'em';
    }
    ex(value) {
      this[_value$1] = value;
      this[_unit] = 'ex';
    }
    css(cssValue) {
      this[_value$1] = null;
      this[_unit] = null;
      if (cssValue == '') cssValue = '0px';
      if (dart.test(cssValue[dartx.endsWith]('%'))) {
        this[_unit] = '%';
      } else {
        this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
      }
      if (dart.test(cssValue[dartx.contains]('.'))) {
        this[_value$1] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
      } else {
        this[_value$1] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
      }
    }
    toString() {
      return dart.str`${this[_value$1]}${this[_unit]}`;
    }
    get value() {
      return this[_value$1];
    }
  };
  dart.defineNamedConstructor(html$.Dimension, 'percent');
  dart.defineNamedConstructor(html$.Dimension, 'px');
  dart.defineNamedConstructor(html$.Dimension, 'pc');
  dart.defineNamedConstructor(html$.Dimension, 'pt');
  dart.defineNamedConstructor(html$.Dimension, 'inch');
  dart.defineNamedConstructor(html$.Dimension, 'cm');
  dart.defineNamedConstructor(html$.Dimension, 'mm');
  dart.defineNamedConstructor(html$.Dimension, 'em');
  dart.defineNamedConstructor(html$.Dimension, 'ex');
  dart.defineNamedConstructor(html$.Dimension, 'css');
  dart.setSignature(html$.Dimension, {
    constructors: () => ({
      percent: dart.definiteFunctionType(html$.Dimension, [core.num]),
      px: dart.definiteFunctionType(html$.Dimension, [core.num]),
      pc: dart.definiteFunctionType(html$.Dimension, [core.num]),
      pt: dart.definiteFunctionType(html$.Dimension, [core.num]),
      inch: dart.definiteFunctionType(html$.Dimension, [core.num]),
      cm: dart.definiteFunctionType(html$.Dimension, [core.num]),
      mm: dart.definiteFunctionType(html$.Dimension, [core.num]),
      em: dart.definiteFunctionType(html$.Dimension, [core.num]),
      ex: dart.definiteFunctionType(html$.Dimension, [core.num]),
      css: dart.definiteFunctionType(html$.Dimension, [core.String])
    }),
    fields: () => ({
      [_value$1]: core.num,
      [_unit]: core.String
    }),
    getters: () => ({value: dart.definiteFunctionType(core.num, [])})
  });
  html$.EventListener = dart.typedef('EventListener', () => dart.functionType(dart.dynamic, [html$.Event]));
  html$.EventStreamProvider$ = dart.generic(T => {
    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
    let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
    let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
    class EventStreamProvider extends core.Object {
      new(eventType) {
        this[_eventType] = eventType;
      }
      forTarget(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_EventStreamOfT())(e, this[_eventType], useCapture);
      }
      forElement(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementEventStreamImplOfT())(e, this[_eventType], useCapture);
      }
      [_forElementList](e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementListEventStreamImplOfT())(e, this[_eventType], useCapture);
      }
      getEventType(target) {
        return this[_eventType];
      }
    }
    dart.addTypeTests(EventStreamProvider);
    dart.setSignature(EventStreamProvider, {
      constructors: () => ({new: dart.definiteFunctionType(html$.EventStreamProvider$(T), [core.String])}),
      fields: () => ({[_eventType]: core.String}),
      methods: () => ({
        forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
        forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
        [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
        getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
      })
    });
    return EventStreamProvider;
  });
  html$.EventStreamProvider = EventStreamProvider();
  html$.ElementStream$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class ElementStream extends core.Object {}
    dart.addTypeTests(ElementStream);
    ElementStream[dart.implements] = () => [StreamOfT()];
    return ElementStream;
  });
  html$.ElementStream = ElementStream();
  const _target$ = Symbol('_target');
  const _useCapture = Symbol('_useCapture');
  html$._EventStream$ = dart.generic(T => {
    let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _EventStream extends async.Stream$(T) {
      new(target, eventType, useCapture) {
        this[_target$] = target;
        this[_eventType] = eventType;
        this[_useCapture] = useCapture;
        super.new();
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this;
      }
      get isBroadcast() {
        return true;
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return new (_EventStreamSubscriptionOfT())(this[_target$], this[_eventType], onData, this[_useCapture]);
      }
    }
    dart.setSignature(_EventStream, {
      constructors: () => ({new: dart.definiteFunctionType(html$._EventStream$(T), [html$.EventTarget, core.String, core.bool])}),
      fields: () => ({
        [_target$]: html$.EventTarget,
        [_eventType]: core.String,
        [_useCapture]: core.bool
      }),
      methods: () => ({
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})
      })
    });
    return _EventStream;
  });
  html$._EventStream = _EventStream();
  html$._matchesWithAncestors = function(event, selector) {
    let target = event[dartx.target];
    return html$.Element.is(target) ? target[dartx.matchesWithAncestors](selector) : false;
  };
  dart.fn(html$._matchesWithAncestors, EventAndStringTobool());
  html$._ElementEventStreamImpl$ = dart.generic(T => {
    let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
    let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
    let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
    class _ElementEventStreamImpl extends html$._EventStream$(T) {
      new(target, eventType, useCapture) {
        super.new(html$.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
      }
      matches(selector) {
        return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
          e[_selector] = selector;
          return e;
        }, TToT()));
      }
      capture(onData) {
        return new (_EventStreamSubscriptionOfT())(this[_target$], this[_eventType], onData, true);
      }
    }
    _ElementEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
    dart.setSignature(_ElementEventStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(html$._ElementEventStreamImpl$(T), [dart.dynamic, dart.dynamic, dart.dynamic])}),
      methods: () => ({
        matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
        capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
      })
    });
    return _ElementEventStreamImpl;
  });
  html$._ElementEventStreamImpl = _ElementEventStreamImpl();
  const _targetList = Symbol('_targetList');
  html$._ElementListEventStreamImpl$ = dart.generic(T => {
    let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html$._StreamPool$(T)))();
    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
    let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
    let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
    class _ElementListEventStreamImpl extends async.Stream$(T) {
      new(targetList, eventType, useCapture) {
        this[_targetList] = targetList;
        this[_eventType] = eventType;
        this[_useCapture] = useCapture;
        super.new();
      }
      matches(selector) {
        return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
          e[_selector] = selector;
          return e;
        }, TToT()));
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        let pool = new (_StreamPoolOfT()).broadcast();
        for (let target of this[_targetList]) {
          pool.add(new (_EventStreamOfT())(target, this[_eventType], this[_useCapture]));
        }
        return pool.stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
      }
      capture(onData) {
        let pool = new (_StreamPoolOfT()).broadcast();
        for (let target of this[_targetList]) {
          pool.add(new (_EventStreamOfT())(target, this[_eventType], true));
        }
        return pool.stream.listen(onData);
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this;
      }
      get isBroadcast() {
        return true;
      }
    }
    _ElementListEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
    dart.setSignature(_ElementListEventStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(html$._ElementListEventStreamImpl$(T), [IterableOfElement(), core.String, core.bool])}),
      fields: () => ({
        [_targetList]: IterableOfElement(),
        [_useCapture]: core.bool,
        [_eventType]: core.String
      }),
      methods: () => ({
        matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()]),
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()})
      })
    });
    return _ElementListEventStreamImpl;
  });
  html$._ElementListEventStreamImpl = _ElementListEventStreamImpl();
  html$._EventListener$ = dart.generic(T => {
    const _EventListener = dart.typedef('_EventListener', () => dart.functionType(dart.dynamic, [T]));
    return _EventListener;
  });
  html$._EventListener = _EventListener();
  const _onData$ = Symbol('_onData');
  const _pauseCount$ = Symbol('_pauseCount');
  const _tryResume = Symbol('_tryResume');
  const _canceled = Symbol('_canceled');
  const _unlisten = Symbol('_unlisten');
  html$._EventStreamSubscription$ = dart.generic(T => {
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    class _EventStreamSubscription extends async.StreamSubscription$(T) {
      new(target, eventType, onData, useCapture) {
        this[_target$] = target;
        this[_eventType] = eventType;
        this[_useCapture] = useCapture;
        this[_onData$] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(onData));
        this[_pauseCount$] = 0;
        this[_tryResume]();
      }
      cancel() {
        if (dart.test(this[_canceled])) return null;
        this[_unlisten]();
        this[_target$] = null;
        this[_onData$] = null;
        return null;
      }
      get [_canceled]() {
        return this[_target$] == null;
      }
      onData(handleData) {
        if (dart.test(this[_canceled])) {
          dart.throw(new core.StateError("Subscription has been canceled."));
        }
        this[_unlisten]();
        this[_onData$] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(handleData));
        this[_tryResume]();
      }
      onError(handleError) {}
      onDone(handleDone) {}
      pause(resumeSignal) {
        if (resumeSignal === void 0) resumeSignal = null;
        if (dart.test(this[_canceled])) return;
        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
        this[_unlisten]();
        if (resumeSignal != null) {
          resumeSignal.whenComplete(dart.bind(this, 'resume'));
        }
      }
      get isPaused() {
        return dart.notNull(this[_pauseCount$]) > 0;
      }
      resume() {
        if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
        this[_tryResume]();
      }
      [_tryResume]() {
        if (this[_onData$] != null && !dart.test(this.isPaused)) {
          this[_target$][dartx.addEventListener](this[_eventType], this[_onData$], this[_useCapture]);
        }
      }
      [_unlisten]() {
        if (this[_onData$] != null) {
          this[_target$][dartx.removeEventListener](this[_eventType], this[_onData$], this[_useCapture]);
        }
      }
      asFuture(futureValue) {
        if (futureValue === void 0) futureValue = null;
        let completer = async.Completer.new();
        return completer.future;
      }
    }
    dart.setSignature(_EventStreamSubscription, {
      constructors: () => ({new: dart.definiteFunctionType(html$._EventStreamSubscription$(T), [html$.EventTarget, core.String, TTovoid(), core.bool])}),
      fields: () => ({
        [_pauseCount$]: core.int,
        [_target$]: html$.EventTarget,
        [_eventType]: core.String,
        [_onData$]: html$.EventListener,
        [_useCapture]: core.bool
      }),
      getters: () => ({
        [_canceled]: dart.definiteFunctionType(core.bool, []),
        isPaused: dart.definiteFunctionType(core.bool, [])
      }),
      methods: () => ({
        cancel: dart.definiteFunctionType(async.Future, []),
        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
        onError: dart.definiteFunctionType(dart.void, [core.Function]),
        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
        resume: dart.definiteFunctionType(dart.void, []),
        [_tryResume]: dart.definiteFunctionType(dart.void, []),
        [_unlisten]: dart.definiteFunctionType(dart.void, []),
        asFuture: dart.definiteFunctionType(async.Future, [], [dart.dynamic])
      })
    });
    return _EventStreamSubscription;
  });
  html$._EventStreamSubscription = _EventStreamSubscription();
  html$.CustomStream$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    class CustomStream extends core.Object {}
    dart.addTypeTests(CustomStream);
    CustomStream[dart.implements] = () => [StreamOfT()];
    return CustomStream;
  });
  html$.CustomStream = CustomStream();
  const _streamController = Symbol('_streamController');
  const _type = Symbol('_type');
  html$._CustomEventStreamImpl$ = dart.generic(T => {
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html$.CustomStream$(T)))();
    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
    class _CustomEventStreamImpl extends async.Stream$(T) {
      new(type) {
        this[_streamController] = null;
        this[_type] = null;
        super.new();
        this[_type] = type;
        this[_streamController] = StreamControllerOfT().broadcast({sync: true});
      }
      listen(onData, opts) {
        let onError = opts && 'onError' in opts ? opts.onError : null;
        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
        return this[_streamController].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
      }
      asBroadcastStream(opts) {
        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
        return this[_streamController].stream;
      }
      get isBroadcast() {
        return true;
      }
      add(event) {
        T._check(event);
        if (event[dartx.type] == this[_type]) this[_streamController].add(event);
      }
    }
    _CustomEventStreamImpl[dart.implements] = () => [CustomStreamOfT()];
    dart.setSignature(_CustomEventStreamImpl, {
      constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamImpl$(T), [core.String])}),
      fields: () => ({
        [_streamController]: StreamControllerOfT(),
        [_type]: core.String
      }),
      methods: () => ({
        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
        add: dart.definiteFunctionType(dart.void, [T])
      })
    });
    return _CustomEventStreamImpl;
  });
  html$._CustomEventStreamImpl = _CustomEventStreamImpl();
  const _parent$ = Symbol('_parent');
  const _shadowKeyCode = Symbol('_shadowKeyCode');
  const _shadowCharCode = Symbol('_shadowCharCode');
  const _shadowAltKey = Symbol('_shadowAltKey');
  const _realKeyCode = Symbol('_realKeyCode');
  const _realCharCode = Symbol('_realCharCode');
  const _realAltKey = Symbol('_realAltKey');
  const _currentTarget = Symbol('_currentTarget');
  const _shadowKeyIdentifier = Symbol('_shadowKeyIdentifier');
  html$.KeyEvent = class KeyEvent extends html$._WrappedEvent {
    get keyCode() {
      return this[_shadowKeyCode];
    }
    get charCode() {
      return this.type == 'keypress' ? this[_shadowCharCode] : 0;
    }
    get altKey() {
      return this[_shadowAltKey];
    }
    get which() {
      return this.keyCode;
    }
    get [_realKeyCode]() {
      return this[_parent$].keyCode;
    }
    get [_realCharCode]() {
      return this[_parent$].charCode;
    }
    get [_realAltKey]() {
      return this[_parent$].altKey;
    }
    static _makeRecord() {
      let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent));
      return _js_helper.makeLeafDispatchRecord(interceptor);
    }
    wrap(parent) {
      this[_parent$] = null;
      this[_shadowAltKey] = null;
      this[_shadowCharCode] = null;
      this[_shadowKeyCode] = null;
      this[_currentTarget] = null;
      super.new(parent);
      this[_parent$] = parent;
      this[_shadowAltKey] = this[_realAltKey];
      this[_shadowCharCode] = this[_realCharCode];
      this[_shadowKeyCode] = this[_realKeyCode];
      this[_currentTarget] = this[_parent$][dartx.currentTarget];
    }
    static new(type, opts) {
      let view = opts && 'view' in opts ? opts.view : null;
      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
      let keyCode = opts && 'keyCode' in opts ? opts.keyCode : 0;
      let charCode = opts && 'charCode' in opts ? opts.charCode : 0;
      let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
      let currentTarget = opts && 'currentTarget' in opts ? opts.currentTarget : null;
      if (view == null) {
        view = html$.window;
      }
      let eventObj = null;
      if (dart.test(html$.KeyEvent.canUseDispatchEvent)) {
        eventObj = html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
        eventObj.keyCode = keyCode;
        eventObj.which = keyCode;
        eventObj.charCode = charCode;
        eventObj.keyLocation = keyLocation;
        eventObj.ctrlKey = ctrlKey;
        eventObj.altKey = altKey;
        eventObj.shiftKey = shiftKey;
        eventObj.metaKey = metaKey;
      } else {
        eventObj = html$.Event.eventType('KeyboardEvent', type, {canBubble: canBubble, cancelable: cancelable});
        Object.defineProperty(eventObj, 'keyCode', {
          get: function() {
            return this.keyCodeVal;
          }
        });
        Object.defineProperty(eventObj, 'which', {
          get: function() {
            return this.keyCodeVal;
          }
        });
        Object.defineProperty(eventObj, 'charCode', {
          get: function() {
            return this.charCodeVal;
          }
        });
        let keyIdentifier = html$.KeyEvent._convertToHexString(charCode, keyCode);
        dart.dsend(eventObj, _initKeyboardEvent, type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
        eventObj.keyCodeVal = keyCode;
        eventObj.charCodeVal = charCode;
      }
      _interceptors.setDispatchProperty(eventObj, html$.KeyEvent._keyboardEventDispatchRecord);
      let keyEvent = new html$.KeyEvent.wrap(html$.KeyboardEvent._check(eventObj));
      if (keyEvent[_currentTarget] == null) {
        keyEvent[_currentTarget] = currentTarget == null ? html$.window : currentTarget;
      }
      return keyEvent;
    }
    static get canUseDispatchEvent() {
      return typeof document.body.dispatchEvent == "function" && document.body.dispatchEvent.length > 0;
    }
    get currentTarget() {
      return this[_currentTarget];
    }
    static _convertToHexString(charCode, keyCode) {
      if (charCode != -1) {
        let hex = charCode[dartx.toRadixString](16);
        let sb = new core.StringBuffer('U+');
        for (let i = 0; i < 4 - dart.notNull(hex[dartx.length]); i++)
          sb.write('0');
        sb.write(hex);
        return sb.toString();
      } else {
        return html$.KeyCode._convertKeyCodeToKeyName(keyCode);
      }
    }
    get code() {
      return this[_parent$][dartx.code];
    }
    get ctrlKey() {
      return this[_parent$][dartx.ctrlKey];
    }
    get detail() {
      return this[_parent$][dartx.detail];
    }
    get key() {
      return this[_parent$][dartx.key];
    }
    get keyLocation() {
      return this[_parent$][dartx.keyLocation];
    }
    get metaKey() {
      return this[_parent$][dartx.metaKey];
    }
    get shiftKey() {
      return this[_parent$][dartx.shiftKey];
    }
    get sourceDevice() {
      return this[_parent$][dartx.sourceDevice];
    }
    get view() {
      return html$.Window._check(this[_parent$][dartx.view]);
    }
    [_initUIEvent](type, canBubble, cancelable, view, detail) {
      dart.throw(new core.UnsupportedError("Cannot initialize a UI Event from a KeyEvent."));
    }
    get [_shadowKeyIdentifier]() {
      return this[_parent$].keyIdentifier;
    }
    get [_charCode]() {
      return this.charCode;
    }
    get [_keyCode]() {
      return this.keyCode;
    }
    get [_which]() {
      return this.which;
    }
    get [_keyIdentifier]() {
      dart.throw(new core.UnsupportedError("keyIdentifier is unsupported."));
    }
    [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
      dart.throw(new core.UnsupportedError("Cannot initialize a KeyboardEvent from a KeyEvent."));
    }
    getModifierState(keyArgument) {
      return dart.throw(new core.UnimplementedError());
    }
    get location() {
      return dart.throw(new core.UnimplementedError());
    }
    get repeat() {
      return dart.throw(new core.UnimplementedError());
    }
    get [_get_view]() {
      return dart.throw(new core.UnimplementedError());
    }
  };
  dart.defineNamedConstructor(html$.KeyEvent, 'wrap');
  html$.KeyEvent[dart.implements] = () => [html$.KeyboardEvent];
  dart.setSignature(html$.KeyEvent, {
    constructors: () => ({
      wrap: dart.definiteFunctionType(html$.KeyEvent, [html$.KeyboardEvent]),
      new: dart.definiteFunctionType(html$.KeyEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyCode: core.int, charCode: core.int, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, currentTarget: html$.EventTarget})
    }),
    fields: () => ({
      [_parent$]: html$.KeyboardEvent,
      [_shadowAltKey]: core.bool,
      [_shadowCharCode]: core.int,
      [_shadowKeyCode]: core.int,
      [_currentTarget]: html$.EventTarget
    }),
    getters: () => ({
      keyCode: dart.definiteFunctionType(core.int, []),
      charCode: dart.definiteFunctionType(core.int, []),
      altKey: dart.definiteFunctionType(core.bool, []),
      which: dart.definiteFunctionType(core.int, []),
      [_realKeyCode]: dart.definiteFunctionType(core.int, []),
      [_realCharCode]: dart.definiteFunctionType(core.int, []),
      [_realAltKey]: dart.definiteFunctionType(core.bool, []),
      code: dart.definiteFunctionType(core.String, []),
      ctrlKey: dart.definiteFunctionType(core.bool, []),
      detail: dart.definiteFunctionType(core.int, []),
      key: dart.definiteFunctionType(core.String, []),
      keyLocation: dart.definiteFunctionType(core.int, []),
      metaKey: dart.definiteFunctionType(core.bool, []),
      shiftKey: dart.definiteFunctionType(core.bool, []),
      sourceDevice: dart.definiteFunctionType(html$.InputDevice, []),
      view: dart.definiteFunctionType(html$.Window, []),
      [_shadowKeyIdentifier]: dart.definiteFunctionType(core.String, []),
      [_charCode]: dart.definiteFunctionType(core.int, []),
      [_keyCode]: dart.definiteFunctionType(core.int, []),
      [_which]: dart.definiteFunctionType(core.int, []),
      [_keyIdentifier]: dart.definiteFunctionType(core.String, []),
      location: dart.definiteFunctionType(core.int, []),
      repeat: dart.definiteFunctionType(core.bool, []),
      [_get_view]: dart.definiteFunctionType(dart.dynamic, [])
    }),
    methods: () => ({
      [_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int]),
      [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
      getModifierState: dart.definiteFunctionType(core.bool, [core.String])
    }),
    sfields: () => ({
      _keyboardEventDispatchRecord: dart.dynamic,
      keyDownEvent: EventStreamProviderOfKeyEvent(),
      keyUpEvent: EventStreamProviderOfKeyEvent(),
      keyPressEvent: EventStreamProviderOfKeyEvent()
    }),
    sgetters: () => ({canUseDispatchEvent: dart.definiteFunctionType(core.bool, [])}),
    statics: () => ({
      _makeRecord: dart.definiteFunctionType(dart.dynamic, []),
      _convertToHexString: dart.definiteFunctionType(core.String, [core.int, core.int])
    }),
    names: ['_makeRecord', '_convertToHexString']
  });
  dart.defineLazy(html$.KeyEvent, {
    get _keyboardEventDispatchRecord() {
      return html$.KeyEvent._makeRecord();
    },
    get keyDownEvent() {
      return new html$._KeyboardEventHandler('keydown');
    },
    set keyDownEvent(_) {},
    get keyUpEvent() {
      return new html$._KeyboardEventHandler('keyup');
    },
    set keyUpEvent(_) {},
    get keyPressEvent() {
      return new html$._KeyboardEventHandler('keypress');
    },
    set keyPressEvent(_) {}
  });
  html$._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html$._CustomEventStreamImpl$(html$.KeyEvent) {
    new(type) {
      super.new(type);
    }
    add(event) {
      if (event.type == this[_type]) {
        event.currentTarget[dartx.dispatchEvent](event[_parent$]);
        this[_streamController].add(event);
      }
    }
  };
  dart.addSimpleTypeTests(html$._CustomKeyEventStreamImpl);
  html$._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
  dart.setSignature(html$._CustomKeyEventStreamImpl, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CustomKeyEventStreamImpl, [core.String])}),
    methods: () => ({add: dart.definiteFunctionType(dart.void, [html$.KeyEvent])})
  });
  const _subscriptions = Symbol('_subscriptions');
  const _controller$0 = Symbol('_controller');
  html$._StreamPool$ = dart.generic(T => {
    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
    let MapOfStreamOfT$StreamSubscriptionOfT = () => (MapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(core.Map$(StreamOfT(), StreamSubscriptionOfT())))();
    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
    class _StreamPool extends core.Object {
      broadcast() {
        this[_subscriptions] = MapOfStreamOfT$StreamSubscriptionOfT().new();
        this[_controller$0] = null;
        this[_controller$0] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
      }
      get stream() {
        return this[_controller$0].stream;
      }
      add(stream) {
        StreamOfT()._check(stream);
        if (dart.test(this[_subscriptions][dartx.containsKey](stream))) return;
        this[_subscriptions][dartx._set](stream, stream.listen(dart.bind(this[_controller$0], 'add'), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid$())}));
      }
      remove(stream) {
        StreamOfT()._check(stream);
        let subscription = this[_subscriptions][dartx.remove](stream);
        if (subscription != null) subscription.cancel();
      }
      close() {
        for (let subscription of this[_subscriptions][dartx.values]) {
          subscription.cancel();
        }
        this[_subscriptions][dartx.clear]();
        this[_controller$0].close();
      }
    }
    dart.addTypeTests(_StreamPool);
    dart.defineNamedConstructor(_StreamPool, 'broadcast');
    dart.setSignature(_StreamPool, {
      constructors: () => ({broadcast: dart.definiteFunctionType(html$._StreamPool$(T), [])}),
      fields: () => ({
        [_controller$0]: StreamControllerOfT(),
        [_subscriptions]: MapOfStreamOfT$StreamSubscriptionOfT()
      }),
      getters: () => ({stream: dart.definiteFunctionType(async.Stream$(T), [])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [StreamOfT()]),
        remove: dart.definiteFunctionType(dart.void, [StreamOfT()]),
        close: dart.definiteFunctionType(dart.void, [])
      })
    });
    return _StreamPool;
  });
  html$._StreamPool = _StreamPool();
  const _eventTypeGetter = Symbol('_eventTypeGetter');
  html$._CustomEventStreamProvider$ = dart.generic(T => {
    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
    let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
    let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
    let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html$.EventStreamProvider$(T)))();
    class _CustomEventStreamProvider extends core.Object {
      new(eventTypeGetter) {
        this[_eventTypeGetter] = eventTypeGetter;
      }
      forTarget(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_EventStreamOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
      }
      forElement(e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementEventStreamImplOfT())(e, dart.dcall(this[_eventTypeGetter], e), useCapture);
      }
      [_forElementList](e, opts) {
        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
        return new (_ElementListEventStreamImplOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
      }
      getEventType(target) {
        return core.String._check(dart.dcall(this[_eventTypeGetter], target));
      }
      get [_eventType]() {
        return dart.throw(new core.UnsupportedError('Access type through getEventType method.'));
      }
    }
    dart.addTypeTests(_CustomEventStreamProvider);
    _CustomEventStreamProvider[dart.implements] = () => [EventStreamProviderOfT()];
    dart.setSignature(_CustomEventStreamProvider, {
      constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamProvider$(T), [dart.dynamic])}),
      fields: () => ({[_eventTypeGetter]: dart.dynamic}),
      getters: () => ({[_eventType]: dart.definiteFunctionType(core.String, [])}),
      methods: () => ({
        forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
        forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
        [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
        getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
      })
    });
    return _CustomEventStreamProvider;
  });
  html$._CustomEventStreamProvider = _CustomEventStreamProvider();
  html$._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
    new(opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      this.uriPolicy = uriPolicy != null ? uriPolicy : html$.UriPolicy.new();
      if (dart.test(html$._Html5NodeValidator._attributeValidators[dartx.isEmpty])) {
        for (let attr of html$._Html5NodeValidator._standardAttributes) {
          html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._standardAttributeValidator);
        }
        for (let attr of html$._Html5NodeValidator._uriAttributes) {
          html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._uriAttributeValidator);
        }
      }
    }
    allowsElement(element) {
      return html$._Html5NodeValidator._allowedElements.contains(html$.Element._safeTagName(element));
    }
    allowsAttribute(element, attributeName, value) {
      let tagName = html$.Element._safeTagName(element);
      let validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`${tagName}::${attributeName}`);
      if (validator == null) {
        validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`*::${attributeName}`);
      }
      if (validator == null) {
        return false;
      }
      return core.bool._check(dart.dcall(validator, element, attributeName, value, this));
    }
    static _standardAttributeValidator(element, attributeName, value, context) {
      return true;
    }
    static _uriAttributeValidator(element, attributeName, value, context) {
      return context.uriPolicy.allowsUri(value);
    }
  };
  html$._Html5NodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._Html5NodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._Html5NodeValidator, [], {uriPolicy: html$.UriPolicy})}),
    fields: () => ({uriPolicy: html$.UriPolicy}),
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    }),
    sfields: () => ({
      _allowedElements: SetOfString(),
      _standardAttributes: ListOfString(),
      _uriAttributes: ListOfString(),
      _attributeValidators: MapOfString$Function()
    }),
    statics: () => ({
      _standardAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator]),
      _uriAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator])
    }),
    names: ['_standardAttributeValidator', '_uriAttributeValidator']
  });
  html$._Html5NodeValidator._standardAttributes = dart.constList(['*::class', '*::dir', '*::draggable', '*::hidden', '*::id', '*::inert', '*::itemprop', '*::itemref', '*::itemscope', '*::lang', '*::spellcheck', '*::title', '*::translate', 'A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'AREA::accesskey', 'AREA::alt', 'AREA::coords', 'AREA::nohref', 'AREA::shape', 'AREA::tabindex', 'AREA::target', 'AUDIO::controls', 'AUDIO::loop', 'AUDIO::mediagroup', 'AUDIO::muted', 'AUDIO::preload', 'BDO::dir', 'BODY::alink', 'BODY::bgcolor', 'BODY::link', 'BODY::text', 'BODY::vlink', 'BR::clear', 'BUTTON::accesskey', 'BUTTON::disabled', 'BUTTON::name', 'BUTTON::tabindex', 'BUTTON::type', 'BUTTON::value', 'CANVAS::height', 'CANVAS::width', 'CAPTION::align', 'COL::align', 'COL::char', 'COL::charoff', 'COL::span', 'COL::valign', 'COL::width', 'COLGROUP::align', 'COLGROUP::char', 'COLGROUP::charoff', 'COLGROUP::span', 'COLGROUP::valign', 'COLGROUP::width', 'COMMAND::checked', 'COMMAND::command', 'COMMAND::disabled', 'COMMAND::label', 'COMMAND::radiogroup', 'COMMAND::type', 'DATA::value', 'DEL::datetime', 'DETAILS::open', 'DIR::compact', 'DIV::align', 'DL::compact', 'FIELDSET::disabled', 'FONT::color', 'FONT::face', 'FONT::size', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target', 'FRAME::name', 'H1::align', 'H2::align', 'H3::align', 'H4::align', 'H5::align', 'H6::align', 'HR::align', 'HR::noshade', 'HR::size', 'HR::width', 'HTML::version', 'IFRAME::align', 'IFRAME::frameborder', 'IFRAME::height', 'IFRAME::marginheight', 'IFRAME::marginwidth', 'IFRAME::width', 'IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width', 'INPUT::accept', 'INPUT::accesskey', 'INPUT::align', 'INPUT::alt', 'INPUT::autocomplete', 'INPUT::autofocus', 'INPUT::checked', 'INPUT::disabled', 'INPUT::inputmode', 'INPUT::ismap', 'INPUT::list', 'INPUT::max', 'INPUT::maxlength', 'INPUT::min', 'INPUT::multiple', 'INPUT::name', 'INPUT::placeholder', 'INPUT::readonly', 'INPUT::required', 'INPUT::size', 'INPUT::step', 'INPUT::tabindex', 'INPUT::type', 'INPUT::usemap', 'INPUT::value', 'INS::datetime', 'KEYGEN::disabled', 'KEYGEN::keytype', 'KEYGEN::name', 'LABEL::accesskey', 'LABEL::for', 'LEGEND::accesskey', 'LEGEND::align', 'LI::type', 'LI::value', 'LINK::sizes', 'MAP::name', 'MENU::compact', 'MENU::label', 'MENU::type', 'METER::high', 'METER::low', 'METER::max', 'METER::min', 'METER::value', 'OBJECT::typemustmatch', 'OL::compact', 'OL::reversed', 'OL::start', 'OL::type', 'OPTGROUP::disabled', 'OPTGROUP::label', 'OPTION::disabled', 'OPTION::label', 'OPTION::selected', 'OPTION::value', 'OUTPUT::for', 'OUTPUT::name', 'P::align', 'PRE::width', 'PROGRESS::max', 'PROGRESS::min', 'PROGRESS::value', 'SELECT::autocomplete', 'SELECT::disabled', 'SELECT::multiple', 'SELECT::name', 'SELECT::required', 'SELECT::size', 'SELECT::tabindex', 'SOURCE::type', 'TABLE::align', 'TABLE::bgcolor', 'TABLE::border', 'TABLE::cellpadding', 'TABLE::cellspacing', 'TABLE::frame', 'TABLE::rules', 'TABLE::summary', 'TABLE::width', 'TBODY::align', 'TBODY::char', 'TBODY::charoff', 'TBODY::valign', 'TD::abbr', 'TD::align', 'TD::axis', 'TD::bgcolor', 'TD::char', 'TD::charoff', 'TD::colspan', 'TD::headers', 'TD::height', 'TD::nowrap', 'TD::rowspan', 'TD::scope', 'TD::valign', 'TD::width', 'TEXTAREA::accesskey', 'TEXTAREA::autocomplete', 'TEXTAREA::cols', 'TEXTAREA::disabled', 'TEXTAREA::inputmode', 'TEXTAREA::name', 'TEXTAREA::placeholder', 'TEXTAREA::readonly', 'TEXTAREA::required', 'TEXTAREA::rows', 'TEXTAREA::tabindex', 'TEXTAREA::wrap', 'TFOOT::align', 'TFOOT::char', 'TFOOT::charoff', 'TFOOT::valign', 'TH::abbr', 'TH::align', 'TH::axis', 'TH::bgcolor', 'TH::char', 'TH::charoff', 'TH::colspan', 'TH::headers', 'TH::height', 'TH::nowrap', 'TH::rowspan', 'TH::scope', 'TH::valign', 'TH::width', 'THEAD::align', 'THEAD::char', 'THEAD::charoff', 'THEAD::valign', 'TR::align', 'TR::bgcolor', 'TR::char', 'TR::charoff', 'TR::valign', 'TRACK::default', 'TRACK::kind', 'TRACK::label', 'TRACK::srclang', 'UL::compact', 'UL::type', 'VIDEO::controls', 'VIDEO::height', 'VIDEO::loop', 'VIDEO::mediagroup', 'VIDEO::muted', 'VIDEO::preload', 'VIDEO::width'], core.String);
  html$._Html5NodeValidator._uriAttributes = dart.constList(['A::href', 'AREA::href', 'BLOCKQUOTE::cite', 'BODY::background', 'COMMAND::icon', 'DEL::cite', 'FORM::action', 'IMG::src', 'INPUT::src', 'INS::cite', 'Q::cite', 'VIDEO::poster'], core.String);
  dart.defineLazy(html$._Html5NodeValidator, {
    get _allowedElements() {
      return SetOfString().from(JSArrayOfString().of(['A', 'ABBR', 'ACRONYM', 'ADDRESS', 'AREA', 'ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BDI', 'BDO', 'BIG', 'BLOCKQUOTE', 'BR', 'BUTTON', 'CANVAS', 'CAPTION', 'CENTER', 'CITE', 'CODE', 'COL', 'COLGROUP', 'COMMAND', 'DATA', 'DATALIST', 'DD', 'DEL', 'DETAILS', 'DFN', 'DIR', 'DIV', 'DL', 'DT', 'EM', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FONT', 'FOOTER', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HGROUP', 'HR', 'I', 'IFRAME', 'IMG', 'INPUT', 'INS', 'KBD', 'LABEL', 'LEGEND', 'LI', 'MAP', 'MARK', 'MENU', 'METER', 'NAV', 'NOBR', 'OL', 'OPTGROUP', 'OPTION', 'OUTPUT', 'P', 'PRE', 'PROGRESS', 'Q', 'S', 'SAMP', 'SECTION', 'SELECT', 'SMALL', 'SOURCE', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUMMARY', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TIME', 'TR', 'TRACK', 'TT', 'U', 'UL', 'VAR', 'VIDEO', 'WBR']));
    },
    get _attributeValidators() {
      return dart.map({}, core.String, core.Function);
    }
  });
  html$.KeyCode = class KeyCode extends core.Object {
    static isCharacterKey(keyCode) {
      if (dart.notNull(keyCode) >= html$.KeyCode.ZERO && dart.notNull(keyCode) <= html$.KeyCode.NINE || dart.notNull(keyCode) >= html$.KeyCode.NUM_ZERO && dart.notNull(keyCode) <= html$.KeyCode.NUM_MULTIPLY || dart.notNull(keyCode) >= html$.KeyCode.A && dart.notNull(keyCode) <= html$.KeyCode.Z) {
        return true;
      }
      if (dart.test(html_common.Device.isWebKit) && keyCode == 0) {
        return true;
      }
      return keyCode == html$.KeyCode.SPACE || keyCode == html$.KeyCode.QUESTION_MARK || keyCode == html$.KeyCode.NUM_PLUS || keyCode == html$.KeyCode.NUM_MINUS || keyCode == html$.KeyCode.NUM_PERIOD || keyCode == html$.KeyCode.NUM_DIVISION || keyCode == html$.KeyCode.SEMICOLON || keyCode == html$.KeyCode.FF_SEMICOLON || keyCode == html$.KeyCode.DASH || keyCode == html$.KeyCode.EQUALS || keyCode == html$.KeyCode.FF_EQUALS || keyCode == html$.KeyCode.COMMA || keyCode == html$.KeyCode.PERIOD || keyCode == html$.KeyCode.SLASH || keyCode == html$.KeyCode.APOSTROPHE || keyCode == html$.KeyCode.SINGLE_QUOTE || keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || keyCode == html$.KeyCode.BACKSLASH || keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET;
    }
    static _convertKeyCodeToKeyName(keyCode) {
      switch (keyCode) {
        case html$.KeyCode.ALT:
        {
          return html$._KeyName.ALT;
        }
        case html$.KeyCode.BACKSPACE:
        {
          return html$._KeyName.BACKSPACE;
        }
        case html$.KeyCode.CAPS_LOCK:
        {
          return html$._KeyName.CAPS_LOCK;
        }
        case html$.KeyCode.CTRL:
        {
          return html$._KeyName.CONTROL;
        }
        case html$.KeyCode.DELETE:
        {
          return html$._KeyName.DEL;
        }
        case html$.KeyCode.DOWN:
        {
          return html$._KeyName.DOWN;
        }
        case html$.KeyCode.END:
        {
          return html$._KeyName.END;
        }
        case html$.KeyCode.ENTER:
        {
          return html$._KeyName.ENTER;
        }
        case html$.KeyCode.ESC:
        {
          return html$._KeyName.ESC;
        }
        case html$.KeyCode.F1:
        {
          return html$._KeyName.F1;
        }
        case html$.KeyCode.F2:
        {
          return html$._KeyName.F2;
        }
        case html$.KeyCode.F3:
        {
          return html$._KeyName.F3;
        }
        case html$.KeyCode.F4:
        {
          return html$._KeyName.F4;
        }
        case html$.KeyCode.F5:
        {
          return html$._KeyName.F5;
        }
        case html$.KeyCode.F6:
        {
          return html$._KeyName.F6;
        }
        case html$.KeyCode.F7:
        {
          return html$._KeyName.F7;
        }
        case html$.KeyCode.F8:
        {
          return html$._KeyName.F8;
        }
        case html$.KeyCode.F9:
        {
          return html$._KeyName.F9;
        }
        case html$.KeyCode.F10:
        {
          return html$._KeyName.F10;
        }
        case html$.KeyCode.F11:
        {
          return html$._KeyName.F11;
        }
        case html$.KeyCode.F12:
        {
          return html$._KeyName.F12;
        }
        case html$.KeyCode.HOME:
        {
          return html$._KeyName.HOME;
        }
        case html$.KeyCode.INSERT:
        {
          return html$._KeyName.INSERT;
        }
        case html$.KeyCode.LEFT:
        {
          return html$._KeyName.LEFT;
        }
        case html$.KeyCode.META:
        {
          return html$._KeyName.META;
        }
        case html$.KeyCode.NUMLOCK:
        {
          return html$._KeyName.NUM_LOCK;
        }
        case html$.KeyCode.PAGE_DOWN:
        {
          return html$._KeyName.PAGE_DOWN;
        }
        case html$.KeyCode.PAGE_UP:
        {
          return html$._KeyName.PAGE_UP;
        }
        case html$.KeyCode.PAUSE:
        {
          return html$._KeyName.PAUSE;
        }
        case html$.KeyCode.PRINT_SCREEN:
        {
          return html$._KeyName.PRINT_SCREEN;
        }
        case html$.KeyCode.RIGHT:
        {
          return html$._KeyName.RIGHT;
        }
        case html$.KeyCode.SCROLL_LOCK:
        {
          return html$._KeyName.SCROLL;
        }
        case html$.KeyCode.SHIFT:
        {
          return html$._KeyName.SHIFT;
        }
        case html$.KeyCode.SPACE:
        {
          return html$._KeyName.SPACEBAR;
        }
        case html$.KeyCode.TAB:
        {
          return html$._KeyName.TAB;
        }
        case html$.KeyCode.UP:
        {
          return html$._KeyName.UP;
        }
        case html$.KeyCode.WIN_IME:
        case html$.KeyCode.WIN_KEY:
        case html$.KeyCode.WIN_KEY_LEFT:
        case html$.KeyCode.WIN_KEY_RIGHT:
        {
          return html$._KeyName.WIN;
        }
        default:
        {
          return html$._KeyName.UNIDENTIFIED;
        }
      }
      return html$._KeyName.UNIDENTIFIED;
    }
  };
  dart.setSignature(html$.KeyCode, {
    sfields: () => ({
      WIN_KEY_FF_LINUX: core.int,
      MAC_ENTER: core.int,
      BACKSPACE: core.int,
      TAB: core.int,
      NUM_CENTER: core.int,
      ENTER: core.int,
      SHIFT: core.int,
      CTRL: core.int,
      ALT: core.int,
      PAUSE: core.int,
      CAPS_LOCK: core.int,
      ESC: core.int,
      SPACE: core.int,
      PAGE_UP: core.int,
      PAGE_DOWN: core.int,
      END: core.int,
      HOME: core.int,
      LEFT: core.int,
      UP: core.int,
      RIGHT: core.int,
      DOWN: core.int,
      NUM_NORTH_EAST: core.int,
      NUM_SOUTH_EAST: core.int,
      NUM_SOUTH_WEST: core.int,
      NUM_NORTH_WEST: core.int,
      NUM_WEST: core.int,
      NUM_NORTH: core.int,
      NUM_EAST: core.int,
      NUM_SOUTH: core.int,
      PRINT_SCREEN: core.int,
      INSERT: core.int,
      NUM_INSERT: core.int,
      DELETE: core.int,
      NUM_DELETE: core.int,
      ZERO: core.int,
      ONE: core.int,
      TWO: core.int,
      THREE: core.int,
      FOUR: core.int,
      FIVE: core.int,
      SIX: core.int,
      SEVEN: core.int,
      EIGHT: core.int,
      NINE: core.int,
      FF_SEMICOLON: core.int,
      FF_EQUALS: core.int,
      QUESTION_MARK: core.int,
      A: core.int,
      B: core.int,
      C: core.int,
      D: core.int,
      E: core.int,
      F: core.int,
      G: core.int,
      H: core.int,
      I: core.int,
      J: core.int,
      K: core.int,
      L: core.int,
      M: core.int,
      N: core.int,
      O: core.int,
      P: core.int,
      Q: core.int,
      R: core.int,
      S: core.int,
      T: core.int,
      U: core.int,
      V: core.int,
      W: core.int,
      X: core.int,
      Y: core.int,
      Z: core.int,
      META: core.int,
      WIN_KEY_LEFT: core.int,
      WIN_KEY_RIGHT: core.int,
      CONTEXT_MENU: core.int,
      NUM_ZERO: core.int,
      NUM_ONE: core.int,
      NUM_TWO: core.int,
      NUM_THREE: core.int,
      NUM_FOUR: core.int,
      NUM_FIVE: core.int,
      NUM_SIX: core.int,
      NUM_SEVEN: core.int,
      NUM_EIGHT: core.int,
      NUM_NINE: core.int,
      NUM_MULTIPLY: core.int,
      NUM_PLUS: core.int,
      NUM_MINUS: core.int,
      NUM_PERIOD: core.int,
      NUM_DIVISION: core.int,
      F1: core.int,
      F2: core.int,
      F3: core.int,
      F4: core.int,
      F5: core.int,
      F6: core.int,
      F7: core.int,
      F8: core.int,
      F9: core.int,
      F10: core.int,
      F11: core.int,
      F12: core.int,
      NUMLOCK: core.int,
      SCROLL_LOCK: core.int,
      FIRST_MEDIA_KEY: core.int,
      LAST_MEDIA_KEY: core.int,
      SEMICOLON: core.int,
      DASH: core.int,
      EQUALS: core.int,
      COMMA: core.int,
      PERIOD: core.int,
      SLASH: core.int,
      APOSTROPHE: core.int,
      TILDE: core.int,
      SINGLE_QUOTE: core.int,
      OPEN_SQUARE_BRACKET: core.int,
      BACKSLASH: core.int,
      CLOSE_SQUARE_BRACKET: core.int,
      WIN_KEY: core.int,
      MAC_FF_META: core.int,
      WIN_IME: core.int,
      UNKNOWN: core.int
    }),
    statics: () => ({
      isCharacterKey: dart.definiteFunctionType(core.bool, [core.int]),
      _convertKeyCodeToKeyName: dart.definiteFunctionType(core.String, [core.int])
    }),
    names: ['isCharacterKey', '_convertKeyCodeToKeyName']
  });
  html$.KeyCode.WIN_KEY_FF_LINUX = 0;
  html$.KeyCode.MAC_ENTER = 3;
  html$.KeyCode.BACKSPACE = 8;
  html$.KeyCode.TAB = 9;
  html$.KeyCode.NUM_CENTER = 12;
  html$.KeyCode.ENTER = 13;
  html$.KeyCode.SHIFT = 16;
  html$.KeyCode.CTRL = 17;
  html$.KeyCode.ALT = 18;
  html$.KeyCode.PAUSE = 19;
  html$.KeyCode.CAPS_LOCK = 20;
  html$.KeyCode.ESC = 27;
  html$.KeyCode.SPACE = 32;
  html$.KeyCode.PAGE_UP = 33;
  html$.KeyCode.PAGE_DOWN = 34;
  html$.KeyCode.END = 35;
  html$.KeyCode.HOME = 36;
  html$.KeyCode.LEFT = 37;
  html$.KeyCode.UP = 38;
  html$.KeyCode.RIGHT = 39;
  html$.KeyCode.DOWN = 40;
  html$.KeyCode.NUM_NORTH_EAST = 33;
  html$.KeyCode.NUM_SOUTH_EAST = 34;
  html$.KeyCode.NUM_SOUTH_WEST = 35;
  html$.KeyCode.NUM_NORTH_WEST = 36;
  html$.KeyCode.NUM_WEST = 37;
  html$.KeyCode.NUM_NORTH = 38;
  html$.KeyCode.NUM_EAST = 39;
  html$.KeyCode.NUM_SOUTH = 40;
  html$.KeyCode.PRINT_SCREEN = 44;
  html$.KeyCode.INSERT = 45;
  html$.KeyCode.NUM_INSERT = 45;
  html$.KeyCode.DELETE = 46;
  html$.KeyCode.NUM_DELETE = 46;
  html$.KeyCode.ZERO = 48;
  html$.KeyCode.ONE = 49;
  html$.KeyCode.TWO = 50;
  html$.KeyCode.THREE = 51;
  html$.KeyCode.FOUR = 52;
  html$.KeyCode.FIVE = 53;
  html$.KeyCode.SIX = 54;
  html$.KeyCode.SEVEN = 55;
  html$.KeyCode.EIGHT = 56;
  html$.KeyCode.NINE = 57;
  html$.KeyCode.FF_SEMICOLON = 59;
  html$.KeyCode.FF_EQUALS = 61;
  html$.KeyCode.QUESTION_MARK = 63;
  html$.KeyCode.A = 65;
  html$.KeyCode.B = 66;
  html$.KeyCode.C = 67;
  html$.KeyCode.D = 68;
  html$.KeyCode.E = 69;
  html$.KeyCode.F = 70;
  html$.KeyCode.G = 71;
  html$.KeyCode.H = 72;
  html$.KeyCode.I = 73;
  html$.KeyCode.J = 74;
  html$.KeyCode.K = 75;
  html$.KeyCode.L = 76;
  html$.KeyCode.M = 77;
  html$.KeyCode.N = 78;
  html$.KeyCode.O = 79;
  html$.KeyCode.P = 80;
  html$.KeyCode.Q = 81;
  html$.KeyCode.R = 82;
  html$.KeyCode.S = 83;
  html$.KeyCode.T = 84;
  html$.KeyCode.U = 85;
  html$.KeyCode.V = 86;
  html$.KeyCode.W = 87;
  html$.KeyCode.X = 88;
  html$.KeyCode.Y = 89;
  html$.KeyCode.Z = 90;
  html$.KeyCode.META = 91;
  html$.KeyCode.WIN_KEY_LEFT = 91;
  html$.KeyCode.WIN_KEY_RIGHT = 92;
  html$.KeyCode.CONTEXT_MENU = 93;
  html$.KeyCode.NUM_ZERO = 96;
  html$.KeyCode.NUM_ONE = 97;
  html$.KeyCode.NUM_TWO = 98;
  html$.KeyCode.NUM_THREE = 99;
  html$.KeyCode.NUM_FOUR = 100;
  html$.KeyCode.NUM_FIVE = 101;
  html$.KeyCode.NUM_SIX = 102;
  html$.KeyCode.NUM_SEVEN = 103;
  html$.KeyCode.NUM_EIGHT = 104;
  html$.KeyCode.NUM_NINE = 105;
  html$.KeyCode.NUM_MULTIPLY = 106;
  html$.KeyCode.NUM_PLUS = 107;
  html$.KeyCode.NUM_MINUS = 109;
  html$.KeyCode.NUM_PERIOD = 110;
  html$.KeyCode.NUM_DIVISION = 111;
  html$.KeyCode.F1 = 112;
  html$.KeyCode.F2 = 113;
  html$.KeyCode.F3 = 114;
  html$.KeyCode.F4 = 115;
  html$.KeyCode.F5 = 116;
  html$.KeyCode.F6 = 117;
  html$.KeyCode.F7 = 118;
  html$.KeyCode.F8 = 119;
  html$.KeyCode.F9 = 120;
  html$.KeyCode.F10 = 121;
  html$.KeyCode.F11 = 122;
  html$.KeyCode.F12 = 123;
  html$.KeyCode.NUMLOCK = 144;
  html$.KeyCode.SCROLL_LOCK = 145;
  html$.KeyCode.FIRST_MEDIA_KEY = 166;
  html$.KeyCode.LAST_MEDIA_KEY = 183;
  html$.KeyCode.SEMICOLON = 186;
  html$.KeyCode.DASH = 189;
  html$.KeyCode.EQUALS = 187;
  html$.KeyCode.COMMA = 188;
  html$.KeyCode.PERIOD = 190;
  html$.KeyCode.SLASH = 191;
  html$.KeyCode.APOSTROPHE = 192;
  html$.KeyCode.TILDE = 192;
  html$.KeyCode.SINGLE_QUOTE = 222;
  html$.KeyCode.OPEN_SQUARE_BRACKET = 219;
  html$.KeyCode.BACKSLASH = 220;
  html$.KeyCode.CLOSE_SQUARE_BRACKET = 221;
  html$.KeyCode.WIN_KEY = 224;
  html$.KeyCode.MAC_FF_META = 224;
  html$.KeyCode.WIN_IME = 229;
  html$.KeyCode.UNKNOWN = -1;
  html$.KeyLocation = class KeyLocation extends core.Object {};
  dart.setSignature(html$.KeyLocation, {
    sfields: () => ({
      STANDARD: core.int,
      LEFT: core.int,
      RIGHT: core.int,
      NUMPAD: core.int,
      MOBILE: core.int,
      JOYSTICK: core.int
    })
  });
  html$.KeyLocation.STANDARD = 0;
  html$.KeyLocation.LEFT = 1;
  html$.KeyLocation.RIGHT = 2;
  html$.KeyLocation.NUMPAD = 3;
  html$.KeyLocation.MOBILE = 4;
  html$.KeyLocation.JOYSTICK = 5;
  html$._KeyName = class _KeyName extends core.Object {};
  dart.setSignature(html$._KeyName, {
    sfields: () => ({
      ACCEPT: core.String,
      ADD: core.String,
      AGAIN: core.String,
      ALL_CANDIDATES: core.String,
      ALPHANUMERIC: core.String,
      ALT: core.String,
      ALT_GRAPH: core.String,
      APPS: core.String,
      ATTN: core.String,
      BROWSER_BACK: core.String,
      BROWSER_FAVORTIES: core.String,
      BROWSER_FORWARD: core.String,
      BROWSER_NAME: core.String,
      BROWSER_REFRESH: core.String,
      BROWSER_SEARCH: core.String,
      BROWSER_STOP: core.String,
      CAMERA: core.String,
      CAPS_LOCK: core.String,
      CLEAR: core.String,
      CODE_INPUT: core.String,
      COMPOSE: core.String,
      CONTROL: core.String,
      CRSEL: core.String,
      CONVERT: core.String,
      COPY: core.String,
      CUT: core.String,
      DECIMAL: core.String,
      DIVIDE: core.String,
      DOWN: core.String,
      DOWN_LEFT: core.String,
      DOWN_RIGHT: core.String,
      EJECT: core.String,
      END: core.String,
      ENTER: core.String,
      ERASE_EOF: core.String,
      EXECUTE: core.String,
      EXSEL: core.String,
      FN: core.String,
      F1: core.String,
      F2: core.String,
      F3: core.String,
      F4: core.String,
      F5: core.String,
      F6: core.String,
      F7: core.String,
      F8: core.String,
      F9: core.String,
      F10: core.String,
      F11: core.String,
      F12: core.String,
      F13: core.String,
      F14: core.String,
      F15: core.String,
      F16: core.String,
      F17: core.String,
      F18: core.String,
      F19: core.String,
      F20: core.String,
      F21: core.String,
      F22: core.String,
      F23: core.String,
      F24: core.String,
      FINAL_MODE: core.String,
      FIND: core.String,
      FULL_WIDTH: core.String,
      HALF_WIDTH: core.String,
      HANGUL_MODE: core.String,
      HANJA_MODE: core.String,
      HELP: core.String,
      HIRAGANA: core.String,
      HOME: core.String,
      INSERT: core.String,
      JAPANESE_HIRAGANA: core.String,
      JAPANESE_KATAKANA: core.String,
      JAPANESE_ROMAJI: core.String,
      JUNJA_MODE: core.String,
      KANA_MODE: core.String,
      KANJI_MODE: core.String,
      KATAKANA: core.String,
      LAUNCH_APPLICATION_1: core.String,
      LAUNCH_APPLICATION_2: core.String,
      LAUNCH_MAIL: core.String,
      LEFT: core.String,
      MENU: core.String,
      META: core.String,
      MEDIA_NEXT_TRACK: core.String,
      MEDIA_PAUSE_PLAY: core.String,
      MEDIA_PREVIOUS_TRACK: core.String,
      MEDIA_STOP: core.String,
      MODE_CHANGE: core.String,
      NEXT_CANDIDATE: core.String,
      NON_CONVERT: core.String,
      NUM_LOCK: core.String,
      PAGE_DOWN: core.String,
      PAGE_UP: core.String,
      PASTE: core.String,
      PAUSE: core.String,
      PLAY: core.String,
      POWER: core.String,
      PREVIOUS_CANDIDATE: core.String,
      PRINT_SCREEN: core.String,
      PROCESS: core.String,
      PROPS: core.String,
      RIGHT: core.String,
      ROMAN_CHARACTERS: core.String,
      SCROLL: core.String,
      SELECT: core.String,
      SELECT_MEDIA: core.String,
      SEPARATOR: core.String,
      SHIFT: core.String,
      SOFT_1: core.String,
      SOFT_2: core.String,
      SOFT_3: core.String,
      SOFT_4: core.String,
      STOP: core.String,
      SUBTRACT: core.String,
      SYMBOL_LOCK: core.String,
      UP: core.String,
      UP_LEFT: core.String,
      UP_RIGHT: core.String,
      UNDO: core.String,
      VOLUME_DOWN: core.String,
      VOLUMN_MUTE: core.String,
      VOLUMN_UP: core.String,
      WIN: core.String,
      ZOOM: core.String,
      BACKSPACE: core.String,
      TAB: core.String,
      CANCEL: core.String,
      ESC: core.String,
      SPACEBAR: core.String,
      DEL: core.String,
      DEAD_GRAVE: core.String,
      DEAD_EACUTE: core.String,
      DEAD_CIRCUMFLEX: core.String,
      DEAD_TILDE: core.String,
      DEAD_MACRON: core.String,
      DEAD_BREVE: core.String,
      DEAD_ABOVE_DOT: core.String,
      DEAD_UMLAUT: core.String,
      DEAD_ABOVE_RING: core.String,
      DEAD_DOUBLEACUTE: core.String,
      DEAD_CARON: core.String,
      DEAD_CEDILLA: core.String,
      DEAD_OGONEK: core.String,
      DEAD_IOTA: core.String,
      DEAD_VOICED_SOUND: core.String,
      DEC_SEMIVOICED_SOUND: core.String,
      UNIDENTIFIED: core.String
    })
  });
  html$._KeyName.ACCEPT = "Accept";
  html$._KeyName.ADD = "Add";
  html$._KeyName.AGAIN = "Again";
  html$._KeyName.ALL_CANDIDATES = "AllCandidates";
  html$._KeyName.ALPHANUMERIC = "Alphanumeric";
  html$._KeyName.ALT = "Alt";
  html$._KeyName.ALT_GRAPH = "AltGraph";
  html$._KeyName.APPS = "Apps";
  html$._KeyName.ATTN = "Attn";
  html$._KeyName.BROWSER_BACK = "BrowserBack";
  html$._KeyName.BROWSER_FAVORTIES = "BrowserFavorites";
  html$._KeyName.BROWSER_FORWARD = "BrowserForward";
  html$._KeyName.BROWSER_NAME = "BrowserHome";
  html$._KeyName.BROWSER_REFRESH = "BrowserRefresh";
  html$._KeyName.BROWSER_SEARCH = "BrowserSearch";
  html$._KeyName.BROWSER_STOP = "BrowserStop";
  html$._KeyName.CAMERA = "Camera";
  html$._KeyName.CAPS_LOCK = "CapsLock";
  html$._KeyName.CLEAR = "Clear";
  html$._KeyName.CODE_INPUT = "CodeInput";
  html$._KeyName.COMPOSE = "Compose";
  html$._KeyName.CONTROL = "Control";
  html$._KeyName.CRSEL = "Crsel";
  html$._KeyName.CONVERT = "Convert";
  html$._KeyName.COPY = "Copy";
  html$._KeyName.CUT = "Cut";
  html$._KeyName.DECIMAL = "Decimal";
  html$._KeyName.DIVIDE = "Divide";
  html$._KeyName.DOWN = "Down";
  html$._KeyName.DOWN_LEFT = "DownLeft";
  html$._KeyName.DOWN_RIGHT = "DownRight";
  html$._KeyName.EJECT = "Eject";
  html$._KeyName.END = "End";
  html$._KeyName.ENTER = "Enter";
  html$._KeyName.ERASE_EOF = "EraseEof";
  html$._KeyName.EXECUTE = "Execute";
  html$._KeyName.EXSEL = "Exsel";
  html$._KeyName.FN = "Fn";
  html$._KeyName.F1 = "F1";
  html$._KeyName.F2 = "F2";
  html$._KeyName.F3 = "F3";
  html$._KeyName.F4 = "F4";
  html$._KeyName.F5 = "F5";
  html$._KeyName.F6 = "F6";
  html$._KeyName.F7 = "F7";
  html$._KeyName.F8 = "F8";
  html$._KeyName.F9 = "F9";
  html$._KeyName.F10 = "F10";
  html$._KeyName.F11 = "F11";
  html$._KeyName.F12 = "F12";
  html$._KeyName.F13 = "F13";
  html$._KeyName.F14 = "F14";
  html$._KeyName.F15 = "F15";
  html$._KeyName.F16 = "F16";
  html$._KeyName.F17 = "F17";
  html$._KeyName.F18 = "F18";
  html$._KeyName.F19 = "F19";
  html$._KeyName.F20 = "F20";
  html$._KeyName.F21 = "F21";
  html$._KeyName.F22 = "F22";
  html$._KeyName.F23 = "F23";
  html$._KeyName.F24 = "F24";
  html$._KeyName.FINAL_MODE = "FinalMode";
  html$._KeyName.FIND = "Find";
  html$._KeyName.FULL_WIDTH = "FullWidth";
  html$._KeyName.HALF_WIDTH = "HalfWidth";
  html$._KeyName.HANGUL_MODE = "HangulMode";
  html$._KeyName.HANJA_MODE = "HanjaMode";
  html$._KeyName.HELP = "Help";
  html$._KeyName.HIRAGANA = "Hiragana";
  html$._KeyName.HOME = "Home";
  html$._KeyName.INSERT = "Insert";
  html$._KeyName.JAPANESE_HIRAGANA = "JapaneseHiragana";
  html$._KeyName.JAPANESE_KATAKANA = "JapaneseKatakana";
  html$._KeyName.JAPANESE_ROMAJI = "JapaneseRomaji";
  html$._KeyName.JUNJA_MODE = "JunjaMode";
  html$._KeyName.KANA_MODE = "KanaMode";
  html$._KeyName.KANJI_MODE = "KanjiMode";
  html$._KeyName.KATAKANA = "Katakana";
  html$._KeyName.LAUNCH_APPLICATION_1 = "LaunchApplication1";
  html$._KeyName.LAUNCH_APPLICATION_2 = "LaunchApplication2";
  html$._KeyName.LAUNCH_MAIL = "LaunchMail";
  html$._KeyName.LEFT = "Left";
  html$._KeyName.MENU = "Menu";
  html$._KeyName.META = "Meta";
  html$._KeyName.MEDIA_NEXT_TRACK = "MediaNextTrack";
  html$._KeyName.MEDIA_PAUSE_PLAY = "MediaPlayPause";
  html$._KeyName.MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
  html$._KeyName.MEDIA_STOP = "MediaStop";
  html$._KeyName.MODE_CHANGE = "ModeChange";
  html$._KeyName.NEXT_CANDIDATE = "NextCandidate";
  html$._KeyName.NON_CONVERT = "Nonconvert";
  html$._KeyName.NUM_LOCK = "NumLock";
  html$._KeyName.PAGE_DOWN = "PageDown";
  html$._KeyName.PAGE_UP = "PageUp";
  html$._KeyName.PASTE = "Paste";
  html$._KeyName.PAUSE = "Pause";
  html$._KeyName.PLAY = "Play";
  html$._KeyName.POWER = "Power";
  html$._KeyName.PREVIOUS_CANDIDATE = "PreviousCandidate";
  html$._KeyName.PRINT_SCREEN = "PrintScreen";
  html$._KeyName.PROCESS = "Process";
  html$._KeyName.PROPS = "Props";
  html$._KeyName.RIGHT = "Right";
  html$._KeyName.ROMAN_CHARACTERS = "RomanCharacters";
  html$._KeyName.SCROLL = "Scroll";
  html$._KeyName.SELECT = "Select";
  html$._KeyName.SELECT_MEDIA = "SelectMedia";
  html$._KeyName.SEPARATOR = "Separator";
  html$._KeyName.SHIFT = "Shift";
  html$._KeyName.SOFT_1 = "Soft1";
  html$._KeyName.SOFT_2 = "Soft2";
  html$._KeyName.SOFT_3 = "Soft3";
  html$._KeyName.SOFT_4 = "Soft4";
  html$._KeyName.STOP = "Stop";
  html$._KeyName.SUBTRACT = "Subtract";
  html$._KeyName.SYMBOL_LOCK = "SymbolLock";
  html$._KeyName.UP = "Up";
  html$._KeyName.UP_LEFT = "UpLeft";
  html$._KeyName.UP_RIGHT = "UpRight";
  html$._KeyName.UNDO = "Undo";
  html$._KeyName.VOLUME_DOWN = "VolumeDown";
  html$._KeyName.VOLUMN_MUTE = "VolumeMute";
  html$._KeyName.VOLUMN_UP = "VolumeUp";
  html$._KeyName.WIN = "Win";
  html$._KeyName.ZOOM = "Zoom";
  html$._KeyName.BACKSPACE = "Backspace";
  html$._KeyName.TAB = "Tab";
  html$._KeyName.CANCEL = "Cancel";
  html$._KeyName.ESC = "Esc";
  html$._KeyName.SPACEBAR = "Spacebar";
  html$._KeyName.DEL = "Del";
  html$._KeyName.DEAD_GRAVE = "DeadGrave";
  html$._KeyName.DEAD_EACUTE = "DeadEacute";
  html$._KeyName.DEAD_CIRCUMFLEX = "DeadCircumflex";
  html$._KeyName.DEAD_TILDE = "DeadTilde";
  html$._KeyName.DEAD_MACRON = "DeadMacron";
  html$._KeyName.DEAD_BREVE = "DeadBreve";
  html$._KeyName.DEAD_ABOVE_DOT = "DeadAboveDot";
  html$._KeyName.DEAD_UMLAUT = "DeadUmlaut";
  html$._KeyName.DEAD_ABOVE_RING = "DeadAboveRing";
  html$._KeyName.DEAD_DOUBLEACUTE = "DeadDoubleacute";
  html$._KeyName.DEAD_CARON = "DeadCaron";
  html$._KeyName.DEAD_CEDILLA = "DeadCedilla";
  html$._KeyName.DEAD_OGONEK = "DeadOgonek";
  html$._KeyName.DEAD_IOTA = "DeadIota";
  html$._KeyName.DEAD_VOICED_SOUND = "DeadVoicedSound";
  html$._KeyName.DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
  html$._KeyName.UNIDENTIFIED = "Unidentified";
  const _stream$ = Symbol('_stream');
  const _keyDownList = Symbol('_keyDownList');
  const _capsLockOn = Symbol('_capsLockOn');
  const _determineKeyCodeForKeypress = Symbol('_determineKeyCodeForKeypress');
  const _findCharCodeKeyDown = Symbol('_findCharCodeKeyDown');
  const _firesKeyPressEvent = Symbol('_firesKeyPressEvent');
  const _normalizeKeyCodes = Symbol('_normalizeKeyCodes');
  html$._KeyboardEventHandler = class _KeyboardEventHandler extends html$.EventStreamProvider$(html$.KeyEvent) {
    forTarget(e, opts) {
      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
      let handler = new html$._KeyboardEventHandler.initializeAllEventListeners(this[_type], e);
      return handler[_stream$];
    }
    new(type) {
      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
      this[_type] = type;
      this[_stream$] = new html$._CustomKeyEventStreamImpl('event');
      this[_target$] = null;
      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
    }
    initializeAllEventListeners(type, target) {
      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
      this[_type] = type;
      this[_target$] = target;
      this[_stream$] = null;
      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
      html$.Element.keyDownEvent.forTarget(this[_target$], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
      html$.Element.keyPressEvent.forTarget(this[_target$], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
      html$.Element.keyUpEvent.forTarget(this[_target$], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
      this[_stream$] = new html$._CustomKeyEventStreamImpl(this[_type]);
    }
    get [_capsLockOn]() {
      return this[_keyDownList][dartx.any](dart.fn(element => element.keyCode == html$.KeyCode.CAPS_LOCK, KeyEventTobool()));
    }
    [_determineKeyCodeForKeypress](event) {
      for (let prevEvent of this[_keyDownList]) {
        if (prevEvent[_shadowCharCode] == event[dartx.charCode]) {
          return prevEvent.keyCode;
        }
        if ((dart.test(event[dartx.shiftKey]) || dart.test(this[_capsLockOn])) && dart.notNull(event[dartx.charCode]) >= dart.notNull("A"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) <= dart.notNull("Z"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) == prevEvent[_shadowCharCode]) {
          return prevEvent.keyCode;
        }
      }
      return html$.KeyCode.UNKNOWN;
    }
    [_findCharCodeKeyDown](event) {
      if (event[dartx.keyLocation] == 3) {
        switch (event[dartx.keyCode]) {
          case html$.KeyCode.NUM_ZERO:
          {
            return html$.KeyCode.ZERO;
          }
          case html$.KeyCode.NUM_ONE:
          {
            return html$.KeyCode.ONE;
          }
          case html$.KeyCode.NUM_TWO:
          {
            return html$.KeyCode.TWO;
          }
          case html$.KeyCode.NUM_THREE:
          {
            return html$.KeyCode.THREE;
          }
          case html$.KeyCode.NUM_FOUR:
          {
            return html$.KeyCode.FOUR;
          }
          case html$.KeyCode.NUM_FIVE:
          {
            return html$.KeyCode.FIVE;
          }
          case html$.KeyCode.NUM_SIX:
          {
            return html$.KeyCode.SIX;
          }
          case html$.KeyCode.NUM_SEVEN:
          {
            return html$.KeyCode.SEVEN;
          }
          case html$.KeyCode.NUM_EIGHT:
          {
            return html$.KeyCode.EIGHT;
          }
          case html$.KeyCode.NUM_NINE:
          {
            return html$.KeyCode.NINE;
          }
          case html$.KeyCode.NUM_MULTIPLY:
          {
            return 42;
          }
          case html$.KeyCode.NUM_PLUS:
          {
            return 43;
          }
          case html$.KeyCode.NUM_MINUS:
          {
            return 45;
          }
          case html$.KeyCode.NUM_PERIOD:
          {
            return 46;
          }
          case html$.KeyCode.NUM_DIVISION:
          {
            return 47;
          }
        }
      } else if (dart.notNull(event[dartx.keyCode]) >= 65 && dart.notNull(event[dartx.keyCode]) <= 90) {
        return dart.notNull(event[dartx.keyCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
      }
      switch (event[dartx.keyCode]) {
        case html$.KeyCode.SEMICOLON:
        {
          return html$.KeyCode.FF_SEMICOLON;
        }
        case html$.KeyCode.EQUALS:
        {
          return html$.KeyCode.FF_EQUALS;
        }
        case html$.KeyCode.COMMA:
        {
          return 44;
        }
        case html$.KeyCode.DASH:
        {
          return 45;
        }
        case html$.KeyCode.PERIOD:
        {
          return 46;
        }
        case html$.KeyCode.SLASH:
        {
          return 47;
        }
        case html$.KeyCode.APOSTROPHE:
        {
          return 96;
        }
        case html$.KeyCode.OPEN_SQUARE_BRACKET:
        {
          return 91;
        }
        case html$.KeyCode.BACKSLASH:
        {
          return 92;
        }
        case html$.KeyCode.CLOSE_SQUARE_BRACKET:
        {
          return 93;
        }
        case html$.KeyCode.SINGLE_QUOTE:
        {
          return 39;
        }
      }
      return event[dartx.keyCode];
    }
    [_firesKeyPressEvent](event) {
      if (!dart.test(html_common.Device.isIE) && !dart.test(html_common.Device.isWebKit)) {
        return true;
      }
      if (dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && dart.test(event.altKey)) {
        return html$.KeyCode.isCharacterKey(event.keyCode);
      }
      if (dart.test(event.altKey) && !dart.test(event.ctrlKey)) {
        return false;
      }
      if (!dart.test(event.shiftKey) && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META)) {
        return false;
      }
      if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode == html$.KeyCode.BACKSLASH || event.keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode == html$.KeyCode.TILDE || event.keyCode == html$.KeyCode.SEMICOLON || event.keyCode == html$.KeyCode.DASH || event.keyCode == html$.KeyCode.EQUALS || event.keyCode == html$.KeyCode.COMMA || event.keyCode == html$.KeyCode.PERIOD || event.keyCode == html$.KeyCode.SLASH || event.keyCode == html$.KeyCode.APOSTROPHE || event.keyCode == html$.KeyCode.SINGLE_QUOTE)) {
        return false;
      }
      switch (event.keyCode) {
        case html$.KeyCode.ENTER:
        {
          return !dart.test(html_common.Device.isIE);
        }
        case html$.KeyCode.ESC:
        {
          return !dart.test(html_common.Device.isWebKit);
        }
      }
      return html$.KeyCode.isCharacterKey(event.keyCode);
    }
    [_normalizeKeyCodes](event) {
      if (dart.test(html_common.Device.isFirefox)) {
        switch (event[dartx.keyCode]) {
          case html$.KeyCode.FF_EQUALS:
          {
            return html$.KeyCode.EQUALS;
          }
          case html$.KeyCode.FF_SEMICOLON:
          {
            return html$.KeyCode.SEMICOLON;
          }
          case html$.KeyCode.MAC_FF_META:
          {
            return html$.KeyCode.META;
          }
          case html$.KeyCode.WIN_KEY_FF_LINUX:
          {
            return html$.KeyCode.WIN_KEY;
          }
        }
      }
      return event[dartx.keyCode];
    }
    processKeyDown(e) {
      if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL && !dart.test(e[dartx.ctrlKey]) || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT && !dart.test(e[dartx.altKey]) || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META && !dart.test(e[dartx.metaKey]))) {
        this[_keyDownList][dartx.clear]();
      }
      let event = new html$.KeyEvent.wrap(e);
      event[_shadowKeyCode] = this[_normalizeKeyCodes](event);
      event[_shadowCharCode] = this[_findCharCodeKeyDown](event);
      if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && event.keyCode != this[_keyDownList][dartx.last].keyCode && !dart.test(this[_firesKeyPressEvent](event))) {
        this.processKeyPress(e);
      }
      this[_keyDownList][dartx.add](event);
      this[_stream$].add(event);
    }
    processKeyPress(event) {
      let e = new html$.KeyEvent.wrap(event);
      if (dart.test(html_common.Device.isIE)) {
        if (e.keyCode == html$.KeyCode.ENTER || e.keyCode == html$.KeyCode.ESC) {
          e[_shadowCharCode] = 0;
        } else {
          e[_shadowCharCode] = e.keyCode;
        }
      } else if (dart.test(html_common.Device.isOpera)) {
        e[_shadowCharCode] = dart.test(html$.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
      }
      e[_shadowKeyCode] = this[_determineKeyCodeForKeypress](e);
      if (e[_shadowKeyIdentifier] != null && dart.test(html$._KeyboardEventHandler._keyIdentifier[dartx.containsKey](e[_shadowKeyIdentifier]))) {
        e[_shadowKeyCode] = html$._KeyboardEventHandler._keyIdentifier[dartx._get](e[_shadowKeyIdentifier]);
      }
      e[_shadowAltKey] = this[_keyDownList][dartx.any](dart.fn(element => element.altKey, KeyEventTobool()));
      this[_stream$].add(e);
    }
    processKeyUp(event) {
      let e = new html$.KeyEvent.wrap(event);
      let toRemove = null;
      for (let key of this[_keyDownList]) {
        if (key.keyCode == e.keyCode) {
          toRemove = key;
        }
      }
      if (toRemove != null) {
        this[_keyDownList][dartx.removeWhere](dart.fn(element => dart.equals(element, toRemove), KeyEventTobool()));
      } else if (dart.notNull(this[_keyDownList][dartx.length]) > 0) {
        this[_keyDownList][dartx.removeLast]();
      }
      this[_stream$].add(e);
    }
  };
  dart.addSimpleTypeTests(html$._KeyboardEventHandler);
  dart.defineNamedConstructor(html$._KeyboardEventHandler, 'initializeAllEventListeners');
  dart.setSignature(html$._KeyboardEventHandler, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String]),
      initializeAllEventListeners: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String, html$.EventTarget])
    }),
    fields: () => ({
      [_keyDownList]: ListOfKeyEvent(),
      [_type]: core.String,
      [_target$]: html$.EventTarget,
      [_stream$]: html$._CustomKeyEventStreamImpl
    }),
    getters: () => ({[_capsLockOn]: dart.definiteFunctionType(core.bool, [])}),
    methods: () => ({
      forTarget: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget], {useCapture: core.bool}),
      [_determineKeyCodeForKeypress]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
      [_findCharCodeKeyDown]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
      [_firesKeyPressEvent]: dart.definiteFunctionType(core.bool, [html$.KeyEvent]),
      [_normalizeKeyCodes]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
      processKeyDown: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
      processKeyPress: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
      processKeyUp: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent])
    }),
    sfields: () => ({
      _ROMAN_ALPHABET_OFFSET: core.int,
      _EVENT_TYPE: core.String,
      _keyIdentifier: MapOfString$int()
    })
  });
  html$._KeyboardEventHandler._EVENT_TYPE = 'KeyEvent';
  html$._KeyboardEventHandler._keyIdentifier = dart.const(dart.map({Up: html$.KeyCode.UP, Down: html$.KeyCode.DOWN, Left: html$.KeyCode.LEFT, Right: html$.KeyCode.RIGHT, Enter: html$.KeyCode.ENTER, F1: html$.KeyCode.F1, F2: html$.KeyCode.F2, F3: html$.KeyCode.F3, F4: html$.KeyCode.F4, F5: html$.KeyCode.F5, F6: html$.KeyCode.F6, F7: html$.KeyCode.F7, F8: html$.KeyCode.F8, F9: html$.KeyCode.F9, F10: html$.KeyCode.F10, F11: html$.KeyCode.F11, F12: html$.KeyCode.F12, 'U+007F': html$.KeyCode.DELETE, Home: html$.KeyCode.HOME, End: html$.KeyCode.END, PageUp: html$.KeyCode.PAGE_UP, PageDown: html$.KeyCode.PAGE_DOWN, Insert: html$.KeyCode.INSERT}, core.String, core.int));
  dart.defineLazy(html$._KeyboardEventHandler, {
    get _ROMAN_ALPHABET_OFFSET() {
      return dart.notNull("a"[dartx.codeUnits][dartx._get](0)) - dart.notNull("A"[dartx.codeUnits][dartx._get](0));
    }
  });
  html$.KeyboardEventStream = class KeyboardEventStream extends core.Object {
    static onKeyPress(target) {
      return new html$._KeyboardEventHandler('keypress').forTarget(target);
    }
    static onKeyUp(target) {
      return new html$._KeyboardEventHandler('keyup').forTarget(target);
    }
    static onKeyDown(target) {
      return new html$._KeyboardEventHandler('keydown').forTarget(target);
    }
  };
  dart.setSignature(html$.KeyboardEventStream, {
    statics: () => ({
      onKeyPress: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
      onKeyUp: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
      onKeyDown: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget])
    }),
    names: ['onKeyPress', 'onKeyUp', 'onKeyDown']
  });
  const _validators = Symbol('_validators');
  html$.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
    new() {
      this[_validators] = JSArrayOfNodeValidator().of([]);
    }
    common() {
      this[_validators] = JSArrayOfNodeValidator().of([]);
      this.allowHtml5();
      this.allowTemplating();
    }
    allowNavigation(uriPolicy) {
      if (uriPolicy === void 0) uriPolicy = null;
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(html$._SimpleNodeValidator.allowNavigation(uriPolicy));
    }
    allowImages(uriPolicy) {
      if (uriPolicy === void 0) uriPolicy = null;
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(html$._SimpleNodeValidator.allowImages(uriPolicy));
    }
    allowTextElements() {
      this.add(html$._SimpleNodeValidator.allowTextElements());
    }
    allowInlineStyles(opts) {
      let tagName = opts && 'tagName' in opts ? opts.tagName : null;
      if (tagName == null) {
        tagName = '*';
      } else {
        tagName = tagName[dartx.toUpperCase]();
      }
      this.add(new html$._SimpleNodeValidator(null, {allowedAttributes: JSArrayOfString().of([dart.str`${tagName}::style`])}));
    }
    allowHtml5(opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      this.add(new html$._Html5NodeValidator({uriPolicy: uriPolicy}));
    }
    allowSvg() {
      this.add(new html$._SvgNodeValidator());
    }
    allowCustomElement(tagName, opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
      let tagNameUpper = tagName[dartx.toUpperCase]();
      let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
    }
    allowTagExtension(tagName, baseName, opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
      let baseNameUpper = baseName[dartx.toUpperCase]();
      let tagNameUpper = tagName[dartx.toUpperCase]();
      let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
      if (uriPolicy == null) {
        uriPolicy = html$.UriPolicy.new();
      }
      this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
    }
    allowElement(tagName, opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
      this.allowCustomElement(tagName, {uriPolicy: uriPolicy, attributes: attributes, uriAttributes: uriAttributes});
    }
    allowTemplating() {
      this.add(new html$._TemplatingNodeValidator());
    }
    add(validator) {
      this[_validators][dartx.add](validator);
    }
    allowsElement(element) {
      return this[_validators][dartx.any](dart.fn(v => v.allowsElement(element), NodeValidatorTobool()));
    }
    allowsAttribute(element, attributeName, value) {
      return this[_validators][dartx.any](dart.fn(v => v.allowsAttribute(element, attributeName, value), NodeValidatorTobool()));
    }
  };
  dart.defineNamedConstructor(html$.NodeValidatorBuilder, 'common');
  html$.NodeValidatorBuilder[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$.NodeValidatorBuilder, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.NodeValidatorBuilder, []),
      common: dart.definiteFunctionType(html$.NodeValidatorBuilder, [])
    }),
    fields: () => ({[_validators]: ListOfNodeValidator()}),
    methods: () => ({
      allowNavigation: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
      allowImages: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
      allowTextElements: dart.definiteFunctionType(dart.void, []),
      allowInlineStyles: dart.definiteFunctionType(dart.void, [], {tagName: core.String}),
      allowHtml5: dart.definiteFunctionType(dart.void, [], {uriPolicy: html$.UriPolicy}),
      allowSvg: dart.definiteFunctionType(dart.void, []),
      allowCustomElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
      allowTagExtension: dart.definiteFunctionType(dart.void, [core.String, core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
      allowElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
      allowTemplating: dart.definiteFunctionType(dart.void, []),
      add: dart.definiteFunctionType(dart.void, [html$.NodeValidator]),
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  let const$53;
  let const$54;
  let const$55;
  let const$56;
  let const$57;
  let const$58;
  let const$59;
  let const$60;
  let const$61;
  let const$62;
  html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
    static allowNavigation(uriPolicy) {
      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$53 || (const$53 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$54 || (const$54 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$55 || (const$55 = dart.constList(['A::href', 'FORM::action'], core.String))});
    }
    static allowImages(uriPolicy) {
      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$56 || (const$56 = dart.constList(['IMG'], core.String)), allowedAttributes: const$57 || (const$57 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$58 || (const$58 = dart.constList(['IMG::src'], core.String))});
    }
    static allowTextElements() {
      return new html$._SimpleNodeValidator(null, {allowedElements: const$59 || (const$59 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
    }
    new(uriPolicy, opts) {
      let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
      let allowedAttributes = opts && 'allowedAttributes' in opts ? opts.allowedAttributes : null;
      let allowedUriAttributes = opts && 'allowedUriAttributes' in opts ? opts.allowedUriAttributes : null;
      this.allowedElements = SetOfString().new();
      this.allowedAttributes = SetOfString().new();
      this.allowedUriAttributes = SetOfString().new();
      this.uriPolicy = uriPolicy;
      this.allowedElements.addAll((allowedElements != null ? allowedElements : const$60 || (const$60 = dart.constList([], core.String))));
      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$61 || (const$61 = dart.constList([], core.String));
      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$62 || (const$62 = dart.constList([], core.String));
      let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
      let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
      this.allowedAttributes.addAll(legalAttributes);
      this.allowedUriAttributes.addAll(allowedUriAttributes);
      this.allowedUriAttributes.addAll(extraUriAttributes);
    }
    allowsElement(element) {
      return this.allowedElements.contains(html$.Element._safeTagName(element));
    }
    allowsAttribute(element, attributeName, value) {
      let tagName = html$.Element._safeTagName(element);
      if (dart.test(this.allowedUriAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
        return this.uriPolicy.allowsUri(value);
      } else if (dart.test(this.allowedUriAttributes.contains(dart.str`*::${attributeName}`))) {
        return this.uriPolicy.allowsUri(value);
      } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
        return true;
      } else if (dart.test(this.allowedAttributes.contains(dart.str`*::${attributeName}`))) {
        return true;
      } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::*`))) {
        return true;
      } else if (dart.test(this.allowedAttributes.contains('*::*'))) {
        return true;
      }
      return false;
    }
  };
  html$._SimpleNodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._SimpleNodeValidator, {
    constructors: () => ({
      allowNavigation: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
      allowImages: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
      allowTextElements: dart.definiteFunctionType(html$._SimpleNodeValidator, []),
      new: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy], {allowedElements: IterableOfString(), allowedAttributes: IterableOfString(), allowedUriAttributes: IterableOfString()})
    }),
    fields: () => ({
      allowedElements: SetOfString(),
      allowedAttributes: SetOfString(),
      allowedUriAttributes: SetOfString(),
      uriPolicy: html$.UriPolicy
    }),
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  html$._CustomElementNodeValidator = class _CustomElementNodeValidator extends html$._SimpleNodeValidator {
    new(uriPolicy, allowedElements, allowedAttributes, allowedUriAttributes, allowTypeExtension, allowCustomTag) {
      this.allowTypeExtension = allowTypeExtension == true;
      this.allowCustomTag = allowCustomTag == true;
      super.new(uriPolicy, {allowedElements: allowedElements, allowedAttributes: allowedAttributes, allowedUriAttributes: allowedUriAttributes});
    }
    allowsElement(element) {
      if (dart.test(this.allowTypeExtension)) {
        let isAttr = element[dartx.attributes][dartx._get]('is');
        if (isAttr != null) {
          return dart.test(this.allowedElements.contains(isAttr[dartx.toUpperCase]())) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
        }
      }
      return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
    }
    allowsAttribute(element, attributeName, value) {
      if (dart.test(this.allowsElement(element))) {
        if (dart.test(this.allowTypeExtension) && attributeName == 'is' && dart.test(this.allowedElements.contains(value[dartx.toUpperCase]()))) {
          return true;
        }
        return super.allowsAttribute(element, attributeName, value);
      }
      return false;
    }
  };
  dart.setSignature(html$._CustomElementNodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._CustomElementNodeValidator, [html$.UriPolicy, IterableOfString(), IterableOfString(), IterableOfString(), core.bool, core.bool])}),
    fields: () => ({
      allowTypeExtension: core.bool,
      allowCustomTag: core.bool
    })
  });
  const _templateAttrs = Symbol('_templateAttrs');
  html$._TemplatingNodeValidator = class _TemplatingNodeValidator extends html$._SimpleNodeValidator {
    new() {
      this[_templateAttrs] = SetOfString().from(html$._TemplatingNodeValidator._TEMPLATE_ATTRS);
      super.new(null, {allowedElements: JSArrayOfString().of(['TEMPLATE']), allowedAttributes: html$._TemplatingNodeValidator._TEMPLATE_ATTRS[dartx.map](core.String)(dart.fn(attr => dart.str`TEMPLATE::${attr}`, StringToString$()))});
    }
    allowsAttribute(element, attributeName, value) {
      if (dart.test(super.allowsAttribute(element, attributeName, value))) {
        return true;
      }
      if (attributeName == 'template' && value == "") {
        return true;
      }
      if (element[dartx.attributes][dartx._get]('template') == "") {
        return this[_templateAttrs].contains(attributeName);
      }
      return false;
    }
  };
  dart.setSignature(html$._TemplatingNodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._TemplatingNodeValidator, [])}),
    fields: () => ({[_templateAttrs]: SetOfString()}),
    sfields: () => ({_TEMPLATE_ATTRS: ListOfString()})
  });
  html$._TemplatingNodeValidator._TEMPLATE_ATTRS = dart.constList(['bind', 'if', 'ref', 'repeat', 'syntax'], core.String);
  html$._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
    allowsElement(element) {
      if (svg$.ScriptElement.is(element)) {
        return false;
      }
      if (svg$.SvgElement.is(element) && html$.Element._safeTagName(element) == 'foreignObject') {
        return false;
      }
      if (svg$.SvgElement.is(element)) {
        return true;
      }
      return false;
    }
    allowsAttribute(element, attributeName, value) {
      if (attributeName == 'is' || dart.test(attributeName[dartx.startsWith]('on'))) {
        return false;
      }
      return this.allowsElement(element);
    }
  };
  html$._SvgNodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._SvgNodeValidator, {
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  html$.ReadyState = class ReadyState extends core.Object {};
  dart.setSignature(html$.ReadyState, {
    sfields: () => ({
      LOADING: core.String,
      INTERACTIVE: core.String,
      COMPLETE: core.String
    })
  });
  html$.ReadyState.LOADING = "loading";
  html$.ReadyState.INTERACTIVE = "interactive";
  html$.ReadyState.COMPLETE = "complete";
  const _list$ = Symbol('_list');
  html$._WrappedList$ = dart.generic(E => {
    let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html$._WrappedIterator$(E)))();
    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
    class _WrappedList extends collection.ListBase$(E) {
      new(list) {
        this[_list$] = list;
      }
      get iterator() {
        return new (_WrappedIteratorOfE())(this[_list$][dartx.iterator]);
      }
      get length() {
        return this[_list$][dartx.length];
      }
      add(element) {
        E._check(element);
        this[_list$][dartx.add](element);
      }
      remove(element) {
        return this[_list$][dartx.remove](element);
      }
      clear() {
        this[_list$][dartx.clear]();
      }
      _get(index) {
        return html$._downcast(html$.Node, E)(this[_list$][dartx._get](index));
      }
      _set(index, value) {
        E._check(value);
        this[_list$][dartx._set](index, value);
        return value;
      }
      set length(newLength) {
        this[_list$][dartx.length] = newLength;
      }
      sort(compare) {
        if (compare === void 0) compare = null;
        this[_list$][dartx.sort](dart.fn((a, b) => compare(html$._downcast(html$.Node, E)(a), html$._downcast(html$.Node, E)(b)), NodeAndNodeToint()));
      }
      indexOf(element, start) {
        if (start === void 0) start = 0;
        return this[_list$][dartx.indexOf](html$.Node._check(element), start);
      }
      lastIndexOf(element, start) {
        if (start === void 0) start = null;
        return this[_list$][dartx.lastIndexOf](html$.Node._check(element), start);
      }
      insert(index, element) {
        E._check(element);
        return this[_list$][dartx.insert](index, element);
      }
      removeAt(index) {
        return html$._downcast(html$.Node, E)(this[_list$][dartx.removeAt](index));
      }
      setRange(start, end, iterable, skipCount) {
        IterableOfE()._check(iterable);
        if (skipCount === void 0) skipCount = 0;
        this[_list$][dartx.setRange](start, end, iterable, skipCount);
      }
      removeRange(start, end) {
        this[_list$][dartx.removeRange](start, end);
      }
      replaceRange(start, end, iterable) {
        IterableOfE()._check(iterable);
        this[_list$][dartx.replaceRange](start, end, iterable);
      }
      fillRange(start, end, fillValue) {
        if (fillValue === void 0) fillValue = null;
        E._check(fillValue);
        this[_list$][dartx.fillRange](start, end, fillValue);
      }
      get rawList() {
        return this[_list$];
      }
    }
    _WrappedList[dart.implements] = () => [html_common.NodeListWrapper];
    dart.setSignature(_WrappedList, {
      constructors: () => ({new: dart.definiteFunctionType(html$._WrappedList$(E), [ListOfNode()])}),
      fields: () => ({[_list$]: ListOfNode()}),
      getters: () => ({
        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
        length: dart.definiteFunctionType(core.int, []),
        rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
      }),
      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
      methods: () => ({
        add: dart.definiteFunctionType(dart.void, [E]),
        _get: dart.definiteFunctionType(E, [core.int]),
        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
        removeAt: dart.definiteFunctionType(E, [core.int]),
        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
      })
    });
    dart.defineExtensionMembers(_WrappedList, [
      'add',
      'remove',
      'clear',
      '_get',
      '_set',
      'sort',
      'indexOf',
      'lastIndexOf',
      'insert',
      'removeAt',
      'setRange',
      'removeRange',
      'replaceRange',
      'fillRange',
      'iterator',
      'length',
      'length'
    ]);
    return _WrappedList;
  });
  html$._WrappedList = _WrappedList();
  const _iterator$1 = Symbol('_iterator');
  html$._WrappedIterator$ = dart.generic(E => {
    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
    class _WrappedIterator extends core.Object {
      new(iterator) {
        this[_iterator$1] = iterator;
      }
      moveNext() {
        return this[_iterator$1].moveNext();
      }
      get current() {
        return html$._downcast(html$.Node, E)(this[_iterator$1].current);
      }
    }
    dart.addTypeTests(_WrappedIterator);
    _WrappedIterator[dart.implements] = () => [IteratorOfE()];
    dart.setSignature(_WrappedIterator, {
      constructors: () => ({new: dart.definiteFunctionType(html$._WrappedIterator$(E), [IteratorOfNode()])}),
      fields: () => ({[_iterator$1]: IteratorOfNode()}),
      getters: () => ({current: dart.definiteFunctionType(E, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _WrappedIterator;
  });
  html$._WrappedIterator = _WrappedIterator();
  html$._downcast = function(From, To) {
    return x => {
      return To._check(x);
    };
  };
  dart.fn(html$._downcast, FromToTo());
  html$._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
    static get(url, onComplete, withCredentials) {
      let request = html$.HttpRequest.new();
      request[dartx.open]('GET', url, {async: true});
      request[dartx.withCredentials] = withCredentials;
      request[dartx.onReadyStateChange].listen(dart.fn(e => {
        if (request[dartx.readyState] == html$.HttpRequest.DONE) {
          onComplete(request);
        }
      }, ProgressEventTovoid$()));
      request[dartx.send]();
      return request;
    }
  };
  dart.setSignature(html$._HttpRequestUtils, {
    statics: () => ({get: dart.definiteFunctionType(html$.HttpRequest, [core.String, HttpRequestTodynamic(), core.bool])}),
    names: ['get']
  });
  const _array = Symbol('_array');
  const _current$4 = Symbol('_current');
  html$.FixedSizeListIterator$ = dart.generic(T => {
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    class FixedSizeListIterator extends core.Object {
      new(array) {
        this[_array] = array;
        this[_position$0] = -1;
        this[_length$2] = array[dartx.length];
        this[_current$4] = null;
      }
      moveNext() {
        let nextPosition = dart.notNull(this[_position$0]) + 1;
        if (nextPosition < dart.notNull(this[_length$2])) {
          this[_current$4] = this[_array][dartx._get](nextPosition);
          this[_position$0] = nextPosition;
          return true;
        }
        this[_current$4] = null;
        this[_position$0] = this[_length$2];
        return false;
      }
      get current() {
        return this[_current$4];
      }
    }
    dart.addTypeTests(FixedSizeListIterator);
    FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(FixedSizeListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(html$.FixedSizeListIterator$(T), [ListOfT()])}),
      fields: () => ({
        [_array]: ListOfT(),
        [_length$2]: core.int,
        [_position$0]: core.int,
        [_current$4]: T
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return FixedSizeListIterator;
  });
  html$.FixedSizeListIterator = FixedSizeListIterator();
  html$._VariableSizeListIterator$ = dart.generic(T => {
    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
    class _VariableSizeListIterator extends core.Object {
      new(array) {
        this[_array] = array;
        this[_position$0] = -1;
        this[_current$4] = null;
      }
      moveNext() {
        let nextPosition = dart.notNull(this[_position$0]) + 1;
        if (nextPosition < dart.notNull(this[_array][dartx.length])) {
          this[_current$4] = this[_array][dartx._get](nextPosition);
          this[_position$0] = nextPosition;
          return true;
        }
        this[_current$4] = null;
        this[_position$0] = this[_array][dartx.length];
        return false;
      }
      get current() {
        return this[_current$4];
      }
    }
    dart.addTypeTests(_VariableSizeListIterator);
    _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
    dart.setSignature(_VariableSizeListIterator, {
      constructors: () => ({new: dart.definiteFunctionType(html$._VariableSizeListIterator$(T), [ListOfT()])}),
      fields: () => ({
        [_array]: ListOfT(),
        [_position$0]: core.int,
        [_current$4]: T
      }),
      getters: () => ({current: dart.definiteFunctionType(T, [])}),
      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
    });
    return _VariableSizeListIterator;
  });
  html$._VariableSizeListIterator = _VariableSizeListIterator();
  html$._convertNativeToDart_Window = function(win) {
    if (win == null) return null;
    return html$._DOMWindowCrossFrame._createSafe(win);
  };
  dart.fn(html$._convertNativeToDart_Window, dynamicToWindowBase());
  html$._convertNativeToDart_EventTarget = function(e) {
    if (e == null) {
      return null;
    }
    if ("postMessage" in e) {
      let window = html$._DOMWindowCrossFrame._createSafe(e);
      if (html$.EventTarget.is(window)) {
        return window;
      }
      return null;
    } else
      return html$.EventTarget._check(e);
  };
  dart.fn(html$._convertNativeToDart_EventTarget, dynamicToEventTarget());
  const _window = Symbol('_window');
  html$._convertDartToNative_EventTarget = function(e) {
    if (html$._DOMWindowCrossFrame.is(e)) {
      return html$.EventTarget._check(e[_window]);
    } else {
      return html$.EventTarget._check(e);
    }
  };
  dart.fn(html$._convertDartToNative_EventTarget, dynamicToEventTarget());
  html$._convertNativeToDart_XHR_Response = function(o) {
    if (html$.Document.is(o)) {
      return o;
    }
    return html_common.convertNativeToDart_SerializedScriptValue(o);
  };
  dart.fn(html$._convertNativeToDart_XHR_Response, dynamicTodynamic$());
  html$._callConstructor = function(constructor, interceptor) {
    return dart.fn(receiver => {
      _js_helper.setNativeSubclassDispatchRecord(receiver, interceptor);
      receiver.constructor = receiver.__proto__.constructor;
      return constructor(receiver);
    }, dynamicTodynamic$());
  };
  dart.fn(html$._callConstructor, dynamicAnddynamicTodynamic$());
  html$._callAttached = function(receiver) {
    return dart.dsend(receiver, 'attached');
  };
  dart.fn(html$._callAttached, dynamicTodynamic$());
  html$._callDetached = function(receiver) {
    return dart.dsend(receiver, 'detached');
  };
  dart.fn(html$._callDetached, dynamicTodynamic$());
  html$._callAttributeChanged = function(receiver, name, oldValue, newValue) {
    return dart.dsend(receiver, 'attributeChanged', name, oldValue, newValue);
  };
  dart.fn(html$._callAttributeChanged, dynamicAnddynamicAnddynamic__Todynamic());
  html$._makeCallbackMethod = function(callback) {
    return (function(invokeCallback) {
      return function() {
        return invokeCallback(this);
      };
    })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 1));
  };
  dart.fn(html$._makeCallbackMethod, dynamicTodynamic$());
  html$._makeCallbackMethod3 = function(callback) {
    return (function(invokeCallback) {
      return function(arg1, arg2, arg3) {
        return invokeCallback(this, arg1, arg2, arg3);
      };
    })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 4));
  };
  dart.fn(html$._makeCallbackMethod3, dynamicTodynamic$());
  html$._registerCustomElement = function(context, document, tag, type, extendsTagName) {
    let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
    if (interceptorClass == null) {
      dart.throw(new core.ArgumentError(type));
    }
    let interceptor = interceptorClass.prototype;
    let constructor = _interceptors.findConstructorForNativeSubclassType(type, 'created');
    if (constructor == null) {
      dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
    }
    _interceptors.getNativeInterceptor(html$.Element.tag('article'));
    let baseClassName = core.String._check(_js_helper.findDispatchTagForInterceptorClass(interceptorClass));
    if (baseClassName == null) {
      dart.throw(new core.ArgumentError(type));
    }
    if (extendsTagName == null) {
      if (baseClassName != 'HTMLElement') {
        dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
      }
    } else {
      if (!(document.createElement(extendsTagName) instanceof window[baseClassName])) {
        dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
      }
    }
    let baseConstructor = context[baseClassName];
    let properties = {};
    properties.createdCallback = {value: html$._makeCallbackMethod(html$._callConstructor(constructor, interceptor))};
    properties.attachedCallback = {value: html$._makeCallbackMethod(html$._callAttached)};
    properties.detachedCallback = {value: html$._makeCallbackMethod(html$._callDetached)};
    properties.attributeChangedCallback = {value: html$._makeCallbackMethod3(html$._callAttributeChanged)};
    let baseProto = baseConstructor.prototype;
    let proto = Object.create(baseProto, properties);
    _js_helper.setNativeSubclassDispatchRecord(proto, interceptor);
    let options = {prototype: proto};
    if (extendsTagName != null) {
      options.extends = extendsTagName;
    }
    document.registerElement(tag, options);
  };
  dart.fn(html$._registerCustomElement, dynamicAnddynamicAndString__Tovoid());
  html$._initializeCustomElement = function(e) {
  };
  dart.fn(html$._initializeCustomElement, ElementTovoid$());
  const _interceptor = Symbol('_interceptor');
  const _constructor = Symbol('_constructor');
  const _nativeType = Symbol('_nativeType');
  html$._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
    new(document, type, extendsTag) {
      this[_interceptor] = null;
      this[_constructor] = null;
      this[_nativeType] = null;
      let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
      if (interceptorClass == null) {
        dart.throw(new core.ArgumentError(type));
      }
      this[_constructor] = _interceptors.findConstructorForNativeSubclassType(type, 'created');
      if (this[_constructor] == null) {
        dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
      }
      _interceptors.getNativeInterceptor(html$.Element.tag('article'));
      let baseClassName = _js_helper.findDispatchTagForInterceptorClass(interceptorClass);
      if (baseClassName == null) {
        dart.throw(new core.ArgumentError(type));
      }
      if (extendsTag == null) {
        if (!dart.equals(baseClassName, 'HTMLElement')) {
          dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
        }
        this[_nativeType] = dart.wrapType(html$.HtmlElement);
      } else {
        let element = document[dartx.createElement](extendsTag);
        if (!(element instanceof window[baseClassName])) {
          dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
        }
        this[_nativeType] = dart.runtimeType(element);
      }
      this[_interceptor] = interceptorClass.prototype;
    }
    upgrade(element) {
      if (!dart.equals(dart.runtimeType(element), this[_nativeType])) {
        dart.throw(new core.ArgumentError(dart.str`element is not subclass of ${this[_nativeType]}`));
      }
      _js_helper.setNativeSubclassDispatchRecord(element, this[_interceptor]);
      this[_constructor](element);
      return element;
    }
  };
  html$._JSElementUpgrader[dart.implements] = () => [html$.ElementUpgrader];
  dart.setSignature(html$._JSElementUpgrader, {
    constructors: () => ({new: dart.definiteFunctionType(html$._JSElementUpgrader, [html$.Document, core.Type, core.String])}),
    fields: () => ({
      [_interceptor]: dart.dynamic,
      [_constructor]: dart.dynamic,
      [_nativeType]: dart.dynamic
    }),
    methods: () => ({upgrade: dart.definiteFunctionType(html$.Element, [html$.Element])})
  });
  html$._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
    get history() {
      return html$._HistoryCrossFrame._createSafe(this[_window].history);
    }
    get location() {
      return html$._LocationCrossFrame._createSafe(this[_window].location);
    }
    get closed() {
      return this[_window].closed;
    }
    get opener() {
      return html$._DOMWindowCrossFrame._createSafe(this[_window].opener);
    }
    get parent() {
      return html$._DOMWindowCrossFrame._createSafe(this[_window].parent);
    }
    get top() {
      return html$._DOMWindowCrossFrame._createSafe(this[_window].top);
    }
    close() {
      return this[_window].close();
    }
    postMessage(message, targetOrigin, messagePorts) {
      if (messagePorts === void 0) messagePorts = null;
      if (messagePorts == null) {
        this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin);
      } else {
        this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
      }
    }
    new(window) {
      this[_window] = window;
    }
    static _createSafe(w) {
      if (core.identical(w, html$.window)) {
        return html$.WindowBase._check(w);
      } else {
        return new html$._DOMWindowCrossFrame(w);
      }
    }
    get on() {
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    [_addEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    addEventListener(type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    dispatchEvent(event) {
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    [_removeEventListener](type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
    removeEventListener(type, listener, useCapture) {
      if (useCapture === void 0) useCapture = null;
      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
    }
  };
  html$._DOMWindowCrossFrame[dart.implements] = () => [html$.WindowBase];
  dart.setSignature(html$._DOMWindowCrossFrame, {
    constructors: () => ({new: dart.definiteFunctionType(html$._DOMWindowCrossFrame, [dart.dynamic])}),
    fields: () => ({[_window]: dart.dynamic}),
    getters: () => ({
      history: dart.definiteFunctionType(html$.HistoryBase, []),
      location: dart.definiteFunctionType(html$.LocationBase, []),
      closed: dart.definiteFunctionType(core.bool, []),
      opener: dart.definiteFunctionType(html$.WindowBase, []),
      parent: dart.definiteFunctionType(html$.WindowBase, []),
      top: dart.definiteFunctionType(html$.WindowBase, []),
      on: dart.definiteFunctionType(html$.Events, [])
    }),
    methods: () => ({
      close: dart.definiteFunctionType(dart.void, []),
      postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [core.List]),
      [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      addEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      dispatchEvent: dart.definiteFunctionType(core.bool, [html$.Event]),
      [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
      removeEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
    }),
    statics: () => ({_createSafe: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])}),
    names: ['_createSafe']
  });
  dart.defineExtensionMembers(html$._DOMWindowCrossFrame, [
    'close',
    'postMessage',
    'history',
    'location',
    'closed',
    'opener',
    'parent',
    'top'
  ]);
  html$._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
    set href(val) {
      return html$._LocationCrossFrame._setHref(this[_location], val);
    }
    static _setHref(location, val) {
      location.href = val;
    }
    new(location) {
      this[_location] = location;
    }
    static _createSafe(location) {
      if (core.identical(location, html$.window[dartx.location])) {
        return html$.LocationBase._check(location);
      } else {
        return new html$._LocationCrossFrame(location);
      }
    }
  };
  html$._LocationCrossFrame[dart.implements] = () => [html$.LocationBase];
  dart.setSignature(html$._LocationCrossFrame, {
    constructors: () => ({new: dart.definiteFunctionType(html$._LocationCrossFrame, [dart.dynamic])}),
    fields: () => ({[_location]: dart.dynamic}),
    setters: () => ({href: dart.definiteFunctionType(dart.void, [core.String])}),
    statics: () => ({
      _setHref: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
      _createSafe: dart.definiteFunctionType(html$.LocationBase, [dart.dynamic])
    }),
    names: ['_setHref', '_createSafe']
  });
  dart.defineExtensionMembers(html$._LocationCrossFrame, ['href']);
  const _history = Symbol('_history');
  html$._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
    back() {
      return this[_history].back();
    }
    forward() {
      return this[_history].forward();
    }
    go(distance) {
      return this[_history].go(distance);
    }
    new(history) {
      this[_history] = history;
    }
    static _createSafe(h) {
      if (core.identical(h, html$.window[dartx.history])) {
        return html$.HistoryBase._check(h);
      } else {
        return new html$._HistoryCrossFrame(h);
      }
    }
  };
  html$._HistoryCrossFrame[dart.implements] = () => [html$.HistoryBase];
  dart.setSignature(html$._HistoryCrossFrame, {
    constructors: () => ({new: dart.definiteFunctionType(html$._HistoryCrossFrame, [dart.dynamic])}),
    fields: () => ({[_history]: dart.dynamic}),
    methods: () => ({
      back: dart.definiteFunctionType(dart.void, []),
      forward: dart.definiteFunctionType(dart.void, []),
      go: dart.definiteFunctionType(dart.void, [core.int])
    }),
    statics: () => ({_createSafe: dart.definiteFunctionType(html$.HistoryBase, [dart.dynamic])}),
    names: ['_createSafe']
  });
  dart.defineExtensionMembers(html$._HistoryCrossFrame, ['back', 'forward', 'go']);
  html$.Platform = class Platform extends core.Object {};
  dart.setSignature(html$.Platform, {
    sfields: () => ({
      supportsTypedData: core.bool,
      supportsSimd: core.bool
    })
  });
  html$.Platform.supportsSimd = false;
  dart.defineLazy(html$.Platform, {
    get supportsTypedData() {
      return !!window.ArrayBuffer;
    }
  });
  html$._wrapZoneCallback$ = dart.generic((A, R) => {
    const _wrapZoneCallback = dart.typedef('_wrapZoneCallback', () => dart.functionType(R, [A]));
    return _wrapZoneCallback;
  });
  html$._wrapZoneCallback = _wrapZoneCallback();
  html$._wrapZoneBinaryCallback$ = dart.generic((A, B, R) => {
    const _wrapZoneBinaryCallback = dart.typedef('_wrapZoneBinaryCallback', () => dart.functionType(R, [A, B]));
    return _wrapZoneBinaryCallback;
  });
  html$._wrapZoneBinaryCallback = _wrapZoneBinaryCallback();
  html$._wrapZone = function(A, R) {
    return callback => {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
      if (callback == null) return null;
      return async.Zone.current.bindUnaryCallback(R, A)(callback, {runGuarded: true});
    };
  };
  dart.fn(html$._wrapZone, _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R());
  html$._wrapBinaryZone = function(A, B, R) {
    return callback => {
      if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
      if (callback == null) return null;
      return async.Zone.current.bindBinaryCallback(R, A, B)(callback, {runGuarded: true});
    };
  };
  dart.fn(html$._wrapBinaryZone, _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R());
  html$.query = function(relativeSelectors) {
    return html$.document[dartx.query](relativeSelectors);
  };
  dart.fn(html$.query, StringToElement());
  html$.queryAll = function(relativeSelectors) {
    return html$.document[dartx.queryAll](html$.Element)(relativeSelectors);
  };
  dart.fn(html$.queryAll, StringToElementListOfElement());
  html$.querySelector = function(selectors) {
    return html$.document[dartx.querySelector](selectors);
  };
  dart.fn(html$.querySelector, StringToElement());
  html$.querySelectorAll = function(selectors) {
    return html$.document[dartx.querySelectorAll](html$.Element)(selectors);
  };
  dart.fn(html$.querySelectorAll, StringToElementListOfElement());
  html$.ElementUpgrader = class ElementUpgrader extends core.Object {};
  html$.NodeValidator = class NodeValidator extends core.Object {
    static new(opts) {
      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
      return new html$._Html5NodeValidator({uriPolicy: uriPolicy});
    }
    static throws(base) {
      return new html$._ThrowsNodeValidator(base);
    }
  };
  dart.setSignature(html$.NodeValidator, {
    constructors: () => ({
      new: dart.definiteFunctionType(html$.NodeValidator, [], {uriPolicy: html$.UriPolicy}),
      throws: dart.definiteFunctionType(html$.NodeValidator, [html$.NodeValidator])
    })
  });
  html$.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
    static new(validator) {
      return new html$._ValidatingTreeSanitizer(validator);
    }
  };
  dart.setSignature(html$.NodeTreeSanitizer, {
    constructors: () => ({new: dart.definiteFunctionType(html$.NodeTreeSanitizer, [html$.NodeValidator])}),
    sfields: () => ({trusted: html$._TrustedHtmlTreeSanitizer})
  });
  dart.defineLazy(html$.NodeTreeSanitizer, {
    get trusted() {
      return dart.const(new html$._TrustedHtmlTreeSanitizer());
    }
  });
  html$._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
    new() {
    }
    sanitizeTree(node) {}
  };
  html$._TrustedHtmlTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
  dart.setSignature(html$._TrustedHtmlTreeSanitizer, {
    constructors: () => ({new: dart.definiteFunctionType(html$._TrustedHtmlTreeSanitizer, [])}),
    methods: () => ({sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node])})
  });
  html$.UriPolicy = class UriPolicy extends core.Object {
    static new() {
      return new html$._SameOriginUriPolicy();
    }
  };
  dart.setSignature(html$.UriPolicy, {
    constructors: () => ({new: dart.definiteFunctionType(html$.UriPolicy, [])})
  });
  const _hiddenAnchor = Symbol('_hiddenAnchor');
  const _loc = Symbol('_loc');
  html$._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
    new() {
      this[_hiddenAnchor] = html$.AnchorElement.new();
      this[_loc] = html$.window[dartx.location];
    }
    allowsUri(uri) {
      this[_hiddenAnchor][dartx.href] = uri;
      return this[_hiddenAnchor][dartx.hostname] == this[_loc][dartx.hostname] && this[_hiddenAnchor][dartx.port] == this[_loc][dartx.port] && this[_hiddenAnchor][dartx.protocol] == this[_loc][dartx.protocol] || this[_hiddenAnchor][dartx.hostname] == '' && this[_hiddenAnchor][dartx.port] == '' && (this[_hiddenAnchor][dartx.protocol] == ':' || this[_hiddenAnchor][dartx.protocol] == '');
    }
  };
  html$._SameOriginUriPolicy[dart.implements] = () => [html$.UriPolicy];
  dart.setSignature(html$._SameOriginUriPolicy, {
    fields: () => ({
      [_hiddenAnchor]: html$.AnchorElement,
      [_loc]: html$.Location
    }),
    methods: () => ({allowsUri: dart.definiteFunctionType(core.bool, [core.String])})
  });
  html$._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
    new(validator) {
      this.validator = validator;
    }
    allowsElement(element) {
      if (!dart.test(this.validator.allowsElement(element))) {
        dart.throw(new core.ArgumentError(html$.Element._safeTagName(element)));
      }
      return true;
    }
    allowsAttribute(element, attributeName, value) {
      if (!dart.test(this.validator.allowsAttribute(element, attributeName, value))) {
        dart.throw(new core.ArgumentError(dart.str`${html$.Element._safeTagName(element)}[${attributeName}="${value}"]`));
      }
    }
  };
  html$._ThrowsNodeValidator[dart.implements] = () => [html$.NodeValidator];
  dart.setSignature(html$._ThrowsNodeValidator, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ThrowsNodeValidator, [html$.NodeValidator])}),
    fields: () => ({validator: html$.NodeValidator}),
    methods: () => ({
      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
    })
  });
  const _removeNode = Symbol('_removeNode');
  const _sanitizeElement = Symbol('_sanitizeElement');
  const _sanitizeUntrustedElement = Symbol('_sanitizeUntrustedElement');
  html$._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
    new(validator) {
      this.validator = validator;
    }
    sanitizeTree(node) {
      const walk = (function(node, parent) {
        this.sanitizeNode(node, parent);
        let child = node[dartx.lastChild];
        while (child != null) {
          let nextChild = child[dartx.previousNode];
          walk(child, node);
          child = nextChild;
        }
      }).bind(this);
      dart.fn(walk, NodeAndNodeTovoid());
      walk(node, null);
    }
    [_removeNode](node, parent) {
      if (parent == null) {
        node[dartx.remove]();
      } else {
        parent[_removeChild](node);
      }
    }
    [_sanitizeUntrustedElement](element, parent) {
      let corrupted = true;
      let attrs = null;
      let isAttr = null;
      try {
        attrs = dart.dload(element, 'attributes');
        isAttr = dart.dindex(attrs, 'is');
        let corruptedTest1 = html$.Element._hasCorruptedAttributes(html$.Element._check(element));
        corrupted = dart.test(corruptedTest1) ? true : html$.Element._hasCorruptedAttributesAdditionalCheck(html$.Element._check(element));
      } catch (e) {
      }

      let elementText = 'element unprintable';
      try {
        elementText = dart.toString(element);
      } catch (e) {
      }

      try {
        let elementTagName = html$.Element._safeTagName(element);
        this[_sanitizeElement](html$.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
      } catch (e$) {
        if (core.ArgumentError.is(e$)) {
          throw e$;
        } else {
          let e = e$;
          this[_removeNode](html$.Node._check(element), parent);
          html$.window[dartx.console].warn(dart.str`Removing corrupted element ${elementText}`);
        }
      }

    }
    [_sanitizeElement](element, parent, corrupted, text, tag, attrs, isAttr) {
      if (false != corrupted) {
        this[_removeNode](element, parent);
        html$.window[dartx.console].warn(dart.str`Removing element due to corrupted attributes on <${text}>`);
        return;
      }
      if (!dart.test(this.validator.allowsElement(element))) {
        this[_removeNode](element, parent);
        html$.window[dartx.console].warn(dart.str`Removing disallowed element <${tag}> from ${parent}`);
        return;
      }
      if (isAttr != null) {
        if (!dart.test(this.validator.allowsAttribute(element, 'is', isAttr))) {
          this[_removeNode](element, parent);
          html$.window[dartx.console].warn('Removing disallowed type extension ' + dart.str`<${tag} is="${isAttr}">`);
          return;
        }
      }
      let keys = attrs[dartx.keys][dartx.toList]();
      for (let i = dart.notNull(attrs[dartx.length]) - 1; i >= 0; --i) {
        let name = keys[dartx._get](i);
        if (!dart.test(this.validator.allowsAttribute(element, core.String._check(dart.dsend(name, 'toLowerCase')), core.String._check(attrs[dartx._get](name))))) {
          html$.window[dartx.console].warn('Removing disallowed attribute ' + dart.str`<${tag} ${name}="${attrs[dartx._get](name)}">`);
          attrs[dartx.remove](name);
        }
      }
      if (html$.TemplateElement.is(element)) {
        let template = element;
        this.sanitizeTree(template[dartx.content]);
      }
    }
    sanitizeNode(node, parent) {
      switch (node[dartx.nodeType]) {
        case html$.Node.ELEMENT_NODE:
        {
          this[_sanitizeUntrustedElement](node, parent);
          break;
        }
        case html$.Node.COMMENT_NODE:
        case html$.Node.DOCUMENT_FRAGMENT_NODE:
        case html$.Node.TEXT_NODE:
        case html$.Node.CDATA_SECTION_NODE:
        {
          break;
        }
        default:
        {
          this[_removeNode](node, parent);
        }
      }
    }
  };
  html$._ValidatingTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
  dart.setSignature(html$._ValidatingTreeSanitizer, {
    constructors: () => ({new: dart.definiteFunctionType(html$._ValidatingTreeSanitizer, [html$.NodeValidator])}),
    fields: () => ({validator: html$.NodeValidator}),
    methods: () => ({
      sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node]),
      [_removeNode]: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node]),
      [_sanitizeUntrustedElement]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
      [_sanitizeElement]: dart.definiteFunctionType(dart.void, [html$.Element, html$.Node, core.bool, core.String, core.String, core.Map, core.String]),
      sanitizeNode: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])
    })
  });
  html_common.convertDartToNative_SerializedScriptValue = function(value) {
    return html_common.convertDartToNative_PrepareForStructuredClone(value);
  };
  dart.fn(html_common.convertDartToNative_SerializedScriptValue, dynamicTodynamic$());
  html_common.convertNativeToDart_SerializedScriptValue = function(object) {
    return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: true});
  };
  dart.fn(html_common.convertNativeToDart_SerializedScriptValue, dynamicTodynamic$());
  html_common._StructuredClone = class _StructuredClone extends core.Object {
    new() {
      this.values = [];
      this.copies = [];
    }
    findSlot(value) {
      let length = this.values[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (core.identical(this.values[dartx._get](i), value)) return i;
      }
      this.values[dartx.add](value);
      this.copies[dartx.add](null);
      return length;
    }
    readSlot(i) {
      return this.copies[dartx._get](i);
    }
    writeSlot(i, x) {
      this.copies[dartx._set](i, x);
    }
    cleanupSlots() {}
    walk(e) {
      if (e == null) return e;
      if (typeof e == 'boolean') return e;
      if (typeof e == 'number') return e;
      if (typeof e == 'string') return e;
      if (core.DateTime.is(e)) {
        return html_common.convertDartToNative_DateTime(e);
      }
      if (core.RegExp.is(e)) {
        dart.throw(new core.UnimplementedError('structured clone of RegExp'));
      }
      if (html$.File.is(e)) return e;
      if (html$.Blob.is(e)) return e;
      if (html$.FileList.is(e)) return e;
      if (html$.ImageData.is(e)) return e;
      if (dart.test(this.cloneNotRequired(e))) return e;
      if (core.Map.is(e)) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        copy = this.newJsMap();
        this.writeSlot(slot, copy);
        e[dartx.forEach](dart.fn((key, value) => {
          this.putIntoMap(copy, key, this.walk(value));
        }, dynamicAnddynamicTovoid$()));
        return copy;
      }
      if (core.List.is(e)) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        copy = this.copyList(e, slot);
        return copy;
      }
      dart.throw(new core.UnimplementedError('structured clone of other type'));
    }
    copyList(e, slot) {
      let i = 0;
      let length = e[dartx.length];
      let copy = this.newJsList(length);
      this.writeSlot(slot, copy);
      for (; i < dart.notNull(length); i++) {
        dart.dsetindex(copy, i, this.walk(e[dartx._get](i)));
      }
      return copy;
    }
    convertDartToNative_PrepareForStructuredClone(value) {
      let copy = this.walk(value);
      this.cleanupSlots();
      return copy;
    }
  };
  dart.setSignature(html_common._StructuredClone, {
    fields: () => ({
      values: core.List,
      copies: core.List
    }),
    methods: () => ({
      findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
      readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
      writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
      cleanupSlots: dart.definiteFunctionType(dart.dynamic, []),
      walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      copyList: dart.definiteFunctionType(dart.dynamic, [core.List, core.int]),
      convertDartToNative_PrepareForStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  html_common._AcceptStructuredClone = class _AcceptStructuredClone extends core.Object {
    new() {
      this.values = [];
      this.copies = [];
      this.mustCopy = false;
    }
    findSlot(value) {
      let length = this.values[dartx.length];
      for (let i = 0; i < dart.notNull(length); i++) {
        if (dart.test(this.identicalInJs(this.values[dartx._get](i), value))) return i;
      }
      this.values[dartx.add](value);
      this.copies[dartx.add](null);
      return length;
    }
    readSlot(i) {
      return this.copies[dartx._get](i);
    }
    writeSlot(i, x) {
      this.copies[dartx._set](i, x);
    }
    walk(e) {
      if (e == null) return e;
      if (typeof e == 'boolean') return e;
      if (typeof e == 'number') return e;
      if (typeof e == 'string') return e;
      if (dart.test(html_common.isJavaScriptDate(e))) {
        return html_common.convertNativeToDart_DateTime(e);
      }
      if (dart.test(html_common.isJavaScriptRegExp(e))) {
        dart.throw(new core.UnimplementedError('structured clone of RegExp'));
      }
      if (dart.test(html_common.isJavaScriptPromise(e))) {
        return html_common.convertNativePromiseToDartFuture(e);
      }
      if (dart.test(html_common.isJavaScriptSimpleObject(e))) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        copy = dart.map();
        this.writeSlot(slot, copy);
        this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic$()));
        return copy;
      }
      if (dart.test(html_common.isJavaScriptArray(e))) {
        let slot = this.findSlot(e);
        let copy = this.readSlot(slot);
        if (copy != null) return copy;
        let length = core.int._check(dart.dload(e, 'length'));
        copy = dart.test(this.mustCopy) ? this.newDartList(length) : e;
        this.writeSlot(slot, copy);
        for (let i = 0; i < dart.notNull(length); i++) {
          dart.dsetindex(copy, i, this.walk(dart.dindex(e, i)));
        }
        return copy;
      }
      return e;
    }
    convertNativeToDart_AcceptStructuredClone(object, opts) {
      let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
      this.mustCopy = core.bool._check(mustCopy);
      let copy = this.walk(object);
      return copy;
    }
  };
  dart.setSignature(html_common._AcceptStructuredClone, {
    fields: () => ({
      values: core.List,
      copies: core.List,
      mustCopy: core.bool
    }),
    methods: () => ({
      findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
      readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
      writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
      walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      convertNativeToDart_AcceptStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})
    })
  });
  html_common.ContextAttributes = class ContextAttributes extends core.Object {
    new(alpha, antialias, depth, failIfMajorPerformanceCaveat, premultipliedAlpha, preserveDrawingBuffer, stencil) {
      this.alpha = alpha;
      this.antialias = antialias;
      this.depth = depth;
      this.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
      this.premultipliedAlpha = premultipliedAlpha;
      this.preserveDrawingBuffer = preserveDrawingBuffer;
      this.stencil = stencil;
    }
  };
  dart.setSignature(html_common.ContextAttributes, {
    constructors: () => ({new: dart.definiteFunctionType(html_common.ContextAttributes, [core.bool, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool])}),
    fields: () => ({
      alpha: core.bool,
      antialias: core.bool,
      depth: core.bool,
      premultipliedAlpha: core.bool,
      preserveDrawingBuffer: core.bool,
      stencil: core.bool,
      failIfMajorPerformanceCaveat: core.bool
    })
  });
  html_common.convertNativeToDart_ContextAttributes = function(nativeContextAttributes) {
    return new html_common.ContextAttributes(nativeContextAttributes.alpha, nativeContextAttributes.antialias, nativeContextAttributes.depth, nativeContextAttributes.failIfMajorPerformanceCaveat, nativeContextAttributes.premultipliedAlpha, nativeContextAttributes.preserveDrawingBuffer, nativeContextAttributes.stencil);
  };
  dart.fn(html_common.convertNativeToDart_ContextAttributes, dynamicTodynamic$());
  html_common._TypedImageData = class _TypedImageData extends core.Object {
    new(data, height, width) {
      this.data = data;
      this.height = height;
      this.width = width;
    }
  };
  html_common._TypedImageData[dart.implements] = () => [html$.ImageData];
  dart.setSignature(html_common._TypedImageData, {
    constructors: () => ({new: dart.definiteFunctionType(html_common._TypedImageData, [typed_data.Uint8ClampedList, core.int, core.int])}),
    fields: () => ({
      data: typed_data.Uint8ClampedList,
      height: core.int,
      width: core.int
    })
  });
  html_common.convertNativeToDart_ImageData = function(nativeImageData) {
    0;
    if (html$.ImageData.is(nativeImageData)) {
      let data = nativeImageData[dartx.data];
      if (data.constructor === Array) {
        if (typeof CanvasPixelArray !== "undefined") {
          data.constructor = CanvasPixelArray;
          data.BYTES_PER_ELEMENT = 1;
        }
      }
      return nativeImageData;
    }
    return new html_common._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
  };
  dart.fn(html_common.convertNativeToDart_ImageData, dynamicToImageData());
  html_common.convertDartToNative_ImageData = function(imageData) {
    if (html_common._TypedImageData.is(imageData)) {
      return {data: imageData.data, height: imageData.height, width: imageData.width};
    }
    return imageData;
  };
  dart.fn(html_common.convertDartToNative_ImageData, ImageDataTodynamic());
  html_common._serializedScriptValue = 'num|String|bool|' + 'JSExtendableArray|=Object|' + 'Blob|File|NativeByteBuffer|NativeTypedData';
  html_common.annotation_Creates_SerializedScriptValue = dart.const(new _js_helper.Creates(html_common._serializedScriptValue));
  html_common.annotation_Returns_SerializedScriptValue = dart.const(new _js_helper.Returns(html_common._serializedScriptValue));
  html_common.convertNativeToDart_Dictionary = function(object) {
    if (object == null) return null;
    let dict = dart.map();
    let keys = Object.getOwnPropertyNames(object);
    for (let key of core.Iterable._check(keys)) {
      dict[dartx._set](key, object[key]);
    }
    return dict;
  };
  dart.fn(html_common.convertNativeToDart_Dictionary, dynamicToMap());
  html_common.convertDartToNative_Dictionary = function(dict, postCreate) {
    if (postCreate === void 0) postCreate = null;
    if (dict == null) return null;
    let object = {};
    if (postCreate != null) {
      dart.dcall(postCreate, object);
    }
    dict[dartx.forEach](dart.fn((key, value) => {
      object[key] = value;
    }, StringAnddynamicTovoid()));
    return object;
  };
  dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
  html_common.convertDartToNative_StringArray = function(input) {
    return input;
  };
  dart.fn(html_common.convertDartToNative_StringArray, ListOfStringToList());
  html_common.convertNativeToDart_DateTime = function(date) {
    let millisSinceEpoch = date.getTime();
    return new core.DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, {isUtc: true});
  };
  dart.fn(html_common.convertNativeToDart_DateTime, dynamicToDateTime());
  html_common.convertDartToNative_DateTime = function(date) {
    return new Date(date.millisecondsSinceEpoch);
  };
  dart.fn(html_common.convertDartToNative_DateTime, DateTimeTodynamic());
  html_common.convertDartToNative_PrepareForStructuredClone = function(value) {
    return new html_common._StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
  };
  dart.fn(html_common.convertDartToNative_PrepareForStructuredClone, dynamicTodynamic$());
  html_common.convertNativeToDart_AcceptStructuredClone = function(object, opts) {
    let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
    return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
  };
  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic$());
  html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
    new() {
      super.new();
    }
    newJsMap() {
      return {};
    }
    putIntoMap(map, key, value) {
      return map[key] = value;
    }
    newJsList(length) {
      return new Array(length);
    }
    cloneNotRequired(e) {
      return _native_typed_data.NativeByteBuffer.is(e) || _native_typed_data.NativeTypedData.is(e);
    }
  };
  dart.setSignature(html_common._StructuredCloneDart2Js, {
    methods: () => ({
      newJsMap: dart.definiteFunctionType(dart.dynamic, []),
      putIntoMap: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
      newJsList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      cloneNotRequired: dart.definiteFunctionType(core.bool, [dart.dynamic])
    })
  });
  html_common._AcceptStructuredCloneDart2Js = class _AcceptStructuredCloneDart2Js extends html_common._AcceptStructuredClone {
    new() {
      super.new();
    }
    newJsList(length) {
      return new Array(length);
    }
    newDartList(length) {
      return this.newJsList(length);
    }
    identicalInJs(a, b) {
      return core.identical(a, b);
    }
    forEachJsField(object, action) {
      for (let key of Object.keys(object)) {
        dart.dcall(action, key, object[key]);
      }
    }
  };
  dart.setSignature(html_common._AcceptStructuredCloneDart2Js, {
    methods: () => ({
      newJsList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      newDartList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
      identicalInJs: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
      forEachJsField: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
    })
  });
  html_common.isJavaScriptDate = function(value) {
    return value instanceof Date;
  };
  dart.fn(html_common.isJavaScriptDate, dynamicTobool$());
  html_common.isJavaScriptRegExp = function(value) {
    return value instanceof RegExp;
  };
  dart.fn(html_common.isJavaScriptRegExp, dynamicTobool$());
  html_common.isJavaScriptArray = function(value) {
    return value instanceof Array;
  };
  dart.fn(html_common.isJavaScriptArray, dynamicTobool$());
  html_common.isJavaScriptSimpleObject = function(value) {
    let proto = Object.getPrototypeOf(value);
    return proto === Object.prototype || proto === null;
  };
  dart.fn(html_common.isJavaScriptSimpleObject, dynamicTobool$());
  html_common.isImmutableJavaScriptArray = function(value) {
    return !!value.immutable$list;
  };
  dart.fn(html_common.isImmutableJavaScriptArray, dynamicTobool$());
  html_common.isJavaScriptPromise = function(value) {
    return typeof Promise != "undefined" && value instanceof Promise;
  };
  dart.fn(html_common.isJavaScriptPromise, dynamicTobool$());
  html_common.convertNativePromiseToDartFuture = function(promise) {
    let completer = async.Completer.new();
    let then = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.complete(result), dynamicTovoid$()), 1);
    let error = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.completeError(result), dynamicTovoid$()), 1);
    let newPromise = promise.then(then).catch(error);
    return completer.future;
  };
  dart.fn(html_common.convertNativePromiseToDartFuture, dynamicToFuture());
  html_common.Device = class Device extends core.Object {
    static get userAgent() {
      return html$.window[dartx.navigator][dartx.userAgent];
    }
    static get isOpera() {
      if (html_common.Device._isOpera == null) {
        html_common.Device._isOpera = html_common.Device.userAgent[dartx.contains]("Opera", 0);
      }
      return html_common.Device._isOpera;
    }
    static get isIE() {
      if (html_common.Device._isIE == null) {
        html_common.Device._isIE = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("Trident/", 0));
      }
      return html_common.Device._isIE;
    }
    static get isFirefox() {
      if (html_common.Device._isFirefox == null) {
        html_common.Device._isFirefox = html_common.Device.userAgent[dartx.contains]("Firefox", 0);
      }
      return html_common.Device._isFirefox;
    }
    static get isWebKit() {
      if (html_common.Device._isWebKit == null) {
        html_common.Device._isWebKit = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("WebKit", 0));
      }
      return html_common.Device._isWebKit;
    }
    static get cssPrefix() {
      let prefix = html_common.Device._cachedCssPrefix;
      if (prefix != null) return prefix;
      if (dart.test(html_common.Device.isFirefox)) {
        prefix = '-moz-';
      } else if (dart.test(html_common.Device.isIE)) {
        prefix = '-ms-';
      } else if (dart.test(html_common.Device.isOpera)) {
        prefix = '-o-';
      } else {
        prefix = '-webkit-';
      }
      return html_common.Device._cachedCssPrefix = prefix;
    }
    static get propertyPrefix() {
      let prefix = html_common.Device._cachedPropertyPrefix;
      if (prefix != null) return prefix;
      if (dart.test(html_common.Device.isFirefox)) {
        prefix = 'moz';
      } else if (dart.test(html_common.Device.isIE)) {
        prefix = 'ms';
      } else if (dart.test(html_common.Device.isOpera)) {
        prefix = 'o';
      } else {
        prefix = 'webkit';
      }
      return html_common.Device._cachedPropertyPrefix = prefix;
    }
    static isEventTypeSupported(eventType) {
      try {
        let e = html$.Event.eventType(eventType, '');
        return html$.Event.is(e);
      } catch (_) {
      }

      return false;
    }
  };
  dart.setSignature(html_common.Device, {
    sfields: () => ({
      _isOpera: core.bool,
      _isIE: core.bool,
      _isFirefox: core.bool,
      _isWebKit: core.bool,
      _cachedCssPrefix: core.String,
      _cachedPropertyPrefix: core.String
    }),
    sgetters: () => ({
      userAgent: dart.definiteFunctionType(core.String, []),
      isOpera: dart.definiteFunctionType(core.bool, []),
      isIE: dart.definiteFunctionType(core.bool, []),
      isFirefox: dart.definiteFunctionType(core.bool, []),
      isWebKit: dart.definiteFunctionType(core.bool, []),
      cssPrefix: dart.definiteFunctionType(core.String, []),
      propertyPrefix: dart.definiteFunctionType(core.String, [])
    }),
    statics: () => ({isEventTypeSupported: dart.definiteFunctionType(core.bool, [core.String])}),
    names: ['isEventTypeSupported']
  });
  html_common.Device._isOpera = null;
  html_common.Device._isIE = null;
  html_common.Device._isFirefox = null;
  html_common.Device._isWebKit = null;
  html_common.Device._cachedCssPrefix = null;
  html_common.Device._cachedPropertyPrefix = null;
  const _childNodes = Symbol('_childNodes');
  const _node = Symbol('_node');
  const _iterable$0 = Symbol('_iterable');
  const _filtered = Symbol('_filtered');
  html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html$.Element) {
    new(node) {
      this[_childNodes] = node[dartx.nodes];
      this[_node] = node;
    }
    get [_iterable$0]() {
      return this[_childNodes][dartx.where](dart.fn(n => html$.Element.is(n), NodeTobool$()))[dartx.map](html$.Element)(dart.fn(n => html$.Element.as(n), NodeToElement()));
    }
    get [_filtered]() {
      return ListOfElement().from(this[_iterable$0], {growable: false});
    }
    forEach(f) {
      this[_filtered][dartx.forEach](f);
    }
    _set(index, value) {
      this._get(index)[dartx.replaceWith](value);
      return value;
    }
    set length(newLength) {
      let len = this.length;
      if (dart.notNull(newLength) >= dart.notNull(len)) {
        return;
      } else if (dart.notNull(newLength) < 0) {
        dart.throw(new core.ArgumentError("Invalid list length"));
      }
      this.removeRange(newLength, len);
    }
    add(value) {
      this[_childNodes][dartx.add](value);
    }
    addAll(iterable) {
      for (let element of iterable) {
        this.add(element);
      }
    }
    contains(needle) {
      if (!html$.Element.is(needle)) return false;
      let element = html$.Element._check(needle);
      return dart.equals(element[dartx.parentNode], this[_node]);
    }
    get reversed() {
      return this[_filtered][dartx.reversed];
    }
    sort(compare) {
      if (compare === void 0) compare = null;
      dart.throw(new core.UnsupportedError('Cannot sort filtered list'));
    }
    setRange(start, end, iterable, skipCount) {
      if (skipCount === void 0) skipCount = 0;
      dart.throw(new core.UnsupportedError('Cannot setRange on filtered list'));
    }
    fillRange(start, end, fillValue) {
      if (fillValue === void 0) fillValue = null;
      dart.throw(new core.UnsupportedError('Cannot fillRange on filtered list'));
    }
    replaceRange(start, end, iterable) {
      dart.throw(new core.UnsupportedError('Cannot replaceRange on filtered list'));
    }
    removeRange(start, end) {
      core.List.from(this[_iterable$0][dartx.skip](start)[dartx.take](dart.notNull(end) - dart.notNull(start)))[dartx.forEach](dart.fn(el => dart.dsend(el, 'remove'), dynamicTovoid$()));
    }
    clear() {
      this[_childNodes][dartx.clear]();
    }
    removeLast() {
      let result = this[_iterable$0][dartx.last];
      if (result != null) {
        result[dartx.remove]();
      }
      return result;
    }
    insert(index, value) {
      if (index == this.length) {
        this.add(value);
      } else {
        let element = this[_iterable$0][dartx.elementAt](index);
        element[dartx.parentNode][dartx.insertBefore](value, element);
      }
    }
    insertAll(index, iterable) {
      if (index == this.length) {
        this.addAll(iterable);
      } else {
        let element = this[_iterable$0][dartx.elementAt](index);
        element[dartx.parentNode][dartx.insertAllBefore](iterable, element);
      }
    }
    removeAt(index) {
      let result = this._get(index);
      result[dartx.remove]();
      return result;
    }
    remove(element) {
      if (!html$.Element.is(element)) return false;
      if (dart.test(this.contains(element))) {
        html$.Element.as(element)[dartx.remove]();
        return true;
      } else {
        return false;
      }
    }
    get length() {
      return this[_iterable$0][dartx.length];
    }
    _get(index) {
      return this[_iterable$0][dartx.elementAt](index);
    }
    get iterator() {
      return this[_filtered][dartx.iterator];
    }
    get rawList() {
      return this[_node][dartx.childNodes];
    }
  };
  dart.addSimpleTypeTests(html_common.FilteredElementList);
  html_common.FilteredElementList[dart.implements] = () => [html_common.NodeListWrapper];
  dart.setSignature(html_common.FilteredElementList, {
    constructors: () => ({new: dart.definiteFunctionType(html_common.FilteredElementList, [html$.Node])}),
    fields: () => ({
      [_node]: html$.Node,
      [_childNodes]: ListOfNode()
    }),
    getters: () => ({
      [_iterable$0]: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
      [_filtered]: dart.definiteFunctionType(core.List$(html$.Element), []),
      reversed: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
      length: dart.definiteFunctionType(core.int, []),
      iterator: dart.definiteFunctionType(core.Iterator$(html$.Element), []),
      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      forEach: dart.definiteFunctionType(dart.void, [ElementTovoid()]),
      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      add: dart.definiteFunctionType(dart.void, [html$.Element]),
      addAll: dart.definiteFunctionType(dart.void, [IterableOfElement()]),
      sort: dart.definiteFunctionType(dart.void, [], [ElementAndElementToint()]),
      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()], [core.int]),
      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.Element]),
      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfElement()]),
      removeLast: dart.definiteFunctionType(html$.Element, []),
      insert: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfElement()]),
      removeAt: dart.definiteFunctionType(html$.Element, [core.int]),
      _get: dart.definiteFunctionType(html$.Element, [core.int])
    })
  });
  dart.defineExtensionMembers(html_common.FilteredElementList, [
    'forEach',
    '_set',
    'add',
    'addAll',
    'contains',
    'sort',
    'setRange',
    'fillRange',
    'replaceRange',
    'removeRange',
    'clear',
    'removeLast',
    'insert',
    'insertAll',
    'removeAt',
    'remove',
    '_get',
    'length',
    'reversed',
    'length',
    'iterator'
  ]);
  html_common.Lists = class Lists extends core.Object {
    static indexOf(a, element, startIndex, endIndex) {
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        return -1;
      }
      if (dart.notNull(startIndex) < 0) {
        startIndex = 0;
      }
      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static lastIndexOf(a, element, startIndex) {
      if (dart.notNull(startIndex) < 0) {
        return -1;
      }
      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
        startIndex = dart.notNull(a[dartx.length]) - 1;
      }
      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
        if (dart.equals(a[dartx._get](i), element)) {
          return i;
        }
      }
      return -1;
    }
    static getRange(a, start, end, accumulator) {
      if (dart.notNull(start) < 0) dart.throw(new core.RangeError.value(start));
      if (dart.notNull(end) < dart.notNull(start)) dart.throw(new core.RangeError.value(end));
      if (dart.notNull(end) > dart.notNull(a[dartx.length])) dart.throw(new core.RangeError.value(end));
      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
        accumulator[dartx.add](a[dartx._get](i));
      }
      return accumulator;
    }
  };
  dart.setSignature(html_common.Lists, {
    statics: () => ({
      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
      getRange: dart.definiteFunctionType(core.List, [core.List, core.int, core.int, core.List])
    }),
    names: ['indexOf', 'lastIndexOf', 'getRange']
  });
  html_common.NodeListWrapper = class NodeListWrapper extends core.Object {};
  svg$._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
    static createSvgElement_tag(tag) {
      let temp = html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag);
      return svg$.SvgElement._check(temp);
    }
  };
  dart.setSignature(svg$._SvgElementFactoryProvider, {
    statics: () => ({createSvgElement_tag: dart.definiteFunctionType(svg$.SvgElement, [core.String])}),
    names: ['createSvgElement_tag']
  });
  const _children$ = Symbol('_children');
  const _svgClassName = Symbol('_svgClassName');
  dart.defineExtensionNames([
    'classes',
    'children',
    'children',
    'outerHtml',
    'innerHtml',
    'innerHtml',
    'createFragment',
    'insertAdjacentText',
    'insertAdjacentHtml',
    'insertAdjacentElement',
    'isContentEditable',
    'click',
    'blur',
    'focus',
    'onAbort',
    'onBlur',
    'onCanPlay',
    'onCanPlayThrough',
    'onChange',
    'onClick',
    'onContextMenu',
    'onDoubleClick',
    'onDrag',
    'onDragEnd',
    'onDragEnter',
    'onDragLeave',
    'onDragOver',
    'onDragStart',
    'onDrop',
    'onDurationChange',
    'onEmptied',
    'onEnded',
    'onError',
    'onFocus',
    'onInput',
    'onInvalid',
    'onKeyDown',
    'onKeyPress',
    'onKeyUp',
    'onLoad',
    'onLoadedData',
    'onLoadedMetadata',
    'onMouseDown',
    'onMouseEnter',
    'onMouseLeave',
    'onMouseMove',
    'onMouseOut',
    'onMouseOver',
    'onMouseUp',
    'onMouseWheel',
    'onPause',
    'onPlay',
    'onPlaying',
    'onRateChange',
    'onReset',
    'onResize',
    'onScroll',
    'onSeeked',
    'onSeeking',
    'onSelect',
    'onStalled',
    'onSubmit',
    'onSuspend',
    'onTimeUpdate',
    'onVolumeChange',
    'onWaiting',
    'ownerSvgElement',
    'viewportElement'
  ]);
  svg$.SvgElement = class SvgElement extends html$.Element {
    static tag(tag) {
      return svg$.SvgElement._check(html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag));
    }
    static svg(svg, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (validator == null && treeSanitizer == null) {
        validator = new html$.NodeValidatorBuilder.common();
        validator.allowSvg();
      }
      let match = svg$.SvgElement._START_TAG_REGEXP.firstMatch(svg);
      let parentElement = null;
      if (match != null && match.group(1)[dartx.toLowerCase]() == 'svg') {
        parentElement = html$.document[dartx.body];
      } else {
        parentElement = svg$.SvgSvgElement.new();
      }
      let fragment = dart.dsend(parentElement, 'createFragment', svg, {validator: validator, treeSanitizer: treeSanitizer});
      return svg$.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', dart.fn(e => svg$.SvgElement.is(e), dynamicTobool$())), 'single'));
    }
    get [dartx.classes]() {
      return new svg$._AttributeClassSet(this);
    }
    set [dartx.classes](value) {
      super[dartx.classes] = value;
    }
    get [dartx.children]() {
      return new html_common.FilteredElementList(this);
    }
    set [dartx.children](value) {
      let children = this[dartx.children];
      children[dartx.clear]();
      children[dartx.addAll](value);
    }
    get [dartx.outerHtml]() {
      let container = html$.Element.tag("div");
      let cloned = svg$.SvgElement._check(this[dartx.clone](true));
      container[dartx.children][dartx.add](cloned);
      return container[dartx.innerHtml];
    }
    get [dartx.innerHtml]() {
      let container = html$.Element.tag("div");
      let cloned = svg$.SvgElement._check(this[dartx.clone](true));
      container[dartx.children][dartx.addAll](cloned[dartx.children]);
      return container[dartx.innerHtml];
    }
    set [dartx.innerHtml](value) {
      this[dartx.setInnerHtml](value);
    }
    [dartx.createFragment](svg, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      if (treeSanitizer == null) {
        if (validator == null) {
          validator = new html$.NodeValidatorBuilder.common();
          validator.allowSvg();
        }
        treeSanitizer = html$.NodeTreeSanitizer.new(validator);
      }
      let html = dart.str`<svg version="1.1">${svg}</svg>`;
      let fragment = html$.document[dartx.body][dartx.createFragment](html, {treeSanitizer: treeSanitizer});
      let svgFragment = html$.DocumentFragment.new();
      let root = fragment[dartx.nodes][dartx.single];
      while (root[dartx.firstChild] != null) {
        svgFragment[dartx.append](root[dartx.firstChild]);
      }
      return svgFragment;
    }
    [dartx.insertAdjacentText](where, text) {
      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentText on SVG."));
    }
    [dartx.insertAdjacentHtml](where, text, opts) {
      let validator = opts && 'validator' in opts ? opts.validator : null;
      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentHtml on SVG."));
    }
    [dartx.insertAdjacentElement](where, element) {
      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentElement on SVG."));
    }
    get [_children$]() {
      dart.throw(new core.UnsupportedError("Cannot get _children on SVG."));
    }
    get [dartx.isContentEditable]() {
      return false;
    }
    [dartx.click]() {
      dart.throw(new core.UnsupportedError("Cannot invoke click SVG."));
    }
    static isTagSupported(tag) {
      let e = svg$.SvgElement.tag(tag);
      return svg$.SvgElement.is(e) && !html$.UnknownElement.is(e);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.ownerSvgElement] = null;
      this[dartx.viewportElement] = null;
      super.created();
    }
    get [_svgClassName]() {
      return this.className;
    }
    get [dartx.ownerSvgElement]() {
      return this.ownerSVGElement;
    }
    get [dartx.viewportElement]() {
      return this.viewportElement;
    }
    [dartx.blur](...args) {
      return this.blur.apply(this, args);
    }
    [dartx.focus](...args) {
      return this.focus.apply(this, args);
    }
    get [dartx.onAbort]() {
      return svg$.SvgElement.abortEvent.forElement(this);
    }
    get [dartx.onBlur]() {
      return svg$.SvgElement.blurEvent.forElement(this);
    }
    get [dartx.onCanPlay]() {
      return svg$.SvgElement.canPlayEvent.forElement(this);
    }
    get [dartx.onCanPlayThrough]() {
      return svg$.SvgElement.canPlayThroughEvent.forElement(this);
    }
    get [dartx.onChange]() {
      return svg$.SvgElement.changeEvent.forElement(this);
    }
    get [dartx.onClick]() {
      return svg$.SvgElement.clickEvent.forElement(this);
    }
    get [dartx.onContextMenu]() {
      return svg$.SvgElement.contextMenuEvent.forElement(this);
    }
    get [dartx.onDoubleClick]() {
      return svg$.SvgElement.doubleClickEvent.forElement(this);
    }
    get [dartx.onDrag]() {
      return svg$.SvgElement.dragEvent.forElement(this);
    }
    get [dartx.onDragEnd]() {
      return svg$.SvgElement.dragEndEvent.forElement(this);
    }
    get [dartx.onDragEnter]() {
      return svg$.SvgElement.dragEnterEvent.forElement(this);
    }
    get [dartx.onDragLeave]() {
      return svg$.SvgElement.dragLeaveEvent.forElement(this);
    }
    get [dartx.onDragOver]() {
      return svg$.SvgElement.dragOverEvent.forElement(this);
    }
    get [dartx.onDragStart]() {
      return svg$.SvgElement.dragStartEvent.forElement(this);
    }
    get [dartx.onDrop]() {
      return svg$.SvgElement.dropEvent.forElement(this);
    }
    get [dartx.onDurationChange]() {
      return svg$.SvgElement.durationChangeEvent.forElement(this);
    }
    get [dartx.onEmptied]() {
      return svg$.SvgElement.emptiedEvent.forElement(this);
    }
    get [dartx.onEnded]() {
      return svg$.SvgElement.endedEvent.forElement(this);
    }
    get [dartx.onError]() {
      return svg$.SvgElement.errorEvent.forElement(this);
    }
    get [dartx.onFocus]() {
      return svg$.SvgElement.focusEvent.forElement(this);
    }
    get [dartx.onInput]() {
      return svg$.SvgElement.inputEvent.forElement(this);
    }
    get [dartx.onInvalid]() {
      return svg$.SvgElement.invalidEvent.forElement(this);
    }
    get [dartx.onKeyDown]() {
      return svg$.SvgElement.keyDownEvent.forElement(this);
    }
    get [dartx.onKeyPress]() {
      return svg$.SvgElement.keyPressEvent.forElement(this);
    }
    get [dartx.onKeyUp]() {
      return svg$.SvgElement.keyUpEvent.forElement(this);
    }
    get [dartx.onLoad]() {
      return svg$.SvgElement.loadEvent.forElement(this);
    }
    get [dartx.onLoadedData]() {
      return svg$.SvgElement.loadedDataEvent.forElement(this);
    }
    get [dartx.onLoadedMetadata]() {
      return svg$.SvgElement.loadedMetadataEvent.forElement(this);
    }
    get [dartx.onMouseDown]() {
      return svg$.SvgElement.mouseDownEvent.forElement(this);
    }
    get [dartx.onMouseEnter]() {
      return svg$.SvgElement.mouseEnterEvent.forElement(this);
    }
    get [dartx.onMouseLeave]() {
      return svg$.SvgElement.mouseLeaveEvent.forElement(this);
    }
    get [dartx.onMouseMove]() {
      return svg$.SvgElement.mouseMoveEvent.forElement(this);
    }
    get [dartx.onMouseOut]() {
      return svg$.SvgElement.mouseOutEvent.forElement(this);
    }
    get [dartx.onMouseOver]() {
      return svg$.SvgElement.mouseOverEvent.forElement(this);
    }
    get [dartx.onMouseUp]() {
      return svg$.SvgElement.mouseUpEvent.forElement(this);
    }
    get [dartx.onMouseWheel]() {
      return svg$.SvgElement.mouseWheelEvent.forElement(this);
    }
    get [dartx.onPause]() {
      return svg$.SvgElement.pauseEvent.forElement(this);
    }
    get [dartx.onPlay]() {
      return svg$.SvgElement.playEvent.forElement(this);
    }
    get [dartx.onPlaying]() {
      return svg$.SvgElement.playingEvent.forElement(this);
    }
    get [dartx.onRateChange]() {
      return svg$.SvgElement.rateChangeEvent.forElement(this);
    }
    get [dartx.onReset]() {
      return svg$.SvgElement.resetEvent.forElement(this);
    }
    get [dartx.onResize]() {
      return svg$.SvgElement.resizeEvent.forElement(this);
    }
    get [dartx.onScroll]() {
      return svg$.SvgElement.scrollEvent.forElement(this);
    }
    get [dartx.onSeeked]() {
      return svg$.SvgElement.seekedEvent.forElement(this);
    }
    get [dartx.onSeeking]() {
      return svg$.SvgElement.seekingEvent.forElement(this);
    }
    get [dartx.onSelect]() {
      return svg$.SvgElement.selectEvent.forElement(this);
    }
    get [dartx.onStalled]() {
      return svg$.SvgElement.stalledEvent.forElement(this);
    }
    get [dartx.onSubmit]() {
      return svg$.SvgElement.submitEvent.forElement(this);
    }
    get [dartx.onSuspend]() {
      return svg$.SvgElement.suspendEvent.forElement(this);
    }
    get [dartx.onTimeUpdate]() {
      return svg$.SvgElement.timeUpdateEvent.forElement(this);
    }
    get [dartx.onVolumeChange]() {
      return svg$.SvgElement.volumeChangeEvent.forElement(this);
    }
    get [dartx.onWaiting]() {
      return svg$.SvgElement.waitingEvent.forElement(this);
    }
  };
  dart.defineNamedConstructor(svg$.SvgElement, 'created');
  svg$.SvgElement[dart.implements] = () => [html$.GlobalEventHandlers];
  dart.setSignature(svg$.SvgElement, {
    constructors: () => ({
      tag: dart.definiteFunctionType(svg$.SvgElement, [core.String]),
      svg: dart.definiteFunctionType(svg$.SvgElement, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
      _: dart.definiteFunctionType(svg$.SvgElement, []),
      created: dart.definiteFunctionType(svg$.SvgElement, [])
    }),
    fields: () => ({
      [dartx.ownerSvgElement]: svg$.SvgSvgElement,
      [dartx.viewportElement]: svg$.SvgElement
    }),
    getters: () => ({
      [_children$]: dart.definiteFunctionType(html$.HtmlCollection, []),
      [_svgClassName]: dart.definiteFunctionType(svg$.AnimatedString, [])
    }),
    sfields: () => ({
      _START_TAG_REGEXP: core.RegExp,
      abortEvent: EventStreamProviderOfEvent(),
      blurEvent: EventStreamProviderOfEvent(),
      canPlayEvent: EventStreamProviderOfEvent(),
      canPlayThroughEvent: EventStreamProviderOfEvent(),
      changeEvent: EventStreamProviderOfEvent(),
      clickEvent: EventStreamProviderOfMouseEvent(),
      contextMenuEvent: EventStreamProviderOfMouseEvent(),
      doubleClickEvent: EventStreamProviderOfEvent(),
      dragEvent: EventStreamProviderOfMouseEvent(),
      dragEndEvent: EventStreamProviderOfMouseEvent(),
      dragEnterEvent: EventStreamProviderOfMouseEvent(),
      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
      dragOverEvent: EventStreamProviderOfMouseEvent(),
      dragStartEvent: EventStreamProviderOfMouseEvent(),
      dropEvent: EventStreamProviderOfMouseEvent(),
      durationChangeEvent: EventStreamProviderOfEvent(),
      emptiedEvent: EventStreamProviderOfEvent(),
      endedEvent: EventStreamProviderOfEvent(),
      errorEvent: EventStreamProviderOfEvent(),
      focusEvent: EventStreamProviderOfEvent(),
      inputEvent: EventStreamProviderOfEvent(),
      invalidEvent: EventStreamProviderOfEvent(),
      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
      loadEvent: EventStreamProviderOfEvent(),
      loadedDataEvent: EventStreamProviderOfEvent(),
      loadedMetadataEvent: EventStreamProviderOfEvent(),
      mouseDownEvent: EventStreamProviderOfMouseEvent(),
      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
      mouseOutEvent: EventStreamProviderOfMouseEvent(),
      mouseOverEvent: EventStreamProviderOfMouseEvent(),
      mouseUpEvent: EventStreamProviderOfMouseEvent(),
      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
      pauseEvent: EventStreamProviderOfEvent(),
      playEvent: EventStreamProviderOfEvent(),
      playingEvent: EventStreamProviderOfEvent(),
      rateChangeEvent: EventStreamProviderOfEvent(),
      resetEvent: EventStreamProviderOfEvent(),
      resizeEvent: EventStreamProviderOfEvent(),
      scrollEvent: EventStreamProviderOfEvent(),
      seekedEvent: EventStreamProviderOfEvent(),
      seekingEvent: EventStreamProviderOfEvent(),
      selectEvent: EventStreamProviderOfEvent(),
      stalledEvent: EventStreamProviderOfEvent(),
      submitEvent: EventStreamProviderOfEvent(),
      suspendEvent: EventStreamProviderOfEvent(),
      timeUpdateEvent: EventStreamProviderOfEvent(),
      volumeChangeEvent: EventStreamProviderOfEvent(),
      waitingEvent: EventStreamProviderOfEvent()
    })
  });
  dart.defineLazy(svg$.SvgElement, {
    get _START_TAG_REGEXP() {
      return core.RegExp.new('<(\\w+)');
    },
    get abortEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('abort'));
    },
    get blurEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('blur'));
    },
    get canPlayEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
    },
    get canPlayThroughEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
    },
    get changeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('change'));
    },
    get clickEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
    },
    get contextMenuEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
    },
    get doubleClickEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
    },
    get dragEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
    },
    get dragEndEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
    },
    get dragEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
    },
    get dragLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
    },
    get dragOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
    },
    get dragStartEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
    },
    get dropEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
    },
    get durationChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
    },
    get emptiedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
    },
    get endedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ended'));
    },
    get errorEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('error'));
    },
    get focusEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('focus'));
    },
    get inputEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('input'));
    },
    get invalidEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
    },
    get keyDownEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
    },
    get keyPressEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
    },
    get keyUpEvent() {
      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
    },
    get loadEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('load'));
    },
    get loadedDataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
    },
    get loadedMetadataEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
    },
    get mouseDownEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
    },
    get mouseEnterEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
    },
    get mouseLeaveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
    },
    get mouseMoveEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
    },
    get mouseOutEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
    },
    get mouseOverEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
    },
    get mouseUpEvent() {
      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
    },
    get mouseWheelEvent() {
      return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
    },
    get pauseEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('pause'));
    },
    get playEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('play'));
    },
    get playingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('playing'));
    },
    get rateChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
    },
    get resetEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('reset'));
    },
    get resizeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('resize'));
    },
    get scrollEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
    },
    get seekedEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
    },
    get seekingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
    },
    get selectEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('select'));
    },
    get stalledEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
    },
    get submitEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('submit'));
    },
    get suspendEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
    },
    get timeUpdateEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
    },
    get volumeChangeEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
    },
    get waitingEvent() {
      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
    }
  });
  dart.registerExtension(dart.global.SVGElement, svg$.SvgElement);
  dart.defineExtensionNames([
    'getBBox',
    'getCtm',
    'getScreenCtm',
    'getTransformToElement',
    'hasExtension',
    'farthestViewportElement',
    'nearestViewportElement',
    'transform',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.GraphicsElement = class GraphicsElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.farthestViewportElement] = null;
      this[dartx.nearestViewportElement] = null;
      this[dartx.transform] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      super.created();
    }
    get [dartx.farthestViewportElement]() {
      return this.farthestViewportElement;
    }
    get [dartx.nearestViewportElement]() {
      return this.nearestViewportElement;
    }
    get [dartx.transform]() {
      return this.transform;
    }
    [dartx.getBBox](...args) {
      return this.getBBox.apply(this, args);
    }
    [dartx.getCtm](...args) {
      return this.getCTM.apply(this, args);
    }
    [dartx.getScreenCtm](...args) {
      return this.getScreenCTM.apply(this, args);
    }
    [dartx.getTransformToElement](...args) {
      return this.getTransformToElement.apply(this, args);
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.GraphicsElement, 'created');
  svg$.GraphicsElement[dart.implements] = () => [svg$.Tests];
  dart.setSignature(svg$.GraphicsElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.GraphicsElement, []),
      created: dart.definiteFunctionType(svg$.GraphicsElement, [])
    }),
    fields: () => ({
      [dartx.farthestViewportElement]: svg$.SvgElement,
      [dartx.nearestViewportElement]: svg$.SvgElement,
      [dartx.transform]: svg$.AnimatedTransformList,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList
    }),
    methods: () => ({
      [dartx.getBBox]: dart.definiteFunctionType(svg$.Rect, []),
      [dartx.getCtm]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.getScreenCtm]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.getTransformToElement]: dart.definiteFunctionType(svg$.Matrix, [svg$.SvgElement]),
      [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
    })
  });
  dart.registerExtension(dart.global.SVGGraphicsElement, svg$.GraphicsElement);
  dart.defineExtensionNames([
    'target',
    'href'
  ]);
  svg$.AElement = class AElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("a"));
    }
    created() {
      this[dartx.target] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.target]() {
      return this.target;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.AElement, 'created');
  svg$.AElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.AElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AElement, []),
      new: dart.definiteFunctionType(svg$.AElement, []),
      created: dart.definiteFunctionType(svg$.AElement, [])
    }),
    fields: () => ({
      [dartx.target]: svg$.AnimatedString,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGAElement, svg$.AElement);
  dart.defineExtensionNames([
    'convertToSpecifiedUnits',
    'newValueSpecifiedUnits',
    'unitType',
    'value',
    'valueAsString',
    'valueInSpecifiedUnits'
  ]);
  svg$.Angle = class Angle extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.unitType]() {
      return this.unitType;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.valueAsString]() {
      return this.valueAsString;
    }
    set [dartx.valueAsString](value) {
      this.valueAsString = value;
    }
    get [dartx.valueInSpecifiedUnits]() {
      return this.valueInSpecifiedUnits;
    }
    set [dartx.valueInSpecifiedUnits](value) {
      this.valueInSpecifiedUnits = value;
    }
    [dartx.convertToSpecifiedUnits](...args) {
      return this.convertToSpecifiedUnits.apply(this, args);
    }
    [dartx.newValueSpecifiedUnits](...args) {
      return this.newValueSpecifiedUnits.apply(this, args);
    }
  };
  dart.setSignature(svg$.Angle, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Angle, [])}),
    fields: () => ({
      [dartx.unitType]: core.int,
      [dartx.value]: core.num,
      [dartx.valueAsString]: core.String,
      [dartx.valueInSpecifiedUnits]: core.num
    }),
    methods: () => ({
      [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
    }),
    sfields: () => ({
      SVG_ANGLETYPE_DEG: core.int,
      SVG_ANGLETYPE_GRAD: core.int,
      SVG_ANGLETYPE_RAD: core.int,
      SVG_ANGLETYPE_UNKNOWN: core.int,
      SVG_ANGLETYPE_UNSPECIFIED: core.int
    })
  });
  svg$.Angle.SVG_ANGLETYPE_DEG = 2;
  svg$.Angle.SVG_ANGLETYPE_GRAD = 4;
  svg$.Angle.SVG_ANGLETYPE_RAD = 3;
  svg$.Angle.SVG_ANGLETYPE_UNKNOWN = 0;
  svg$.Angle.SVG_ANGLETYPE_UNSPECIFIED = 1;
  dart.registerExtension(dart.global.SVGAngle, svg$.Angle);
  dart.defineExtensionNames([
    'beginElement',
    'beginElementAt',
    'endElement',
    'endElementAt',
    'getCurrentTime',
    'getSimpleDuration',
    'getStartTime',
    'hasExtension',
    'targetElement',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.AnimationElement = class AnimationElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimationElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animation"));
    }
    created() {
      this[dartx.targetElement] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      super.created();
    }
    get [dartx.targetElement]() {
      return this.targetElement;
    }
    [dartx.beginElement](...args) {
      return this.beginElement.apply(this, args);
    }
    [dartx.beginElementAt](...args) {
      return this.beginElementAt.apply(this, args);
    }
    [dartx.endElement](...args) {
      return this.endElement.apply(this, args);
    }
    [dartx.endElementAt](...args) {
      return this.endElementAt.apply(this, args);
    }
    [dartx.getCurrentTime](...args) {
      return this.getCurrentTime.apply(this, args);
    }
    [dartx.getSimpleDuration](...args) {
      return this.getSimpleDuration.apply(this, args);
    }
    [dartx.getStartTime](...args) {
      return this.getStartTime.apply(this, args);
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.AnimationElement, 'created');
  svg$.AnimationElement[dart.implements] = () => [svg$.Tests];
  dart.setSignature(svg$.AnimationElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimationElement, []),
      new: dart.definiteFunctionType(svg$.AnimationElement, []),
      created: dart.definiteFunctionType(svg$.AnimationElement, [])
    }),
    fields: () => ({
      [dartx.targetElement]: svg$.SvgElement,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList
    }),
    methods: () => ({
      [dartx.beginElement]: dart.definiteFunctionType(dart.void, []),
      [dartx.beginElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.endElement]: dart.definiteFunctionType(dart.void, []),
      [dartx.endElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
      [dartx.getSimpleDuration]: dart.definiteFunctionType(core.double, []),
      [dartx.getStartTime]: dart.definiteFunctionType(core.double, []),
      [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
    })
  });
  dart.registerExtension(dart.global.SVGAnimationElement, svg$.AnimationElement);
  svg$.AnimateElement = class AnimateElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimateElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animate"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('animate')) && svg$.AnimateElement.is(svg$.SvgElement.tag('animate'));
    }
  };
  dart.defineNamedConstructor(svg$.AnimateElement, 'created');
  dart.setSignature(svg$.AnimateElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimateElement, []),
      new: dart.definiteFunctionType(svg$.AnimateElement, []),
      created: dart.definiteFunctionType(svg$.AnimateElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGAnimateElement, svg$.AnimateElement);
  svg$.AnimateMotionElement = class AnimateMotionElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimateMotionElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('animateMotion')) && svg$.AnimateMotionElement.is(svg$.SvgElement.tag('animateMotion'));
    }
  };
  dart.defineNamedConstructor(svg$.AnimateMotionElement, 'created');
  dart.setSignature(svg$.AnimateMotionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
      new: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
      created: dart.definiteFunctionType(svg$.AnimateMotionElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGAnimateMotionElement, svg$.AnimateMotionElement);
  svg$.AnimateTransformElement = class AnimateTransformElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.AnimateTransformElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('animateTransform')) && svg$.AnimateTransformElement.is(svg$.SvgElement.tag('animateTransform'));
    }
  };
  dart.defineNamedConstructor(svg$.AnimateTransformElement, 'created');
  dart.setSignature(svg$.AnimateTransformElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
      new: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
      created: dart.definiteFunctionType(svg$.AnimateTransformElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGAnimateTransformElement, svg$.AnimateTransformElement);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedAngle, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedAngle, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.Angle,
      [dartx.baseVal]: svg$.Angle
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedAngle, svg$.AnimatedAngle);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedBoolean, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedBoolean, [])}),
    fields: () => ({
      [dartx.animVal]: core.bool,
      [dartx.baseVal]: core.bool
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedBoolean, svg$.AnimatedBoolean);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedEnumeration, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedEnumeration, [])}),
    fields: () => ({
      [dartx.animVal]: core.int,
      [dartx.baseVal]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedEnumeration, svg$.AnimatedEnumeration);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedInteger, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedInteger, [])}),
    fields: () => ({
      [dartx.animVal]: core.int,
      [dartx.baseVal]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedInteger, svg$.AnimatedInteger);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedLength, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLength, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.Length,
      [dartx.baseVal]: svg$.Length
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedLength, svg$.AnimatedLength);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedLengthList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLengthList, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.LengthList,
      [dartx.baseVal]: svg$.LengthList
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedLengthList, svg$.AnimatedLengthList);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedNumber, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumber, [])}),
    fields: () => ({
      [dartx.animVal]: core.double,
      [dartx.baseVal]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedNumber, svg$.AnimatedNumber);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedNumberList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumberList, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.NumberList,
      [dartx.baseVal]: svg$.NumberList
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedNumberList, svg$.AnimatedNumberList);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedPreserveAspectRatio, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedPreserveAspectRatio, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.PreserveAspectRatio,
      [dartx.baseVal]: svg$.PreserveAspectRatio
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedPreserveAspectRatio, svg$.AnimatedPreserveAspectRatio);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedRect, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedRect, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.Rect,
      [dartx.baseVal]: svg$.Rect
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedRect, svg$.AnimatedRect);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
    set [dartx.baseVal](value) {
      this.baseVal = value;
    }
  };
  dart.setSignature(svg$.AnimatedString, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedString, [])}),
    fields: () => ({
      [dartx.animVal]: core.String,
      [dartx.baseVal]: core.String
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedString, svg$.AnimatedString);
  dart.defineExtensionNames([
    'animVal',
    'baseVal'
  ]);
  svg$.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.animVal]() {
      return this.animVal;
    }
    get [dartx.baseVal]() {
      return this.baseVal;
    }
  };
  dart.setSignature(svg$.AnimatedTransformList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedTransformList, [])}),
    fields: () => ({
      [dartx.animVal]: svg$.TransformList,
      [dartx.baseVal]: svg$.TransformList
    })
  });
  dart.registerExtension(dart.global.SVGAnimatedTransformList, svg$.AnimatedTransformList);
  dart.defineExtensionNames([
    'isPointInFill',
    'isPointInStroke'
  ]);
  svg$.GeometryElement = class GeometryElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
    [dartx.isPointInFill](...args) {
      return this.isPointInFill.apply(this, args);
    }
    [dartx.isPointInStroke](...args) {
      return this.isPointInStroke.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.GeometryElement, 'created');
  dart.setSignature(svg$.GeometryElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.GeometryElement, []),
      created: dart.definiteFunctionType(svg$.GeometryElement, [])
    }),
    methods: () => ({
      [dartx.isPointInFill]: dart.definiteFunctionType(core.bool, [svg$.Point]),
      [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [svg$.Point])
    })
  });
  dart.registerExtension(dart.global.SVGGeometryElement, svg$.GeometryElement);
  dart.defineExtensionNames([
    'cx',
    'cy',
    'r'
  ]);
  svg$.CircleElement = class CircleElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.CircleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("circle"));
    }
    created() {
      this[dartx.cx] = null;
      this[dartx.cy] = null;
      this[dartx.r] = null;
      super.created();
    }
    get [dartx.cx]() {
      return this.cx;
    }
    get [dartx.cy]() {
      return this.cy;
    }
    get [dartx.r]() {
      return this.r;
    }
  };
  dart.defineNamedConstructor(svg$.CircleElement, 'created');
  dart.setSignature(svg$.CircleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.CircleElement, []),
      new: dart.definiteFunctionType(svg$.CircleElement, []),
      created: dart.definiteFunctionType(svg$.CircleElement, [])
    }),
    fields: () => ({
      [dartx.cx]: svg$.AnimatedLength,
      [dartx.cy]: svg$.AnimatedLength,
      [dartx.r]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGCircleElement, svg$.CircleElement);
  dart.defineExtensionNames([
    'clipPathUnits'
  ]);
  svg$.ClipPathElement = class ClipPathElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ClipPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
    }
    created() {
      this[dartx.clipPathUnits] = null;
      super.created();
    }
    get [dartx.clipPathUnits]() {
      return this.clipPathUnits;
    }
  };
  dart.defineNamedConstructor(svg$.ClipPathElement, 'created');
  dart.setSignature(svg$.ClipPathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ClipPathElement, []),
      new: dart.definiteFunctionType(svg$.ClipPathElement, []),
      created: dart.definiteFunctionType(svg$.ClipPathElement, [])
    }),
    fields: () => ({[dartx.clipPathUnits]: svg$.AnimatedEnumeration})
  });
  dart.registerExtension(dart.global.SVGClipPathElement, svg$.ClipPathElement);
  svg$.DefsElement = class DefsElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.DefsElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("defs"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.DefsElement, 'created');
  dart.setSignature(svg$.DefsElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.DefsElement, []),
      new: dart.definiteFunctionType(svg$.DefsElement, []),
      created: dart.definiteFunctionType(svg$.DefsElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGDefsElement, svg$.DefsElement);
  svg$.DescElement = class DescElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.DescElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("desc"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.DescElement, 'created');
  dart.setSignature(svg$.DescElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.DescElement, []),
      new: dart.definiteFunctionType(svg$.DescElement, []),
      created: dart.definiteFunctionType(svg$.DescElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGDescElement, svg$.DescElement);
  svg$.DiscardElement = class DiscardElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.DiscardElement, 'created');
  dart.setSignature(svg$.DiscardElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.DiscardElement, []),
      created: dart.definiteFunctionType(svg$.DiscardElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGDiscardElement, svg$.DiscardElement);
  dart.defineExtensionNames([
    'cx',
    'cy',
    'rx',
    'ry'
  ]);
  svg$.EllipseElement = class EllipseElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.EllipseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
    }
    created() {
      this[dartx.cx] = null;
      this[dartx.cy] = null;
      this[dartx.rx] = null;
      this[dartx.ry] = null;
      super.created();
    }
    get [dartx.cx]() {
      return this.cx;
    }
    get [dartx.cy]() {
      return this.cy;
    }
    get [dartx.rx]() {
      return this.rx;
    }
    get [dartx.ry]() {
      return this.ry;
    }
  };
  dart.defineNamedConstructor(svg$.EllipseElement, 'created');
  dart.setSignature(svg$.EllipseElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.EllipseElement, []),
      new: dart.definiteFunctionType(svg$.EllipseElement, []),
      created: dart.definiteFunctionType(svg$.EllipseElement, [])
    }),
    fields: () => ({
      [dartx.cx]: svg$.AnimatedLength,
      [dartx.cy]: svg$.AnimatedLength,
      [dartx.rx]: svg$.AnimatedLength,
      [dartx.ry]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGEllipseElement, svg$.EllipseElement);
  dart.defineExtensionNames([
    'in1',
    'in2',
    'mode',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEBlendElement = class FEBlendElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEBlendElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.in2] = null;
      this[dartx.mode] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feBlend')) && svg$.FEBlendElement.is(svg$.SvgElement.tag('feBlend'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.in2]() {
      return this.in2;
    }
    get [dartx.mode]() {
      return this.mode;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEBlendElement, 'created');
  svg$.FEBlendElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEBlendElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEBlendElement, []),
      new: dart.definiteFunctionType(svg$.FEBlendElement, []),
      created: dart.definiteFunctionType(svg$.FEBlendElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.in2]: svg$.AnimatedString,
      [dartx.mode]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_FEBLEND_MODE_DARKEN: core.int,
      SVG_FEBLEND_MODE_LIGHTEN: core.int,
      SVG_FEBLEND_MODE_MULTIPLY: core.int,
      SVG_FEBLEND_MODE_NORMAL: core.int,
      SVG_FEBLEND_MODE_SCREEN: core.int,
      SVG_FEBLEND_MODE_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
  svg$.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEBlendElement, svg$.FEBlendElement);
  dart.defineExtensionNames([
    'in1',
    'type',
    'values',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEColorMatrixElement = class FEColorMatrixElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEColorMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.type] = null;
      this[dartx.values] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feColorMatrix')) && svg$.FEColorMatrixElement.is(svg$.SvgElement.tag('feColorMatrix'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.values]() {
      return this.values;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEColorMatrixElement, 'created');
  svg$.FEColorMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEColorMatrixElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
      new: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
      created: dart.definiteFunctionType(svg$.FEColorMatrixElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.type]: svg$.AnimatedEnumeration,
      [dartx.values]: svg$.AnimatedNumberList,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_FECOLORMATRIX_TYPE_HUEROTATE: core.int,
      SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: core.int,
      SVG_FECOLORMATRIX_TYPE_MATRIX: core.int,
      SVG_FECOLORMATRIX_TYPE_SATURATE: core.int,
      SVG_FECOLORMATRIX_TYPE_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEColorMatrixElement, svg$.FEColorMatrixElement);
  dart.defineExtensionNames([
    'in1',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEComponentTransferElement = class FEComponentTransferElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEComponentTransferElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feComponentTransfer')) && svg$.FEComponentTransferElement.is(svg$.SvgElement.tag('feComponentTransfer'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEComponentTransferElement, 'created');
  svg$.FEComponentTransferElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEComponentTransferElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
      new: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
      created: dart.definiteFunctionType(svg$.FEComponentTransferElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEComponentTransferElement, svg$.FEComponentTransferElement);
  dart.defineExtensionNames([
    'in1',
    'in2',
    'k1',
    'k2',
    'k3',
    'k4',
    'operator',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FECompositeElement = class FECompositeElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.in2] = null;
      this[dartx.k1] = null;
      this[dartx.k2] = null;
      this[dartx.k3] = null;
      this[dartx.k4] = null;
      this[dartx.operator] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.in2]() {
      return this.in2;
    }
    get [dartx.k1]() {
      return this.k1;
    }
    get [dartx.k2]() {
      return this.k2;
    }
    get [dartx.k3]() {
      return this.k3;
    }
    get [dartx.k4]() {
      return this.k4;
    }
    get [dartx.operator]() {
      return this.operator;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FECompositeElement, 'created');
  svg$.FECompositeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FECompositeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FECompositeElement, []),
      created: dart.definiteFunctionType(svg$.FECompositeElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.in2]: svg$.AnimatedString,
      [dartx.k1]: svg$.AnimatedNumber,
      [dartx.k2]: svg$.AnimatedNumber,
      [dartx.k3]: svg$.AnimatedNumber,
      [dartx.k4]: svg$.AnimatedNumber,
      [dartx.operator]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: core.int,
      SVG_FECOMPOSITE_OPERATOR_ATOP: core.int,
      SVG_FECOMPOSITE_OPERATOR_IN: core.int,
      SVG_FECOMPOSITE_OPERATOR_OUT: core.int,
      SVG_FECOMPOSITE_OPERATOR_OVER: core.int,
      SVG_FECOMPOSITE_OPERATOR_UNKNOWN: core.int,
      SVG_FECOMPOSITE_OPERATOR_XOR: core.int
    })
  });
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN = 2;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT = 3;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER = 1;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR = 5;
  dart.registerExtension(dart.global.SVGFECompositeElement, svg$.FECompositeElement);
  dart.defineExtensionNames([
    'bias',
    'divisor',
    'edgeMode',
    'in1',
    'kernelMatrix',
    'kernelUnitLengthX',
    'kernelUnitLengthY',
    'orderX',
    'orderY',
    'preserveAlpha',
    'targetX',
    'targetY',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEConvolveMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
    }
    created() {
      this[dartx.bias] = null;
      this[dartx.divisor] = null;
      this[dartx.edgeMode] = null;
      this[dartx.in1] = null;
      this[dartx.kernelMatrix] = null;
      this[dartx.kernelUnitLengthX] = null;
      this[dartx.kernelUnitLengthY] = null;
      this[dartx.orderX] = null;
      this[dartx.orderY] = null;
      this[dartx.preserveAlpha] = null;
      this[dartx.targetX] = null;
      this[dartx.targetY] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feConvolveMatrix')) && svg$.FEConvolveMatrixElement.is(svg$.SvgElement.tag('feConvolveMatrix'));
    }
    get [dartx.bias]() {
      return this.bias;
    }
    get [dartx.divisor]() {
      return this.divisor;
    }
    get [dartx.edgeMode]() {
      return this.edgeMode;
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.kernelMatrix]() {
      return this.kernelMatrix;
    }
    get [dartx.kernelUnitLengthX]() {
      return this.kernelUnitLengthX;
    }
    get [dartx.kernelUnitLengthY]() {
      return this.kernelUnitLengthY;
    }
    get [dartx.orderX]() {
      return this.orderX;
    }
    get [dartx.orderY]() {
      return this.orderY;
    }
    get [dartx.preserveAlpha]() {
      return this.preserveAlpha;
    }
    get [dartx.targetX]() {
      return this.targetX;
    }
    get [dartx.targetY]() {
      return this.targetY;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEConvolveMatrixElement, 'created');
  svg$.FEConvolveMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEConvolveMatrixElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
      new: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
      created: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, [])
    }),
    fields: () => ({
      [dartx.bias]: svg$.AnimatedNumber,
      [dartx.divisor]: svg$.AnimatedNumber,
      [dartx.edgeMode]: svg$.AnimatedEnumeration,
      [dartx.in1]: svg$.AnimatedString,
      [dartx.kernelMatrix]: svg$.AnimatedNumberList,
      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
      [dartx.orderX]: svg$.AnimatedInteger,
      [dartx.orderY]: svg$.AnimatedInteger,
      [dartx.preserveAlpha]: svg$.AnimatedBoolean,
      [dartx.targetX]: svg$.AnimatedInteger,
      [dartx.targetY]: svg$.AnimatedInteger,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_EDGEMODE_DUPLICATE: core.int,
      SVG_EDGEMODE_NONE: core.int,
      SVG_EDGEMODE_UNKNOWN: core.int,
      SVG_EDGEMODE_WRAP: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE = 1;
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_NONE = 3;
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN = 0;
  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP = 2;
  dart.registerExtension(dart.global.SVGFEConvolveMatrixElement, svg$.FEConvolveMatrixElement);
  dart.defineExtensionNames([
    'diffuseConstant',
    'in1',
    'kernelUnitLengthX',
    'kernelUnitLengthY',
    'surfaceScale',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEDiffuseLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
    }
    created() {
      this[dartx.diffuseConstant] = null;
      this[dartx.in1] = null;
      this[dartx.kernelUnitLengthX] = null;
      this[dartx.kernelUnitLengthY] = null;
      this[dartx.surfaceScale] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feDiffuseLighting')) && svg$.FEDiffuseLightingElement.is(svg$.SvgElement.tag('feDiffuseLighting'));
    }
    get [dartx.diffuseConstant]() {
      return this.diffuseConstant;
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.kernelUnitLengthX]() {
      return this.kernelUnitLengthX;
    }
    get [dartx.kernelUnitLengthY]() {
      return this.kernelUnitLengthY;
    }
    get [dartx.surfaceScale]() {
      return this.surfaceScale;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEDiffuseLightingElement, 'created');
  svg$.FEDiffuseLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEDiffuseLightingElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
      new: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
      created: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, [])
    }),
    fields: () => ({
      [dartx.diffuseConstant]: svg$.AnimatedNumber,
      [dartx.in1]: svg$.AnimatedString,
      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
      [dartx.surfaceScale]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEDiffuseLightingElement, svg$.FEDiffuseLightingElement);
  dart.defineExtensionNames([
    'in1',
    'in2',
    'scale',
    'xChannelSelector',
    'yChannelSelector',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEDisplacementMapElement = class FEDisplacementMapElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEDisplacementMapElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.in2] = null;
      this[dartx.scale] = null;
      this[dartx.xChannelSelector] = null;
      this[dartx.yChannelSelector] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feDisplacementMap')) && svg$.FEDisplacementMapElement.is(svg$.SvgElement.tag('feDisplacementMap'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.in2]() {
      return this.in2;
    }
    get [dartx.scale]() {
      return this.scale;
    }
    get [dartx.xChannelSelector]() {
      return this.xChannelSelector;
    }
    get [dartx.yChannelSelector]() {
      return this.yChannelSelector;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEDisplacementMapElement, 'created');
  svg$.FEDisplacementMapElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEDisplacementMapElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
      new: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
      created: dart.definiteFunctionType(svg$.FEDisplacementMapElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.in2]: svg$.AnimatedString,
      [dartx.scale]: svg$.AnimatedNumber,
      [dartx.xChannelSelector]: svg$.AnimatedEnumeration,
      [dartx.yChannelSelector]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_CHANNEL_A: core.int,
      SVG_CHANNEL_B: core.int,
      SVG_CHANNEL_G: core.int,
      SVG_CHANNEL_R: core.int,
      SVG_CHANNEL_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FEDisplacementMapElement.SVG_CHANNEL_A = 4;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_B = 3;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_G = 2;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_R = 1;
  svg$.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEDisplacementMapElement, svg$.FEDisplacementMapElement);
  dart.defineExtensionNames([
    'azimuth',
    'elevation'
  ]);
  svg$.FEDistantLightElement = class FEDistantLightElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEDistantLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
    }
    created() {
      this[dartx.azimuth] = null;
      this[dartx.elevation] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feDistantLight')) && svg$.FEDistantLightElement.is(svg$.SvgElement.tag('feDistantLight'));
    }
    get [dartx.azimuth]() {
      return this.azimuth;
    }
    get [dartx.elevation]() {
      return this.elevation;
    }
  };
  dart.defineNamedConstructor(svg$.FEDistantLightElement, 'created');
  dart.setSignature(svg$.FEDistantLightElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
      new: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
      created: dart.definiteFunctionType(svg$.FEDistantLightElement, [])
    }),
    fields: () => ({
      [dartx.azimuth]: svg$.AnimatedNumber,
      [dartx.elevation]: svg$.AnimatedNumber
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEDistantLightElement, svg$.FEDistantLightElement);
  dart.defineExtensionNames([
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEFloodElement = class FEFloodElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFloodElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFlood')) && svg$.FEFloodElement.is(svg$.SvgElement.tag('feFlood'));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEFloodElement, 'created');
  svg$.FEFloodElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEFloodElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFloodElement, []),
      new: dart.definiteFunctionType(svg$.FEFloodElement, []),
      created: dart.definiteFunctionType(svg$.FEFloodElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFloodElement, svg$.FEFloodElement);
  svg$._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$._SVGComponentTransferFunctionElement, 'created');
  dart.setSignature(svg$._SVGComponentTransferFunctionElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, []),
      created: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGComponentTransferFunctionElement, svg$._SVGComponentTransferFunctionElement);
  svg$.FEFuncAElement = class FEFuncAElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncAElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncA')) && svg$.FEFuncAElement.is(svg$.SvgElement.tag('feFuncA'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncAElement, 'created');
  dart.setSignature(svg$.FEFuncAElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncAElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncAElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncAElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncAElement, svg$.FEFuncAElement);
  svg$.FEFuncBElement = class FEFuncBElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncBElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncB')) && svg$.FEFuncBElement.is(svg$.SvgElement.tag('feFuncB'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncBElement, 'created');
  dart.setSignature(svg$.FEFuncBElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncBElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncBElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncBElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncBElement, svg$.FEFuncBElement);
  svg$.FEFuncGElement = class FEFuncGElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncGElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncG')) && svg$.FEFuncGElement.is(svg$.SvgElement.tag('feFuncG'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncGElement, 'created');
  dart.setSignature(svg$.FEFuncGElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncGElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncGElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncGElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncGElement, svg$.FEFuncGElement);
  svg$.FEFuncRElement = class FEFuncRElement extends svg$._SVGComponentTransferFunctionElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEFuncRElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feFuncR')) && svg$.FEFuncRElement.is(svg$.SvgElement.tag('feFuncR'));
    }
  };
  dart.defineNamedConstructor(svg$.FEFuncRElement, 'created');
  dart.setSignature(svg$.FEFuncRElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEFuncRElement, []),
      new: dart.definiteFunctionType(svg$.FEFuncRElement, []),
      created: dart.definiteFunctionType(svg$.FEFuncRElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEFuncRElement, svg$.FEFuncRElement);
  dart.defineExtensionNames([
    'setStdDeviation',
    'in1',
    'stdDeviationX',
    'stdDeviationY',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEGaussianBlurElement = class FEGaussianBlurElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEGaussianBlurElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.stdDeviationX] = null;
      this[dartx.stdDeviationY] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feGaussianBlur')) && svg$.FEGaussianBlurElement.is(svg$.SvgElement.tag('feGaussianBlur'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.stdDeviationX]() {
      return this.stdDeviationX;
    }
    get [dartx.stdDeviationY]() {
      return this.stdDeviationY;
    }
    [dartx.setStdDeviation](...args) {
      return this.setStdDeviation.apply(this, args);
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEGaussianBlurElement, 'created');
  svg$.FEGaussianBlurElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEGaussianBlurElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
      new: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
      created: dart.definiteFunctionType(svg$.FEGaussianBlurElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.stdDeviationX]: svg$.AnimatedNumber,
      [dartx.stdDeviationY]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    methods: () => ({[dartx.setStdDeviation]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEGaussianBlurElement, svg$.FEGaussianBlurElement);
  dart.defineExtensionNames([
    'preserveAspectRatio',
    'height',
    'result',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.FEImageElement = class FEImageElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
    }
    created() {
      this[dartx.preserveAspectRatio] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feImage')) && svg$.FEImageElement.is(svg$.SvgElement.tag('feImage'));
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.FEImageElement, 'created');
  svg$.FEImageElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes, svg$.UriReference];
  dart.setSignature(svg$.FEImageElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEImageElement, []),
      new: dart.definiteFunctionType(svg$.FEImageElement, []),
      created: dart.definiteFunctionType(svg$.FEImageElement, [])
    }),
    fields: () => ({
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEImageElement, svg$.FEImageElement);
  dart.defineExtensionNames([
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEMergeElement = class FEMergeElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEMergeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feMerge')) && svg$.FEMergeElement.is(svg$.SvgElement.tag('feMerge'));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEMergeElement, 'created');
  svg$.FEMergeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEMergeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEMergeElement, []),
      new: dart.definiteFunctionType(svg$.FEMergeElement, []),
      created: dart.definiteFunctionType(svg$.FEMergeElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEMergeElement, svg$.FEMergeElement);
  dart.defineExtensionNames([
    'in1'
  ]);
  svg$.FEMergeNodeElement = class FEMergeNodeElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEMergeNodeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
    }
    created() {
      this[dartx.in1] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feMergeNode')) && svg$.FEMergeNodeElement.is(svg$.SvgElement.tag('feMergeNode'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
  };
  dart.defineNamedConstructor(svg$.FEMergeNodeElement, 'created');
  dart.setSignature(svg$.FEMergeNodeElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
      new: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
      created: dart.definiteFunctionType(svg$.FEMergeNodeElement, [])
    }),
    fields: () => ({[dartx.in1]: svg$.AnimatedString}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEMergeNodeElement, svg$.FEMergeNodeElement);
  dart.defineExtensionNames([
    'in1',
    'operator',
    'radiusX',
    'radiusY',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEMorphologyElement = class FEMorphologyElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.operator] = null;
      this[dartx.radiusX] = null;
      this[dartx.radiusY] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.operator]() {
      return this.operator;
    }
    get [dartx.radiusX]() {
      return this.radiusX;
    }
    get [dartx.radiusY]() {
      return this.radiusY;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEMorphologyElement, 'created');
  svg$.FEMorphologyElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEMorphologyElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEMorphologyElement, []),
      created: dart.definiteFunctionType(svg$.FEMorphologyElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.operator]: svg$.AnimatedEnumeration,
      [dartx.radiusX]: svg$.AnimatedNumber,
      [dartx.radiusY]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_MORPHOLOGY_OPERATOR_DILATE: core.int,
      SVG_MORPHOLOGY_OPERATOR_ERODE: core.int,
      SVG_MORPHOLOGY_OPERATOR_UNKNOWN: core.int
    })
  });
  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFEMorphologyElement, svg$.FEMorphologyElement);
  dart.defineExtensionNames([
    'dx',
    'dy',
    'in1',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FEOffsetElement = class FEOffsetElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEOffsetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
    }
    created() {
      this[dartx.dx] = null;
      this[dartx.dy] = null;
      this[dartx.in1] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feOffset')) && svg$.FEOffsetElement.is(svg$.SvgElement.tag('feOffset'));
    }
    get [dartx.dx]() {
      return this.dx;
    }
    get [dartx.dy]() {
      return this.dy;
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FEOffsetElement, 'created');
  svg$.FEOffsetElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FEOffsetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEOffsetElement, []),
      new: dart.definiteFunctionType(svg$.FEOffsetElement, []),
      created: dart.definiteFunctionType(svg$.FEOffsetElement, [])
    }),
    fields: () => ({
      [dartx.dx]: svg$.AnimatedNumber,
      [dartx.dy]: svg$.AnimatedNumber,
      [dartx.in1]: svg$.AnimatedString,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEOffsetElement, svg$.FEOffsetElement);
  dart.defineExtensionNames([
    'x',
    'y',
    'z'
  ]);
  svg$.FEPointLightElement = class FEPointLightElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FEPointLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
    }
    created() {
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.z] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('fePointLight')) && svg$.FEPointLightElement.is(svg$.SvgElement.tag('fePointLight'));
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.defineNamedConstructor(svg$.FEPointLightElement, 'created');
  dart.setSignature(svg$.FEPointLightElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FEPointLightElement, []),
      new: dart.definiteFunctionType(svg$.FEPointLightElement, []),
      created: dart.definiteFunctionType(svg$.FEPointLightElement, [])
    }),
    fields: () => ({
      [dartx.x]: svg$.AnimatedNumber,
      [dartx.y]: svg$.AnimatedNumber,
      [dartx.z]: svg$.AnimatedNumber
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFEPointLightElement, svg$.FEPointLightElement);
  dart.defineExtensionNames([
    'in1',
    'kernelUnitLengthX',
    'kernelUnitLengthY',
    'specularConstant',
    'specularExponent',
    'surfaceScale',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FESpecularLightingElement = class FESpecularLightingElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FESpecularLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.kernelUnitLengthX] = null;
      this[dartx.kernelUnitLengthY] = null;
      this[dartx.specularConstant] = null;
      this[dartx.specularExponent] = null;
      this[dartx.surfaceScale] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feSpecularLighting')) && svg$.FESpecularLightingElement.is(svg$.SvgElement.tag('feSpecularLighting'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.kernelUnitLengthX]() {
      return this.kernelUnitLengthX;
    }
    get [dartx.kernelUnitLengthY]() {
      return this.kernelUnitLengthY;
    }
    get [dartx.specularConstant]() {
      return this.specularConstant;
    }
    get [dartx.specularExponent]() {
      return this.specularExponent;
    }
    get [dartx.surfaceScale]() {
      return this.surfaceScale;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FESpecularLightingElement, 'created');
  svg$.FESpecularLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FESpecularLightingElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
      new: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
      created: dart.definiteFunctionType(svg$.FESpecularLightingElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
      [dartx.specularConstant]: svg$.AnimatedNumber,
      [dartx.specularExponent]: svg$.AnimatedNumber,
      [dartx.surfaceScale]: svg$.AnimatedNumber,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFESpecularLightingElement, svg$.FESpecularLightingElement);
  dart.defineExtensionNames([
    'limitingConeAngle',
    'pointsAtX',
    'pointsAtY',
    'pointsAtZ',
    'specularExponent',
    'x',
    'y',
    'z'
  ]);
  svg$.FESpotLightElement = class FESpotLightElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FESpotLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
    }
    created() {
      this[dartx.limitingConeAngle] = null;
      this[dartx.pointsAtX] = null;
      this[dartx.pointsAtY] = null;
      this[dartx.pointsAtZ] = null;
      this[dartx.specularExponent] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.z] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feSpotLight')) && svg$.FESpotLightElement.is(svg$.SvgElement.tag('feSpotLight'));
    }
    get [dartx.limitingConeAngle]() {
      return this.limitingConeAngle;
    }
    get [dartx.pointsAtX]() {
      return this.pointsAtX;
    }
    get [dartx.pointsAtY]() {
      return this.pointsAtY;
    }
    get [dartx.pointsAtZ]() {
      return this.pointsAtZ;
    }
    get [dartx.specularExponent]() {
      return this.specularExponent;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.z]() {
      return this.z;
    }
  };
  dart.defineNamedConstructor(svg$.FESpotLightElement, 'created');
  dart.setSignature(svg$.FESpotLightElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FESpotLightElement, []),
      new: dart.definiteFunctionType(svg$.FESpotLightElement, []),
      created: dart.definiteFunctionType(svg$.FESpotLightElement, [])
    }),
    fields: () => ({
      [dartx.limitingConeAngle]: svg$.AnimatedNumber,
      [dartx.pointsAtX]: svg$.AnimatedNumber,
      [dartx.pointsAtY]: svg$.AnimatedNumber,
      [dartx.pointsAtZ]: svg$.AnimatedNumber,
      [dartx.specularExponent]: svg$.AnimatedNumber,
      [dartx.x]: svg$.AnimatedNumber,
      [dartx.y]: svg$.AnimatedNumber,
      [dartx.z]: svg$.AnimatedNumber
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFESpotLightElement, svg$.FESpotLightElement);
  dart.defineExtensionNames([
    'in1',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FETileElement = class FETileElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FETileElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
    }
    created() {
      this[dartx.in1] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feTile')) && svg$.FETileElement.is(svg$.SvgElement.tag('feTile'));
    }
    get [dartx.in1]() {
      return this.in1;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FETileElement, 'created');
  svg$.FETileElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FETileElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FETileElement, []),
      new: dart.definiteFunctionType(svg$.FETileElement, []),
      created: dart.definiteFunctionType(svg$.FETileElement, [])
    }),
    fields: () => ({
      [dartx.in1]: svg$.AnimatedString,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFETileElement, svg$.FETileElement);
  dart.defineExtensionNames([
    'baseFrequencyX',
    'baseFrequencyY',
    'numOctaves',
    'seed',
    'stitchTiles',
    'type',
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FETurbulenceElement = class FETurbulenceElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FETurbulenceElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
    }
    created() {
      this[dartx.baseFrequencyX] = null;
      this[dartx.baseFrequencyY] = null;
      this[dartx.numOctaves] = null;
      this[dartx.seed] = null;
      this[dartx.stitchTiles] = null;
      this[dartx.type] = null;
      this[dartx.height] = null;
      this[dartx.result] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('feTurbulence')) && svg$.FETurbulenceElement.is(svg$.SvgElement.tag('feTurbulence'));
    }
    get [dartx.baseFrequencyX]() {
      return this.baseFrequencyX;
    }
    get [dartx.baseFrequencyY]() {
      return this.baseFrequencyY;
    }
    get [dartx.numOctaves]() {
      return this.numOctaves;
    }
    get [dartx.seed]() {
      return this.seed;
    }
    get [dartx.stitchTiles]() {
      return this.stitchTiles;
    }
    get [dartx.type]() {
      return this.type;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.result]() {
      return this.result;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.FETurbulenceElement, 'created');
  svg$.FETurbulenceElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$.FETurbulenceElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
      new: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
      created: dart.definiteFunctionType(svg$.FETurbulenceElement, [])
    }),
    fields: () => ({
      [dartx.baseFrequencyX]: svg$.AnimatedNumber,
      [dartx.baseFrequencyY]: svg$.AnimatedNumber,
      [dartx.numOctaves]: svg$.AnimatedInteger,
      [dartx.seed]: svg$.AnimatedNumber,
      [dartx.stitchTiles]: svg$.AnimatedEnumeration,
      [dartx.type]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.result]: svg$.AnimatedString,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sfields: () => ({
      SVG_STITCHTYPE_NOSTITCH: core.int,
      SVG_STITCHTYPE_STITCH: core.int,
      SVG_STITCHTYPE_UNKNOWN: core.int,
      SVG_TURBULENCE_TYPE_FRACTALNOISE: core.int,
      SVG_TURBULENCE_TYPE_TURBULENCE: core.int,
      SVG_TURBULENCE_TYPE_UNKNOWN: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  svg$.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH = 2;
  svg$.FETurbulenceElement.SVG_STITCHTYPE_STITCH = 1;
  svg$.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN = 0;
  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE = 2;
  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGFETurbulenceElement, svg$.FETurbulenceElement);
  dart.defineExtensionNames([
    'filterUnits',
    'height',
    'primitiveUnits',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.FilterElement = class FilterElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.FilterElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("filter"));
    }
    created() {
      this[dartx.filterUnits] = null;
      this[dartx.height] = null;
      this[dartx.primitiveUnits] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('filter')) && svg$.FilterElement.is(svg$.SvgElement.tag('filter'));
    }
    get [dartx.filterUnits]() {
      return this.filterUnits;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.primitiveUnits]() {
      return this.primitiveUnits;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.FilterElement, 'created');
  svg$.FilterElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.FilterElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.FilterElement, []),
      new: dart.definiteFunctionType(svg$.FilterElement, []),
      created: dart.definiteFunctionType(svg$.FilterElement, [])
    }),
    fields: () => ({
      [dartx.filterUnits]: svg$.AnimatedEnumeration,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.primitiveUnits]: svg$.AnimatedEnumeration,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGFilterElement, svg$.FilterElement);
  dart.defineExtensionNames([
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  svg$.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get height() {
      return this[height$];
    }
    set height(value) {
      super.height = value;
    }
    get result() {
      return this[result];
    }
    set result(value) {
      super.result = value;
    }
    get width() {
      return this[width$];
    }
    set width(value) {
      super.width = value;
    }
    get x() {
      return this[x];
    }
    set x(value) {
      super.x = value;
    }
    get y() {
      return this[y];
    }
    set y(value) {
      super.y = value;
    }
  };
  const height$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'height'.toString());
  const result = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'result'.toString());
  const width$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'width'.toString());
  const x = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'x'.toString());
  const y = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'y'.toString());
  dart.setSignature(svg$.FilterPrimitiveStandardAttributes, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.FilterPrimitiveStandardAttributes, [])}),
    fields: () => ({
      height: svg$.AnimatedLength,
      result: svg$.AnimatedString,
      width: svg$.AnimatedLength,
      x: svg$.AnimatedLength,
      y: svg$.AnimatedLength
    })
  });
  dart.defineExtensionMembers(svg$.FilterPrimitiveStandardAttributes, [
    'height',
    'result',
    'width',
    'x',
    'y'
  ]);
  dart.defineExtensionNames([
    'preserveAspectRatio',
    'viewBox'
  ]);
  svg$.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get preserveAspectRatio() {
      return this[preserveAspectRatio];
    }
    set preserveAspectRatio(value) {
      super.preserveAspectRatio = value;
    }
    get viewBox() {
      return this[viewBox];
    }
    set viewBox(value) {
      super.viewBox = value;
    }
  };
  const preserveAspectRatio = Symbol(svg$.FitToViewBox.name + "." + 'preserveAspectRatio'.toString());
  const viewBox = Symbol(svg$.FitToViewBox.name + "." + 'viewBox'.toString());
  dart.setSignature(svg$.FitToViewBox, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.FitToViewBox, [])}),
    fields: () => ({
      preserveAspectRatio: svg$.AnimatedPreserveAspectRatio,
      viewBox: svg$.AnimatedRect
    })
  });
  dart.defineExtensionMembers(svg$.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
  dart.defineExtensionNames([
    'height',
    'width',
    'x',
    'y'
  ]);
  svg$.ForeignObjectElement = class ForeignObjectElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ForeignObjectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('foreignObject')) && svg$.ForeignObjectElement.is(svg$.SvgElement.tag('foreignObject'));
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.ForeignObjectElement, 'created');
  dart.setSignature(svg$.ForeignObjectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
      new: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
      created: dart.definiteFunctionType(svg$.ForeignObjectElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGForeignObjectElement, svg$.ForeignObjectElement);
  svg$.GElement = class GElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.GElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("g"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.GElement, 'created');
  dart.setSignature(svg$.GElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.GElement, []),
      new: dart.definiteFunctionType(svg$.GElement, []),
      created: dart.definiteFunctionType(svg$.GElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGGElement, svg$.GElement);
  dart.defineExtensionNames([
    'height',
    'preserveAspectRatio',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.ImageElement = class ImageElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("image"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.ImageElement, 'created');
  svg$.ImageElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.ImageElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ImageElement, []),
      new: dart.definiteFunctionType(svg$.ImageElement, []),
      created: dart.definiteFunctionType(svg$.ImageElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGImageElement, svg$.ImageElement);
  dart.defineExtensionNames([
    'convertToSpecifiedUnits',
    'newValueSpecifiedUnits',
    'unitType',
    'value',
    'valueAsString',
    'valueInSpecifiedUnits'
  ]);
  svg$.Length = class Length extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.unitType]() {
      return this.unitType;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    get [dartx.valueAsString]() {
      return this.valueAsString;
    }
    set [dartx.valueAsString](value) {
      this.valueAsString = value;
    }
    get [dartx.valueInSpecifiedUnits]() {
      return this.valueInSpecifiedUnits;
    }
    set [dartx.valueInSpecifiedUnits](value) {
      this.valueInSpecifiedUnits = value;
    }
    [dartx.convertToSpecifiedUnits](...args) {
      return this.convertToSpecifiedUnits.apply(this, args);
    }
    [dartx.newValueSpecifiedUnits](...args) {
      return this.newValueSpecifiedUnits.apply(this, args);
    }
  };
  dart.setSignature(svg$.Length, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Length, [])}),
    fields: () => ({
      [dartx.unitType]: core.int,
      [dartx.value]: core.num,
      [dartx.valueAsString]: core.String,
      [dartx.valueInSpecifiedUnits]: core.num
    }),
    methods: () => ({
      [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
    }),
    sfields: () => ({
      SVG_LENGTHTYPE_CM: core.int,
      SVG_LENGTHTYPE_EMS: core.int,
      SVG_LENGTHTYPE_EXS: core.int,
      SVG_LENGTHTYPE_IN: core.int,
      SVG_LENGTHTYPE_MM: core.int,
      SVG_LENGTHTYPE_NUMBER: core.int,
      SVG_LENGTHTYPE_PC: core.int,
      SVG_LENGTHTYPE_PERCENTAGE: core.int,
      SVG_LENGTHTYPE_PT: core.int,
      SVG_LENGTHTYPE_PX: core.int,
      SVG_LENGTHTYPE_UNKNOWN: core.int
    })
  });
  svg$.Length.SVG_LENGTHTYPE_CM = 6;
  svg$.Length.SVG_LENGTHTYPE_EMS = 3;
  svg$.Length.SVG_LENGTHTYPE_EXS = 4;
  svg$.Length.SVG_LENGTHTYPE_IN = 8;
  svg$.Length.SVG_LENGTHTYPE_MM = 7;
  svg$.Length.SVG_LENGTHTYPE_NUMBER = 1;
  svg$.Length.SVG_LENGTHTYPE_PC = 10;
  svg$.Length.SVG_LENGTHTYPE_PERCENTAGE = 2;
  svg$.Length.SVG_LENGTHTYPE_PT = 9;
  svg$.Length.SVG_LENGTHTYPE_PX = 5;
  svg$.Length.SVG_LENGTHTYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGLength, svg$.Length);
  const __setter__$ = Symbol('__setter__');
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.LengthList = class LengthList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Length), html$.ImmutableListMixin$(svg$.Length)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.LengthList[dart.implements] = () => [ListOfLength()];
  dart.setSignature(svg$.LengthList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.LengthList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.Length, []),
      [dartx.last]: dart.definiteFunctionType(svg$.Length, []),
      [dartx.single]: dart.definiteFunctionType(svg$.Length, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGLengthList, svg$.LengthList);
  dart.defineExtensionNames([
    'x1',
    'x2',
    'y1',
    'y2'
  ]);
  svg$.LineElement = class LineElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.LineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("line"));
    }
    created() {
      this[dartx.x1] = null;
      this[dartx.x2] = null;
      this[dartx.y1] = null;
      this[dartx.y2] = null;
      super.created();
    }
    get [dartx.x1]() {
      return this.x1;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    get [dartx.y2]() {
      return this.y2;
    }
  };
  dart.defineNamedConstructor(svg$.LineElement, 'created');
  dart.setSignature(svg$.LineElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.LineElement, []),
      new: dart.definiteFunctionType(svg$.LineElement, []),
      created: dart.definiteFunctionType(svg$.LineElement, [])
    }),
    fields: () => ({
      [dartx.x1]: svg$.AnimatedLength,
      [dartx.x2]: svg$.AnimatedLength,
      [dartx.y1]: svg$.AnimatedLength,
      [dartx.y2]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGLineElement, svg$.LineElement);
  dart.defineExtensionNames([
    'gradientTransform',
    'gradientUnits',
    'spreadMethod',
    'href'
  ]);
  svg$._GradientElement = class _GradientElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.gradientTransform] = null;
      this[dartx.gradientUnits] = null;
      this[dartx.spreadMethod] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.gradientTransform]() {
      return this.gradientTransform;
    }
    get [dartx.gradientUnits]() {
      return this.gradientUnits;
    }
    get [dartx.spreadMethod]() {
      return this.spreadMethod;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$._GradientElement, 'created');
  svg$._GradientElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$._GradientElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._GradientElement, []),
      created: dart.definiteFunctionType(svg$._GradientElement, [])
    }),
    fields: () => ({
      [dartx.gradientTransform]: svg$.AnimatedTransformList,
      [dartx.gradientUnits]: svg$.AnimatedEnumeration,
      [dartx.spreadMethod]: svg$.AnimatedEnumeration,
      [dartx.href]: svg$.AnimatedString
    }),
    sfields: () => ({
      SVG_SPREADMETHOD_PAD: core.int,
      SVG_SPREADMETHOD_REFLECT: core.int,
      SVG_SPREADMETHOD_REPEAT: core.int,
      SVG_SPREADMETHOD_UNKNOWN: core.int
    })
  });
  svg$._GradientElement.SVG_SPREADMETHOD_PAD = 1;
  svg$._GradientElement.SVG_SPREADMETHOD_REFLECT = 2;
  svg$._GradientElement.SVG_SPREADMETHOD_REPEAT = 3;
  svg$._GradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGGradientElement, svg$._GradientElement);
  dart.defineExtensionNames([
    'x1',
    'x2',
    'y1',
    'y2'
  ]);
  svg$.LinearGradientElement = class LinearGradientElement extends svg$._GradientElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.LinearGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
    }
    created() {
      this[dartx.x1] = null;
      this[dartx.x2] = null;
      this[dartx.y1] = null;
      this[dartx.y2] = null;
      super.created();
    }
    get [dartx.x1]() {
      return this.x1;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    get [dartx.y2]() {
      return this.y2;
    }
  };
  dart.defineNamedConstructor(svg$.LinearGradientElement, 'created');
  dart.setSignature(svg$.LinearGradientElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.LinearGradientElement, []),
      new: dart.definiteFunctionType(svg$.LinearGradientElement, []),
      created: dart.definiteFunctionType(svg$.LinearGradientElement, [])
    }),
    fields: () => ({
      [dartx.x1]: svg$.AnimatedLength,
      [dartx.x2]: svg$.AnimatedLength,
      [dartx.y1]: svg$.AnimatedLength,
      [dartx.y2]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGLinearGradientElement, svg$.LinearGradientElement);
  dart.defineExtensionNames([
    'setOrientToAngle',
    'setOrientToAuto',
    'markerHeight',
    'markerUnits',
    'markerWidth',
    'orientAngle',
    'orientType',
    'refX',
    'refY',
    'preserveAspectRatio',
    'viewBox'
  ]);
  svg$.MarkerElement = class MarkerElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.MarkerElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("marker"));
    }
    created() {
      this[dartx.markerHeight] = null;
      this[dartx.markerUnits] = null;
      this[dartx.markerWidth] = null;
      this[dartx.orientAngle] = null;
      this[dartx.orientType] = null;
      this[dartx.refX] = null;
      this[dartx.refY] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      super.created();
    }
    get [dartx.markerHeight]() {
      return this.markerHeight;
    }
    get [dartx.markerUnits]() {
      return this.markerUnits;
    }
    get [dartx.markerWidth]() {
      return this.markerWidth;
    }
    get [dartx.orientAngle]() {
      return this.orientAngle;
    }
    get [dartx.orientType]() {
      return this.orientType;
    }
    get [dartx.refX]() {
      return this.refX;
    }
    get [dartx.refY]() {
      return this.refY;
    }
    [dartx.setOrientToAngle](...args) {
      return this.setOrientToAngle.apply(this, args);
    }
    [dartx.setOrientToAuto](...args) {
      return this.setOrientToAuto.apply(this, args);
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
  };
  dart.defineNamedConstructor(svg$.MarkerElement, 'created');
  svg$.MarkerElement[dart.implements] = () => [svg$.FitToViewBox];
  dart.setSignature(svg$.MarkerElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.MarkerElement, []),
      new: dart.definiteFunctionType(svg$.MarkerElement, []),
      created: dart.definiteFunctionType(svg$.MarkerElement, [])
    }),
    fields: () => ({
      [dartx.markerHeight]: svg$.AnimatedLength,
      [dartx.markerUnits]: svg$.AnimatedEnumeration,
      [dartx.markerWidth]: svg$.AnimatedLength,
      [dartx.orientAngle]: svg$.AnimatedAngle,
      [dartx.orientType]: svg$.AnimatedEnumeration,
      [dartx.refX]: svg$.AnimatedLength,
      [dartx.refY]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect
    }),
    methods: () => ({
      [dartx.setOrientToAngle]: dart.definiteFunctionType(dart.void, [svg$.Angle]),
      [dartx.setOrientToAuto]: dart.definiteFunctionType(dart.void, [])
    }),
    sfields: () => ({
      SVG_MARKERUNITS_STROKEWIDTH: core.int,
      SVG_MARKERUNITS_UNKNOWN: core.int,
      SVG_MARKERUNITS_USERSPACEONUSE: core.int,
      SVG_MARKER_ORIENT_ANGLE: core.int,
      SVG_MARKER_ORIENT_AUTO: core.int,
      SVG_MARKER_ORIENT_UNKNOWN: core.int
    })
  });
  svg$.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH = 2;
  svg$.MarkerElement.SVG_MARKERUNITS_UNKNOWN = 0;
  svg$.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE = 1;
  svg$.MarkerElement.SVG_MARKER_ORIENT_ANGLE = 2;
  svg$.MarkerElement.SVG_MARKER_ORIENT_AUTO = 1;
  svg$.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGMarkerElement, svg$.MarkerElement);
  dart.defineExtensionNames([
    'hasExtension',
    'height',
    'maskContentUnits',
    'maskUnits',
    'width',
    'x',
    'y',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.MaskElement = class MaskElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.MaskElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mask"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.maskContentUnits] = null;
      this[dartx.maskUnits] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.maskContentUnits]() {
      return this.maskContentUnits;
    }
    get [dartx.maskUnits]() {
      return this.maskUnits;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.MaskElement, 'created');
  svg$.MaskElement[dart.implements] = () => [svg$.Tests];
  dart.setSignature(svg$.MaskElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.MaskElement, []),
      new: dart.definiteFunctionType(svg$.MaskElement, []),
      created: dart.definiteFunctionType(svg$.MaskElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.maskContentUnits]: svg$.AnimatedEnumeration,
      [dartx.maskUnits]: svg$.AnimatedEnumeration,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList
    }),
    methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
  });
  dart.registerExtension(dart.global.SVGMaskElement, svg$.MaskElement);
  dart.defineExtensionNames([
    'flipX',
    'flipY',
    'inverse',
    'multiply',
    'rotate',
    'rotateFromVector',
    'scale',
    'scaleNonUniform',
    'skewX',
    'skewY',
    'translate',
    'a',
    'b',
    'c',
    'd',
    'e',
    'f'
  ]);
  svg$.Matrix = class Matrix extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.a]() {
      return this.a;
    }
    set [dartx.a](value) {
      this.a = value;
    }
    get [dartx.b]() {
      return this.b;
    }
    set [dartx.b](value) {
      this.b = value;
    }
    get [dartx.c]() {
      return this.c;
    }
    set [dartx.c](value) {
      this.c = value;
    }
    get [dartx.d]() {
      return this.d;
    }
    set [dartx.d](value) {
      this.d = value;
    }
    get [dartx.e]() {
      return this.e;
    }
    set [dartx.e](value) {
      this.e = value;
    }
    get [dartx.f]() {
      return this.f;
    }
    set [dartx.f](value) {
      this.f = value;
    }
    [dartx.flipX](...args) {
      return this.flipX.apply(this, args);
    }
    [dartx.flipY](...args) {
      return this.flipY.apply(this, args);
    }
    [dartx.inverse](...args) {
      return this.inverse.apply(this, args);
    }
    [dartx.multiply](...args) {
      return this.multiply.apply(this, args);
    }
    [dartx.rotate](...args) {
      return this.rotate.apply(this, args);
    }
    [dartx.rotateFromVector](...args) {
      return this.rotateFromVector.apply(this, args);
    }
    [dartx.scale](...args) {
      return this.scale.apply(this, args);
    }
    [dartx.scaleNonUniform](...args) {
      return this.scaleNonUniform.apply(this, args);
    }
    [dartx.skewX](...args) {
      return this.skewX.apply(this, args);
    }
    [dartx.skewY](...args) {
      return this.skewY.apply(this, args);
    }
    [dartx.translate](...args) {
      return this.translate.apply(this, args);
    }
  };
  dart.setSignature(svg$.Matrix, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Matrix, [])}),
    fields: () => ({
      [dartx.a]: core.num,
      [dartx.b]: core.num,
      [dartx.c]: core.num,
      [dartx.d]: core.num,
      [dartx.e]: core.num,
      [dartx.f]: core.num
    }),
    methods: () => ({
      [dartx.flipX]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.flipY]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.inverse]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.multiply]: dart.definiteFunctionType(svg$.Matrix, [svg$.Matrix]),
      [dartx.rotate]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.rotateFromVector]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
      [dartx.scale]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.scaleNonUniform]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
      [dartx.skewX]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.skewY]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
      [dartx.translate]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.SVGMatrix, svg$.Matrix);
  svg$.MetadataElement = class MetadataElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.MetadataElement, 'created');
  dart.setSignature(svg$.MetadataElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.MetadataElement, []),
      created: dart.definiteFunctionType(svg$.MetadataElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGMetadataElement, svg$.MetadataElement);
  dart.defineExtensionNames([
    'value'
  ]);
  svg$.Number = class Number extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
  };
  dart.setSignature(svg$.Number, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Number, [])}),
    fields: () => ({[dartx.value]: core.num})
  });
  dart.registerExtension(dart.global.SVGNumber, svg$.Number);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.NumberList = class NumberList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Number), html$.ImmutableListMixin$(svg$.Number)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.NumberList[dart.implements] = () => [ListOfNumber()];
  dart.setSignature(svg$.NumberList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.NumberList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.Number, []),
      [dartx.last]: dart.definiteFunctionType(svg$.Number, []),
      [dartx.single]: dart.definiteFunctionType(svg$.Number, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGNumberList, svg$.NumberList);
  dart.defineExtensionNames([
    'createSvgPathSegArcAbs',
    'createSvgPathSegArcRel',
    'createSvgPathSegClosePath',
    'createSvgPathSegCurvetoCubicAbs',
    'createSvgPathSegCurvetoCubicRel',
    'createSvgPathSegCurvetoCubicSmoothAbs',
    'createSvgPathSegCurvetoCubicSmoothRel',
    'createSvgPathSegCurvetoQuadraticAbs',
    'createSvgPathSegCurvetoQuadraticRel',
    'createSvgPathSegCurvetoQuadraticSmoothAbs',
    'createSvgPathSegCurvetoQuadraticSmoothRel',
    'createSvgPathSegLinetoAbs',
    'createSvgPathSegLinetoHorizontalAbs',
    'createSvgPathSegLinetoHorizontalRel',
    'createSvgPathSegLinetoRel',
    'createSvgPathSegLinetoVerticalAbs',
    'createSvgPathSegLinetoVerticalRel',
    'createSvgPathSegMovetoAbs',
    'createSvgPathSegMovetoRel',
    'getPathSegAtLength',
    'getPointAtLength',
    'getTotalLength',
    'animatedNormalizedPathSegList',
    'animatedPathSegList',
    'normalizedPathSegList',
    'pathLength',
    'pathSegList'
  ]);
  svg$.PathElement = class PathElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("path"));
    }
    created() {
      this[dartx.animatedNormalizedPathSegList] = null;
      this[dartx.animatedPathSegList] = null;
      this[dartx.normalizedPathSegList] = null;
      this[dartx.pathLength] = null;
      this[dartx.pathSegList] = null;
      super.created();
    }
    get [dartx.animatedNormalizedPathSegList]() {
      return this.animatedNormalizedPathSegList;
    }
    get [dartx.animatedPathSegList]() {
      return this.animatedPathSegList;
    }
    get [dartx.normalizedPathSegList]() {
      return this.normalizedPathSegList;
    }
    get [dartx.pathLength]() {
      return this.pathLength;
    }
    get [dartx.pathSegList]() {
      return this.pathSegList;
    }
    [dartx.createSvgPathSegArcAbs](...args) {
      return this.createSVGPathSegArcAbs.apply(this, args);
    }
    [dartx.createSvgPathSegArcRel](...args) {
      return this.createSVGPathSegArcRel.apply(this, args);
    }
    [dartx.createSvgPathSegClosePath](...args) {
      return this.createSVGPathSegClosePath.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicAbs](...args) {
      return this.createSVGPathSegCurvetoCubicAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicRel](...args) {
      return this.createSVGPathSegCurvetoCubicRel.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicSmoothAbs](...args) {
      return this.createSVGPathSegCurvetoCubicSmoothAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoCubicSmoothRel](...args) {
      return this.createSVGPathSegCurvetoCubicSmoothRel.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticAbs](...args) {
      return this.createSVGPathSegCurvetoQuadraticAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticRel](...args) {
      return this.createSVGPathSegCurvetoQuadraticRel.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs](...args) {
      return this.createSVGPathSegCurvetoQuadraticSmoothAbs.apply(this, args);
    }
    [dartx.createSvgPathSegCurvetoQuadraticSmoothRel](...args) {
      return this.createSVGPathSegCurvetoQuadraticSmoothRel.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoAbs](...args) {
      return this.createSVGPathSegLinetoAbs.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoHorizontalAbs](...args) {
      return this.createSVGPathSegLinetoHorizontalAbs.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoHorizontalRel](...args) {
      return this.createSVGPathSegLinetoHorizontalRel.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoRel](...args) {
      return this.createSVGPathSegLinetoRel.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoVerticalAbs](...args) {
      return this.createSVGPathSegLinetoVerticalAbs.apply(this, args);
    }
    [dartx.createSvgPathSegLinetoVerticalRel](...args) {
      return this.createSVGPathSegLinetoVerticalRel.apply(this, args);
    }
    [dartx.createSvgPathSegMovetoAbs](...args) {
      return this.createSVGPathSegMovetoAbs.apply(this, args);
    }
    [dartx.createSvgPathSegMovetoRel](...args) {
      return this.createSVGPathSegMovetoRel.apply(this, args);
    }
    [dartx.getPathSegAtLength](...args) {
      return this.getPathSegAtLength.apply(this, args);
    }
    [dartx.getPointAtLength](...args) {
      return this.getPointAtLength.apply(this, args);
    }
    [dartx.getTotalLength](...args) {
      return this.getTotalLength.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.PathElement, 'created');
  dart.setSignature(svg$.PathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PathElement, []),
      new: dart.definiteFunctionType(svg$.PathElement, []),
      created: dart.definiteFunctionType(svg$.PathElement, [])
    }),
    fields: () => ({
      [dartx.animatedNormalizedPathSegList]: svg$.PathSegList,
      [dartx.animatedPathSegList]: svg$.PathSegList,
      [dartx.normalizedPathSegList]: svg$.PathSegList,
      [dartx.pathLength]: svg$.AnimatedNumber,
      [dartx.pathSegList]: svg$.PathSegList
    }),
    methods: () => ({
      [dartx.createSvgPathSegArcAbs]: dart.definiteFunctionType(svg$.PathSegArcAbs, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
      [dartx.createSvgPathSegArcRel]: dart.definiteFunctionType(svg$.PathSegArcRel, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
      [dartx.createSvgPathSegClosePath]: dart.definiteFunctionType(svg$.PathSegClosePath, []),
      [dartx.createSvgPathSegCurvetoCubicAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoCubicRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoCubicSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoCubicSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [core.num, core.num, core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [core.num, core.num]),
      [dartx.createSvgPathSegCurvetoQuadraticSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [core.num, core.num]),
      [dartx.createSvgPathSegLinetoAbs]: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [core.num, core.num]),
      [dartx.createSvgPathSegLinetoHorizontalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [core.num]),
      [dartx.createSvgPathSegLinetoHorizontalRel]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [core.num]),
      [dartx.createSvgPathSegLinetoRel]: dart.definiteFunctionType(svg$.PathSegLinetoRel, [core.num, core.num]),
      [dartx.createSvgPathSegLinetoVerticalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [core.num]),
      [dartx.createSvgPathSegLinetoVerticalRel]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [core.num]),
      [dartx.createSvgPathSegMovetoAbs]: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [core.num, core.num]),
      [dartx.createSvgPathSegMovetoRel]: dart.definiteFunctionType(svg$.PathSegMovetoRel, [core.num, core.num]),
      [dartx.getPathSegAtLength]: dart.definiteFunctionType(core.int, [core.num]),
      [dartx.getPointAtLength]: dart.definiteFunctionType(svg$.Point, [core.num]),
      [dartx.getTotalLength]: dart.definiteFunctionType(core.double, [])
    })
  });
  dart.registerExtension(dart.global.SVGPathElement, svg$.PathElement);
  dart.defineExtensionNames([
    'pathSegType',
    'pathSegTypeAsLetter'
  ]);
  svg$.PathSeg = class PathSeg extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.pathSegType]() {
      return this.pathSegType;
    }
    get [dartx.pathSegTypeAsLetter]() {
      return this.pathSegTypeAsLetter;
    }
  };
  dart.setSignature(svg$.PathSeg, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSeg, [])}),
    fields: () => ({
      [dartx.pathSegType]: core.int,
      [dartx.pathSegTypeAsLetter]: core.String
    }),
    sfields: () => ({
      PATHSEG_ARC_ABS: core.int,
      PATHSEG_ARC_REL: core.int,
      PATHSEG_CLOSEPATH: core.int,
      PATHSEG_CURVETO_CUBIC_ABS: core.int,
      PATHSEG_CURVETO_CUBIC_REL: core.int,
      PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: core.int,
      PATHSEG_CURVETO_CUBIC_SMOOTH_REL: core.int,
      PATHSEG_CURVETO_QUADRATIC_ABS: core.int,
      PATHSEG_CURVETO_QUADRATIC_REL: core.int,
      PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: core.int,
      PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: core.int,
      PATHSEG_LINETO_ABS: core.int,
      PATHSEG_LINETO_HORIZONTAL_ABS: core.int,
      PATHSEG_LINETO_HORIZONTAL_REL: core.int,
      PATHSEG_LINETO_REL: core.int,
      PATHSEG_LINETO_VERTICAL_ABS: core.int,
      PATHSEG_LINETO_VERTICAL_REL: core.int,
      PATHSEG_MOVETO_ABS: core.int,
      PATHSEG_MOVETO_REL: core.int,
      PATHSEG_UNKNOWN: core.int
    })
  });
  svg$.PathSeg.PATHSEG_ARC_ABS = 10;
  svg$.PathSeg.PATHSEG_ARC_REL = 11;
  svg$.PathSeg.PATHSEG_CLOSEPATH = 1;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
  svg$.PathSeg.PATHSEG_LINETO_ABS = 4;
  svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
  svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
  svg$.PathSeg.PATHSEG_LINETO_REL = 5;
  svg$.PathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
  svg$.PathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
  svg$.PathSeg.PATHSEG_MOVETO_ABS = 2;
  svg$.PathSeg.PATHSEG_MOVETO_REL = 3;
  svg$.PathSeg.PATHSEG_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGPathSeg, svg$.PathSeg);
  dart.defineExtensionNames([
    'angle',
    'largeArcFlag',
    'r1',
    'r2',
    'sweepFlag',
    'x',
    'y'
  ]);
  svg$.PathSegArcAbs = class PathSegArcAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    set [dartx.angle](value) {
      this.angle = value;
    }
    get [dartx.largeArcFlag]() {
      return this.largeArcFlag;
    }
    set [dartx.largeArcFlag](value) {
      this.largeArcFlag = value;
    }
    get [dartx.r1]() {
      return this.r1;
    }
    set [dartx.r1](value) {
      this.r1 = value;
    }
    get [dartx.r2]() {
      return this.r2;
    }
    set [dartx.r2](value) {
      this.r2 = value;
    }
    get [dartx.sweepFlag]() {
      return this.sweepFlag;
    }
    set [dartx.sweepFlag](value) {
      this.sweepFlag = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegArcAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcAbs, [])}),
    fields: () => ({
      [dartx.angle]: core.num,
      [dartx.largeArcFlag]: core.bool,
      [dartx.r1]: core.num,
      [dartx.r2]: core.num,
      [dartx.sweepFlag]: core.bool,
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegArcAbs, svg$.PathSegArcAbs);
  dart.defineExtensionNames([
    'angle',
    'largeArcFlag',
    'r1',
    'r2',
    'sweepFlag',
    'x',
    'y'
  ]);
  svg$.PathSegArcRel = class PathSegArcRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    set [dartx.angle](value) {
      this.angle = value;
    }
    get [dartx.largeArcFlag]() {
      return this.largeArcFlag;
    }
    set [dartx.largeArcFlag](value) {
      this.largeArcFlag = value;
    }
    get [dartx.r1]() {
      return this.r1;
    }
    set [dartx.r1](value) {
      this.r1 = value;
    }
    get [dartx.r2]() {
      return this.r2;
    }
    set [dartx.r2](value) {
      this.r2 = value;
    }
    get [dartx.sweepFlag]() {
      return this.sweepFlag;
    }
    set [dartx.sweepFlag](value) {
      this.sweepFlag = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegArcRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcRel, [])}),
    fields: () => ({
      [dartx.angle]: core.num,
      [dartx.largeArcFlag]: core.bool,
      [dartx.r1]: core.num,
      [dartx.r2]: core.num,
      [dartx.sweepFlag]: core.bool,
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegArcRel, svg$.PathSegArcRel);
  svg$.PathSegClosePath = class PathSegClosePath extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(svg$.PathSegClosePath, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegClosePath, [])})
  });
  dart.registerExtension(dart.global.SVGPathSegClosePath, svg$.PathSegClosePath);
  dart.defineExtensionNames([
    'x',
    'x1',
    'x2',
    'y',
    'y1',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicAbs = class PathSegCurvetoCubicAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicAbs, svg$.PathSegCurvetoCubicAbs);
  dart.defineExtensionNames([
    'x',
    'x1',
    'x2',
    'y',
    'y1',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicRel = class PathSegCurvetoCubicRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicRel, svg$.PathSegCurvetoCubicRel);
  dart.defineExtensionNames([
    'x',
    'x2',
    'y',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicSmoothAbs = class PathSegCurvetoCubicSmoothAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicSmoothAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothAbs, svg$.PathSegCurvetoCubicSmoothAbs);
  dart.defineExtensionNames([
    'x',
    'x2',
    'y',
    'y2'
  ]);
  svg$.PathSegCurvetoCubicSmoothRel = class PathSegCurvetoCubicSmoothRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x2]() {
      return this.x2;
    }
    set [dartx.x2](value) {
      this.x2 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y2]() {
      return this.y2;
    }
    set [dartx.y2](value) {
      this.y2 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoCubicSmoothRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x2]: core.num,
      [dartx.y]: core.num,
      [dartx.y2]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothRel, svg$.PathSegCurvetoCubicSmoothRel);
  dart.defineExtensionNames([
    'x',
    'x1',
    'y',
    'y1'
  ]);
  svg$.PathSegCurvetoQuadraticAbs = class PathSegCurvetoQuadraticAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticAbs, svg$.PathSegCurvetoQuadraticAbs);
  dart.defineExtensionNames([
    'x',
    'x1',
    'y',
    'y1'
  ]);
  svg$.PathSegCurvetoQuadraticRel = class PathSegCurvetoQuadraticRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.x1]() {
      return this.x1;
    }
    set [dartx.x1](value) {
      this.x1 = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    get [dartx.y1]() {
      return this.y1;
    }
    set [dartx.y1](value) {
      this.y1 = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.x1]: core.num,
      [dartx.y]: core.num,
      [dartx.y1]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticRel, svg$.PathSegCurvetoQuadraticRel);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegCurvetoQuadraticSmoothAbs = class PathSegCurvetoQuadraticSmoothAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothAbs, svg$.PathSegCurvetoQuadraticSmoothAbs);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegCurvetoQuadraticSmoothRel = class PathSegCurvetoQuadraticSmoothRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothRel, svg$.PathSegCurvetoQuadraticSmoothRel);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegLinetoAbs = class PathSegLinetoAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoAbs, svg$.PathSegLinetoAbs);
  dart.defineExtensionNames([
    'x'
  ]);
  svg$.PathSegLinetoHorizontalAbs = class PathSegLinetoHorizontalAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoHorizontalAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [])}),
    fields: () => ({[dartx.x]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalAbs, svg$.PathSegLinetoHorizontalAbs);
  dart.defineExtensionNames([
    'x'
  ]);
  svg$.PathSegLinetoHorizontalRel = class PathSegLinetoHorizontalRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoHorizontalRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [])}),
    fields: () => ({[dartx.x]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalRel, svg$.PathSegLinetoHorizontalRel);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegLinetoRel = class PathSegLinetoRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoRel, svg$.PathSegLinetoRel);
  dart.defineExtensionNames([
    'y'
  ]);
  svg$.PathSegLinetoVerticalAbs = class PathSegLinetoVerticalAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoVerticalAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [])}),
    fields: () => ({[dartx.y]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoVerticalAbs, svg$.PathSegLinetoVerticalAbs);
  dart.defineExtensionNames([
    'y'
  ]);
  svg$.PathSegLinetoVerticalRel = class PathSegLinetoVerticalRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegLinetoVerticalRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [])}),
    fields: () => ({[dartx.y]: core.num})
  });
  dart.registerExtension(dart.global.SVGPathSegLinetoVerticalRel, svg$.PathSegLinetoVerticalRel);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.PathSegList = class PathSegList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.PathSeg), html$.ImmutableListMixin$(svg$.PathSeg)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.PathSegList[dart.implements] = () => [ListOfPathSeg()];
  dart.setSignature(svg$.PathSegList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.PathSeg, []),
      [dartx.last]: dart.definiteFunctionType(svg$.PathSeg, []),
      [dartx.single]: dart.definiteFunctionType(svg$.PathSeg, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGPathSegList, svg$.PathSegList);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegMovetoAbs = class PathSegMovetoAbs extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegMovetoAbs, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegMovetoAbs, svg$.PathSegMovetoAbs);
  dart.defineExtensionNames([
    'x',
    'y'
  ]);
  svg$.PathSegMovetoRel = class PathSegMovetoRel extends svg$.PathSeg {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.PathSegMovetoRel, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoRel, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGPathSegMovetoRel, svg$.PathSegMovetoRel);
  dart.defineExtensionNames([
    'hasExtension',
    'height',
    'patternContentUnits',
    'patternTransform',
    'patternUnits',
    'width',
    'x',
    'y',
    'preserveAspectRatio',
    'viewBox',
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage',
    'href'
  ]);
  svg$.PatternElement = class PatternElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PatternElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.patternContentUnits] = null;
      this[dartx.patternTransform] = null;
      this[dartx.patternUnits] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      this[dartx.requiredExtensions] = null;
      this[dartx.requiredFeatures] = null;
      this[dartx.systemLanguage] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.patternContentUnits]() {
      return this.patternContentUnits;
    }
    get [dartx.patternTransform]() {
      return this.patternTransform;
    }
    get [dartx.patternUnits]() {
      return this.patternUnits;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.requiredExtensions]() {
      return this.requiredExtensions;
    }
    get [dartx.requiredFeatures]() {
      return this.requiredFeatures;
    }
    get [dartx.systemLanguage]() {
      return this.systemLanguage;
    }
    [dartx.hasExtension](...args) {
      return this.hasExtension.apply(this, args);
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.PatternElement, 'created');
  svg$.PatternElement[dart.implements] = () => [svg$.FitToViewBox, svg$.UriReference, svg$.Tests];
  dart.setSignature(svg$.PatternElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PatternElement, []),
      new: dart.definiteFunctionType(svg$.PatternElement, []),
      created: dart.definiteFunctionType(svg$.PatternElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.patternContentUnits]: svg$.AnimatedEnumeration,
      [dartx.patternTransform]: svg$.AnimatedTransformList,
      [dartx.patternUnits]: svg$.AnimatedEnumeration,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.requiredExtensions]: svg$.StringList,
      [dartx.requiredFeatures]: svg$.StringList,
      [dartx.systemLanguage]: svg$.StringList,
      [dartx.href]: svg$.AnimatedString
    }),
    methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
  });
  dart.registerExtension(dart.global.SVGPatternElement, svg$.PatternElement);
  dart.defineExtensionNames([
    'matrixTransform',
    'x',
    'y'
  ]);
  svg$.Point = class Point extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
    [dartx.matrixTransform](...args) {
      return this.matrixTransform.apply(this, args);
    }
  };
  dart.setSignature(svg$.Point, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Point, [])}),
    fields: () => ({
      [dartx.x]: core.num,
      [dartx.y]: core.num
    }),
    methods: () => ({[dartx.matrixTransform]: dart.definiteFunctionType(svg$.Point, [svg$.Matrix])})
  });
  dart.registerExtension(dart.global.SVGPoint, svg$.Point);
  dart.defineExtensionNames([
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'length',
    'numberOfItems'
  ]);
  svg$.PointList = class PointList extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  dart.setSignature(svg$.PointList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PointList, [])}),
    fields: () => ({
      [dartx.length]: core.int,
      [dartx.numberOfItems]: core.int
    }),
    methods: () => ({
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Point]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGPointList, svg$.PointList);
  dart.defineExtensionNames([
    'animatedPoints',
    'points'
  ]);
  svg$.PolygonElement = class PolygonElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PolygonElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
    }
    created() {
      this[dartx.animatedPoints] = null;
      this[dartx.points] = null;
      super.created();
    }
    get [dartx.animatedPoints]() {
      return this.animatedPoints;
    }
    get [dartx.points]() {
      return this.points;
    }
  };
  dart.defineNamedConstructor(svg$.PolygonElement, 'created');
  dart.setSignature(svg$.PolygonElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PolygonElement, []),
      new: dart.definiteFunctionType(svg$.PolygonElement, []),
      created: dart.definiteFunctionType(svg$.PolygonElement, [])
    }),
    fields: () => ({
      [dartx.animatedPoints]: svg$.PointList,
      [dartx.points]: svg$.PointList
    })
  });
  dart.registerExtension(dart.global.SVGPolygonElement, svg$.PolygonElement);
  dart.defineExtensionNames([
    'animatedPoints',
    'points'
  ]);
  svg$.PolylineElement = class PolylineElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.PolylineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
    }
    created() {
      this[dartx.animatedPoints] = null;
      this[dartx.points] = null;
      super.created();
    }
    get [dartx.animatedPoints]() {
      return this.animatedPoints;
    }
    get [dartx.points]() {
      return this.points;
    }
  };
  dart.defineNamedConstructor(svg$.PolylineElement, 'created');
  dart.setSignature(svg$.PolylineElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.PolylineElement, []),
      new: dart.definiteFunctionType(svg$.PolylineElement, []),
      created: dart.definiteFunctionType(svg$.PolylineElement, [])
    }),
    fields: () => ({
      [dartx.animatedPoints]: svg$.PointList,
      [dartx.points]: svg$.PointList
    })
  });
  dart.registerExtension(dart.global.SVGPolylineElement, svg$.PolylineElement);
  dart.defineExtensionNames([
    'align',
    'meetOrSlice'
  ]);
  svg$.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.align]() {
      return this.align;
    }
    set [dartx.align](value) {
      this.align = value;
    }
    get [dartx.meetOrSlice]() {
      return this.meetOrSlice;
    }
    set [dartx.meetOrSlice](value) {
      this.meetOrSlice = value;
    }
  };
  dart.setSignature(svg$.PreserveAspectRatio, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.PreserveAspectRatio, [])}),
    fields: () => ({
      [dartx.align]: core.int,
      [dartx.meetOrSlice]: core.int
    }),
    sfields: () => ({
      SVG_MEETORSLICE_MEET: core.int,
      SVG_MEETORSLICE_SLICE: core.int,
      SVG_MEETORSLICE_UNKNOWN: core.int,
      SVG_PRESERVEASPECTRATIO_NONE: core.int,
      SVG_PRESERVEASPECTRATIO_UNKNOWN: core.int,
      SVG_PRESERVEASPECTRATIO_XMAXYMAX: core.int,
      SVG_PRESERVEASPECTRATIO_XMAXYMID: core.int,
      SVG_PRESERVEASPECTRATIO_XMAXYMIN: core.int,
      SVG_PRESERVEASPECTRATIO_XMIDYMAX: core.int,
      SVG_PRESERVEASPECTRATIO_XMIDYMID: core.int,
      SVG_PRESERVEASPECTRATIO_XMIDYMIN: core.int,
      SVG_PRESERVEASPECTRATIO_XMINYMAX: core.int,
      SVG_PRESERVEASPECTRATIO_XMINYMID: core.int,
      SVG_PRESERVEASPECTRATIO_XMINYMIN: core.int
    })
  });
  svg$.PreserveAspectRatio.SVG_MEETORSLICE_MEET = 1;
  svg$.PreserveAspectRatio.SVG_MEETORSLICE_SLICE = 2;
  svg$.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN = 0;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE = 1;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
  dart.registerExtension(dart.global.SVGPreserveAspectRatio, svg$.PreserveAspectRatio);
  dart.defineExtensionNames([
    'cx',
    'cy',
    'fr',
    'fx',
    'fy',
    'r'
  ]);
  svg$.RadialGradientElement = class RadialGradientElement extends svg$._GradientElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.RadialGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
    }
    created() {
      this[dartx.cx] = null;
      this[dartx.cy] = null;
      this[dartx.fr] = null;
      this[dartx.fx] = null;
      this[dartx.fy] = null;
      this[dartx.r] = null;
      super.created();
    }
    get [dartx.cx]() {
      return this.cx;
    }
    get [dartx.cy]() {
      return this.cy;
    }
    get [dartx.fr]() {
      return this.fr;
    }
    get [dartx.fx]() {
      return this.fx;
    }
    get [dartx.fy]() {
      return this.fy;
    }
    get [dartx.r]() {
      return this.r;
    }
  };
  dart.defineNamedConstructor(svg$.RadialGradientElement, 'created');
  dart.setSignature(svg$.RadialGradientElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.RadialGradientElement, []),
      new: dart.definiteFunctionType(svg$.RadialGradientElement, []),
      created: dart.definiteFunctionType(svg$.RadialGradientElement, [])
    }),
    fields: () => ({
      [dartx.cx]: svg$.AnimatedLength,
      [dartx.cy]: svg$.AnimatedLength,
      [dartx.fr]: svg$.AnimatedLength,
      [dartx.fx]: svg$.AnimatedLength,
      [dartx.fy]: svg$.AnimatedLength,
      [dartx.r]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGRadialGradientElement, svg$.RadialGradientElement);
  dart.defineExtensionNames([
    'height',
    'width',
    'x',
    'y'
  ]);
  svg$.Rect = class Rect extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.height]() {
      return this.height;
    }
    set [dartx.height](value) {
      this.height = value;
    }
    get [dartx.width]() {
      return this.width;
    }
    set [dartx.width](value) {
      this.width = value;
    }
    get [dartx.x]() {
      return this.x;
    }
    set [dartx.x](value) {
      this.x = value;
    }
    get [dartx.y]() {
      return this.y;
    }
    set [dartx.y](value) {
      this.y = value;
    }
  };
  dart.setSignature(svg$.Rect, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Rect, [])}),
    fields: () => ({
      [dartx.height]: core.num,
      [dartx.width]: core.num,
      [dartx.x]: core.num,
      [dartx.y]: core.num
    })
  });
  dart.registerExtension(dart.global.SVGRect, svg$.Rect);
  dart.defineExtensionNames([
    'height',
    'rx',
    'ry',
    'width',
    'x',
    'y'
  ]);
  svg$.RectElement = class RectElement extends svg$.GeometryElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.RectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("rect"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.rx] = null;
      this[dartx.ry] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.rx]() {
      return this.rx;
    }
    get [dartx.ry]() {
      return this.ry;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.RectElement, 'created');
  dart.setSignature(svg$.RectElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.RectElement, []),
      new: dart.definiteFunctionType(svg$.RectElement, []),
      created: dart.definiteFunctionType(svg$.RectElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.rx]: svg$.AnimatedLength,
      [dartx.ry]: svg$.AnimatedLength,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength
    })
  });
  dart.registerExtension(dart.global.SVGRectElement, svg$.RectElement);
  dart.defineExtensionNames([
    'type',
    'href'
  ]);
  svg$.ScriptElement = class ScriptElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ScriptElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("script"));
    }
    created() {
      this[dartx.type] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.ScriptElement, 'created');
  svg$.ScriptElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.ScriptElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ScriptElement, []),
      new: dart.definiteFunctionType(svg$.ScriptElement, []),
      created: dart.definiteFunctionType(svg$.ScriptElement, [])
    }),
    fields: () => ({
      [dartx.type]: core.String,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGScriptElement, svg$.ScriptElement);
  svg$.SetElement = class SetElement extends svg$.AnimationElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.SetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("set"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('set')) && svg$.SetElement.is(svg$.SvgElement.tag('set'));
    }
  };
  dart.defineNamedConstructor(svg$.SetElement, 'created');
  dart.setSignature(svg$.SetElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.SetElement, []),
      new: dart.definiteFunctionType(svg$.SetElement, []),
      created: dart.definiteFunctionType(svg$.SetElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGSetElement, svg$.SetElement);
  dart.defineExtensionNames([
    'gradientOffset'
  ]);
  svg$.StopElement = class StopElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.StopElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("stop"));
    }
    created() {
      this[dartx.gradientOffset] = null;
      super.created();
    }
    get [dartx.gradientOffset]() {
      return this.offset;
    }
  };
  dart.defineNamedConstructor(svg$.StopElement, 'created');
  dart.setSignature(svg$.StopElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.StopElement, []),
      new: dart.definiteFunctionType(svg$.StopElement, []),
      created: dart.definiteFunctionType(svg$.StopElement, [])
    }),
    fields: () => ({[dartx.gradientOffset]: svg$.AnimatedNumber})
  });
  dart.registerExtension(dart.global.SVGStopElement, svg$.StopElement);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.StringList = class StringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.StringList[dart.implements] = () => [ListOfString()];
  dart.setSignature(svg$.StringList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.StringList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(core.String, []),
      [dartx.last]: dart.definiteFunctionType(core.String, []),
      [dartx.single]: dart.definiteFunctionType(core.String, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.elementAt]: dart.definiteFunctionType(core.String, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
      [dartx.appendItem]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.getItem]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(core.String, [core.String]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(core.String, [core.String, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(core.String, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(core.String, [core.String, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGStringList, svg$.StringList);
  dart.defineExtensionNames([
    'disabled',
    'media',
    'sheet',
    'type'
  ]);
  svg$.StyleElement = class StyleElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.StyleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("style"));
    }
    created() {
      this[dartx.disabled] = null;
      this[dartx.media] = null;
      this[dartx.sheet] = null;
      this[dartx.type] = null;
      super.created();
    }
    get [dartx.disabled]() {
      return this.disabled;
    }
    set [dartx.disabled](value) {
      this.disabled = value;
    }
    get [dartx.media]() {
      return this.media;
    }
    set [dartx.media](value) {
      this.media = value;
    }
    get [dartx.sheet]() {
      return this.sheet;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
  };
  dart.defineNamedConstructor(svg$.StyleElement, 'created');
  dart.setSignature(svg$.StyleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.StyleElement, []),
      new: dart.definiteFunctionType(svg$.StyleElement, []),
      created: dart.definiteFunctionType(svg$.StyleElement, [])
    }),
    fields: () => ({
      [dartx.disabled]: core.bool,
      [dartx.media]: core.String,
      [dartx.sheet]: html$.StyleSheet,
      [dartx.type]: core.String
    })
  });
  dart.registerExtension(dart.global.SVGStyleElement, svg$.StyleElement);
  const _element$0 = Symbol('_element');
  svg$._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
    new(element) {
      this[_element$0] = element;
    }
    readClasses() {
      let classname = this[_element$0][dartx.attributes][dartx._get]('class');
      let s = LinkedHashSetOfString().new();
      if (classname == null) {
        return s;
      }
      for (let name of classname[dartx.split](' ')) {
        let trimmed = name[dartx.trim]();
        if (!dart.test(trimmed[dartx.isEmpty])) {
          s.add(trimmed);
        }
      }
      return s;
    }
    writeClasses(s) {
      this[_element$0][dartx.attributes][dartx._set]('class', s.join(' '));
    }
  };
  dart.setSignature(svg$._AttributeClassSet, {
    constructors: () => ({new: dart.definiteFunctionType(svg$._AttributeClassSet, [html$.Element])}),
    fields: () => ({[_element$0]: html$.Element}),
    methods: () => ({
      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
      writeClasses: dart.definiteFunctionType(dart.void, [core.Set])
    })
  });
  dart.defineExtensionNames([
    'animationsPaused',
    'checkEnclosure',
    'checkIntersection',
    'createSvgAngle',
    'createSvgLength',
    'createSvgMatrix',
    'createSvgNumber',
    'createSvgPoint',
    'createSvgRect',
    'createSvgTransform',
    'createSvgTransformFromMatrix',
    'deselectAll',
    'forceRedraw',
    'getCurrentTime',
    'getElementById',
    'getEnclosureList',
    'getIntersectionList',
    'pauseAnimations',
    'setCurrentTime',
    'suspendRedraw',
    'unpauseAnimations',
    'unsuspendRedraw',
    'unsuspendRedrawAll',
    'currentScale',
    'currentTranslate',
    'currentView',
    'height',
    'pixelUnitToMillimeterX',
    'pixelUnitToMillimeterY',
    'screenPixelToMillimeterX',
    'screenPixelToMillimeterY',
    'useCurrentView',
    'viewport',
    'width',
    'x',
    'y',
    'preserveAspectRatio',
    'viewBox',
    'zoomAndPan'
  ]);
  svg$.SvgSvgElement = class SvgSvgElement extends svg$.GraphicsElement {
    static new() {
      let el = svg$.SvgElement.tag("svg");
      el[dartx.attributes][dartx._set]('version', "1.1");
      return svg$.SvgSvgElement._check(el);
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.currentScale] = null;
      this[dartx.currentTranslate] = null;
      this[dartx.currentView] = null;
      this[dartx.height] = null;
      this[dartx.pixelUnitToMillimeterX] = null;
      this[dartx.pixelUnitToMillimeterY] = null;
      this[dartx.screenPixelToMillimeterX] = null;
      this[dartx.screenPixelToMillimeterY] = null;
      this[dartx.useCurrentView] = null;
      this[dartx.viewport] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      this[dartx.zoomAndPan] = null;
      super.created();
    }
    get [dartx.currentScale]() {
      return this.currentScale;
    }
    set [dartx.currentScale](value) {
      this.currentScale = value;
    }
    get [dartx.currentTranslate]() {
      return this.currentTranslate;
    }
    get [dartx.currentView]() {
      return this.currentView;
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.pixelUnitToMillimeterX]() {
      return this.pixelUnitToMillimeterX;
    }
    get [dartx.pixelUnitToMillimeterY]() {
      return this.pixelUnitToMillimeterY;
    }
    get [dartx.screenPixelToMillimeterX]() {
      return this.screenPixelToMillimeterX;
    }
    get [dartx.screenPixelToMillimeterY]() {
      return this.screenPixelToMillimeterY;
    }
    get [dartx.useCurrentView]() {
      return this.useCurrentView;
    }
    get [dartx.viewport]() {
      return this.viewport;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    [dartx.animationsPaused](...args) {
      return this.animationsPaused.apply(this, args);
    }
    [dartx.checkEnclosure](...args) {
      return this.checkEnclosure.apply(this, args);
    }
    [dartx.checkIntersection](...args) {
      return this.checkIntersection.apply(this, args);
    }
    [dartx.createSvgAngle](...args) {
      return this.createSVGAngle.apply(this, args);
    }
    [dartx.createSvgLength](...args) {
      return this.createSVGLength.apply(this, args);
    }
    [dartx.createSvgMatrix](...args) {
      return this.createSVGMatrix.apply(this, args);
    }
    [dartx.createSvgNumber](...args) {
      return this.createSVGNumber.apply(this, args);
    }
    [dartx.createSvgPoint](...args) {
      return this.createSVGPoint.apply(this, args);
    }
    [dartx.createSvgRect](...args) {
      return this.createSVGRect.apply(this, args);
    }
    [dartx.createSvgTransform](...args) {
      return this.createSVGTransform.apply(this, args);
    }
    [dartx.createSvgTransformFromMatrix](...args) {
      return this.createSVGTransformFromMatrix.apply(this, args);
    }
    [dartx.deselectAll](...args) {
      return this.deselectAll.apply(this, args);
    }
    [dartx.forceRedraw](...args) {
      return this.forceRedraw.apply(this, args);
    }
    [dartx.getCurrentTime](...args) {
      return this.getCurrentTime.apply(this, args);
    }
    [dartx.getElementById](...args) {
      return this.getElementById.apply(this, args);
    }
    [dartx.getEnclosureList](...args) {
      return this.getEnclosureList.apply(this, args);
    }
    [dartx.getIntersectionList](...args) {
      return this.getIntersectionList.apply(this, args);
    }
    [dartx.pauseAnimations](...args) {
      return this.pauseAnimations.apply(this, args);
    }
    [dartx.setCurrentTime](...args) {
      return this.setCurrentTime.apply(this, args);
    }
    [dartx.suspendRedraw](...args) {
      return this.suspendRedraw.apply(this, args);
    }
    [dartx.unpauseAnimations](...args) {
      return this.unpauseAnimations.apply(this, args);
    }
    [dartx.unsuspendRedraw](...args) {
      return this.unsuspendRedraw.apply(this, args);
    }
    [dartx.unsuspendRedrawAll](...args) {
      return this.unsuspendRedrawAll.apply(this, args);
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.zoomAndPan]() {
      return this.zoomAndPan;
    }
    set [dartx.zoomAndPan](value) {
      this.zoomAndPan = value;
    }
  };
  dart.defineNamedConstructor(svg$.SvgSvgElement, 'created');
  svg$.SvgSvgElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
  dart.setSignature(svg$.SvgSvgElement, {
    constructors: () => ({
      new: dart.definiteFunctionType(svg$.SvgSvgElement, []),
      _: dart.definiteFunctionType(svg$.SvgSvgElement, []),
      created: dart.definiteFunctionType(svg$.SvgSvgElement, [])
    }),
    fields: () => ({
      [dartx.currentScale]: core.num,
      [dartx.currentTranslate]: svg$.Point,
      [dartx.currentView]: svg$.ViewSpec,
      [dartx.height]: svg$.AnimatedLength,
      [dartx.pixelUnitToMillimeterX]: core.double,
      [dartx.pixelUnitToMillimeterY]: core.double,
      [dartx.screenPixelToMillimeterX]: core.double,
      [dartx.screenPixelToMillimeterY]: core.double,
      [dartx.useCurrentView]: core.bool,
      [dartx.viewport]: svg$.Rect,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.zoomAndPan]: core.int
    }),
    methods: () => ({
      [dartx.animationsPaused]: dart.definiteFunctionType(core.bool, []),
      [dartx.checkEnclosure]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
      [dartx.checkIntersection]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
      [dartx.createSvgAngle]: dart.definiteFunctionType(svg$.Angle, []),
      [dartx.createSvgLength]: dart.definiteFunctionType(svg$.Length, []),
      [dartx.createSvgMatrix]: dart.definiteFunctionType(svg$.Matrix, []),
      [dartx.createSvgNumber]: dart.definiteFunctionType(svg$.Number, []),
      [dartx.createSvgPoint]: dart.definiteFunctionType(svg$.Point, []),
      [dartx.createSvgRect]: dart.definiteFunctionType(svg$.Rect, []),
      [dartx.createSvgTransform]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
      [dartx.deselectAll]: dart.definiteFunctionType(dart.void, []),
      [dartx.forceRedraw]: dart.definiteFunctionType(dart.void, []),
      [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
      [dartx.getEnclosureList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
      [dartx.getIntersectionList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
      [dartx.pauseAnimations]: dart.definiteFunctionType(dart.void, []),
      [dartx.setCurrentTime]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.suspendRedraw]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.unpauseAnimations]: dart.definiteFunctionType(dart.void, []),
      [dartx.unsuspendRedraw]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.unsuspendRedrawAll]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.SVGSVGElement, svg$.SvgSvgElement);
  svg$.SwitchElement = class SwitchElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.SwitchElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("switch"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.SwitchElement, 'created');
  dart.setSignature(svg$.SwitchElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.SwitchElement, []),
      new: dart.definiteFunctionType(svg$.SwitchElement, []),
      created: dart.definiteFunctionType(svg$.SwitchElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGSwitchElement, svg$.SwitchElement);
  dart.defineExtensionNames([
    'preserveAspectRatio',
    'viewBox'
  ]);
  svg$.SymbolElement = class SymbolElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.SymbolElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
    }
    created() {
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      super.created();
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
  };
  dart.defineNamedConstructor(svg$.SymbolElement, 'created');
  svg$.SymbolElement[dart.implements] = () => [svg$.FitToViewBox];
  dart.setSignature(svg$.SymbolElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.SymbolElement, []),
      new: dart.definiteFunctionType(svg$.SymbolElement, []),
      created: dart.definiteFunctionType(svg$.SymbolElement, [])
    }),
    fields: () => ({
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect
    })
  });
  dart.registerExtension(dart.global.SVGSymbolElement, svg$.SymbolElement);
  dart.defineExtensionNames([
    'getCharNumAtPosition',
    'getComputedTextLength',
    'getEndPositionOfChar',
    'getExtentOfChar',
    'getNumberOfChars',
    'getRotationOfChar',
    'getStartPositionOfChar',
    'getSubStringLength',
    'selectSubString',
    'lengthAdjust',
    'textLength'
  ]);
  svg$.TextContentElement = class TextContentElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.lengthAdjust] = null;
      this[dartx.textLength] = null;
      super.created();
    }
    get [dartx.lengthAdjust]() {
      return this.lengthAdjust;
    }
    get [dartx.textLength]() {
      return this.textLength;
    }
    [dartx.getCharNumAtPosition](...args) {
      return this.getCharNumAtPosition.apply(this, args);
    }
    [dartx.getComputedTextLength](...args) {
      return this.getComputedTextLength.apply(this, args);
    }
    [dartx.getEndPositionOfChar](...args) {
      return this.getEndPositionOfChar.apply(this, args);
    }
    [dartx.getExtentOfChar](...args) {
      return this.getExtentOfChar.apply(this, args);
    }
    [dartx.getNumberOfChars](...args) {
      return this.getNumberOfChars.apply(this, args);
    }
    [dartx.getRotationOfChar](...args) {
      return this.getRotationOfChar.apply(this, args);
    }
    [dartx.getStartPositionOfChar](...args) {
      return this.getStartPositionOfChar.apply(this, args);
    }
    [dartx.getSubStringLength](...args) {
      return this.getSubStringLength.apply(this, args);
    }
    [dartx.selectSubString](...args) {
      return this.selectSubString.apply(this, args);
    }
  };
  dart.defineNamedConstructor(svg$.TextContentElement, 'created');
  dart.setSignature(svg$.TextContentElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextContentElement, []),
      created: dart.definiteFunctionType(svg$.TextContentElement, [])
    }),
    fields: () => ({
      [dartx.lengthAdjust]: svg$.AnimatedEnumeration,
      [dartx.textLength]: svg$.AnimatedLength
    }),
    methods: () => ({
      [dartx.getCharNumAtPosition]: dart.definiteFunctionType(core.int, [svg$.Point]),
      [dartx.getComputedTextLength]: dart.definiteFunctionType(core.double, []),
      [dartx.getEndPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.getExtentOfChar]: dart.definiteFunctionType(svg$.Rect, [core.int]),
      [dartx.getNumberOfChars]: dart.definiteFunctionType(core.int, []),
      [dartx.getRotationOfChar]: dart.definiteFunctionType(core.double, [core.int]),
      [dartx.getStartPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
      [dartx.getSubStringLength]: dart.definiteFunctionType(core.double, [core.int, core.int]),
      [dartx.selectSubString]: dart.definiteFunctionType(dart.void, [core.int, core.int])
    }),
    sfields: () => ({
      LENGTHADJUST_SPACING: core.int,
      LENGTHADJUST_SPACINGANDGLYPHS: core.int,
      LENGTHADJUST_UNKNOWN: core.int
    })
  });
  svg$.TextContentElement.LENGTHADJUST_SPACING = 1;
  svg$.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
  svg$.TextContentElement.LENGTHADJUST_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGTextContentElement, svg$.TextContentElement);
  dart.defineExtensionNames([
    'dx',
    'dy',
    'rotate',
    'x',
    'y'
  ]);
  svg$.TextPositioningElement = class TextPositioningElement extends svg$.TextContentElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.dx] = null;
      this[dartx.dy] = null;
      this[dartx.rotate] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      super.created();
    }
    get [dartx.dx]() {
      return this.dx;
    }
    get [dartx.dy]() {
      return this.dy;
    }
    get [dartx.rotate]() {
      return this.rotate;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
  };
  dart.defineNamedConstructor(svg$.TextPositioningElement, 'created');
  dart.setSignature(svg$.TextPositioningElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextPositioningElement, []),
      created: dart.definiteFunctionType(svg$.TextPositioningElement, [])
    }),
    fields: () => ({
      [dartx.dx]: svg$.AnimatedLengthList,
      [dartx.dy]: svg$.AnimatedLengthList,
      [dartx.rotate]: svg$.AnimatedNumberList,
      [dartx.x]: svg$.AnimatedLengthList,
      [dartx.y]: svg$.AnimatedLengthList
    })
  });
  dart.registerExtension(dart.global.SVGTextPositioningElement, svg$.TextPositioningElement);
  svg$.TSpanElement = class TSpanElement extends svg$.TextPositioningElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.TSpanElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.TSpanElement, 'created');
  dart.setSignature(svg$.TSpanElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TSpanElement, []),
      new: dart.definiteFunctionType(svg$.TSpanElement, []),
      created: dart.definiteFunctionType(svg$.TSpanElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGTSpanElement, svg$.TSpanElement);
  dart.defineExtensionNames([
    'requiredExtensions',
    'requiredFeatures',
    'systemLanguage'
  ]);
  svg$.Tests = class Tests extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get requiredExtensions() {
      return this[requiredExtensions];
    }
    set requiredExtensions(value) {
      super.requiredExtensions = value;
    }
    get requiredFeatures() {
      return this[requiredFeatures];
    }
    set requiredFeatures(value) {
      super.requiredFeatures = value;
    }
    get systemLanguage() {
      return this[systemLanguage];
    }
    set systemLanguage(value) {
      super.systemLanguage = value;
    }
  };
  const requiredExtensions = Symbol(svg$.Tests.name + "." + 'requiredExtensions'.toString());
  const requiredFeatures = Symbol(svg$.Tests.name + "." + 'requiredFeatures'.toString());
  const systemLanguage = Symbol(svg$.Tests.name + "." + 'systemLanguage'.toString());
  dart.setSignature(svg$.Tests, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Tests, [])}),
    fields: () => ({
      requiredExtensions: svg$.StringList,
      requiredFeatures: svg$.StringList,
      systemLanguage: svg$.StringList
    })
  });
  dart.defineExtensionMembers(svg$.Tests, ['requiredExtensions', 'requiredFeatures', 'systemLanguage']);
  svg$.TextElement = class TextElement extends svg$.TextPositioningElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.TextElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("text"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.TextElement, 'created');
  dart.setSignature(svg$.TextElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextElement, []),
      new: dart.definiteFunctionType(svg$.TextElement, []),
      created: dart.definiteFunctionType(svg$.TextElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGTextElement, svg$.TextElement);
  dart.defineExtensionNames([
    'method',
    'spacing',
    'startOffset',
    'href'
  ]);
  svg$.TextPathElement = class TextPathElement extends svg$.TextContentElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      this[dartx.method] = null;
      this[dartx.spacing] = null;
      this[dartx.startOffset] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.method]() {
      return this.method;
    }
    get [dartx.spacing]() {
      return this.spacing;
    }
    get [dartx.startOffset]() {
      return this.startOffset;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.TextPathElement, 'created');
  svg$.TextPathElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.TextPathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TextPathElement, []),
      created: dart.definiteFunctionType(svg$.TextPathElement, [])
    }),
    fields: () => ({
      [dartx.method]: svg$.AnimatedEnumeration,
      [dartx.spacing]: svg$.AnimatedEnumeration,
      [dartx.startOffset]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    }),
    sfields: () => ({
      TEXTPATH_METHODTYPE_ALIGN: core.int,
      TEXTPATH_METHODTYPE_STRETCH: core.int,
      TEXTPATH_METHODTYPE_UNKNOWN: core.int,
      TEXTPATH_SPACINGTYPE_AUTO: core.int,
      TEXTPATH_SPACINGTYPE_EXACT: core.int,
      TEXTPATH_SPACINGTYPE_UNKNOWN: core.int
    })
  });
  svg$.TextPathElement.TEXTPATH_METHODTYPE_ALIGN = 1;
  svg$.TextPathElement.TEXTPATH_METHODTYPE_STRETCH = 2;
  svg$.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN = 0;
  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO = 1;
  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT = 2;
  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGTextPathElement, svg$.TextPathElement);
  svg$.TitleElement = class TitleElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.TitleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("title"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$.TitleElement, 'created');
  dart.setSignature(svg$.TitleElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.TitleElement, []),
      new: dart.definiteFunctionType(svg$.TitleElement, []),
      created: dart.definiteFunctionType(svg$.TitleElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGTitleElement, svg$.TitleElement);
  dart.defineExtensionNames([
    'setMatrix',
    'setRotate',
    'setScale',
    'setSkewX',
    'setSkewY',
    'setTranslate',
    'angle',
    'matrix',
    'type'
  ]);
  svg$.Transform = class Transform extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.angle]() {
      return this.angle;
    }
    get [dartx.matrix]() {
      return this.matrix;
    }
    get [dartx.type]() {
      return this.type;
    }
    [dartx.setMatrix](...args) {
      return this.setMatrix.apply(this, args);
    }
    [dartx.setRotate](...args) {
      return this.setRotate.apply(this, args);
    }
    [dartx.setScale](...args) {
      return this.setScale.apply(this, args);
    }
    [dartx.setSkewX](...args) {
      return this.setSkewX.apply(this, args);
    }
    [dartx.setSkewY](...args) {
      return this.setSkewY.apply(this, args);
    }
    [dartx.setTranslate](...args) {
      return this.setTranslate.apply(this, args);
    }
  };
  dart.setSignature(svg$.Transform, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.Transform, [])}),
    fields: () => ({
      [dartx.angle]: core.double,
      [dartx.matrix]: svg$.Matrix,
      [dartx.type]: core.int
    }),
    methods: () => ({
      [dartx.setMatrix]: dart.definiteFunctionType(dart.void, [svg$.Matrix]),
      [dartx.setRotate]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setScale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.setSkewX]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.setSkewY]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.setTranslate]: dart.definiteFunctionType(dart.void, [core.num, core.num])
    }),
    sfields: () => ({
      SVG_TRANSFORM_MATRIX: core.int,
      SVG_TRANSFORM_ROTATE: core.int,
      SVG_TRANSFORM_SCALE: core.int,
      SVG_TRANSFORM_SKEWX: core.int,
      SVG_TRANSFORM_SKEWY: core.int,
      SVG_TRANSFORM_TRANSLATE: core.int,
      SVG_TRANSFORM_UNKNOWN: core.int
    })
  });
  svg$.Transform.SVG_TRANSFORM_MATRIX = 1;
  svg$.Transform.SVG_TRANSFORM_ROTATE = 4;
  svg$.Transform.SVG_TRANSFORM_SCALE = 3;
  svg$.Transform.SVG_TRANSFORM_SKEWX = 5;
  svg$.Transform.SVG_TRANSFORM_SKEWY = 6;
  svg$.Transform.SVG_TRANSFORM_TRANSLATE = 2;
  svg$.Transform.SVG_TRANSFORM_UNKNOWN = 0;
  dart.registerExtension(dart.global.SVGTransform, svg$.Transform);
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'appendItem',
    'clear',
    'consolidate',
    'createSvgTransformFromMatrix',
    'getItem',
    'initialize',
    'insertItemBefore',
    'removeItem',
    'replaceItem',
    'numberOfItems'
  ]);
  svg$.TransformList = class TransformList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Transform), html$.ImmutableListMixin$(svg$.Transform)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfItems]() {
      return this.numberOfItems;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.getItem](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [__setter__$](...args) {
      return this.__setter__.apply(this, args);
    }
    [dartx.appendItem](...args) {
      return this.appendItem.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.consolidate](...args) {
      return this.consolidate.apply(this, args);
    }
    [dartx.createSvgTransformFromMatrix](...args) {
      return this.createSVGTransformFromMatrix.apply(this, args);
    }
    [dartx.getItem](...args) {
      return this.getItem.apply(this, args);
    }
    [dartx.initialize](...args) {
      return this.initialize.apply(this, args);
    }
    [dartx.insertItemBefore](...args) {
      return this.insertItemBefore.apply(this, args);
    }
    [dartx.removeItem](...args) {
      return this.removeItem.apply(this, args);
    }
    [dartx.replaceItem](...args) {
      return this.replaceItem.apply(this, args);
    }
  };
  svg$.TransformList[dart.implements] = () => [ListOfTransform()];
  dart.setSignature(svg$.TransformList, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.TransformList, [])}),
    fields: () => ({[dartx.numberOfItems]: core.int}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.last]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.single]: dart.definiteFunctionType(svg$.Transform, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
      [dartx.elementAt]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
      [dartx.appendItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
      [dartx.consolidate]: dart.definiteFunctionType(svg$.Transform, []),
      [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
      [dartx.getItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [dartx.initialize]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int]),
      [dartx.removeItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int])
    })
  });
  dart.registerExtension(dart.global.SVGTransformList, svg$.TransformList);
  svg$.UnitTypes = class UnitTypes extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(svg$.UnitTypes, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.UnitTypes, [])}),
    sfields: () => ({
      SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: core.int,
      SVG_UNIT_TYPE_UNKNOWN: core.int,
      SVG_UNIT_TYPE_USERSPACEONUSE: core.int
    })
  });
  svg$.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
  svg$.UnitTypes.SVG_UNIT_TYPE_UNKNOWN = 0;
  svg$.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE = 1;
  dart.registerExtension(dart.global.SVGUnitTypes, svg$.UnitTypes);
  dart.defineExtensionNames([
    'href'
  ]);
  svg$.UriReference = class UriReference extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get href() {
      return this[href$0];
    }
    set href(value) {
      super.href = value;
    }
  };
  const href$0 = Symbol(svg$.UriReference.name + "." + 'href'.toString());
  dart.setSignature(svg$.UriReference, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.UriReference, [])}),
    fields: () => ({href: svg$.AnimatedString})
  });
  dart.defineExtensionMembers(svg$.UriReference, ['href']);
  dart.defineExtensionNames([
    'height',
    'width',
    'x',
    'y',
    'href'
  ]);
  svg$.UseElement = class UseElement extends svg$.GraphicsElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.UseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("use"));
    }
    created() {
      this[dartx.height] = null;
      this[dartx.width] = null;
      this[dartx.x] = null;
      this[dartx.y] = null;
      this[dartx.href] = null;
      super.created();
    }
    get [dartx.height]() {
      return this.height;
    }
    get [dartx.width]() {
      return this.width;
    }
    get [dartx.x]() {
      return this.x;
    }
    get [dartx.y]() {
      return this.y;
    }
    get [dartx.href]() {
      return this.href;
    }
  };
  dart.defineNamedConstructor(svg$.UseElement, 'created');
  svg$.UseElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$.UseElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.UseElement, []),
      new: dart.definiteFunctionType(svg$.UseElement, []),
      created: dart.definiteFunctionType(svg$.UseElement, [])
    }),
    fields: () => ({
      [dartx.height]: svg$.AnimatedLength,
      [dartx.width]: svg$.AnimatedLength,
      [dartx.x]: svg$.AnimatedLength,
      [dartx.y]: svg$.AnimatedLength,
      [dartx.href]: svg$.AnimatedString
    })
  });
  dart.registerExtension(dart.global.SVGUseElement, svg$.UseElement);
  dart.defineExtensionNames([
    'viewTarget',
    'preserveAspectRatio',
    'viewBox',
    'zoomAndPan'
  ]);
  svg$.ViewElement = class ViewElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$.ViewElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("view"));
    }
    created() {
      this[dartx.viewTarget] = null;
      this[dartx.preserveAspectRatio] = null;
      this[dartx.viewBox] = null;
      this[dartx.zoomAndPan] = null;
      super.created();
    }
    get [dartx.viewTarget]() {
      return this.viewTarget;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.zoomAndPan]() {
      return this.zoomAndPan;
    }
    set [dartx.zoomAndPan](value) {
      this.zoomAndPan = value;
    }
  };
  dart.defineNamedConstructor(svg$.ViewElement, 'created');
  svg$.ViewElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
  dart.setSignature(svg$.ViewElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$.ViewElement, []),
      new: dart.definiteFunctionType(svg$.ViewElement, []),
      created: dart.definiteFunctionType(svg$.ViewElement, [])
    }),
    fields: () => ({
      [dartx.viewTarget]: svg$.StringList,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.zoomAndPan]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGViewElement, svg$.ViewElement);
  dart.defineExtensionNames([
    'preserveAspectRatioString',
    'transform',
    'transformString',
    'viewBoxString',
    'viewTarget',
    'viewTargetString',
    'preserveAspectRatio',
    'viewBox',
    'zoomAndPan'
  ]);
  svg$.ViewSpec = class ViewSpec extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.preserveAspectRatioString]() {
      return this.preserveAspectRatioString;
    }
    get [dartx.transform]() {
      return this.transform;
    }
    get [dartx.transformString]() {
      return this.transformString;
    }
    get [dartx.viewBoxString]() {
      return this.viewBoxString;
    }
    get [dartx.viewTarget]() {
      return this.viewTarget;
    }
    get [dartx.viewTargetString]() {
      return this.viewTargetString;
    }
    get [dartx.preserveAspectRatio]() {
      return this.preserveAspectRatio;
    }
    get [dartx.viewBox]() {
      return this.viewBox;
    }
    get [dartx.zoomAndPan]() {
      return this.zoomAndPan;
    }
    set [dartx.zoomAndPan](value) {
      this.zoomAndPan = value;
    }
  };
  svg$.ViewSpec[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
  dart.setSignature(svg$.ViewSpec, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.ViewSpec, [])}),
    fields: () => ({
      [dartx.preserveAspectRatioString]: core.String,
      [dartx.transform]: svg$.TransformList,
      [dartx.transformString]: core.String,
      [dartx.viewBoxString]: core.String,
      [dartx.viewTarget]: svg$.SvgElement,
      [dartx.viewTargetString]: core.String,
      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
      [dartx.viewBox]: svg$.AnimatedRect,
      [dartx.zoomAndPan]: core.int
    })
  });
  dart.registerExtension(dart.global.SVGViewSpec, svg$.ViewSpec);
  dart.defineExtensionNames([
    'zoomAndPan'
  ]);
  svg$.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get zoomAndPan() {
      return this[zoomAndPan];
    }
    set zoomAndPan(value) {
      this[zoomAndPan] = value;
    }
  };
  const zoomAndPan = Symbol(svg$.ZoomAndPan.name + "." + 'zoomAndPan'.toString());
  dart.setSignature(svg$.ZoomAndPan, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomAndPan, [])}),
    fields: () => ({zoomAndPan: core.int}),
    sfields: () => ({
      SVG_ZOOMANDPAN_DISABLE: core.int,
      SVG_ZOOMANDPAN_MAGNIFY: core.int,
      SVG_ZOOMANDPAN_UNKNOWN: core.int
    })
  });
  dart.defineExtensionMembers(svg$.ZoomAndPan, ['zoomAndPan', 'zoomAndPan']);
  svg$.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE = 1;
  svg$.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY = 2;
  svg$.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN = 0;
  dart.defineExtensionNames([
    'newScale',
    'newTranslate',
    'previousScale',
    'previousTranslate',
    'zoomRectScreen'
  ]);
  svg$.ZoomEvent = class ZoomEvent extends html$.UIEvent {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.newScale]() {
      return this.newScale;
    }
    get [dartx.newTranslate]() {
      return this.newTranslate;
    }
    get [dartx.previousScale]() {
      return this.previousScale;
    }
    get [dartx.previousTranslate]() {
      return this.previousTranslate;
    }
    get [dartx.zoomRectScreen]() {
      return this.zoomRectScreen;
    }
  };
  dart.setSignature(svg$.ZoomEvent, {
    constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomEvent, [])}),
    fields: () => ({
      [dartx.newScale]: core.double,
      [dartx.newTranslate]: svg$.Point,
      [dartx.previousScale]: core.double,
      [dartx.previousTranslate]: svg$.Point,
      [dartx.zoomRectScreen]: svg$.Rect
    })
  });
  dart.registerExtension(dart.global.SVGZoomEvent, svg$.ZoomEvent);
  svg$._SVGCursorElement = class _SVGCursorElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$._SVGCursorElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("cursor"));
    }
    created() {
      super.created();
    }
    static get supported() {
      return dart.test(svg$.SvgElement.isTagSupported('cursor')) && svg$._SVGCursorElement.is(svg$.SvgElement.tag('cursor'));
    }
  };
  dart.defineNamedConstructor(svg$._SVGCursorElement, 'created');
  svg$._SVGCursorElement[dart.implements] = () => [svg$.UriReference, svg$.Tests];
  dart.setSignature(svg$._SVGCursorElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGCursorElement, []),
      new: dart.definiteFunctionType(svg$._SVGCursorElement, []),
      created: dart.definiteFunctionType(svg$._SVGCursorElement, [])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.SVGCursorElement, svg$._SVGCursorElement);
  svg$._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$._SVGFEDropShadowElement, 'created');
  svg$._SVGFEDropShadowElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
  dart.setSignature(svg$._SVGFEDropShadowElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, []),
      created: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGFEDropShadowElement, svg$._SVGFEDropShadowElement);
  svg$._SVGMPathElement = class _SVGMPathElement extends svg$.SvgElement {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new() {
      return svg$._SVGMPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
    }
    created() {
      super.created();
    }
  };
  dart.defineNamedConstructor(svg$._SVGMPathElement, 'created');
  svg$._SVGMPathElement[dart.implements] = () => [svg$.UriReference];
  dart.setSignature(svg$._SVGMPathElement, {
    constructors: () => ({
      _: dart.definiteFunctionType(svg$._SVGMPathElement, []),
      new: dart.definiteFunctionType(svg$._SVGMPathElement, []),
      created: dart.definiteFunctionType(svg$._SVGMPathElement, [])
    })
  });
  dart.registerExtension(dart.global.SVGMPathElement, svg$._SVGMPathElement);
  const _connect = Symbol('_connect');
  dart.defineExtensionNames([
    'disconnect',
    'connectNode',
    'connectParam',
    'channelCount',
    'channelCountMode',
    'channelInterpretation',
    'context',
    'numberOfInputs',
    'numberOfOutputs'
  ]);
  web_audio.AudioNode = class AudioNode extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.channelCount]() {
      return this.channelCount;
    }
    set [dartx.channelCount](value) {
      this.channelCount = value;
    }
    get [dartx.channelCountMode]() {
      return this.channelCountMode;
    }
    set [dartx.channelCountMode](value) {
      this.channelCountMode = value;
    }
    get [dartx.channelInterpretation]() {
      return this.channelInterpretation;
    }
    set [dartx.channelInterpretation](value) {
      this.channelInterpretation = value;
    }
    get [dartx.context]() {
      return this.context;
    }
    get [dartx.numberOfInputs]() {
      return this.numberOfInputs;
    }
    get [dartx.numberOfOutputs]() {
      return this.numberOfOutputs;
    }
    [_connect](...args) {
      return this.connect.apply(this, args);
    }
    [dartx.disconnect](...args) {
      return this.disconnect.apply(this, args);
    }
    [dartx.connectNode](destination, output, input) {
      if (output === void 0) output = 0;
      if (input === void 0) input = 0;
      return this[_connect](destination, output, input);
    }
    [dartx.connectParam](destination, output) {
      if (output === void 0) output = 0;
      return this[_connect](destination, output);
    }
  };
  dart.setSignature(web_audio.AudioNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioNode, [])}),
    fields: () => ({
      [dartx.channelCount]: core.int,
      [dartx.channelCountMode]: core.String,
      [dartx.channelInterpretation]: core.String,
      [dartx.context]: web_audio.AudioContext,
      [dartx.numberOfInputs]: core.int,
      [dartx.numberOfOutputs]: core.int
    }),
    methods: () => ({
      [_connect]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int], [core.int]),
      [dartx.disconnect]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.connectNode]: dart.definiteFunctionType(dart.void, [web_audio.AudioNode], [core.int, core.int]),
      [dartx.connectParam]: dart.definiteFunctionType(dart.void, [web_audio.AudioParam], [core.int])
    })
  });
  dart.registerExtension(dart.global.AudioNode, web_audio.AudioNode);
  dart.defineExtensionNames([
    'getByteFrequencyData',
    'getByteTimeDomainData',
    'getFloatFrequencyData',
    'getFloatTimeDomainData',
    'fftSize',
    'frequencyBinCount',
    'maxDecibels',
    'minDecibels',
    'smoothingTimeConstant'
  ]);
  web_audio.AnalyserNode = class AnalyserNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.fftSize]() {
      return this.fftSize;
    }
    set [dartx.fftSize](value) {
      this.fftSize = value;
    }
    get [dartx.frequencyBinCount]() {
      return this.frequencyBinCount;
    }
    get [dartx.maxDecibels]() {
      return this.maxDecibels;
    }
    set [dartx.maxDecibels](value) {
      this.maxDecibels = value;
    }
    get [dartx.minDecibels]() {
      return this.minDecibels;
    }
    set [dartx.minDecibels](value) {
      this.minDecibels = value;
    }
    get [dartx.smoothingTimeConstant]() {
      return this.smoothingTimeConstant;
    }
    set [dartx.smoothingTimeConstant](value) {
      this.smoothingTimeConstant = value;
    }
    [dartx.getByteFrequencyData](...args) {
      return this.getByteFrequencyData.apply(this, args);
    }
    [dartx.getByteTimeDomainData](...args) {
      return this.getByteTimeDomainData.apply(this, args);
    }
    [dartx.getFloatFrequencyData](...args) {
      return this.getFloatFrequencyData.apply(this, args);
    }
    [dartx.getFloatTimeDomainData](...args) {
      return this.getFloatTimeDomainData.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AnalyserNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AnalyserNode, [])}),
    fields: () => ({
      [dartx.fftSize]: core.int,
      [dartx.frequencyBinCount]: core.int,
      [dartx.maxDecibels]: core.num,
      [dartx.minDecibels]: core.num,
      [dartx.smoothingTimeConstant]: core.num
    }),
    methods: () => ({
      [dartx.getByteFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
      [dartx.getByteTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
      [dartx.getFloatFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List]),
      [dartx.getFloatTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List])
    })
  });
  dart.registerExtension(dart.global.AnalyserNode, web_audio.AnalyserNode);
  dart.registerExtension(dart.global.RealtimeAnalyserNode, web_audio.AnalyserNode);
  dart.defineExtensionNames([
    'getChannelData',
    'duration',
    'length',
    'numberOfChannels',
    'sampleRate'
  ]);
  web_audio.AudioBuffer = class AudioBuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.duration]() {
      return this.duration;
    }
    get [dartx.length]() {
      return this.length;
    }
    get [dartx.numberOfChannels]() {
      return this.numberOfChannels;
    }
    get [dartx.sampleRate]() {
      return this.sampleRate;
    }
    [dartx.getChannelData](...args) {
      return this.getChannelData.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AudioBuffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBuffer, [])}),
    fields: () => ({
      [dartx.duration]: core.double,
      [dartx.length]: core.int,
      [dartx.numberOfChannels]: core.int,
      [dartx.sampleRate]: core.double
    }),
    methods: () => ({[dartx.getChannelData]: dart.definiteFunctionType(typed_data.Float32List, [core.int])})
  });
  dart.registerExtension(dart.global.AudioBuffer, web_audio.AudioBuffer);
  web_audio.AudioBufferCallback = dart.typedef('AudioBufferCallback', () => dart.functionType(dart.void, [web_audio.AudioBuffer]));
  web_audio.AudioSourceNode = class AudioSourceNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.AudioSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioSourceNode, [])})
  });
  dart.registerExtension(dart.global.AudioSourceNode, web_audio.AudioSourceNode);
  dart.defineExtensionNames([
    'start',
    'stop',
    'onEnded',
    'buffer',
    'loop',
    'loopEnd',
    'loopStart',
    'playbackRate'
  ]);
  web_audio.AudioBufferSourceNode = class AudioBufferSourceNode extends web_audio.AudioSourceNode {
    [dartx.start](when, grainOffset, grainDuration) {
      if (grainOffset === void 0) grainOffset = null;
      if (grainDuration === void 0) grainDuration = null;
      if (!!this.start) {
        if (grainDuration != null) {
          this.start(when, grainOffset, grainDuration);
        } else if (grainOffset != null) {
          this.start(when, grainOffset);
        } else {
          this.start(when);
        }
      } else {
        if (grainDuration != null) {
          this.noteOn(when, grainOffset, grainDuration);
        } else if (grainOffset != null) {
          this.noteOn(when, grainOffset);
        } else {
          this.noteOn(when);
        }
      }
    }
    [dartx.stop](when) {
      if (!!this.stop) {
        this.stop(when);
      } else {
        this.noteOff(when);
      }
    }
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.buffer]() {
      return this.buffer;
    }
    set [dartx.buffer](value) {
      this.buffer = value;
    }
    get [dartx.loop]() {
      return this.loop;
    }
    set [dartx.loop](value) {
      this.loop = value;
    }
    get [dartx.loopEnd]() {
      return this.loopEnd;
    }
    set [dartx.loopEnd](value) {
      this.loopEnd = value;
    }
    get [dartx.loopStart]() {
      return this.loopStart;
    }
    set [dartx.loopStart](value) {
      this.loopStart = value;
    }
    get [dartx.playbackRate]() {
      return this.playbackRate;
    }
    get [dartx.onEnded]() {
      return web_audio.AudioBufferSourceNode.endedEvent.forTarget(this);
    }
  };
  dart.setSignature(web_audio.AudioBufferSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, [])}),
    fields: () => ({
      [dartx.buffer]: web_audio.AudioBuffer,
      [dartx.loop]: core.bool,
      [dartx.loopEnd]: core.num,
      [dartx.loopStart]: core.num,
      [dartx.playbackRate]: web_audio.AudioParam
    }),
    getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.start]: dart.definiteFunctionType(dart.void, [core.num], [core.num, core.num]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [core.num])
    }),
    sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
  });
  web_audio.AudioBufferSourceNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
  dart.registerExtension(dart.global.AudioBufferSourceNode, web_audio.AudioBufferSourceNode);
  const _decodeAudioData = Symbol('_decodeAudioData');
  dart.defineExtensionNames([
    'createAnalyser',
    'createBiquadFilter',
    'createBuffer',
    'createBufferSource',
    'createChannelMerger',
    'createChannelSplitter',
    'createConvolver',
    'createDelay',
    'createDynamicsCompressor',
    'createMediaElementSource',
    'createMediaStreamDestination',
    'createMediaStreamSource',
    'createOscillator',
    'createPanner',
    'createPeriodicWave',
    'createWaveShaper',
    'startRendering',
    'onComplete',
    'createGain',
    'createScriptProcessor',
    'decodeAudioData',
    'currentTime',
    'destination',
    'listener',
    'sampleRate'
  ]);
  web_audio.AudioContext = class AudioContext extends html$.EventTarget {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!(window.AudioContext || window.webkitAudioContext);
    }
    get [dartx.currentTime]() {
      return this.currentTime;
    }
    get [dartx.destination]() {
      return this.destination;
    }
    get [dartx.listener]() {
      return this.listener;
    }
    get [dartx.sampleRate]() {
      return this.sampleRate;
    }
    [dartx.createAnalyser](...args) {
      return this.createAnalyser.apply(this, args);
    }
    [dartx.createBiquadFilter](...args) {
      return this.createBiquadFilter.apply(this, args);
    }
    [dartx.createBuffer](...args) {
      return this.createBuffer.apply(this, args);
    }
    [dartx.createBufferSource](...args) {
      return this.createBufferSource.apply(this, args);
    }
    [dartx.createChannelMerger](...args) {
      return this.createChannelMerger.apply(this, args);
    }
    [dartx.createChannelSplitter](...args) {
      return this.createChannelSplitter.apply(this, args);
    }
    [dartx.createConvolver](...args) {
      return this.createConvolver.apply(this, args);
    }
    [dartx.createDelay](...args) {
      return this.createDelay.apply(this, args);
    }
    [dartx.createDynamicsCompressor](...args) {
      return this.createDynamicsCompressor.apply(this, args);
    }
    [dartx.createMediaElementSource](...args) {
      return this.createMediaElementSource.apply(this, args);
    }
    [dartx.createMediaStreamDestination](...args) {
      return this.createMediaStreamDestination.apply(this, args);
    }
    [dartx.createMediaStreamSource](...args) {
      return this.createMediaStreamSource.apply(this, args);
    }
    [dartx.createOscillator](...args) {
      return this.createOscillator.apply(this, args);
    }
    [dartx.createPanner](...args) {
      return this.createPanner.apply(this, args);
    }
    [dartx.createPeriodicWave](...args) {
      return this.createPeriodicWave.apply(this, args);
    }
    [dartx.createWaveShaper](...args) {
      return this.createWaveShaper.apply(this, args);
    }
    [_decodeAudioData](...args) {
      return this.decodeAudioData.apply(this, args);
    }
    [dartx.startRendering](...args) {
      return this.startRendering.apply(this, args);
    }
    get [dartx.onComplete]() {
      return web_audio.AudioContext.completeEvent.forTarget(this);
    }
    static new() {
      return new (window.AudioContext || window.webkitAudioContext)();
    }
    [dartx.createGain]() {
      if (this.createGain !== undefined) {
        return this.createGain();
      } else {
        return this.createGainNode();
      }
    }
    [dartx.createScriptProcessor](bufferSize, numberOfInputChannels, numberOfOutputChannels) {
      if (numberOfInputChannels === void 0) numberOfInputChannels = null;
      if (numberOfOutputChannels === void 0) numberOfOutputChannels = null;
      let func = this.createScriptProcessor || this.createJavaScriptNode;
      if (numberOfOutputChannels != null) {
        return func.call(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
      } else if (numberOfInputChannels != null) {
        return func.call(this, bufferSize, numberOfInputChannels);
      } else {
        return func.call(this, bufferSize);
      }
    }
    [dartx.decodeAudioData](audioData) {
      let completer = CompleterOfAudioBuffer().new();
      this[_decodeAudioData](audioData, dart.fn(value => {
        completer.complete(value);
      }, AudioBufferTovoid()), dart.fn(error => {
        if (error == null) {
          completer.completeError('');
        } else {
          completer.completeError(error);
        }
      }, AudioBufferTovoid()));
      return completer.future;
    }
  };
  dart.setSignature(web_audio.AudioContext, {
    constructors: () => ({
      _: dart.definiteFunctionType(web_audio.AudioContext, []),
      new: dart.definiteFunctionType(web_audio.AudioContext, [])
    }),
    fields: () => ({
      [dartx.currentTime]: core.double,
      [dartx.destination]: web_audio.AudioDestinationNode,
      [dartx.listener]: web_audio.AudioListener,
      [dartx.sampleRate]: core.double
    }),
    getters: () => ({[dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.createAnalyser]: dart.definiteFunctionType(web_audio.AnalyserNode, []),
      [dartx.createBiquadFilter]: dart.definiteFunctionType(web_audio.BiquadFilterNode, []),
      [dartx.createBuffer]: dart.definiteFunctionType(web_audio.AudioBuffer, [core.int, core.int, core.num]),
      [dartx.createBufferSource]: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, []),
      [dartx.createChannelMerger]: dart.definiteFunctionType(web_audio.ChannelMergerNode, [], [core.int]),
      [dartx.createChannelSplitter]: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [], [core.int]),
      [dartx.createConvolver]: dart.definiteFunctionType(web_audio.ConvolverNode, []),
      [dartx.createDelay]: dart.definiteFunctionType(web_audio.DelayNode, [], [core.num]),
      [dartx.createDynamicsCompressor]: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, []),
      [dartx.createMediaElementSource]: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [html$.MediaElement]),
      [dartx.createMediaStreamDestination]: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, []),
      [dartx.createMediaStreamSource]: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [html$.MediaStream]),
      [dartx.createOscillator]: dart.definiteFunctionType(web_audio.OscillatorNode, []),
      [dartx.createPanner]: dart.definiteFunctionType(web_audio.PannerNode, []),
      [dartx.createPeriodicWave]: dart.definiteFunctionType(web_audio.PeriodicWave, [typed_data.Float32List, typed_data.Float32List]),
      [dartx.createWaveShaper]: dart.definiteFunctionType(web_audio.WaveShaperNode, []),
      [_decodeAudioData]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer, web_audio.AudioBufferCallback], [web_audio.AudioBufferCallback]),
      [dartx.startRendering]: dart.definiteFunctionType(dart.void, []),
      [dartx.createGain]: dart.definiteFunctionType(web_audio.GainNode, []),
      [dartx.createScriptProcessor]: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [core.int], [core.int, core.int]),
      [dartx.decodeAudioData]: dart.definiteFunctionType(async.Future$(web_audio.AudioBuffer), [typed_data.ByteBuffer])
    }),
    sfields: () => ({completeEvent: EventStreamProviderOfEvent()}),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  web_audio.AudioContext.completeEvent = dart.const(new (EventStreamProviderOfEvent())('complete'));
  dart.registerExtension(dart.global.AudioContext, web_audio.AudioContext);
  dart.registerExtension(dart.global.webkitAudioContext, web_audio.AudioContext);
  dart.defineExtensionNames([
    'maxChannelCount'
  ]);
  web_audio.AudioDestinationNode = class AudioDestinationNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.maxChannelCount]() {
      return this.maxChannelCount;
    }
  };
  dart.setSignature(web_audio.AudioDestinationNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioDestinationNode, [])}),
    fields: () => ({[dartx.maxChannelCount]: core.int})
  });
  dart.registerExtension(dart.global.AudioDestinationNode, web_audio.AudioDestinationNode);
  dart.defineExtensionNames([
    'setOrientation',
    'setPosition',
    'setVelocity',
    'dopplerFactor',
    'speedOfSound'
  ]);
  web_audio.AudioListener = class AudioListener extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.dopplerFactor]() {
      return this.dopplerFactor;
    }
    set [dartx.dopplerFactor](value) {
      this.dopplerFactor = value;
    }
    get [dartx.speedOfSound]() {
      return this.speedOfSound;
    }
    set [dartx.speedOfSound](value) {
      this.speedOfSound = value;
    }
    [dartx.setOrientation](...args) {
      return this.setOrientation.apply(this, args);
    }
    [dartx.setPosition](...args) {
      return this.setPosition.apply(this, args);
    }
    [dartx.setVelocity](...args) {
      return this.setVelocity.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AudioListener, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioListener, [])}),
    fields: () => ({
      [dartx.dopplerFactor]: core.num,
      [dartx.speedOfSound]: core.num
    }),
    methods: () => ({
      [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.AudioListener, web_audio.AudioListener);
  dart.defineExtensionNames([
    'cancelScheduledValues',
    'exponentialRampToValueAtTime',
    'linearRampToValueAtTime',
    'setTargetAtTime',
    'setValueAtTime',
    'setValueCurveAtTime',
    'defaultValue',
    'value'
  ]);
  web_audio.AudioParam = class AudioParam extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.defaultValue]() {
      return this.defaultValue;
    }
    get [dartx.value]() {
      return this.value;
    }
    set [dartx.value](value) {
      this.value = value;
    }
    [dartx.cancelScheduledValues](...args) {
      return this.cancelScheduledValues.apply(this, args);
    }
    [dartx.exponentialRampToValueAtTime](...args) {
      return this.exponentialRampToValueAtTime.apply(this, args);
    }
    [dartx.linearRampToValueAtTime](...args) {
      return this.linearRampToValueAtTime.apply(this, args);
    }
    [dartx.setTargetAtTime](...args) {
      return this.setTargetAtTime.apply(this, args);
    }
    [dartx.setValueAtTime](...args) {
      return this.setValueAtTime.apply(this, args);
    }
    [dartx.setValueCurveAtTime](...args) {
      return this.setValueCurveAtTime.apply(this, args);
    }
  };
  dart.setSignature(web_audio.AudioParam, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioParam, [])}),
    fields: () => ({
      [dartx.defaultValue]: core.double,
      [dartx.value]: core.num
    }),
    methods: () => ({
      [dartx.cancelScheduledValues]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.exponentialRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.linearRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.setTargetAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.setValueCurveAtTime]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.AudioParam, web_audio.AudioParam);
  dart.defineExtensionNames([
    'inputBuffer',
    'outputBuffer',
    'playbackTime'
  ]);
  web_audio.AudioProcessingEvent = class AudioProcessingEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.inputBuffer]() {
      return this.inputBuffer;
    }
    get [dartx.outputBuffer]() {
      return this.outputBuffer;
    }
    get [dartx.playbackTime]() {
      return this.playbackTime;
    }
  };
  dart.setSignature(web_audio.AudioProcessingEvent, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioProcessingEvent, [])}),
    fields: () => ({
      [dartx.inputBuffer]: web_audio.AudioBuffer,
      [dartx.outputBuffer]: web_audio.AudioBuffer,
      [dartx.playbackTime]: core.double
    })
  });
  dart.registerExtension(dart.global.AudioProcessingEvent, web_audio.AudioProcessingEvent);
  dart.defineExtensionNames([
    'getFrequencyResponse',
    'Q',
    'detune',
    'frequency',
    'gain',
    'type'
  ]);
  web_audio.BiquadFilterNode = class BiquadFilterNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.Q]() {
      return this.Q;
    }
    get [dartx.detune]() {
      return this.detune;
    }
    get [dartx.frequency]() {
      return this.frequency;
    }
    get [dartx.gain]() {
      return this.gain;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    [dartx.getFrequencyResponse](...args) {
      return this.getFrequencyResponse.apply(this, args);
    }
  };
  dart.setSignature(web_audio.BiquadFilterNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.BiquadFilterNode, [])}),
    fields: () => ({
      [dartx.Q]: web_audio.AudioParam,
      [dartx.detune]: web_audio.AudioParam,
      [dartx.frequency]: web_audio.AudioParam,
      [dartx.gain]: web_audio.AudioParam,
      [dartx.type]: core.String
    }),
    methods: () => ({[dartx.getFrequencyResponse]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, typed_data.Float32List, typed_data.Float32List])})
  });
  dart.registerExtension(dart.global.BiquadFilterNode, web_audio.BiquadFilterNode);
  web_audio.ChannelMergerNode = class ChannelMergerNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.ChannelMergerNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelMergerNode, [])})
  });
  dart.registerExtension(dart.global.ChannelMergerNode, web_audio.ChannelMergerNode);
  dart.registerExtension(dart.global.AudioChannelMerger, web_audio.ChannelMergerNode);
  web_audio.ChannelSplitterNode = class ChannelSplitterNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.ChannelSplitterNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [])})
  });
  dart.registerExtension(dart.global.ChannelSplitterNode, web_audio.ChannelSplitterNode);
  dart.registerExtension(dart.global.AudioChannelSplitter, web_audio.ChannelSplitterNode);
  dart.defineExtensionNames([
    'buffer',
    'normalize'
  ]);
  web_audio.ConvolverNode = class ConvolverNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.buffer]() {
      return this.buffer;
    }
    set [dartx.buffer](value) {
      this.buffer = value;
    }
    get [dartx.normalize]() {
      return this.normalize;
    }
    set [dartx.normalize](value) {
      this.normalize = value;
    }
  };
  dart.setSignature(web_audio.ConvolverNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ConvolverNode, [])}),
    fields: () => ({
      [dartx.buffer]: web_audio.AudioBuffer,
      [dartx.normalize]: core.bool
    })
  });
  dart.registerExtension(dart.global.ConvolverNode, web_audio.ConvolverNode);
  dart.defineExtensionNames([
    'delayTime'
  ]);
  web_audio.DelayNode = class DelayNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.delayTime]() {
      return this.delayTime;
    }
  };
  dart.setSignature(web_audio.DelayNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.DelayNode, [])}),
    fields: () => ({[dartx.delayTime]: web_audio.AudioParam})
  });
  dart.registerExtension(dart.global.DelayNode, web_audio.DelayNode);
  dart.defineExtensionNames([
    'attack',
    'knee',
    'ratio',
    'reduction',
    'release',
    'threshold'
  ]);
  web_audio.DynamicsCompressorNode = class DynamicsCompressorNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.attack]() {
      return this.attack;
    }
    get [dartx.knee]() {
      return this.knee;
    }
    get [dartx.ratio]() {
      return this.ratio;
    }
    get [dartx.reduction]() {
      return this.reduction;
    }
    get [dartx.release]() {
      return this.release;
    }
    get [dartx.threshold]() {
      return this.threshold;
    }
  };
  dart.setSignature(web_audio.DynamicsCompressorNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, [])}),
    fields: () => ({
      [dartx.attack]: web_audio.AudioParam,
      [dartx.knee]: web_audio.AudioParam,
      [dartx.ratio]: web_audio.AudioParam,
      [dartx.reduction]: web_audio.AudioParam,
      [dartx.release]: web_audio.AudioParam,
      [dartx.threshold]: web_audio.AudioParam
    })
  });
  dart.registerExtension(dart.global.DynamicsCompressorNode, web_audio.DynamicsCompressorNode);
  dart.defineExtensionNames([
    'gain'
  ]);
  web_audio.GainNode = class GainNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.gain]() {
      return this.gain;
    }
  };
  dart.setSignature(web_audio.GainNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.GainNode, [])}),
    fields: () => ({[dartx.gain]: web_audio.AudioParam})
  });
  dart.registerExtension(dart.global.GainNode, web_audio.GainNode);
  dart.registerExtension(dart.global.AudioGainNode, web_audio.GainNode);
  dart.defineExtensionNames([
    'mediaElement'
  ]);
  web_audio.MediaElementAudioSourceNode = class MediaElementAudioSourceNode extends web_audio.AudioSourceNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.mediaElement]() {
      return this.mediaElement;
    }
  };
  dart.setSignature(web_audio.MediaElementAudioSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [])}),
    fields: () => ({[dartx.mediaElement]: html$.MediaElement})
  });
  dart.registerExtension(dart.global.MediaElementAudioSourceNode, web_audio.MediaElementAudioSourceNode);
  dart.defineExtensionNames([
    'stream'
  ]);
  web_audio.MediaStreamAudioDestinationNode = class MediaStreamAudioDestinationNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.stream]() {
      return this.stream;
    }
  };
  dart.setSignature(web_audio.MediaStreamAudioDestinationNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, [])}),
    fields: () => ({[dartx.stream]: html$.MediaStream})
  });
  dart.registerExtension(dart.global.MediaStreamAudioDestinationNode, web_audio.MediaStreamAudioDestinationNode);
  dart.defineExtensionNames([
    'mediaStream'
  ]);
  web_audio.MediaStreamAudioSourceNode = class MediaStreamAudioSourceNode extends web_audio.AudioSourceNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.mediaStream]() {
      return this.mediaStream;
    }
  };
  dart.setSignature(web_audio.MediaStreamAudioSourceNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [])}),
    fields: () => ({[dartx.mediaStream]: html$.MediaStream})
  });
  dart.registerExtension(dart.global.MediaStreamAudioSourceNode, web_audio.MediaStreamAudioSourceNode);
  dart.defineExtensionNames([
    'renderedBuffer'
  ]);
  web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.renderedBuffer]() {
      return this.renderedBuffer;
    }
  };
  dart.setSignature(web_audio.OfflineAudioCompletionEvent, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.OfflineAudioCompletionEvent, [])}),
    fields: () => ({[dartx.renderedBuffer]: web_audio.AudioBuffer})
  });
  dart.registerExtension(dart.global.OfflineAudioCompletionEvent, web_audio.OfflineAudioCompletionEvent);
  web_audio.OfflineAudioContext = class OfflineAudioContext extends web_audio.AudioContext {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static new(numberOfChannels, numberOfFrames, sampleRate) {
      return web_audio.OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
    }
    static _create_1(numberOfChannels, numberOfFrames, sampleRate) {
      return new OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
    }
  };
  dart.setSignature(web_audio.OfflineAudioContext, {
    constructors: () => ({
      _: dart.definiteFunctionType(web_audio.OfflineAudioContext, []),
      new: dart.definiteFunctionType(web_audio.OfflineAudioContext, [core.int, core.int, core.num])
    }),
    statics: () => ({_create_1: dart.definiteFunctionType(web_audio.OfflineAudioContext, [dart.dynamic, dart.dynamic, dart.dynamic])}),
    names: ['_create_1']
  });
  dart.registerExtension(dart.global.OfflineAudioContext, web_audio.OfflineAudioContext);
  dart.defineExtensionNames([
    'noteOff',
    'noteOn',
    'setPeriodicWave',
    'start',
    'stop',
    'onEnded',
    'detune',
    'frequency',
    'type'
  ]);
  web_audio.OscillatorNode = class OscillatorNode extends web_audio.AudioSourceNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.detune]() {
      return this.detune;
    }
    get [dartx.frequency]() {
      return this.frequency;
    }
    get [dartx.type]() {
      return this.type;
    }
    set [dartx.type](value) {
      this.type = value;
    }
    [dartx.noteOff](...args) {
      return this.noteOff.apply(this, args);
    }
    [dartx.noteOn](...args) {
      return this.noteOn.apply(this, args);
    }
    [dartx.setPeriodicWave](...args) {
      return this.setPeriodicWave.apply(this, args);
    }
    [dartx.start](...args) {
      return this.start.apply(this, args);
    }
    [dartx.stop](...args) {
      return this.stop.apply(this, args);
    }
    get [dartx.onEnded]() {
      return web_audio.OscillatorNode.endedEvent.forTarget(this);
    }
  };
  dart.setSignature(web_audio.OscillatorNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.OscillatorNode, [])}),
    fields: () => ({
      [dartx.detune]: web_audio.AudioParam,
      [dartx.frequency]: web_audio.AudioParam,
      [dartx.type]: core.String
    }),
    getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
    methods: () => ({
      [dartx.noteOff]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.noteOn]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.setPeriodicWave]: dart.definiteFunctionType(dart.void, [web_audio.PeriodicWave]),
      [dartx.start]: dart.definiteFunctionType(dart.void, [], [core.num]),
      [dartx.stop]: dart.definiteFunctionType(dart.void, [], [core.num])
    }),
    sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
  });
  web_audio.OscillatorNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
  dart.registerExtension(dart.global.OscillatorNode, web_audio.OscillatorNode);
  dart.registerExtension(dart.global.Oscillator, web_audio.OscillatorNode);
  dart.defineExtensionNames([
    'setOrientation',
    'setPosition',
    'setVelocity',
    'coneInnerAngle',
    'coneOuterAngle',
    'coneOuterGain',
    'distanceModel',
    'maxDistance',
    'panningModel',
    'refDistance',
    'rolloffFactor'
  ]);
  web_audio.PannerNode = class PannerNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.coneInnerAngle]() {
      return this.coneInnerAngle;
    }
    set [dartx.coneInnerAngle](value) {
      this.coneInnerAngle = value;
    }
    get [dartx.coneOuterAngle]() {
      return this.coneOuterAngle;
    }
    set [dartx.coneOuterAngle](value) {
      this.coneOuterAngle = value;
    }
    get [dartx.coneOuterGain]() {
      return this.coneOuterGain;
    }
    set [dartx.coneOuterGain](value) {
      this.coneOuterGain = value;
    }
    get [dartx.distanceModel]() {
      return this.distanceModel;
    }
    set [dartx.distanceModel](value) {
      this.distanceModel = value;
    }
    get [dartx.maxDistance]() {
      return this.maxDistance;
    }
    set [dartx.maxDistance](value) {
      this.maxDistance = value;
    }
    get [dartx.panningModel]() {
      return this.panningModel;
    }
    set [dartx.panningModel](value) {
      this.panningModel = value;
    }
    get [dartx.refDistance]() {
      return this.refDistance;
    }
    set [dartx.refDistance](value) {
      this.refDistance = value;
    }
    get [dartx.rolloffFactor]() {
      return this.rolloffFactor;
    }
    set [dartx.rolloffFactor](value) {
      this.rolloffFactor = value;
    }
    [dartx.setOrientation](...args) {
      return this.setOrientation.apply(this, args);
    }
    [dartx.setPosition](...args) {
      return this.setPosition.apply(this, args);
    }
    [dartx.setVelocity](...args) {
      return this.setVelocity.apply(this, args);
    }
  };
  dart.setSignature(web_audio.PannerNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.PannerNode, [])}),
    fields: () => ({
      [dartx.coneInnerAngle]: core.num,
      [dartx.coneOuterAngle]: core.num,
      [dartx.coneOuterGain]: core.num,
      [dartx.distanceModel]: core.String,
      [dartx.maxDistance]: core.num,
      [dartx.panningModel]: core.String,
      [dartx.refDistance]: core.num,
      [dartx.rolloffFactor]: core.num
    }),
    methods: () => ({
      [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
      [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
    })
  });
  dart.registerExtension(dart.global.PannerNode, web_audio.PannerNode);
  dart.registerExtension(dart.global.AudioPannerNode, web_audio.PannerNode);
  dart.registerExtension(dart.global.webkitAudioPannerNode, web_audio.PannerNode);
  web_audio.PeriodicWave = class PeriodicWave extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_audio.PeriodicWave, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.PeriodicWave, [])})
  });
  dart.registerExtension(dart.global.PeriodicWave, web_audio.PeriodicWave);
  dart.defineExtensionNames([
    'setEventListener',
    'onAudioProcess',
    'bufferSize'
  ]);
  web_audio.ScriptProcessorNode = class ScriptProcessorNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.bufferSize]() {
      return this.bufferSize;
    }
    [dartx.setEventListener](...args) {
      return this.setEventListener.apply(this, args);
    }
    get [dartx.onAudioProcess]() {
      return web_audio.ScriptProcessorNode.audioProcessEvent.forTarget(this);
    }
  };
  dart.setSignature(web_audio.ScriptProcessorNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [])}),
    fields: () => ({[dartx.bufferSize]: core.int}),
    getters: () => ({[dartx.onAudioProcess]: dart.definiteFunctionType(async.Stream$(web_audio.AudioProcessingEvent), [])}),
    methods: () => ({[dartx.setEventListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])}),
    sfields: () => ({audioProcessEvent: EventStreamProviderOfAudioProcessingEvent()})
  });
  web_audio.ScriptProcessorNode.audioProcessEvent = dart.const(new (EventStreamProviderOfAudioProcessingEvent())('audioprocess'));
  dart.registerExtension(dart.global.ScriptProcessorNode, web_audio.ScriptProcessorNode);
  dart.registerExtension(dart.global.JavaScriptAudioNode, web_audio.ScriptProcessorNode);
  dart.defineExtensionNames([
    'curve',
    'oversample'
  ]);
  web_audio.WaveShaperNode = class WaveShaperNode extends web_audio.AudioNode {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.curve]() {
      return this.curve;
    }
    set [dartx.curve](value) {
      this.curve = value;
    }
    get [dartx.oversample]() {
      return this.oversample;
    }
    set [dartx.oversample](value) {
      this.oversample = value;
    }
  };
  dart.setSignature(web_audio.WaveShaperNode, {
    constructors: () => ({_: dart.definiteFunctionType(web_audio.WaveShaperNode, [])}),
    fields: () => ({
      [dartx.curve]: typed_data.Float32List,
      [dartx.oversample]: core.String
    })
  });
  dart.registerExtension(dart.global.WaveShaperNode, web_audio.WaveShaperNode);
  const _getContextAttributes_1$ = Symbol('_getContextAttributes_1');
  const _texImage2D_1 = Symbol('_texImage2D_1');
  const _texImage2D_2 = Symbol('_texImage2D_2');
  const _texImage2D_3 = Symbol('_texImage2D_3');
  const _texImage2D_4 = Symbol('_texImage2D_4');
  const _texImage2D_5 = Symbol('_texImage2D_5');
  const _texImage2DImageData_1 = Symbol('_texImage2DImageData_1');
  const _texSubImage2D_1 = Symbol('_texSubImage2D_1');
  const _texSubImage2D_2 = Symbol('_texSubImage2D_2');
  const _texSubImage2D_3 = Symbol('_texSubImage2D_3');
  const _texSubImage2D_4 = Symbol('_texSubImage2D_4');
  const _texSubImage2D_5 = Symbol('_texSubImage2D_5');
  const _texSubImage2DImageData_1 = Symbol('_texSubImage2DImageData_1');
  dart.defineExtensionNames([
    'activeTexture',
    'attachShader',
    'bindAttribLocation',
    'bindBuffer',
    'bindFramebuffer',
    'bindRenderbuffer',
    'bindTexture',
    'blendColor',
    'blendEquation',
    'blendEquationSeparate',
    'blendFunc',
    'blendFuncSeparate',
    'bufferByteData',
    'bufferData',
    'bufferDataTyped',
    'bufferSubByteData',
    'bufferSubData',
    'bufferSubDataTyped',
    'checkFramebufferStatus',
    'clear',
    'clearColor',
    'clearDepth',
    'clearStencil',
    'colorMask',
    'compileShader',
    'compressedTexImage2D',
    'compressedTexSubImage2D',
    'copyTexImage2D',
    'copyTexSubImage2D',
    'createBuffer',
    'createFramebuffer',
    'createProgram',
    'createRenderbuffer',
    'createShader',
    'createTexture',
    'cullFace',
    'deleteBuffer',
    'deleteFramebuffer',
    'deleteProgram',
    'deleteRenderbuffer',
    'deleteShader',
    'deleteTexture',
    'depthFunc',
    'depthMask',
    'depthRange',
    'detachShader',
    'disable',
    'disableVertexAttribArray',
    'drawArrays',
    'drawElements',
    'enable',
    'enableVertexAttribArray',
    'finish',
    'flush',
    'framebufferRenderbuffer',
    'framebufferTexture2D',
    'frontFace',
    'generateMipmap',
    'getActiveAttrib',
    'getActiveUniform',
    'getAttachedShaders',
    'getAttribLocation',
    'getBufferParameter',
    'getContextAttributes',
    'getError',
    'getExtension',
    'getFramebufferAttachmentParameter',
    'getParameter',
    'getProgramInfoLog',
    'getProgramParameter',
    'getRenderbufferParameter',
    'getShaderInfoLog',
    'getShaderParameter',
    'getShaderPrecisionFormat',
    'getShaderSource',
    'getSupportedExtensions',
    'getTexParameter',
    'getUniform',
    'getUniformLocation',
    'getVertexAttrib',
    'getVertexAttribOffset',
    'hint',
    'isBuffer',
    'isContextLost',
    'isEnabled',
    'isFramebuffer',
    'isProgram',
    'isRenderbuffer',
    'isShader',
    'isTexture',
    'lineWidth',
    'linkProgram',
    'pixelStorei',
    'polygonOffset',
    'readPixels',
    'renderbufferStorage',
    'sampleCoverage',
    'scissor',
    'shaderSource',
    'stencilFunc',
    'stencilFuncSeparate',
    'stencilMask',
    'stencilMaskSeparate',
    'stencilOp',
    'stencilOpSeparate',
    'texImage2D',
    'texImage2DCanvas',
    'texImage2DImage',
    'texImage2DImageData',
    'texImage2DVideo',
    'texParameterf',
    'texParameteri',
    'texSubImage2D',
    'texSubImage2DCanvas',
    'texSubImage2DImage',
    'texSubImage2DImageData',
    'texSubImage2DVideo',
    'uniform1f',
    'uniform1fv',
    'uniform1i',
    'uniform1iv',
    'uniform2f',
    'uniform2fv',
    'uniform2i',
    'uniform2iv',
    'uniform3f',
    'uniform3fv',
    'uniform3i',
    'uniform3iv',
    'uniform4f',
    'uniform4fv',
    'uniform4i',
    'uniform4iv',
    'uniformMatrix2fv',
    'uniformMatrix3fv',
    'uniformMatrix4fv',
    'useProgram',
    'validateProgram',
    'vertexAttrib1f',
    'vertexAttrib1fv',
    'vertexAttrib2f',
    'vertexAttrib2fv',
    'vertexAttrib3f',
    'vertexAttrib3fv',
    'vertexAttrib4f',
    'vertexAttrib4fv',
    'vertexAttribPointer',
    'viewport',
    'texImage2DUntyped',
    'texImage2DTyped',
    'texSubImage2DUntyped',
    'texSubImage2DTyped',
    'canvas',
    'drawingBufferHeight',
    'drawingBufferWidth'
  ]);
  web_gl.RenderingContext = class RenderingContext extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.WebGLRenderingContext;
    }
    get [dartx.canvas]() {
      return this.canvas;
    }
    get [dartx.drawingBufferHeight]() {
      return this.drawingBufferHeight;
    }
    get [dartx.drawingBufferWidth]() {
      return this.drawingBufferWidth;
    }
    [dartx.activeTexture](...args) {
      return this.activeTexture.apply(this, args);
    }
    [dartx.attachShader](...args) {
      return this.attachShader.apply(this, args);
    }
    [dartx.bindAttribLocation](...args) {
      return this.bindAttribLocation.apply(this, args);
    }
    [dartx.bindBuffer](...args) {
      return this.bindBuffer.apply(this, args);
    }
    [dartx.bindFramebuffer](...args) {
      return this.bindFramebuffer.apply(this, args);
    }
    [dartx.bindRenderbuffer](...args) {
      return this.bindRenderbuffer.apply(this, args);
    }
    [dartx.bindTexture](...args) {
      return this.bindTexture.apply(this, args);
    }
    [dartx.blendColor](...args) {
      return this.blendColor.apply(this, args);
    }
    [dartx.blendEquation](...args) {
      return this.blendEquation.apply(this, args);
    }
    [dartx.blendEquationSeparate](...args) {
      return this.blendEquationSeparate.apply(this, args);
    }
    [dartx.blendFunc](...args) {
      return this.blendFunc.apply(this, args);
    }
    [dartx.blendFuncSeparate](...args) {
      return this.blendFuncSeparate.apply(this, args);
    }
    [dartx.bufferByteData](...args) {
      return this.bufferData.apply(this, args);
    }
    [dartx.bufferData](...args) {
      return this.bufferData.apply(this, args);
    }
    [dartx.bufferDataTyped](...args) {
      return this.bufferData.apply(this, args);
    }
    [dartx.bufferSubByteData](...args) {
      return this.bufferSubData.apply(this, args);
    }
    [dartx.bufferSubData](...args) {
      return this.bufferSubData.apply(this, args);
    }
    [dartx.bufferSubDataTyped](...args) {
      return this.bufferSubData.apply(this, args);
    }
    [dartx.checkFramebufferStatus](...args) {
      return this.checkFramebufferStatus.apply(this, args);
    }
    [dartx.clear](...args) {
      return this.clear.apply(this, args);
    }
    [dartx.clearColor](...args) {
      return this.clearColor.apply(this, args);
    }
    [dartx.clearDepth](...args) {
      return this.clearDepth.apply(this, args);
    }
    [dartx.clearStencil](...args) {
      return this.clearStencil.apply(this, args);
    }
    [dartx.colorMask](...args) {
      return this.colorMask.apply(this, args);
    }
    [dartx.compileShader](...args) {
      return this.compileShader.apply(this, args);
    }
    [dartx.compressedTexImage2D](...args) {
      return this.compressedTexImage2D.apply(this, args);
    }
    [dartx.compressedTexSubImage2D](...args) {
      return this.compressedTexSubImage2D.apply(this, args);
    }
    [dartx.copyTexImage2D](...args) {
      return this.copyTexImage2D.apply(this, args);
    }
    [dartx.copyTexSubImage2D](...args) {
      return this.copyTexSubImage2D.apply(this, args);
    }
    [dartx.createBuffer](...args) {
      return this.createBuffer.apply(this, args);
    }
    [dartx.createFramebuffer](...args) {
      return this.createFramebuffer.apply(this, args);
    }
    [dartx.createProgram](...args) {
      return this.createProgram.apply(this, args);
    }
    [dartx.createRenderbuffer](...args) {
      return this.createRenderbuffer.apply(this, args);
    }
    [dartx.createShader](...args) {
      return this.createShader.apply(this, args);
    }
    [dartx.createTexture](...args) {
      return this.createTexture.apply(this, args);
    }
    [dartx.cullFace](...args) {
      return this.cullFace.apply(this, args);
    }
    [dartx.deleteBuffer](...args) {
      return this.deleteBuffer.apply(this, args);
    }
    [dartx.deleteFramebuffer](...args) {
      return this.deleteFramebuffer.apply(this, args);
    }
    [dartx.deleteProgram](...args) {
      return this.deleteProgram.apply(this, args);
    }
    [dartx.deleteRenderbuffer](...args) {
      return this.deleteRenderbuffer.apply(this, args);
    }
    [dartx.deleteShader](...args) {
      return this.deleteShader.apply(this, args);
    }
    [dartx.deleteTexture](...args) {
      return this.deleteTexture.apply(this, args);
    }
    [dartx.depthFunc](...args) {
      return this.depthFunc.apply(this, args);
    }
    [dartx.depthMask](...args) {
      return this.depthMask.apply(this, args);
    }
    [dartx.depthRange](...args) {
      return this.depthRange.apply(this, args);
    }
    [dartx.detachShader](...args) {
      return this.detachShader.apply(this, args);
    }
    [dartx.disable](...args) {
      return this.disable.apply(this, args);
    }
    [dartx.disableVertexAttribArray](...args) {
      return this.disableVertexAttribArray.apply(this, args);
    }
    [dartx.drawArrays](...args) {
      return this.drawArrays.apply(this, args);
    }
    [dartx.drawElements](...args) {
      return this.drawElements.apply(this, args);
    }
    [dartx.enable](...args) {
      return this.enable.apply(this, args);
    }
    [dartx.enableVertexAttribArray](...args) {
      return this.enableVertexAttribArray.apply(this, args);
    }
    [dartx.finish](...args) {
      return this.finish.apply(this, args);
    }
    [dartx.flush](...args) {
      return this.flush.apply(this, args);
    }
    [dartx.framebufferRenderbuffer](...args) {
      return this.framebufferRenderbuffer.apply(this, args);
    }
    [dartx.framebufferTexture2D](...args) {
      return this.framebufferTexture2D.apply(this, args);
    }
    [dartx.frontFace](...args) {
      return this.frontFace.apply(this, args);
    }
    [dartx.generateMipmap](...args) {
      return this.generateMipmap.apply(this, args);
    }
    [dartx.getActiveAttrib](...args) {
      return this.getActiveAttrib.apply(this, args);
    }
    [dartx.getActiveUniform](...args) {
      return this.getActiveUniform.apply(this, args);
    }
    [dartx.getAttachedShaders](...args) {
      return this.getAttachedShaders.apply(this, args);
    }
    [dartx.getAttribLocation](...args) {
      return this.getAttribLocation.apply(this, args);
    }
    [dartx.getBufferParameter](...args) {
      return this.getBufferParameter.apply(this, args);
    }
    [dartx.getContextAttributes]() {
      return web_gl.ContextAttributes._check(html_common.convertNativeToDart_ContextAttributes(this[_getContextAttributes_1$]()));
    }
    [_getContextAttributes_1$](...args) {
      return this.getContextAttributes.apply(this, args);
    }
    [dartx.getError](...args) {
      return this.getError.apply(this, args);
    }
    [dartx.getExtension](...args) {
      return this.getExtension.apply(this, args);
    }
    [dartx.getFramebufferAttachmentParameter](...args) {
      return this.getFramebufferAttachmentParameter.apply(this, args);
    }
    [dartx.getParameter](...args) {
      return this.getParameter.apply(this, args);
    }
    [dartx.getProgramInfoLog](...args) {
      return this.getProgramInfoLog.apply(this, args);
    }
    [dartx.getProgramParameter](...args) {
      return this.getProgramParameter.apply(this, args);
    }
    [dartx.getRenderbufferParameter](...args) {
      return this.getRenderbufferParameter.apply(this, args);
    }
    [dartx.getShaderInfoLog](...args) {
      return this.getShaderInfoLog.apply(this, args);
    }
    [dartx.getShaderParameter](...args) {
      return this.getShaderParameter.apply(this, args);
    }
    [dartx.getShaderPrecisionFormat](...args) {
      return this.getShaderPrecisionFormat.apply(this, args);
    }
    [dartx.getShaderSource](...args) {
      return this.getShaderSource.apply(this, args);
    }
    [dartx.getSupportedExtensions](...args) {
      return this.getSupportedExtensions.apply(this, args);
    }
    [dartx.getTexParameter](...args) {
      return this.getTexParameter.apply(this, args);
    }
    [dartx.getUniform](...args) {
      return this.getUniform.apply(this, args);
    }
    [dartx.getUniformLocation](...args) {
      return this.getUniformLocation.apply(this, args);
    }
    [dartx.getVertexAttrib](...args) {
      return this.getVertexAttrib.apply(this, args);
    }
    [dartx.getVertexAttribOffset](...args) {
      return this.getVertexAttribOffset.apply(this, args);
    }
    [dartx.hint](...args) {
      return this.hint.apply(this, args);
    }
    [dartx.isBuffer](...args) {
      return this.isBuffer.apply(this, args);
    }
    [dartx.isContextLost](...args) {
      return this.isContextLost.apply(this, args);
    }
    [dartx.isEnabled](...args) {
      return this.isEnabled.apply(this, args);
    }
    [dartx.isFramebuffer](...args) {
      return this.isFramebuffer.apply(this, args);
    }
    [dartx.isProgram](...args) {
      return this.isProgram.apply(this, args);
    }
    [dartx.isRenderbuffer](...args) {
      return this.isRenderbuffer.apply(this, args);
    }
    [dartx.isShader](...args) {
      return this.isShader.apply(this, args);
    }
    [dartx.isTexture](...args) {
      return this.isTexture.apply(this, args);
    }
    [dartx.lineWidth](...args) {
      return this.lineWidth.apply(this, args);
    }
    [dartx.linkProgram](...args) {
      return this.linkProgram.apply(this, args);
    }
    [dartx.pixelStorei](...args) {
      return this.pixelStorei.apply(this, args);
    }
    [dartx.polygonOffset](...args) {
      return this.polygonOffset.apply(this, args);
    }
    [dartx.readPixels](...args) {
      return this.readPixels.apply(this, args);
    }
    [dartx.renderbufferStorage](...args) {
      return this.renderbufferStorage.apply(this, args);
    }
    [dartx.sampleCoverage](...args) {
      return this.sampleCoverage.apply(this, args);
    }
    [dartx.scissor](...args) {
      return this.scissor.apply(this, args);
    }
    [dartx.shaderSource](...args) {
      return this.shaderSource.apply(this, args);
    }
    [dartx.stencilFunc](...args) {
      return this.stencilFunc.apply(this, args);
    }
    [dartx.stencilFuncSeparate](...args) {
      return this.stencilFuncSeparate.apply(this, args);
    }
    [dartx.stencilMask](...args) {
      return this.stencilMask.apply(this, args);
    }
    [dartx.stencilMaskSeparate](...args) {
      return this.stencilMaskSeparate.apply(this, args);
    }
    [dartx.stencilOp](...args) {
      return this.stencilOp.apply(this, args);
    }
    [dartx.stencilOpSeparate](...args) {
      return this.stencilOpSeparate.apply(this, args);
    }
    [dartx.texImage2D](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
      if (format === void 0) format = null;
      if (type === void 0) type = null;
      if (pixels === void 0) pixels = null;
      if (pixels != null && type != null && format != null && typeof border_OR_canvas_OR_image_OR_pixels_OR_video == 'number') {
        this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
        return;
      }
      if ((html$.ImageData.is(border_OR_canvas_OR_image_OR_pixels_OR_video) || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
        let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(border_OR_canvas_OR_image_OR_pixels_OR_video));
        this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
        return;
      }
      if (html$.ImageElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
        this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.CanvasElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
        this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.VideoElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
        this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_texImage2D_1](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_2](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_3](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_4](...args) {
      return this.texImage2D.apply(this, args);
    }
    [_texImage2D_5](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DCanvas](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DImage](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DImageData](target, level, internalformat, format, type, pixels) {
      let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
      this[_texImage2DImageData_1](target, level, internalformat, format, type, pixels_1);
      return;
    }
    [_texImage2DImageData_1](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DVideo](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texParameterf](...args) {
      return this.texParameterf.apply(this, args);
    }
    [dartx.texParameteri](...args) {
      return this.texParameteri.apply(this, args);
    }
    [dartx.texSubImage2D](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
      if (type === void 0) type = null;
      if (pixels === void 0) pixels = null;
      if (pixels != null && type != null && typeof canvas_OR_format_OR_image_OR_pixels_OR_video == 'number') {
        this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
        return;
      }
      if ((html$.ImageData.is(canvas_OR_format_OR_image_OR_pixels_OR_video) || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
        let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(canvas_OR_format_OR_image_OR_pixels_OR_video));
        this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
        return;
      }
      if (html$.ImageElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
        this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.CanvasElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
        this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
        return;
      }
      if (html$.VideoElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
        this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
        return;
      }
      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
    }
    [_texSubImage2D_1](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_2](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_3](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_4](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [_texSubImage2D_5](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DCanvas](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DImage](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DImageData](target, level, xoffset, yoffset, format, type, pixels) {
      let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
      this[_texSubImage2DImageData_1](target, level, xoffset, yoffset, format, type, pixels_1);
      return;
    }
    [_texSubImage2DImageData_1](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DVideo](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.uniform1f](...args) {
      return this.uniform1f.apply(this, args);
    }
    [dartx.uniform1fv](...args) {
      return this.uniform1fv.apply(this, args);
    }
    [dartx.uniform1i](...args) {
      return this.uniform1i.apply(this, args);
    }
    [dartx.uniform1iv](...args) {
      return this.uniform1iv.apply(this, args);
    }
    [dartx.uniform2f](...args) {
      return this.uniform2f.apply(this, args);
    }
    [dartx.uniform2fv](...args) {
      return this.uniform2fv.apply(this, args);
    }
    [dartx.uniform2i](...args) {
      return this.uniform2i.apply(this, args);
    }
    [dartx.uniform2iv](...args) {
      return this.uniform2iv.apply(this, args);
    }
    [dartx.uniform3f](...args) {
      return this.uniform3f.apply(this, args);
    }
    [dartx.uniform3fv](...args) {
      return this.uniform3fv.apply(this, args);
    }
    [dartx.uniform3i](...args) {
      return this.uniform3i.apply(this, args);
    }
    [dartx.uniform3iv](...args) {
      return this.uniform3iv.apply(this, args);
    }
    [dartx.uniform4f](...args) {
      return this.uniform4f.apply(this, args);
    }
    [dartx.uniform4fv](...args) {
      return this.uniform4fv.apply(this, args);
    }
    [dartx.uniform4i](...args) {
      return this.uniform4i.apply(this, args);
    }
    [dartx.uniform4iv](...args) {
      return this.uniform4iv.apply(this, args);
    }
    [dartx.uniformMatrix2fv](...args) {
      return this.uniformMatrix2fv.apply(this, args);
    }
    [dartx.uniformMatrix3fv](...args) {
      return this.uniformMatrix3fv.apply(this, args);
    }
    [dartx.uniformMatrix4fv](...args) {
      return this.uniformMatrix4fv.apply(this, args);
    }
    [dartx.useProgram](...args) {
      return this.useProgram.apply(this, args);
    }
    [dartx.validateProgram](...args) {
      return this.validateProgram.apply(this, args);
    }
    [dartx.vertexAttrib1f](...args) {
      return this.vertexAttrib1f.apply(this, args);
    }
    [dartx.vertexAttrib1fv](...args) {
      return this.vertexAttrib1fv.apply(this, args);
    }
    [dartx.vertexAttrib2f](...args) {
      return this.vertexAttrib2f.apply(this, args);
    }
    [dartx.vertexAttrib2fv](...args) {
      return this.vertexAttrib2fv.apply(this, args);
    }
    [dartx.vertexAttrib3f](...args) {
      return this.vertexAttrib3f.apply(this, args);
    }
    [dartx.vertexAttrib3fv](...args) {
      return this.vertexAttrib3fv.apply(this, args);
    }
    [dartx.vertexAttrib4f](...args) {
      return this.vertexAttrib4f.apply(this, args);
    }
    [dartx.vertexAttrib4fv](...args) {
      return this.vertexAttrib4fv.apply(this, args);
    }
    [dartx.vertexAttribPointer](...args) {
      return this.vertexAttribPointer.apply(this, args);
    }
    [dartx.viewport](...args) {
      return this.viewport.apply(this, args);
    }
    [dartx.texImage2DUntyped](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texImage2DTyped](...args) {
      return this.texImage2D.apply(this, args);
    }
    [dartx.texSubImage2DUntyped](...args) {
      return this.texSubImage2D.apply(this, args);
    }
    [dartx.texSubImage2DTyped](...args) {
      return this.texSubImage2D.apply(this, args);
    }
  };
  web_gl.RenderingContext[dart.implements] = () => [html$.CanvasRenderingContext];
  dart.setSignature(web_gl.RenderingContext, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.RenderingContext, [])}),
    fields: () => ({
      [dartx.canvas]: html$.CanvasElement,
      [dartx.drawingBufferHeight]: core.int,
      [dartx.drawingBufferWidth]: core.int
    }),
    methods: () => ({
      [dartx.activeTexture]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.attachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
      [dartx.bindAttribLocation]: dart.definiteFunctionType(dart.void, [web_gl.Program, core.int, core.String]),
      [dartx.bindBuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Buffer]),
      [dartx.bindFramebuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Framebuffer]),
      [dartx.bindRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Renderbuffer]),
      [dartx.bindTexture]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Texture]),
      [dartx.blendColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.blendEquation]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.blendEquationSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.blendFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.blendFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.bufferByteData]: dart.definiteFunctionType(dart.void, [core.int, typed_data.ByteBuffer, core.int]),
      [dartx.bufferData]: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic, core.int]),
      [dartx.bufferDataTyped]: dart.definiteFunctionType(dart.void, [core.int, typed_data.TypedData, core.int]),
      [dartx.bufferSubByteData]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.ByteBuffer]),
      [dartx.bufferSubData]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
      [dartx.bufferSubDataTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.TypedData]),
      [dartx.checkFramebufferStatus]: dart.definiteFunctionType(core.int, [core.int]),
      [dartx.clear]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.clearColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
      [dartx.clearDepth]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.clearStencil]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.colorMask]: dart.definiteFunctionType(dart.void, [core.bool, core.bool, core.bool, core.bool]),
      [dartx.compileShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
      [dartx.compressedTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.compressedTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.copyTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      [dartx.copyTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
      [dartx.createBuffer]: dart.definiteFunctionType(web_gl.Buffer, []),
      [dartx.createFramebuffer]: dart.definiteFunctionType(web_gl.Framebuffer, []),
      [dartx.createProgram]: dart.definiteFunctionType(web_gl.Program, []),
      [dartx.createRenderbuffer]: dart.definiteFunctionType(web_gl.Renderbuffer, []),
      [dartx.createShader]: dart.definiteFunctionType(web_gl.Shader, [core.int]),
      [dartx.createTexture]: dart.definiteFunctionType(web_gl.Texture, []),
      [dartx.cullFace]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.deleteBuffer]: dart.definiteFunctionType(dart.void, [web_gl.Buffer]),
      [dartx.deleteFramebuffer]: dart.definiteFunctionType(dart.void, [web_gl.Framebuffer]),
      [dartx.deleteProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.deleteRenderbuffer]: dart.definiteFunctionType(dart.void, [web_gl.Renderbuffer]),
      [dartx.deleteShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
      [dartx.deleteTexture]: dart.definiteFunctionType(dart.void, [web_gl.Texture]),
      [dartx.depthFunc]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.depthMask]: dart.definiteFunctionType(dart.void, [core.bool]),
      [dartx.depthRange]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.detachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
      [dartx.disable]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.disableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.drawArrays]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.drawElements]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.enable]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.enableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.finish]: dart.definiteFunctionType(dart.void, []),
      [dartx.flush]: dart.definiteFunctionType(dart.void, []),
      [dartx.framebufferRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Renderbuffer]),
      [dartx.framebufferTexture2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Texture, core.int]),
      [dartx.frontFace]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.generateMipmap]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.getActiveAttrib]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
      [dartx.getActiveUniform]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
      [dartx.getAttachedShaders]: dart.definiteFunctionType(core.List$(web_gl.Shader), [web_gl.Program]),
      [dartx.getAttribLocation]: dart.definiteFunctionType(core.int, [web_gl.Program, core.String]),
      [dartx.getBufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getContextAttributes]: dart.definiteFunctionType(web_gl.ContextAttributes, []),
      [_getContextAttributes_1$]: dart.definiteFunctionType(dart.dynamic, []),
      [dartx.getError]: dart.definiteFunctionType(core.int, []),
      [dartx.getExtension]: dart.definiteFunctionType(core.Object, [core.String]),
      [dartx.getFramebufferAttachmentParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int, core.int]),
      [dartx.getParameter]: dart.definiteFunctionType(core.Object, [core.int]),
      [dartx.getProgramInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Program]),
      [dartx.getProgramParameter]: dart.definiteFunctionType(core.Object, [web_gl.Program, core.int]),
      [dartx.getRenderbufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getShaderInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
      [dartx.getShaderParameter]: dart.definiteFunctionType(core.Object, [web_gl.Shader, core.int]),
      [dartx.getShaderPrecisionFormat]: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [core.int, core.int]),
      [dartx.getShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
      [dartx.getSupportedExtensions]: dart.definiteFunctionType(core.List$(core.String), []),
      [dartx.getTexParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getUniform]: dart.definiteFunctionType(core.Object, [web_gl.Program, web_gl.UniformLocation]),
      [dartx.getUniformLocation]: dart.definiteFunctionType(web_gl.UniformLocation, [web_gl.Program, core.String]),
      [dartx.getVertexAttrib]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
      [dartx.getVertexAttribOffset]: dart.definiteFunctionType(core.int, [core.int, core.int]),
      [dartx.hint]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.isBuffer]: dart.definiteFunctionType(core.bool, [web_gl.Buffer]),
      [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
      [dartx.isEnabled]: dart.definiteFunctionType(core.bool, [core.int]),
      [dartx.isFramebuffer]: dart.definiteFunctionType(core.bool, [web_gl.Framebuffer]),
      [dartx.isProgram]: dart.definiteFunctionType(core.bool, [web_gl.Program]),
      [dartx.isRenderbuffer]: dart.definiteFunctionType(core.bool, [web_gl.Renderbuffer]),
      [dartx.isShader]: dart.definiteFunctionType(core.bool, [web_gl.Shader]),
      [dartx.isTexture]: dart.definiteFunctionType(core.bool, [web_gl.Texture]),
      [dartx.lineWidth]: dart.definiteFunctionType(dart.void, [core.num]),
      [dartx.linkProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.pixelStorei]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.polygonOffset]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
      [dartx.readPixels]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.renderbufferStorage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.sampleCoverage]: dart.definiteFunctionType(dart.void, [core.num, core.bool]),
      [dartx.scissor]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.shaderSource]: dart.definiteFunctionType(dart.void, [web_gl.Shader, core.String]),
      [dartx.stencilFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.stencilFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.stencilMask]: dart.definiteFunctionType(dart.void, [core.int]),
      [dartx.stencilMaskSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
      [dartx.stencilOp]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.stencilOpSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.texImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
      [_texImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
      [_texImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_texImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
      [_texImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
      [_texImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
      [dartx.texImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
      [dartx.texImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
      [dartx.texImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
      [_texImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.texImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
      [dartx.texParameterf]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.num]),
      [dartx.texParameteri]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
      [dartx.texSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
      [_texSubImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
      [_texSubImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [_texSubImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
      [_texSubImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
      [_texSubImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
      [dartx.texSubImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
      [dartx.texSubImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
      [dartx.texSubImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
      [_texSubImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
      [dartx.texSubImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
      [dartx.uniform1f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num]),
      [dartx.uniform1fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform1i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int]),
      [dartx.uniform1iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniform2f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num]),
      [dartx.uniform2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform2i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
      [dartx.uniform2iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniform3f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num]),
      [dartx.uniform3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform3i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
      [dartx.uniform3iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniform4f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num, core.num]),
      [dartx.uniform4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
      [dartx.uniform4i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
      [dartx.uniform4iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
      [dartx.uniformMatrix2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
      [dartx.uniformMatrix3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
      [dartx.uniformMatrix4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
      [dartx.useProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.validateProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
      [dartx.vertexAttrib1f]: dart.definiteFunctionType(dart.void, [core.int, core.num]),
      [dartx.vertexAttrib1fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttrib2f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num]),
      [dartx.vertexAttrib2fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttrib3f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num]),
      [dartx.vertexAttrib3fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttrib4f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num, core.num]),
      [dartx.vertexAttrib4fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
      [dartx.vertexAttribPointer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.bool, core.int, core.int]),
      [dartx.viewport]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.texImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
      [dartx.texImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
      [dartx.texSubImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
      [dartx.texSubImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData])
    }),
    sfields: () => ({
      ACTIVE_ATTRIBUTES: core.int,
      ACTIVE_TEXTURE: core.int,
      ACTIVE_UNIFORMS: core.int,
      ALIASED_LINE_WIDTH_RANGE: core.int,
      ALIASED_POINT_SIZE_RANGE: core.int,
      ALPHA: core.int,
      ALPHA_BITS: core.int,
      ALWAYS: core.int,
      ARRAY_BUFFER: core.int,
      ARRAY_BUFFER_BINDING: core.int,
      ATTACHED_SHADERS: core.int,
      BACK: core.int,
      BLEND: core.int,
      BLEND_COLOR: core.int,
      BLEND_DST_ALPHA: core.int,
      BLEND_DST_RGB: core.int,
      BLEND_EQUATION: core.int,
      BLEND_EQUATION_ALPHA: core.int,
      BLEND_EQUATION_RGB: core.int,
      BLEND_SRC_ALPHA: core.int,
      BLEND_SRC_RGB: core.int,
      BLUE_BITS: core.int,
      BOOL: core.int,
      BOOL_VEC2: core.int,
      BOOL_VEC3: core.int,
      BOOL_VEC4: core.int,
      BROWSER_DEFAULT_WEBGL: core.int,
      BUFFER_SIZE: core.int,
      BUFFER_USAGE: core.int,
      BYTE: core.int,
      CCW: core.int,
      CLAMP_TO_EDGE: core.int,
      COLOR_ATTACHMENT0: core.int,
      COLOR_BUFFER_BIT: core.int,
      COLOR_CLEAR_VALUE: core.int,
      COLOR_WRITEMASK: core.int,
      COMPILE_STATUS: core.int,
      COMPRESSED_TEXTURE_FORMATS: core.int,
      CONSTANT_ALPHA: core.int,
      CONSTANT_COLOR: core.int,
      CONTEXT_LOST_WEBGL: core.int,
      CULL_FACE: core.int,
      CULL_FACE_MODE: core.int,
      CURRENT_PROGRAM: core.int,
      CURRENT_VERTEX_ATTRIB: core.int,
      CW: core.int,
      DECR: core.int,
      DECR_WRAP: core.int,
      DELETE_STATUS: core.int,
      DEPTH_ATTACHMENT: core.int,
      DEPTH_BITS: core.int,
      DEPTH_BUFFER_BIT: core.int,
      DEPTH_CLEAR_VALUE: core.int,
      DEPTH_COMPONENT: core.int,
      DEPTH_COMPONENT16: core.int,
      DEPTH_FUNC: core.int,
      DEPTH_RANGE: core.int,
      DEPTH_STENCIL: core.int,
      DEPTH_STENCIL_ATTACHMENT: core.int,
      DEPTH_TEST: core.int,
      DEPTH_WRITEMASK: core.int,
      DITHER: core.int,
      DONT_CARE: core.int,
      DST_ALPHA: core.int,
      DST_COLOR: core.int,
      DYNAMIC_DRAW: core.int,
      ELEMENT_ARRAY_BUFFER: core.int,
      ELEMENT_ARRAY_BUFFER_BINDING: core.int,
      EQUAL: core.int,
      FASTEST: core.int,
      FLOAT: core.int,
      FLOAT_MAT2: core.int,
      FLOAT_MAT3: core.int,
      FLOAT_MAT4: core.int,
      FLOAT_VEC2: core.int,
      FLOAT_VEC3: core.int,
      FLOAT_VEC4: core.int,
      FRAGMENT_SHADER: core.int,
      FRAMEBUFFER: core.int,
      FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: core.int,
      FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: core.int,
      FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: core.int,
      FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: core.int,
      FRAMEBUFFER_BINDING: core.int,
      FRAMEBUFFER_COMPLETE: core.int,
      FRAMEBUFFER_INCOMPLETE_ATTACHMENT: core.int,
      FRAMEBUFFER_INCOMPLETE_DIMENSIONS: core.int,
      FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: core.int,
      FRAMEBUFFER_UNSUPPORTED: core.int,
      FRONT: core.int,
      FRONT_AND_BACK: core.int,
      FRONT_FACE: core.int,
      FUNC_ADD: core.int,
      FUNC_REVERSE_SUBTRACT: core.int,
      FUNC_SUBTRACT: core.int,
      GENERATE_MIPMAP_HINT: core.int,
      GEQUAL: core.int,
      GREATER: core.int,
      GREEN_BITS: core.int,
      HIGH_FLOAT: core.int,
      HIGH_INT: core.int,
      IMPLEMENTATION_COLOR_READ_FORMAT: core.int,
      IMPLEMENTATION_COLOR_READ_TYPE: core.int,
      INCR: core.int,
      INCR_WRAP: core.int,
      INT: core.int,
      INT_VEC2: core.int,
      INT_VEC3: core.int,
      INT_VEC4: core.int,
      INVALID_ENUM: core.int,
      INVALID_FRAMEBUFFER_OPERATION: core.int,
      INVALID_OPERATION: core.int,
      INVALID_VALUE: core.int,
      INVERT: core.int,
      KEEP: core.int,
      LEQUAL: core.int,
      LESS: core.int,
      LINEAR: core.int,
      LINEAR_MIPMAP_LINEAR: core.int,
      LINEAR_MIPMAP_NEAREST: core.int,
      LINES: core.int,
      LINE_LOOP: core.int,
      LINE_STRIP: core.int,
      LINE_WIDTH: core.int,
      LINK_STATUS: core.int,
      LOW_FLOAT: core.int,
      LOW_INT: core.int,
      LUMINANCE: core.int,
      LUMINANCE_ALPHA: core.int,
      MAX_COMBINED_TEXTURE_IMAGE_UNITS: core.int,
      MAX_CUBE_MAP_TEXTURE_SIZE: core.int,
      MAX_FRAGMENT_UNIFORM_VECTORS: core.int,
      MAX_RENDERBUFFER_SIZE: core.int,
      MAX_TEXTURE_IMAGE_UNITS: core.int,
      MAX_TEXTURE_SIZE: core.int,
      MAX_VARYING_VECTORS: core.int,
      MAX_VERTEX_ATTRIBS: core.int,
      MAX_VERTEX_TEXTURE_IMAGE_UNITS: core.int,
      MAX_VERTEX_UNIFORM_VECTORS: core.int,
      MAX_VIEWPORT_DIMS: core.int,
      MEDIUM_FLOAT: core.int,
      MEDIUM_INT: core.int,
      MIRRORED_REPEAT: core.int,
      NEAREST: core.int,
      NEAREST_MIPMAP_LINEAR: core.int,
      NEAREST_MIPMAP_NEAREST: core.int,
      NEVER: core.int,
      NICEST: core.int,
      NONE: core.int,
      NOTEQUAL: core.int,
      NO_ERROR: core.int,
      ONE: core.int,
      ONE_MINUS_CONSTANT_ALPHA: core.int,
      ONE_MINUS_CONSTANT_COLOR: core.int,
      ONE_MINUS_DST_ALPHA: core.int,
      ONE_MINUS_DST_COLOR: core.int,
      ONE_MINUS_SRC_ALPHA: core.int,
      ONE_MINUS_SRC_COLOR: core.int,
      OUT_OF_MEMORY: core.int,
      PACK_ALIGNMENT: core.int,
      POINTS: core.int,
      POLYGON_OFFSET_FACTOR: core.int,
      POLYGON_OFFSET_FILL: core.int,
      POLYGON_OFFSET_UNITS: core.int,
      RED_BITS: core.int,
      RENDERBUFFER: core.int,
      RENDERBUFFER_ALPHA_SIZE: core.int,
      RENDERBUFFER_BINDING: core.int,
      RENDERBUFFER_BLUE_SIZE: core.int,
      RENDERBUFFER_DEPTH_SIZE: core.int,
      RENDERBUFFER_GREEN_SIZE: core.int,
      RENDERBUFFER_HEIGHT: core.int,
      RENDERBUFFER_INTERNAL_FORMAT: core.int,
      RENDERBUFFER_RED_SIZE: core.int,
      RENDERBUFFER_STENCIL_SIZE: core.int,
      RENDERBUFFER_WIDTH: core.int,
      RENDERER: core.int,
      REPEAT: core.int,
      REPLACE: core.int,
      RGB: core.int,
      RGB565: core.int,
      RGB5_A1: core.int,
      RGBA: core.int,
      RGBA4: core.int,
      SAMPLER_2D: core.int,
      SAMPLER_CUBE: core.int,
      SAMPLES: core.int,
      SAMPLE_ALPHA_TO_COVERAGE: core.int,
      SAMPLE_BUFFERS: core.int,
      SAMPLE_COVERAGE: core.int,
      SAMPLE_COVERAGE_INVERT: core.int,
      SAMPLE_COVERAGE_VALUE: core.int,
      SCISSOR_BOX: core.int,
      SCISSOR_TEST: core.int,
      SHADER_TYPE: core.int,
      SHADING_LANGUAGE_VERSION: core.int,
      SHORT: core.int,
      SRC_ALPHA: core.int,
      SRC_ALPHA_SATURATE: core.int,
      SRC_COLOR: core.int,
      STATIC_DRAW: core.int,
      STENCIL_ATTACHMENT: core.int,
      STENCIL_BACK_FAIL: core.int,
      STENCIL_BACK_FUNC: core.int,
      STENCIL_BACK_PASS_DEPTH_FAIL: core.int,
      STENCIL_BACK_PASS_DEPTH_PASS: core.int,
      STENCIL_BACK_REF: core.int,
      STENCIL_BACK_VALUE_MASK: core.int,
      STENCIL_BACK_WRITEMASK: core.int,
      STENCIL_BITS: core.int,
      STENCIL_BUFFER_BIT: core.int,
      STENCIL_CLEAR_VALUE: core.int,
      STENCIL_FAIL: core.int,
      STENCIL_FUNC: core.int,
      STENCIL_INDEX: core.int,
      STENCIL_INDEX8: core.int,
      STENCIL_PASS_DEPTH_FAIL: core.int,
      STENCIL_PASS_DEPTH_PASS: core.int,
      STENCIL_REF: core.int,
      STENCIL_TEST: core.int,
      STENCIL_VALUE_MASK: core.int,
      STENCIL_WRITEMASK: core.int,
      STREAM_DRAW: core.int,
      SUBPIXEL_BITS: core.int,
      TEXTURE: core.int,
      TEXTURE0: core.int,
      TEXTURE1: core.int,
      TEXTURE10: core.int,
      TEXTURE11: core.int,
      TEXTURE12: core.int,
      TEXTURE13: core.int,
      TEXTURE14: core.int,
      TEXTURE15: core.int,
      TEXTURE16: core.int,
      TEXTURE17: core.int,
      TEXTURE18: core.int,
      TEXTURE19: core.int,
      TEXTURE2: core.int,
      TEXTURE20: core.int,
      TEXTURE21: core.int,
      TEXTURE22: core.int,
      TEXTURE23: core.int,
      TEXTURE24: core.int,
      TEXTURE25: core.int,
      TEXTURE26: core.int,
      TEXTURE27: core.int,
      TEXTURE28: core.int,
      TEXTURE29: core.int,
      TEXTURE3: core.int,
      TEXTURE30: core.int,
      TEXTURE31: core.int,
      TEXTURE4: core.int,
      TEXTURE5: core.int,
      TEXTURE6: core.int,
      TEXTURE7: core.int,
      TEXTURE8: core.int,
      TEXTURE9: core.int,
      TEXTURE_2D: core.int,
      TEXTURE_BINDING_2D: core.int,
      TEXTURE_BINDING_CUBE_MAP: core.int,
      TEXTURE_CUBE_MAP: core.int,
      TEXTURE_CUBE_MAP_NEGATIVE_X: core.int,
      TEXTURE_CUBE_MAP_NEGATIVE_Y: core.int,
      TEXTURE_CUBE_MAP_NEGATIVE_Z: core.int,
      TEXTURE_CUBE_MAP_POSITIVE_X: core.int,
      TEXTURE_CUBE_MAP_POSITIVE_Y: core.int,
      TEXTURE_CUBE_MAP_POSITIVE_Z: core.int,
      TEXTURE_MAG_FILTER: core.int,
      TEXTURE_MIN_FILTER: core.int,
      TEXTURE_WRAP_S: core.int,
      TEXTURE_WRAP_T: core.int,
      TRIANGLES: core.int,
      TRIANGLE_FAN: core.int,
      TRIANGLE_STRIP: core.int,
      UNPACK_ALIGNMENT: core.int,
      UNPACK_COLORSPACE_CONVERSION_WEBGL: core.int,
      UNPACK_FLIP_Y_WEBGL: core.int,
      UNPACK_PREMULTIPLY_ALPHA_WEBGL: core.int,
      UNSIGNED_BYTE: core.int,
      UNSIGNED_INT: core.int,
      UNSIGNED_SHORT: core.int,
      UNSIGNED_SHORT_4_4_4_4: core.int,
      UNSIGNED_SHORT_5_5_5_1: core.int,
      UNSIGNED_SHORT_5_6_5: core.int,
      VALIDATE_STATUS: core.int,
      VENDOR: core.int,
      VERSION: core.int,
      VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: core.int,
      VERTEX_ATTRIB_ARRAY_ENABLED: core.int,
      VERTEX_ATTRIB_ARRAY_NORMALIZED: core.int,
      VERTEX_ATTRIB_ARRAY_POINTER: core.int,
      VERTEX_ATTRIB_ARRAY_SIZE: core.int,
      VERTEX_ATTRIB_ARRAY_STRIDE: core.int,
      VERTEX_ATTRIB_ARRAY_TYPE: core.int,
      VERTEX_SHADER: core.int,
      VIEWPORT: core.int,
      ZERO: core.int
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  web_gl.RenderingContext.ACTIVE_ATTRIBUTES = 35721;
  web_gl.RenderingContext.ACTIVE_TEXTURE = 34016;
  web_gl.RenderingContext.ACTIVE_UNIFORMS = 35718;
  web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE = 33902;
  web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE = 33901;
  web_gl.RenderingContext.ALPHA = 6406;
  web_gl.RenderingContext.ALPHA_BITS = 3413;
  web_gl.RenderingContext.ALWAYS = 519;
  web_gl.RenderingContext.ARRAY_BUFFER = 34962;
  web_gl.RenderingContext.ARRAY_BUFFER_BINDING = 34964;
  web_gl.RenderingContext.ATTACHED_SHADERS = 35717;
  web_gl.RenderingContext.BACK = 1029;
  web_gl.RenderingContext.BLEND = 3042;
  web_gl.RenderingContext.BLEND_COLOR = 32773;
  web_gl.RenderingContext.BLEND_DST_ALPHA = 32970;
  web_gl.RenderingContext.BLEND_DST_RGB = 32968;
  web_gl.RenderingContext.BLEND_EQUATION = 32777;
  web_gl.RenderingContext.BLEND_EQUATION_ALPHA = 34877;
  web_gl.RenderingContext.BLEND_EQUATION_RGB = 32777;
  web_gl.RenderingContext.BLEND_SRC_ALPHA = 32971;
  web_gl.RenderingContext.BLEND_SRC_RGB = 32969;
  web_gl.RenderingContext.BLUE_BITS = 3412;
  web_gl.RenderingContext.BOOL = 35670;
  web_gl.RenderingContext.BOOL_VEC2 = 35671;
  web_gl.RenderingContext.BOOL_VEC3 = 35672;
  web_gl.RenderingContext.BOOL_VEC4 = 35673;
  web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL = 37444;
  web_gl.RenderingContext.BUFFER_SIZE = 34660;
  web_gl.RenderingContext.BUFFER_USAGE = 34661;
  web_gl.RenderingContext.BYTE = 5120;
  web_gl.RenderingContext.CCW = 2305;
  web_gl.RenderingContext.CLAMP_TO_EDGE = 33071;
  web_gl.RenderingContext.COLOR_ATTACHMENT0 = 36064;
  web_gl.RenderingContext.COLOR_BUFFER_BIT = 16384;
  web_gl.RenderingContext.COLOR_CLEAR_VALUE = 3106;
  web_gl.RenderingContext.COLOR_WRITEMASK = 3107;
  web_gl.RenderingContext.COMPILE_STATUS = 35713;
  web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS = 34467;
  web_gl.RenderingContext.CONSTANT_ALPHA = 32771;
  web_gl.RenderingContext.CONSTANT_COLOR = 32769;
  web_gl.RenderingContext.CONTEXT_LOST_WEBGL = 37442;
  web_gl.RenderingContext.CULL_FACE = 2884;
  web_gl.RenderingContext.CULL_FACE_MODE = 2885;
  web_gl.RenderingContext.CURRENT_PROGRAM = 35725;
  web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB = 34342;
  web_gl.RenderingContext.CW = 2304;
  web_gl.RenderingContext.DECR = 7683;
  web_gl.RenderingContext.DECR_WRAP = 34056;
  web_gl.RenderingContext.DELETE_STATUS = 35712;
  web_gl.RenderingContext.DEPTH_ATTACHMENT = 36096;
  web_gl.RenderingContext.DEPTH_BITS = 3414;
  web_gl.RenderingContext.DEPTH_BUFFER_BIT = 256;
  web_gl.RenderingContext.DEPTH_CLEAR_VALUE = 2931;
  web_gl.RenderingContext.DEPTH_COMPONENT = 6402;
  web_gl.RenderingContext.DEPTH_COMPONENT16 = 33189;
  web_gl.RenderingContext.DEPTH_FUNC = 2932;
  web_gl.RenderingContext.DEPTH_RANGE = 2928;
  web_gl.RenderingContext.DEPTH_STENCIL = 34041;
  web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT = 33306;
  web_gl.RenderingContext.DEPTH_TEST = 2929;
  web_gl.RenderingContext.DEPTH_WRITEMASK = 2930;
  web_gl.RenderingContext.DITHER = 3024;
  web_gl.RenderingContext.DONT_CARE = 4352;
  web_gl.RenderingContext.DST_ALPHA = 772;
  web_gl.RenderingContext.DST_COLOR = 774;
  web_gl.RenderingContext.DYNAMIC_DRAW = 35048;
  web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER = 34963;
  web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING = 34965;
  web_gl.RenderingContext.EQUAL = 514;
  web_gl.RenderingContext.FASTEST = 4353;
  web_gl.RenderingContext.FLOAT = 5126;
  web_gl.RenderingContext.FLOAT_MAT2 = 35674;
  web_gl.RenderingContext.FLOAT_MAT3 = 35675;
  web_gl.RenderingContext.FLOAT_MAT4 = 35676;
  web_gl.RenderingContext.FLOAT_VEC2 = 35664;
  web_gl.RenderingContext.FLOAT_VEC3 = 35665;
  web_gl.RenderingContext.FLOAT_VEC4 = 35666;
  web_gl.RenderingContext.FRAGMENT_SHADER = 35632;
  web_gl.RenderingContext.FRAMEBUFFER = 36160;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 36049;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 36048;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 36051;
  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 36050;
  web_gl.RenderingContext.FRAMEBUFFER_BINDING = 36006;
  web_gl.RenderingContext.FRAMEBUFFER_COMPLETE = 36053;
  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 36054;
  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 36057;
  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 36055;
  web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED = 36061;
  web_gl.RenderingContext.FRONT = 1028;
  web_gl.RenderingContext.FRONT_AND_BACK = 1032;
  web_gl.RenderingContext.FRONT_FACE = 2886;
  web_gl.RenderingContext.FUNC_ADD = 32774;
  web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT = 32779;
  web_gl.RenderingContext.FUNC_SUBTRACT = 32778;
  web_gl.RenderingContext.GENERATE_MIPMAP_HINT = 33170;
  web_gl.RenderingContext.GEQUAL = 518;
  web_gl.RenderingContext.GREATER = 516;
  web_gl.RenderingContext.GREEN_BITS = 3411;
  web_gl.RenderingContext.HIGH_FLOAT = 36338;
  web_gl.RenderingContext.HIGH_INT = 36341;
  web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT = 35739;
  web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE = 35738;
  web_gl.RenderingContext.INCR = 7682;
  web_gl.RenderingContext.INCR_WRAP = 34055;
  web_gl.RenderingContext.INT = 5124;
  web_gl.RenderingContext.INT_VEC2 = 35667;
  web_gl.RenderingContext.INT_VEC3 = 35668;
  web_gl.RenderingContext.INT_VEC4 = 35669;
  web_gl.RenderingContext.INVALID_ENUM = 1280;
  web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION = 1286;
  web_gl.RenderingContext.INVALID_OPERATION = 1282;
  web_gl.RenderingContext.INVALID_VALUE = 1281;
  web_gl.RenderingContext.INVERT = 5386;
  web_gl.RenderingContext.KEEP = 7680;
  web_gl.RenderingContext.LEQUAL = 515;
  web_gl.RenderingContext.LESS = 513;
  web_gl.RenderingContext.LINEAR = 9729;
  web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR = 9987;
  web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST = 9985;
  web_gl.RenderingContext.LINES = 1;
  web_gl.RenderingContext.LINE_LOOP = 2;
  web_gl.RenderingContext.LINE_STRIP = 3;
  web_gl.RenderingContext.LINE_WIDTH = 2849;
  web_gl.RenderingContext.LINK_STATUS = 35714;
  web_gl.RenderingContext.LOW_FLOAT = 36336;
  web_gl.RenderingContext.LOW_INT = 36339;
  web_gl.RenderingContext.LUMINANCE = 6409;
  web_gl.RenderingContext.LUMINANCE_ALPHA = 6410;
  web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661;
  web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE = 34076;
  web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS = 36349;
  web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE = 34024;
  web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS = 34930;
  web_gl.RenderingContext.MAX_TEXTURE_SIZE = 3379;
  web_gl.RenderingContext.MAX_VARYING_VECTORS = 36348;
  web_gl.RenderingContext.MAX_VERTEX_ATTRIBS = 34921;
  web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660;
  web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS = 36347;
  web_gl.RenderingContext.MAX_VIEWPORT_DIMS = 3386;
  web_gl.RenderingContext.MEDIUM_FLOAT = 36337;
  web_gl.RenderingContext.MEDIUM_INT = 36340;
  web_gl.RenderingContext.MIRRORED_REPEAT = 33648;
  web_gl.RenderingContext.NEAREST = 9728;
  web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR = 9986;
  web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST = 9984;
  web_gl.RenderingContext.NEVER = 512;
  web_gl.RenderingContext.NICEST = 4354;
  web_gl.RenderingContext.NONE = 0;
  web_gl.RenderingContext.NOTEQUAL = 517;
  web_gl.RenderingContext.NO_ERROR = 0;
  web_gl.RenderingContext.ONE = 1;
  web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA = 32772;
  web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR = 32770;
  web_gl.RenderingContext.ONE_MINUS_DST_ALPHA = 773;
  web_gl.RenderingContext.ONE_MINUS_DST_COLOR = 775;
  web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA = 771;
  web_gl.RenderingContext.ONE_MINUS_SRC_COLOR = 769;
  web_gl.RenderingContext.OUT_OF_MEMORY = 1285;
  web_gl.RenderingContext.PACK_ALIGNMENT = 3333;
  web_gl.RenderingContext.POINTS = 0;
  web_gl.RenderingContext.POLYGON_OFFSET_FACTOR = 32824;
  web_gl.RenderingContext.POLYGON_OFFSET_FILL = 32823;
  web_gl.RenderingContext.POLYGON_OFFSET_UNITS = 10752;
  web_gl.RenderingContext.RED_BITS = 3410;
  web_gl.RenderingContext.RENDERBUFFER = 36161;
  web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE = 36179;
  web_gl.RenderingContext.RENDERBUFFER_BINDING = 36007;
  web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE = 36178;
  web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE = 36180;
  web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE = 36177;
  web_gl.RenderingContext.RENDERBUFFER_HEIGHT = 36163;
  web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT = 36164;
  web_gl.RenderingContext.RENDERBUFFER_RED_SIZE = 36176;
  web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE = 36181;
  web_gl.RenderingContext.RENDERBUFFER_WIDTH = 36162;
  web_gl.RenderingContext.RENDERER = 7937;
  web_gl.RenderingContext.REPEAT = 10497;
  web_gl.RenderingContext.REPLACE = 7681;
  web_gl.RenderingContext.RGB = 6407;
  web_gl.RenderingContext.RGB565 = 36194;
  web_gl.RenderingContext.RGB5_A1 = 32855;
  web_gl.RenderingContext.RGBA = 6408;
  web_gl.RenderingContext.RGBA4 = 32854;
  web_gl.RenderingContext.SAMPLER_2D = 35678;
  web_gl.RenderingContext.SAMPLER_CUBE = 35680;
  web_gl.RenderingContext.SAMPLES = 32937;
  web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE = 32926;
  web_gl.RenderingContext.SAMPLE_BUFFERS = 32936;
  web_gl.RenderingContext.SAMPLE_COVERAGE = 32928;
  web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT = 32939;
  web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE = 32938;
  web_gl.RenderingContext.SCISSOR_BOX = 3088;
  web_gl.RenderingContext.SCISSOR_TEST = 3089;
  web_gl.RenderingContext.SHADER_TYPE = 35663;
  web_gl.RenderingContext.SHADING_LANGUAGE_VERSION = 35724;
  web_gl.RenderingContext.SHORT = 5122;
  web_gl.RenderingContext.SRC_ALPHA = 770;
  web_gl.RenderingContext.SRC_ALPHA_SATURATE = 776;
  web_gl.RenderingContext.SRC_COLOR = 768;
  web_gl.RenderingContext.STATIC_DRAW = 35044;
  web_gl.RenderingContext.STENCIL_ATTACHMENT = 36128;
  web_gl.RenderingContext.STENCIL_BACK_FAIL = 34817;
  web_gl.RenderingContext.STENCIL_BACK_FUNC = 34816;
  web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL = 34818;
  web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS = 34819;
  web_gl.RenderingContext.STENCIL_BACK_REF = 36003;
  web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK = 36004;
  web_gl.RenderingContext.STENCIL_BACK_WRITEMASK = 36005;
  web_gl.RenderingContext.STENCIL_BITS = 3415;
  web_gl.RenderingContext.STENCIL_BUFFER_BIT = 1024;
  web_gl.RenderingContext.STENCIL_CLEAR_VALUE = 2961;
  web_gl.RenderingContext.STENCIL_FAIL = 2964;
  web_gl.RenderingContext.STENCIL_FUNC = 2962;
  web_gl.RenderingContext.STENCIL_INDEX = 6401;
  web_gl.RenderingContext.STENCIL_INDEX8 = 36168;
  web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL = 2965;
  web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS = 2966;
  web_gl.RenderingContext.STENCIL_REF = 2967;
  web_gl.RenderingContext.STENCIL_TEST = 2960;
  web_gl.RenderingContext.STENCIL_VALUE_MASK = 2963;
  web_gl.RenderingContext.STENCIL_WRITEMASK = 2968;
  web_gl.RenderingContext.STREAM_DRAW = 35040;
  web_gl.RenderingContext.SUBPIXEL_BITS = 3408;
  web_gl.RenderingContext.TEXTURE = 5890;
  web_gl.RenderingContext.TEXTURE0 = 33984;
  web_gl.RenderingContext.TEXTURE1 = 33985;
  web_gl.RenderingContext.TEXTURE10 = 33994;
  web_gl.RenderingContext.TEXTURE11 = 33995;
  web_gl.RenderingContext.TEXTURE12 = 33996;
  web_gl.RenderingContext.TEXTURE13 = 33997;
  web_gl.RenderingContext.TEXTURE14 = 33998;
  web_gl.RenderingContext.TEXTURE15 = 33999;
  web_gl.RenderingContext.TEXTURE16 = 34000;
  web_gl.RenderingContext.TEXTURE17 = 34001;
  web_gl.RenderingContext.TEXTURE18 = 34002;
  web_gl.RenderingContext.TEXTURE19 = 34003;
  web_gl.RenderingContext.TEXTURE2 = 33986;
  web_gl.RenderingContext.TEXTURE20 = 34004;
  web_gl.RenderingContext.TEXTURE21 = 34005;
  web_gl.RenderingContext.TEXTURE22 = 34006;
  web_gl.RenderingContext.TEXTURE23 = 34007;
  web_gl.RenderingContext.TEXTURE24 = 34008;
  web_gl.RenderingContext.TEXTURE25 = 34009;
  web_gl.RenderingContext.TEXTURE26 = 34010;
  web_gl.RenderingContext.TEXTURE27 = 34011;
  web_gl.RenderingContext.TEXTURE28 = 34012;
  web_gl.RenderingContext.TEXTURE29 = 34013;
  web_gl.RenderingContext.TEXTURE3 = 33987;
  web_gl.RenderingContext.TEXTURE30 = 34014;
  web_gl.RenderingContext.TEXTURE31 = 34015;
  web_gl.RenderingContext.TEXTURE4 = 33988;
  web_gl.RenderingContext.TEXTURE5 = 33989;
  web_gl.RenderingContext.TEXTURE6 = 33990;
  web_gl.RenderingContext.TEXTURE7 = 33991;
  web_gl.RenderingContext.TEXTURE8 = 33992;
  web_gl.RenderingContext.TEXTURE9 = 33993;
  web_gl.RenderingContext.TEXTURE_2D = 3553;
  web_gl.RenderingContext.TEXTURE_BINDING_2D = 32873;
  web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP = 34068;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP = 34067;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071;
  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073;
  web_gl.RenderingContext.TEXTURE_MAG_FILTER = 10240;
  web_gl.RenderingContext.TEXTURE_MIN_FILTER = 10241;
  web_gl.RenderingContext.TEXTURE_WRAP_S = 10242;
  web_gl.RenderingContext.TEXTURE_WRAP_T = 10243;
  web_gl.RenderingContext.TRIANGLES = 4;
  web_gl.RenderingContext.TRIANGLE_FAN = 6;
  web_gl.RenderingContext.TRIANGLE_STRIP = 5;
  web_gl.RenderingContext.UNPACK_ALIGNMENT = 3317;
  web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL = 37443;
  web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL = 37440;
  web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL = 37441;
  web_gl.RenderingContext.UNSIGNED_BYTE = 5121;
  web_gl.RenderingContext.UNSIGNED_INT = 5125;
  web_gl.RenderingContext.UNSIGNED_SHORT = 5123;
  web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4 = 32819;
  web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1 = 32820;
  web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5 = 33635;
  web_gl.RenderingContext.VALIDATE_STATUS = 35715;
  web_gl.RenderingContext.VENDOR = 7936;
  web_gl.RenderingContext.VERSION = 7938;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED = 34338;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER = 34373;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE = 34339;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE = 34340;
  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE = 34341;
  web_gl.RenderingContext.VERTEX_SHADER = 35633;
  web_gl.RenderingContext.VIEWPORT = 2978;
  web_gl.RenderingContext.ZERO = 0;
  dart.registerExtension(dart.global.WebGLRenderingContext, web_gl.RenderingContext);
  web_gl.ACTIVE_ATTRIBUTES = web_gl.RenderingContext.ACTIVE_ATTRIBUTES;
  web_gl.ACTIVE_TEXTURE = web_gl.RenderingContext.ACTIVE_TEXTURE;
  web_gl.ACTIVE_UNIFORMS = web_gl.RenderingContext.ACTIVE_UNIFORMS;
  web_gl.ALIASED_LINE_WIDTH_RANGE = web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE;
  web_gl.ALIASED_POINT_SIZE_RANGE = web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE;
  web_gl.ALPHA = web_gl.RenderingContext.ALPHA;
  web_gl.ALPHA_BITS = web_gl.RenderingContext.ALPHA_BITS;
  web_gl.ALWAYS = web_gl.RenderingContext.ALWAYS;
  web_gl.ARRAY_BUFFER = web_gl.RenderingContext.ARRAY_BUFFER;
  web_gl.ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ARRAY_BUFFER_BINDING;
  web_gl.ATTACHED_SHADERS = web_gl.RenderingContext.ATTACHED_SHADERS;
  web_gl.BACK = web_gl.RenderingContext.BACK;
  web_gl.BLEND = web_gl.RenderingContext.BLEND;
  web_gl.BLEND_COLOR = web_gl.RenderingContext.BLEND_COLOR;
  web_gl.BLEND_DST_ALPHA = web_gl.RenderingContext.BLEND_DST_ALPHA;
  web_gl.BLEND_DST_RGB = web_gl.RenderingContext.BLEND_DST_RGB;
  web_gl.BLEND_EQUATION = web_gl.RenderingContext.BLEND_EQUATION;
  web_gl.BLEND_EQUATION_ALPHA = web_gl.RenderingContext.BLEND_EQUATION_ALPHA;
  web_gl.BLEND_EQUATION_RGB = web_gl.RenderingContext.BLEND_EQUATION_RGB;
  web_gl.BLEND_SRC_ALPHA = web_gl.RenderingContext.BLEND_SRC_ALPHA;
  web_gl.BLEND_SRC_RGB = web_gl.RenderingContext.BLEND_SRC_RGB;
  web_gl.BLUE_BITS = web_gl.RenderingContext.BLUE_BITS;
  web_gl.BOOL = web_gl.RenderingContext.BOOL;
  web_gl.BOOL_VEC2 = web_gl.RenderingContext.BOOL_VEC2;
  web_gl.BOOL_VEC3 = web_gl.RenderingContext.BOOL_VEC3;
  web_gl.BOOL_VEC4 = web_gl.RenderingContext.BOOL_VEC4;
  web_gl.BROWSER_DEFAULT_WEBGL = web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL;
  web_gl.BUFFER_SIZE = web_gl.RenderingContext.BUFFER_SIZE;
  web_gl.BUFFER_USAGE = web_gl.RenderingContext.BUFFER_USAGE;
  web_gl.BYTE = web_gl.RenderingContext.BYTE;
  web_gl.CCW = web_gl.RenderingContext.CCW;
  web_gl.CLAMP_TO_EDGE = web_gl.RenderingContext.CLAMP_TO_EDGE;
  web_gl.COLOR_ATTACHMENT0 = web_gl.RenderingContext.COLOR_ATTACHMENT0;
  web_gl.COLOR_BUFFER_BIT = web_gl.RenderingContext.COLOR_BUFFER_BIT;
  web_gl.COLOR_CLEAR_VALUE = web_gl.RenderingContext.COLOR_CLEAR_VALUE;
  web_gl.COLOR_WRITEMASK = web_gl.RenderingContext.COLOR_WRITEMASK;
  web_gl.COMPILE_STATUS = web_gl.RenderingContext.COMPILE_STATUS;
  web_gl.COMPRESSED_TEXTURE_FORMATS = web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS;
  web_gl.CONSTANT_ALPHA = web_gl.RenderingContext.CONSTANT_ALPHA;
  web_gl.CONSTANT_COLOR = web_gl.RenderingContext.CONSTANT_COLOR;
  web_gl.CONTEXT_LOST_WEBGL = web_gl.RenderingContext.CONTEXT_LOST_WEBGL;
  web_gl.CULL_FACE = web_gl.RenderingContext.CULL_FACE;
  web_gl.CULL_FACE_MODE = web_gl.RenderingContext.CULL_FACE_MODE;
  web_gl.CURRENT_PROGRAM = web_gl.RenderingContext.CURRENT_PROGRAM;
  web_gl.CURRENT_VERTEX_ATTRIB = web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB;
  web_gl.CW = web_gl.RenderingContext.CW;
  web_gl.DECR = web_gl.RenderingContext.DECR;
  web_gl.DECR_WRAP = web_gl.RenderingContext.DECR_WRAP;
  web_gl.DELETE_STATUS = web_gl.RenderingContext.DELETE_STATUS;
  web_gl.DEPTH_ATTACHMENT = web_gl.RenderingContext.DEPTH_ATTACHMENT;
  web_gl.DEPTH_BITS = web_gl.RenderingContext.DEPTH_BITS;
  web_gl.DEPTH_BUFFER_BIT = web_gl.RenderingContext.DEPTH_BUFFER_BIT;
  web_gl.DEPTH_CLEAR_VALUE = web_gl.RenderingContext.DEPTH_CLEAR_VALUE;
  web_gl.DEPTH_COMPONENT = web_gl.RenderingContext.DEPTH_COMPONENT;
  web_gl.DEPTH_COMPONENT16 = web_gl.RenderingContext.DEPTH_COMPONENT16;
  web_gl.DEPTH_FUNC = web_gl.RenderingContext.DEPTH_FUNC;
  web_gl.DEPTH_RANGE = web_gl.RenderingContext.DEPTH_RANGE;
  web_gl.DEPTH_STENCIL = web_gl.RenderingContext.DEPTH_STENCIL;
  web_gl.DEPTH_STENCIL_ATTACHMENT = web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT;
  web_gl.DEPTH_TEST = web_gl.RenderingContext.DEPTH_TEST;
  web_gl.DEPTH_WRITEMASK = web_gl.RenderingContext.DEPTH_WRITEMASK;
  web_gl.DITHER = web_gl.RenderingContext.DITHER;
  web_gl.DONT_CARE = web_gl.RenderingContext.DONT_CARE;
  web_gl.DST_ALPHA = web_gl.RenderingContext.DST_ALPHA;
  web_gl.DST_COLOR = web_gl.RenderingContext.DST_COLOR;
  web_gl.DYNAMIC_DRAW = web_gl.RenderingContext.DYNAMIC_DRAW;
  web_gl.ELEMENT_ARRAY_BUFFER = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER;
  web_gl.ELEMENT_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
  web_gl.EQUAL = web_gl.RenderingContext.EQUAL;
  web_gl.FASTEST = web_gl.RenderingContext.FASTEST;
  web_gl.FLOAT = web_gl.RenderingContext.FLOAT;
  web_gl.FLOAT_MAT2 = web_gl.RenderingContext.FLOAT_MAT2;
  web_gl.FLOAT_MAT3 = web_gl.RenderingContext.FLOAT_MAT3;
  web_gl.FLOAT_MAT4 = web_gl.RenderingContext.FLOAT_MAT4;
  web_gl.FLOAT_VEC2 = web_gl.RenderingContext.FLOAT_VEC2;
  web_gl.FLOAT_VEC3 = web_gl.RenderingContext.FLOAT_VEC3;
  web_gl.FLOAT_VEC4 = web_gl.RenderingContext.FLOAT_VEC4;
  web_gl.FRAGMENT_SHADER = web_gl.RenderingContext.FRAGMENT_SHADER;
  web_gl.FRAMEBUFFER = web_gl.RenderingContext.FRAMEBUFFER;
  web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
  web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
  web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
  web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
  web_gl.FRAMEBUFFER_BINDING = web_gl.RenderingContext.FRAMEBUFFER_BINDING;
  web_gl.FRAMEBUFFER_COMPLETE = web_gl.RenderingContext.FRAMEBUFFER_COMPLETE;
  web_gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
  web_gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
  web_gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
  web_gl.FRAMEBUFFER_UNSUPPORTED = web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED;
  web_gl.FRONT = web_gl.RenderingContext.FRONT;
  web_gl.FRONT_AND_BACK = web_gl.RenderingContext.FRONT_AND_BACK;
  web_gl.FRONT_FACE = web_gl.RenderingContext.FRONT_FACE;
  web_gl.FUNC_ADD = web_gl.RenderingContext.FUNC_ADD;
  web_gl.FUNC_REVERSE_SUBTRACT = web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT;
  web_gl.FUNC_SUBTRACT = web_gl.RenderingContext.FUNC_SUBTRACT;
  web_gl.GENERATE_MIPMAP_HINT = web_gl.RenderingContext.GENERATE_MIPMAP_HINT;
  web_gl.GEQUAL = web_gl.RenderingContext.GEQUAL;
  web_gl.GREATER = web_gl.RenderingContext.GREATER;
  web_gl.GREEN_BITS = web_gl.RenderingContext.GREEN_BITS;
  web_gl.OesTextureHalfFloat = class OesTextureHalfFloat extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureHalfFloat, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloat, [])}),
    sfields: () => ({HALF_FLOAT_OES: core.int})
  });
  web_gl.OesTextureHalfFloat.HALF_FLOAT_OES = 36193;
  dart.registerExtension(dart.global.OESTextureHalfFloat, web_gl.OesTextureHalfFloat);
  web_gl.HALF_FLOAT_OES = web_gl.OesTextureHalfFloat.HALF_FLOAT_OES;
  web_gl.HIGH_FLOAT = web_gl.RenderingContext.HIGH_FLOAT;
  web_gl.HIGH_INT = web_gl.RenderingContext.HIGH_INT;
  web_gl.INCR = web_gl.RenderingContext.INCR;
  web_gl.INCR_WRAP = web_gl.RenderingContext.INCR_WRAP;
  web_gl.INT = web_gl.RenderingContext.INT;
  web_gl.INT_VEC2 = web_gl.RenderingContext.INT_VEC2;
  web_gl.INT_VEC3 = web_gl.RenderingContext.INT_VEC3;
  web_gl.INT_VEC4 = web_gl.RenderingContext.INT_VEC4;
  web_gl.INVALID_ENUM = web_gl.RenderingContext.INVALID_ENUM;
  web_gl.INVALID_FRAMEBUFFER_OPERATION = web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
  web_gl.INVALID_OPERATION = web_gl.RenderingContext.INVALID_OPERATION;
  web_gl.INVALID_VALUE = web_gl.RenderingContext.INVALID_VALUE;
  web_gl.INVERT = web_gl.RenderingContext.INVERT;
  web_gl.KEEP = web_gl.RenderingContext.KEEP;
  web_gl.LEQUAL = web_gl.RenderingContext.LEQUAL;
  web_gl.LESS = web_gl.RenderingContext.LESS;
  web_gl.LINEAR = web_gl.RenderingContext.LINEAR;
  web_gl.LINEAR_MIPMAP_LINEAR = web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR;
  web_gl.LINEAR_MIPMAP_NEAREST = web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST;
  web_gl.LINES = web_gl.RenderingContext.LINES;
  web_gl.LINE_LOOP = web_gl.RenderingContext.LINE_LOOP;
  web_gl.LINE_STRIP = web_gl.RenderingContext.LINE_STRIP;
  web_gl.LINE_WIDTH = web_gl.RenderingContext.LINE_WIDTH;
  web_gl.LINK_STATUS = web_gl.RenderingContext.LINK_STATUS;
  web_gl.LOW_FLOAT = web_gl.RenderingContext.LOW_FLOAT;
  web_gl.LOW_INT = web_gl.RenderingContext.LOW_INT;
  web_gl.LUMINANCE = web_gl.RenderingContext.LUMINANCE;
  web_gl.LUMINANCE_ALPHA = web_gl.RenderingContext.LUMINANCE_ALPHA;
  web_gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
  web_gl.MAX_CUBE_MAP_TEXTURE_SIZE = web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
  web_gl.MAX_FRAGMENT_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
  web_gl.MAX_RENDERBUFFER_SIZE = web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE;
  web_gl.MAX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
  web_gl.MAX_TEXTURE_SIZE = web_gl.RenderingContext.MAX_TEXTURE_SIZE;
  web_gl.MAX_VARYING_VECTORS = web_gl.RenderingContext.MAX_VARYING_VECTORS;
  web_gl.MAX_VERTEX_ATTRIBS = web_gl.RenderingContext.MAX_VERTEX_ATTRIBS;
  web_gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
  web_gl.MAX_VERTEX_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
  web_gl.MAX_VIEWPORT_DIMS = web_gl.RenderingContext.MAX_VIEWPORT_DIMS;
  web_gl.MEDIUM_FLOAT = web_gl.RenderingContext.MEDIUM_FLOAT;
  web_gl.MEDIUM_INT = web_gl.RenderingContext.MEDIUM_INT;
  web_gl.MIRRORED_REPEAT = web_gl.RenderingContext.MIRRORED_REPEAT;
  web_gl.NEAREST = web_gl.RenderingContext.NEAREST;
  web_gl.NEAREST_MIPMAP_LINEAR = web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR;
  web_gl.NEAREST_MIPMAP_NEAREST = web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST;
  web_gl.NEVER = web_gl.RenderingContext.NEVER;
  web_gl.NICEST = web_gl.RenderingContext.NICEST;
  web_gl.NONE = web_gl.RenderingContext.NONE;
  web_gl.NOTEQUAL = web_gl.RenderingContext.NOTEQUAL;
  web_gl.NO_ERROR = web_gl.RenderingContext.NO_ERROR;
  web_gl.ONE = web_gl.RenderingContext.ONE;
  web_gl.ONE_MINUS_CONSTANT_ALPHA = web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
  web_gl.ONE_MINUS_CONSTANT_COLOR = web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR;
  web_gl.ONE_MINUS_DST_ALPHA = web_gl.RenderingContext.ONE_MINUS_DST_ALPHA;
  web_gl.ONE_MINUS_DST_COLOR = web_gl.RenderingContext.ONE_MINUS_DST_COLOR;
  web_gl.ONE_MINUS_SRC_ALPHA = web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA;
  web_gl.ONE_MINUS_SRC_COLOR = web_gl.RenderingContext.ONE_MINUS_SRC_COLOR;
  web_gl.OUT_OF_MEMORY = web_gl.RenderingContext.OUT_OF_MEMORY;
  web_gl.PACK_ALIGNMENT = web_gl.RenderingContext.PACK_ALIGNMENT;
  web_gl.POINTS = web_gl.RenderingContext.POINTS;
  web_gl.POLYGON_OFFSET_FACTOR = web_gl.RenderingContext.POLYGON_OFFSET_FACTOR;
  web_gl.POLYGON_OFFSET_FILL = web_gl.RenderingContext.POLYGON_OFFSET_FILL;
  web_gl.POLYGON_OFFSET_UNITS = web_gl.RenderingContext.POLYGON_OFFSET_UNITS;
  web_gl.RED_BITS = web_gl.RenderingContext.RED_BITS;
  web_gl.RENDERBUFFER = web_gl.RenderingContext.RENDERBUFFER;
  web_gl.RENDERBUFFER_ALPHA_SIZE = web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE;
  web_gl.RENDERBUFFER_BINDING = web_gl.RenderingContext.RENDERBUFFER_BINDING;
  web_gl.RENDERBUFFER_BLUE_SIZE = web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE;
  web_gl.RENDERBUFFER_DEPTH_SIZE = web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE;
  web_gl.RENDERBUFFER_GREEN_SIZE = web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE;
  web_gl.RENDERBUFFER_HEIGHT = web_gl.RenderingContext.RENDERBUFFER_HEIGHT;
  web_gl.RENDERBUFFER_INTERNAL_FORMAT = web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
  web_gl.RENDERBUFFER_RED_SIZE = web_gl.RenderingContext.RENDERBUFFER_RED_SIZE;
  web_gl.RENDERBUFFER_STENCIL_SIZE = web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE;
  web_gl.RENDERBUFFER_WIDTH = web_gl.RenderingContext.RENDERBUFFER_WIDTH;
  web_gl.RENDERER = web_gl.RenderingContext.RENDERER;
  web_gl.REPEAT = web_gl.RenderingContext.REPEAT;
  web_gl.REPLACE = web_gl.RenderingContext.REPLACE;
  web_gl.RGB = web_gl.RenderingContext.RGB;
  web_gl.RGB565 = web_gl.RenderingContext.RGB565;
  web_gl.RGB5_A1 = web_gl.RenderingContext.RGB5_A1;
  web_gl.RGBA = web_gl.RenderingContext.RGBA;
  web_gl.RGBA4 = web_gl.RenderingContext.RGBA4;
  web_gl.SAMPLER_2D = web_gl.RenderingContext.SAMPLER_2D;
  web_gl.SAMPLER_CUBE = web_gl.RenderingContext.SAMPLER_CUBE;
  web_gl.SAMPLES = web_gl.RenderingContext.SAMPLES;
  web_gl.SAMPLE_ALPHA_TO_COVERAGE = web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
  web_gl.SAMPLE_BUFFERS = web_gl.RenderingContext.SAMPLE_BUFFERS;
  web_gl.SAMPLE_COVERAGE = web_gl.RenderingContext.SAMPLE_COVERAGE;
  web_gl.SAMPLE_COVERAGE_INVERT = web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT;
  web_gl.SAMPLE_COVERAGE_VALUE = web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE;
  web_gl.SCISSOR_BOX = web_gl.RenderingContext.SCISSOR_BOX;
  web_gl.SCISSOR_TEST = web_gl.RenderingContext.SCISSOR_TEST;
  web_gl.SHADER_TYPE = web_gl.RenderingContext.SHADER_TYPE;
  web_gl.SHADING_LANGUAGE_VERSION = web_gl.RenderingContext.SHADING_LANGUAGE_VERSION;
  web_gl.SHORT = web_gl.RenderingContext.SHORT;
  web_gl.SRC_ALPHA = web_gl.RenderingContext.SRC_ALPHA;
  web_gl.SRC_ALPHA_SATURATE = web_gl.RenderingContext.SRC_ALPHA_SATURATE;
  web_gl.SRC_COLOR = web_gl.RenderingContext.SRC_COLOR;
  web_gl.STATIC_DRAW = web_gl.RenderingContext.STATIC_DRAW;
  web_gl.STENCIL_ATTACHMENT = web_gl.RenderingContext.STENCIL_ATTACHMENT;
  web_gl.STENCIL_BACK_FAIL = web_gl.RenderingContext.STENCIL_BACK_FAIL;
  web_gl.STENCIL_BACK_FUNC = web_gl.RenderingContext.STENCIL_BACK_FUNC;
  web_gl.STENCIL_BACK_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
  web_gl.STENCIL_BACK_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
  web_gl.STENCIL_BACK_REF = web_gl.RenderingContext.STENCIL_BACK_REF;
  web_gl.STENCIL_BACK_VALUE_MASK = web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK;
  web_gl.STENCIL_BACK_WRITEMASK = web_gl.RenderingContext.STENCIL_BACK_WRITEMASK;
  web_gl.STENCIL_BITS = web_gl.RenderingContext.STENCIL_BITS;
  web_gl.STENCIL_BUFFER_BIT = web_gl.RenderingContext.STENCIL_BUFFER_BIT;
  web_gl.STENCIL_CLEAR_VALUE = web_gl.RenderingContext.STENCIL_CLEAR_VALUE;
  web_gl.STENCIL_FAIL = web_gl.RenderingContext.STENCIL_FAIL;
  web_gl.STENCIL_FUNC = web_gl.RenderingContext.STENCIL_FUNC;
  web_gl.STENCIL_INDEX = web_gl.RenderingContext.STENCIL_INDEX;
  web_gl.STENCIL_INDEX8 = web_gl.RenderingContext.STENCIL_INDEX8;
  web_gl.STENCIL_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL;
  web_gl.STENCIL_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS;
  web_gl.STENCIL_REF = web_gl.RenderingContext.STENCIL_REF;
  web_gl.STENCIL_TEST = web_gl.RenderingContext.STENCIL_TEST;
  web_gl.STENCIL_VALUE_MASK = web_gl.RenderingContext.STENCIL_VALUE_MASK;
  web_gl.STENCIL_WRITEMASK = web_gl.RenderingContext.STENCIL_WRITEMASK;
  web_gl.STREAM_DRAW = web_gl.RenderingContext.STREAM_DRAW;
  web_gl.SUBPIXEL_BITS = web_gl.RenderingContext.SUBPIXEL_BITS;
  web_gl.TEXTURE = web_gl.RenderingContext.TEXTURE;
  web_gl.TEXTURE0 = web_gl.RenderingContext.TEXTURE0;
  web_gl.TEXTURE1 = web_gl.RenderingContext.TEXTURE1;
  web_gl.TEXTURE10 = web_gl.RenderingContext.TEXTURE10;
  web_gl.TEXTURE11 = web_gl.RenderingContext.TEXTURE11;
  web_gl.TEXTURE12 = web_gl.RenderingContext.TEXTURE12;
  web_gl.TEXTURE13 = web_gl.RenderingContext.TEXTURE13;
  web_gl.TEXTURE14 = web_gl.RenderingContext.TEXTURE14;
  web_gl.TEXTURE15 = web_gl.RenderingContext.TEXTURE15;
  web_gl.TEXTURE16 = web_gl.RenderingContext.TEXTURE16;
  web_gl.TEXTURE17 = web_gl.RenderingContext.TEXTURE17;
  web_gl.TEXTURE18 = web_gl.RenderingContext.TEXTURE18;
  web_gl.TEXTURE19 = web_gl.RenderingContext.TEXTURE19;
  web_gl.TEXTURE2 = web_gl.RenderingContext.TEXTURE2;
  web_gl.TEXTURE20 = web_gl.RenderingContext.TEXTURE20;
  web_gl.TEXTURE21 = web_gl.RenderingContext.TEXTURE21;
  web_gl.TEXTURE22 = web_gl.RenderingContext.TEXTURE22;
  web_gl.TEXTURE23 = web_gl.RenderingContext.TEXTURE23;
  web_gl.TEXTURE24 = web_gl.RenderingContext.TEXTURE24;
  web_gl.TEXTURE25 = web_gl.RenderingContext.TEXTURE25;
  web_gl.TEXTURE26 = web_gl.RenderingContext.TEXTURE26;
  web_gl.TEXTURE27 = web_gl.RenderingContext.TEXTURE27;
  web_gl.TEXTURE28 = web_gl.RenderingContext.TEXTURE28;
  web_gl.TEXTURE29 = web_gl.RenderingContext.TEXTURE29;
  web_gl.TEXTURE3 = web_gl.RenderingContext.TEXTURE3;
  web_gl.TEXTURE30 = web_gl.RenderingContext.TEXTURE30;
  web_gl.TEXTURE31 = web_gl.RenderingContext.TEXTURE31;
  web_gl.TEXTURE4 = web_gl.RenderingContext.TEXTURE4;
  web_gl.TEXTURE5 = web_gl.RenderingContext.TEXTURE5;
  web_gl.TEXTURE6 = web_gl.RenderingContext.TEXTURE6;
  web_gl.TEXTURE7 = web_gl.RenderingContext.TEXTURE7;
  web_gl.TEXTURE8 = web_gl.RenderingContext.TEXTURE8;
  web_gl.TEXTURE9 = web_gl.RenderingContext.TEXTURE9;
  web_gl.TEXTURE_2D = web_gl.RenderingContext.TEXTURE_2D;
  web_gl.TEXTURE_BINDING_2D = web_gl.RenderingContext.TEXTURE_BINDING_2D;
  web_gl.TEXTURE_BINDING_CUBE_MAP = web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP;
  web_gl.TEXTURE_CUBE_MAP = web_gl.RenderingContext.TEXTURE_CUBE_MAP;
  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
  web_gl.TEXTURE_CUBE_MAP_POSITIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
  web_gl.TEXTURE_CUBE_MAP_POSITIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
  web_gl.TEXTURE_CUBE_MAP_POSITIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
  web_gl.TEXTURE_MAG_FILTER = web_gl.RenderingContext.TEXTURE_MAG_FILTER;
  web_gl.TEXTURE_MIN_FILTER = web_gl.RenderingContext.TEXTURE_MIN_FILTER;
  web_gl.TEXTURE_WRAP_S = web_gl.RenderingContext.TEXTURE_WRAP_S;
  web_gl.TEXTURE_WRAP_T = web_gl.RenderingContext.TEXTURE_WRAP_T;
  web_gl.TRIANGLES = web_gl.RenderingContext.TRIANGLES;
  web_gl.TRIANGLE_FAN = web_gl.RenderingContext.TRIANGLE_FAN;
  web_gl.TRIANGLE_STRIP = web_gl.RenderingContext.TRIANGLE_STRIP;
  web_gl.UNPACK_ALIGNMENT = web_gl.RenderingContext.UNPACK_ALIGNMENT;
  web_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL = web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
  web_gl.UNPACK_FLIP_Y_WEBGL = web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL;
  web_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL = web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
  web_gl.UNSIGNED_BYTE = web_gl.RenderingContext.UNSIGNED_BYTE;
  web_gl.UNSIGNED_INT = web_gl.RenderingContext.UNSIGNED_INT;
  web_gl.UNSIGNED_SHORT = web_gl.RenderingContext.UNSIGNED_SHORT;
  web_gl.UNSIGNED_SHORT_4_4_4_4 = web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4;
  web_gl.UNSIGNED_SHORT_5_5_5_1 = web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1;
  web_gl.UNSIGNED_SHORT_5_6_5 = web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5;
  web_gl.VALIDATE_STATUS = web_gl.RenderingContext.VALIDATE_STATUS;
  web_gl.VENDOR = web_gl.RenderingContext.VENDOR;
  web_gl.VERSION = web_gl.RenderingContext.VERSION;
  web_gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
  web_gl.VERTEX_ATTRIB_ARRAY_ENABLED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
  web_gl.VERTEX_ATTRIB_ARRAY_NORMALIZED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
  web_gl.VERTEX_ATTRIB_ARRAY_POINTER = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
  web_gl.VERTEX_ATTRIB_ARRAY_SIZE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
  web_gl.VERTEX_ATTRIB_ARRAY_STRIDE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
  web_gl.VERTEX_ATTRIB_ARRAY_TYPE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
  web_gl.VERTEX_SHADER = web_gl.RenderingContext.VERTEX_SHADER;
  web_gl.VIEWPORT = web_gl.RenderingContext.VIEWPORT;
  web_gl.ZERO = web_gl.RenderingContext.ZERO;
  dart.defineExtensionNames([
    'name',
    'size',
    'type'
  ]);
  web_gl.ActiveInfo = class ActiveInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.name]() {
      return this.name;
    }
    get [dartx.size]() {
      return this.size;
    }
    get [dartx.type]() {
      return this.type;
    }
  };
  dart.setSignature(web_gl.ActiveInfo, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ActiveInfo, [])}),
    fields: () => ({
      [dartx.name]: core.String,
      [dartx.size]: core.int,
      [dartx.type]: core.int
    })
  });
  dart.registerExtension(dart.global.WebGLActiveInfo, web_gl.ActiveInfo);
  dart.defineExtensionNames([
    'drawArraysInstancedAngle',
    'drawElementsInstancedAngle',
    'vertexAttribDivisorAngle'
  ]);
  web_gl.AngleInstancedArrays = class AngleInstancedArrays extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.drawArraysInstancedAngle](...args) {
      return this.drawArraysInstancedANGLE.apply(this, args);
    }
    [dartx.drawElementsInstancedAngle](...args) {
      return this.drawElementsInstancedANGLE.apply(this, args);
    }
    [dartx.vertexAttribDivisorAngle](...args) {
      return this.vertexAttribDivisorANGLE.apply(this, args);
    }
  };
  dart.setSignature(web_gl.AngleInstancedArrays, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.AngleInstancedArrays, [])}),
    methods: () => ({
      [dartx.drawArraysInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
      [dartx.drawElementsInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
      [dartx.vertexAttribDivisorAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int])
    }),
    sfields: () => ({VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: core.int})
  });
  web_gl.AngleInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 35070;
  dart.registerExtension(dart.global.ANGLEInstancedArrays, web_gl.AngleInstancedArrays);
  web_gl.Buffer = class Buffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Buffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Buffer, [])})
  });
  dart.registerExtension(dart.global.WebGLBuffer, web_gl.Buffer);
  web_gl.CompressedTextureAtc = class CompressedTextureAtc extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTextureAtc, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureAtc, [])}),
    sfields: () => ({
      COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: core.int,
      COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: core.int,
      COMPRESSED_RGB_ATC_WEBGL: core.int
    })
  });
  web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 35987;
  web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 34798;
  web_gl.CompressedTextureAtc.COMPRESSED_RGB_ATC_WEBGL = 35986;
  dart.registerExtension(dart.global.WebGLCompressedTextureATC, web_gl.CompressedTextureAtc);
  web_gl.CompressedTextureETC1 = class CompressedTextureETC1 extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTextureETC1, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureETC1, [])}),
    sfields: () => ({COMPRESSED_RGB_ETC1_WEBGL: core.int})
  });
  web_gl.CompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL = 36196;
  dart.registerExtension(dart.global.WebGLCompressedTextureETC1, web_gl.CompressedTextureETC1);
  web_gl.CompressedTexturePvrtc = class CompressedTexturePvrtc extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTexturePvrtc, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTexturePvrtc, [])}),
    sfields: () => ({
      COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: core.int,
      COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: core.int,
      COMPRESSED_RGB_PVRTC_2BPPV1_IMG: core.int,
      COMPRESSED_RGB_PVRTC_4BPPV1_IMG: core.int
    })
  });
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 35843;
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842;
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 35841;
  web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840;
  dart.registerExtension(dart.global.WebGLCompressedTexturePVRTC, web_gl.CompressedTexturePvrtc);
  web_gl.CompressedTextureS3TC = class CompressedTextureS3TC extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.CompressedTextureS3TC, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureS3TC, [])}),
    sfields: () => ({
      COMPRESSED_RGBA_S3TC_DXT1_EXT: core.int,
      COMPRESSED_RGBA_S3TC_DXT3_EXT: core.int,
      COMPRESSED_RGBA_S3TC_DXT5_EXT: core.int,
      COMPRESSED_RGB_S3TC_DXT1_EXT: core.int
    })
  });
  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777;
  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778;
  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779;
  web_gl.CompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776;
  dart.registerExtension(dart.global.WebGLCompressedTextureS3TC, web_gl.CompressedTextureS3TC);
  dart.defineExtensionNames([
    'alpha',
    'antialias',
    'depth',
    'failIfMajorPerformanceCaveat',
    'premultipliedAlpha',
    'preserveDrawingBuffer',
    'stencil'
  ]);
  web_gl.ContextAttributes = class ContextAttributes extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.alpha]() {
      return this.alpha;
    }
    set [dartx.alpha](value) {
      this.alpha = value;
    }
    get [dartx.antialias]() {
      return this.antialias;
    }
    set [dartx.antialias](value) {
      this.antialias = value;
    }
    get [dartx.depth]() {
      return this.depth;
    }
    set [dartx.depth](value) {
      this.depth = value;
    }
    get [dartx.failIfMajorPerformanceCaveat]() {
      return this.failIfMajorPerformanceCaveat;
    }
    set [dartx.failIfMajorPerformanceCaveat](value) {
      this.failIfMajorPerformanceCaveat = value;
    }
    get [dartx.premultipliedAlpha]() {
      return this.premultipliedAlpha;
    }
    set [dartx.premultipliedAlpha](value) {
      this.premultipliedAlpha = value;
    }
    get [dartx.preserveDrawingBuffer]() {
      return this.preserveDrawingBuffer;
    }
    set [dartx.preserveDrawingBuffer](value) {
      this.preserveDrawingBuffer = value;
    }
    get [dartx.stencil]() {
      return this.stencil;
    }
    set [dartx.stencil](value) {
      this.stencil = value;
    }
  };
  dart.setSignature(web_gl.ContextAttributes, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextAttributes, [])}),
    fields: () => ({
      [dartx.alpha]: core.bool,
      [dartx.antialias]: core.bool,
      [dartx.depth]: core.bool,
      [dartx.failIfMajorPerformanceCaveat]: core.bool,
      [dartx.premultipliedAlpha]: core.bool,
      [dartx.preserveDrawingBuffer]: core.bool,
      [dartx.stencil]: core.bool
    })
  });
  dart.registerExtension(dart.global.WebGLContextAttributes, web_gl.ContextAttributes);
  dart.defineExtensionNames([
    'statusMessage'
  ]);
  web_gl.ContextEvent = class ContextEvent extends html$.Event {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.statusMessage]() {
      return this.statusMessage;
    }
  };
  dart.setSignature(web_gl.ContextEvent, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextEvent, [])}),
    fields: () => ({[dartx.statusMessage]: core.String})
  });
  dart.registerExtension(dart.global.WebGLContextEvent, web_gl.ContextEvent);
  web_gl.DebugRendererInfo = class DebugRendererInfo extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.DebugRendererInfo, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugRendererInfo, [])}),
    sfields: () => ({
      UNMASKED_RENDERER_WEBGL: core.int,
      UNMASKED_VENDOR_WEBGL: core.int
    })
  });
  web_gl.DebugRendererInfo.UNMASKED_RENDERER_WEBGL = 37446;
  web_gl.DebugRendererInfo.UNMASKED_VENDOR_WEBGL = 37445;
  dart.registerExtension(dart.global.WebGLDebugRendererInfo, web_gl.DebugRendererInfo);
  dart.defineExtensionNames([
    'getTranslatedShaderSource'
  ]);
  web_gl.DebugShaders = class DebugShaders extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.getTranslatedShaderSource](...args) {
      return this.getTranslatedShaderSource.apply(this, args);
    }
  };
  dart.setSignature(web_gl.DebugShaders, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugShaders, [])}),
    methods: () => ({[dartx.getTranslatedShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader])})
  });
  dart.registerExtension(dart.global.WebGLDebugShaders, web_gl.DebugShaders);
  web_gl.DepthTexture = class DepthTexture extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.DepthTexture, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DepthTexture, [])}),
    sfields: () => ({UNSIGNED_INT_24_8_WEBGL: core.int})
  });
  web_gl.DepthTexture.UNSIGNED_INT_24_8_WEBGL = 34042;
  dart.registerExtension(dart.global.WebGLDepthTexture, web_gl.DepthTexture);
  dart.defineExtensionNames([
    'drawBuffersWebgl'
  ]);
  web_gl.DrawBuffers = class DrawBuffers extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.drawBuffersWebgl](...args) {
      return this.drawBuffersWEBGL.apply(this, args);
    }
  };
  dart.setSignature(web_gl.DrawBuffers, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.DrawBuffers, [])}),
    methods: () => ({[dartx.drawBuffersWebgl]: dart.definiteFunctionType(dart.void, [ListOfint()])}),
    sfields: () => ({
      COLOR_ATTACHMENT0_WEBGL: core.int,
      COLOR_ATTACHMENT10_WEBGL: core.int,
      COLOR_ATTACHMENT11_WEBGL: core.int,
      COLOR_ATTACHMENT12_WEBGL: core.int,
      COLOR_ATTACHMENT13_WEBGL: core.int,
      COLOR_ATTACHMENT14_WEBGL: core.int,
      COLOR_ATTACHMENT15_WEBGL: core.int,
      COLOR_ATTACHMENT1_WEBGL: core.int,
      COLOR_ATTACHMENT2_WEBGL: core.int,
      COLOR_ATTACHMENT3_WEBGL: core.int,
      COLOR_ATTACHMENT4_WEBGL: core.int,
      COLOR_ATTACHMENT5_WEBGL: core.int,
      COLOR_ATTACHMENT6_WEBGL: core.int,
      COLOR_ATTACHMENT7_WEBGL: core.int,
      COLOR_ATTACHMENT8_WEBGL: core.int,
      COLOR_ATTACHMENT9_WEBGL: core.int,
      DRAW_BUFFER0_WEBGL: core.int,
      DRAW_BUFFER10_WEBGL: core.int,
      DRAW_BUFFER11_WEBGL: core.int,
      DRAW_BUFFER12_WEBGL: core.int,
      DRAW_BUFFER13_WEBGL: core.int,
      DRAW_BUFFER14_WEBGL: core.int,
      DRAW_BUFFER15_WEBGL: core.int,
      DRAW_BUFFER1_WEBGL: core.int,
      DRAW_BUFFER2_WEBGL: core.int,
      DRAW_BUFFER3_WEBGL: core.int,
      DRAW_BUFFER4_WEBGL: core.int,
      DRAW_BUFFER5_WEBGL: core.int,
      DRAW_BUFFER6_WEBGL: core.int,
      DRAW_BUFFER7_WEBGL: core.int,
      DRAW_BUFFER8_WEBGL: core.int,
      DRAW_BUFFER9_WEBGL: core.int,
      MAX_COLOR_ATTACHMENTS_WEBGL: core.int,
      MAX_DRAW_BUFFERS_WEBGL: core.int
    })
  });
  web_gl.DrawBuffers.COLOR_ATTACHMENT0_WEBGL = 36064;
  web_gl.DrawBuffers.COLOR_ATTACHMENT10_WEBGL = 36074;
  web_gl.DrawBuffers.COLOR_ATTACHMENT11_WEBGL = 36075;
  web_gl.DrawBuffers.COLOR_ATTACHMENT12_WEBGL = 36076;
  web_gl.DrawBuffers.COLOR_ATTACHMENT13_WEBGL = 36077;
  web_gl.DrawBuffers.COLOR_ATTACHMENT14_WEBGL = 36078;
  web_gl.DrawBuffers.COLOR_ATTACHMENT15_WEBGL = 36079;
  web_gl.DrawBuffers.COLOR_ATTACHMENT1_WEBGL = 36065;
  web_gl.DrawBuffers.COLOR_ATTACHMENT2_WEBGL = 36066;
  web_gl.DrawBuffers.COLOR_ATTACHMENT3_WEBGL = 36067;
  web_gl.DrawBuffers.COLOR_ATTACHMENT4_WEBGL = 36068;
  web_gl.DrawBuffers.COLOR_ATTACHMENT5_WEBGL = 36069;
  web_gl.DrawBuffers.COLOR_ATTACHMENT6_WEBGL = 36070;
  web_gl.DrawBuffers.COLOR_ATTACHMENT7_WEBGL = 36071;
  web_gl.DrawBuffers.COLOR_ATTACHMENT8_WEBGL = 36072;
  web_gl.DrawBuffers.COLOR_ATTACHMENT9_WEBGL = 36073;
  web_gl.DrawBuffers.DRAW_BUFFER0_WEBGL = 34853;
  web_gl.DrawBuffers.DRAW_BUFFER10_WEBGL = 34863;
  web_gl.DrawBuffers.DRAW_BUFFER11_WEBGL = 34864;
  web_gl.DrawBuffers.DRAW_BUFFER12_WEBGL = 34865;
  web_gl.DrawBuffers.DRAW_BUFFER13_WEBGL = 34866;
  web_gl.DrawBuffers.DRAW_BUFFER14_WEBGL = 34867;
  web_gl.DrawBuffers.DRAW_BUFFER15_WEBGL = 34868;
  web_gl.DrawBuffers.DRAW_BUFFER1_WEBGL = 34854;
  web_gl.DrawBuffers.DRAW_BUFFER2_WEBGL = 34855;
  web_gl.DrawBuffers.DRAW_BUFFER3_WEBGL = 34856;
  web_gl.DrawBuffers.DRAW_BUFFER4_WEBGL = 34857;
  web_gl.DrawBuffers.DRAW_BUFFER5_WEBGL = 34858;
  web_gl.DrawBuffers.DRAW_BUFFER6_WEBGL = 34859;
  web_gl.DrawBuffers.DRAW_BUFFER7_WEBGL = 34860;
  web_gl.DrawBuffers.DRAW_BUFFER8_WEBGL = 34861;
  web_gl.DrawBuffers.DRAW_BUFFER9_WEBGL = 34862;
  web_gl.DrawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL = 36063;
  web_gl.DrawBuffers.MAX_DRAW_BUFFERS_WEBGL = 34852;
  dart.registerExtension(dart.global.WebGLDrawBuffers, web_gl.DrawBuffers);
  web_gl.ExtBlendMinMax = class ExtBlendMinMax extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtBlendMinMax, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtBlendMinMax, [])}),
    sfields: () => ({
      MAX_EXT: core.int,
      MIN_EXT: core.int
    })
  });
  web_gl.ExtBlendMinMax.MAX_EXT = 32776;
  web_gl.ExtBlendMinMax.MIN_EXT = 32775;
  dart.registerExtension(dart.global.EXTBlendMinMax, web_gl.ExtBlendMinMax);
  web_gl.ExtFragDepth = class ExtFragDepth extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtFragDepth, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtFragDepth, [])})
  });
  dart.registerExtension(dart.global.EXTFragDepth, web_gl.ExtFragDepth);
  web_gl.ExtShaderTextureLod = class ExtShaderTextureLod extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtShaderTextureLod, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtShaderTextureLod, [])})
  });
  dart.registerExtension(dart.global.EXTShaderTextureLOD, web_gl.ExtShaderTextureLod);
  web_gl.ExtTextureFilterAnisotropic = class ExtTextureFilterAnisotropic extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.ExtTextureFilterAnisotropic, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtTextureFilterAnisotropic, [])}),
    sfields: () => ({
      MAX_TEXTURE_MAX_ANISOTROPY_EXT: core.int,
      TEXTURE_MAX_ANISOTROPY_EXT: core.int
    })
  });
  web_gl.ExtTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047;
  web_gl.ExtTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT = 34046;
  dart.registerExtension(dart.global.EXTTextureFilterAnisotropic, web_gl.ExtTextureFilterAnisotropic);
  web_gl.Framebuffer = class Framebuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Framebuffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Framebuffer, [])})
  });
  dart.registerExtension(dart.global.WebGLFramebuffer, web_gl.Framebuffer);
  dart.defineExtensionNames([
    'loseContext',
    'restoreContext'
  ]);
  web_gl.LoseContext = class LoseContext extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.loseContext](...args) {
      return this.loseContext.apply(this, args);
    }
    [dartx.restoreContext](...args) {
      return this.restoreContext.apply(this, args);
    }
  };
  dart.setSignature(web_gl.LoseContext, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.LoseContext, [])}),
    methods: () => ({
      [dartx.loseContext]: dart.definiteFunctionType(dart.void, []),
      [dartx.restoreContext]: dart.definiteFunctionType(dart.void, [])
    })
  });
  dart.registerExtension(dart.global.WebGLLoseContext, web_gl.LoseContext);
  dart.registerExtension(dart.global.WebGLExtensionLoseContext, web_gl.LoseContext);
  web_gl.OesElementIndexUint = class OesElementIndexUint extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesElementIndexUint, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesElementIndexUint, [])})
  });
  dart.registerExtension(dart.global.OESElementIndexUint, web_gl.OesElementIndexUint);
  web_gl.OesStandardDerivatives = class OesStandardDerivatives extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesStandardDerivatives, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesStandardDerivatives, [])}),
    sfields: () => ({FRAGMENT_SHADER_DERIVATIVE_HINT_OES: core.int})
  });
  web_gl.OesStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 35723;
  dart.registerExtension(dart.global.OESStandardDerivatives, web_gl.OesStandardDerivatives);
  web_gl.OesTextureFloat = class OesTextureFloat extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureFloat, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloat, [])})
  });
  dart.registerExtension(dart.global.OESTextureFloat, web_gl.OesTextureFloat);
  web_gl.OesTextureFloatLinear = class OesTextureFloatLinear extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureFloatLinear, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloatLinear, [])})
  });
  dart.registerExtension(dart.global.OESTextureFloatLinear, web_gl.OesTextureFloatLinear);
  web_gl.OesTextureHalfFloatLinear = class OesTextureHalfFloatLinear extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.OesTextureHalfFloatLinear, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloatLinear, [])})
  });
  dart.registerExtension(dart.global.OESTextureHalfFloatLinear, web_gl.OesTextureHalfFloatLinear);
  dart.defineExtensionNames([
    'bindVertexArray',
    'createVertexArray',
    'deleteVertexArray',
    'isVertexArray'
  ]);
  web_gl.OesVertexArrayObject = class OesVertexArrayObject extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.bindVertexArray](...args) {
      return this.bindVertexArrayOES.apply(this, args);
    }
    [dartx.createVertexArray](...args) {
      return this.createVertexArrayOES.apply(this, args);
    }
    [dartx.deleteVertexArray](...args) {
      return this.deleteVertexArrayOES.apply(this, args);
    }
    [dartx.isVertexArray](...args) {
      return this.isVertexArrayOES.apply(this, args);
    }
  };
  dart.setSignature(web_gl.OesVertexArrayObject, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesVertexArrayObject, [])}),
    methods: () => ({
      [dartx.bindVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
      [dartx.createVertexArray]: dart.definiteFunctionType(web_gl.VertexArrayObject, []),
      [dartx.deleteVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
      [dartx.isVertexArray]: dart.definiteFunctionType(core.bool, [web_gl.VertexArrayObject])
    }),
    sfields: () => ({VERTEX_ARRAY_BINDING_OES: core.int})
  });
  web_gl.OesVertexArrayObject.VERTEX_ARRAY_BINDING_OES = 34229;
  dart.registerExtension(dart.global.OESVertexArrayObject, web_gl.OesVertexArrayObject);
  web_gl.Program = class Program extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Program, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Program, [])})
  });
  dart.registerExtension(dart.global.WebGLProgram, web_gl.Program);
  web_gl.Renderbuffer = class Renderbuffer extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Renderbuffer, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Renderbuffer, [])})
  });
  dart.registerExtension(dart.global.WebGLRenderbuffer, web_gl.Renderbuffer);
  web_gl.Shader = class Shader extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Shader, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Shader, [])})
  });
  dart.registerExtension(dart.global.WebGLShader, web_gl.Shader);
  dart.defineExtensionNames([
    'precision',
    'rangeMax',
    'rangeMin'
  ]);
  web_gl.ShaderPrecisionFormat = class ShaderPrecisionFormat extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.precision]() {
      return this.precision;
    }
    get [dartx.rangeMax]() {
      return this.rangeMax;
    }
    get [dartx.rangeMin]() {
      return this.rangeMin;
    }
  };
  dart.setSignature(web_gl.ShaderPrecisionFormat, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [])}),
    fields: () => ({
      [dartx.precision]: core.int,
      [dartx.rangeMax]: core.int,
      [dartx.rangeMin]: core.int
    })
  });
  dart.registerExtension(dart.global.WebGLShaderPrecisionFormat, web_gl.ShaderPrecisionFormat);
  web_gl.Texture = class Texture extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.Texture, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.Texture, [])})
  });
  dart.registerExtension(dart.global.WebGLTexture, web_gl.Texture);
  web_gl.UniformLocation = class UniformLocation extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.UniformLocation, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.UniformLocation, [])})
  });
  dart.registerExtension(dart.global.WebGLUniformLocation, web_gl.UniformLocation);
  web_gl.VertexArrayObject = class VertexArrayObject extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl.VertexArrayObject, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl.VertexArrayObject, [])})
  });
  dart.registerExtension(dart.global.WebGLVertexArrayObjectOES, web_gl.VertexArrayObject);
  web_gl._WebGLRenderingContextBase = class _WebGLRenderingContextBase extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
  };
  dart.setSignature(web_gl._WebGLRenderingContextBase, {
    constructors: () => ({_: dart.definiteFunctionType(web_gl._WebGLRenderingContextBase, [])})
  });
  web_sql.SqlStatementCallback = dart.typedef('SqlStatementCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlResultSet]));
  web_sql.SqlStatementErrorCallback = dart.typedef('SqlStatementErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlError]));
  web_sql.SqlTransactionCallback = dart.typedef('SqlTransactionCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction]));
  web_sql.SqlTransactionErrorCallback = dart.typedef('SqlTransactionErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlError]));
  dart.defineExtensionNames([
    'changeVersion',
    'readTransaction',
    'transaction',
    'version'
  ]);
  web_sql.SqlDatabase = class SqlDatabase extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    static get supported() {
      return !!window.openDatabase;
    }
    get [dartx.version]() {
      return this.version;
    }
    [dartx.changeVersion](...args) {
      return this.changeVersion.apply(this, args);
    }
    [dartx.readTransaction](...args) {
      return this.readTransaction.apply(this, args);
    }
    [dartx.transaction](...args) {
      return this.transaction.apply(this, args);
    }
  };
  dart.setSignature(web_sql.SqlDatabase, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlDatabase, [])}),
    fields: () => ({[dartx.version]: core.String}),
    methods: () => ({
      [dartx.changeVersion]: dart.definiteFunctionType(dart.void, [core.String, core.String], [web_sql.SqlTransactionCallback, web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
      [dartx.readTransaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
      [dartx.transaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback])
    }),
    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
  });
  dart.registerExtension(dart.global.Database, web_sql.SqlDatabase);
  dart.defineExtensionNames([
    'code',
    'message'
  ]);
  web_sql.SqlError = class SqlError extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.code]() {
      return this.code;
    }
    get [dartx.message]() {
      return this.message;
    }
  };
  dart.setSignature(web_sql.SqlError, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlError, [])}),
    fields: () => ({
      [dartx.code]: core.int,
      [dartx.message]: core.String
    }),
    sfields: () => ({
      CONSTRAINT_ERR: core.int,
      DATABASE_ERR: core.int,
      QUOTA_ERR: core.int,
      SYNTAX_ERR: core.int,
      TIMEOUT_ERR: core.int,
      TOO_LARGE_ERR: core.int,
      UNKNOWN_ERR: core.int,
      VERSION_ERR: core.int
    })
  });
  web_sql.SqlError.CONSTRAINT_ERR = 6;
  web_sql.SqlError.DATABASE_ERR = 1;
  web_sql.SqlError.QUOTA_ERR = 4;
  web_sql.SqlError.SYNTAX_ERR = 5;
  web_sql.SqlError.TIMEOUT_ERR = 7;
  web_sql.SqlError.TOO_LARGE_ERR = 3;
  web_sql.SqlError.UNKNOWN_ERR = 0;
  web_sql.SqlError.VERSION_ERR = 2;
  dart.registerExtension(dart.global.SQLError, web_sql.SqlError);
  dart.defineExtensionNames([
    'insertId',
    'rows',
    'rowsAffected'
  ]);
  web_sql.SqlResultSet = class SqlResultSet extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.insertId]() {
      return this.insertId;
    }
    get [dartx.rows]() {
      return this.rows;
    }
    get [dartx.rowsAffected]() {
      return this.rowsAffected;
    }
  };
  dart.setSignature(web_sql.SqlResultSet, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSet, [])}),
    fields: () => ({
      [dartx.insertId]: core.int,
      [dartx.rows]: web_sql.SqlResultSetRowList,
      [dartx.rowsAffected]: core.int
    })
  });
  dart.registerExtension(dart.global.SQLResultSet, web_sql.SqlResultSet);
  const _item_1 = Symbol('_item_1');
  dart.defineExtensionNames([
    'length',
    '_get',
    '_set',
    'length',
    'first',
    'last',
    'single',
    'elementAt',
    'item'
  ]);
  web_sql.SqlResultSetRowList = class SqlResultSetRowList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.Map), html$.ImmutableListMixin$(core.Map)) {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    get [dartx.length]() {
      return this.length;
    }
    [dartx._get](index) {
      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
      return this[dartx.item](index);
    }
    [dartx._set](index, value) {
      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
      return value;
    }
    set [dartx.length](value) {
      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
    }
    get [dartx.first]() {
      if (dart.notNull(this[dartx.length]) > 0) {
        return this[0];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.last]() {
      let len = this[dartx.length];
      if (dart.notNull(len) > 0) {
        return this[dart.notNull(len) - 1];
      }
      dart.throw(new core.StateError("No elements"));
    }
    get [dartx.single]() {
      let len = this[dartx.length];
      if (len == 1) {
        return this[0];
      }
      if (len == 0) dart.throw(new core.StateError("No elements"));
      dart.throw(new core.StateError("More than one element"));
    }
    [dartx.elementAt](index) {
      return this[dartx._get](index);
    }
    [dartx.item](index) {
      return html_common.convertNativeToDart_Dictionary(this[_item_1](index));
    }
    [_item_1](...args) {
      return this.item.apply(this, args);
    }
  };
  web_sql.SqlResultSetRowList[dart.implements] = () => [ListOfMap()];
  dart.setSignature(web_sql.SqlResultSetRowList, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSetRowList, [])}),
    getters: () => ({
      [dartx.length]: dart.definiteFunctionType(core.int, []),
      [dartx.first]: dart.definiteFunctionType(core.Map, []),
      [dartx.last]: dart.definiteFunctionType(core.Map, []),
      [dartx.single]: dart.definiteFunctionType(core.Map, [])
    }),
    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      [dartx._get]: dart.definiteFunctionType(core.Map, [core.int]),
      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.Map]),
      [dartx.elementAt]: dart.definiteFunctionType(core.Map, [core.int]),
      [dartx.item]: dart.definiteFunctionType(core.Map, [core.int]),
      [_item_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
    })
  });
  dart.registerExtension(dart.global.SQLResultSetRowList, web_sql.SqlResultSetRowList);
  dart.defineExtensionNames([
    'executeSql'
  ]);
  web_sql.SqlTransaction = class SqlTransaction extends _interceptors.Interceptor {
    static _() {
      dart.throw(new core.UnsupportedError("Not supported"));
    }
    [dartx.executeSql](...args) {
      return this.executeSql.apply(this, args);
    }
  };
  dart.setSignature(web_sql.SqlTransaction, {
    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlTransaction, [])}),
    methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
  });
  dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
  // Exports:
  return {
    dart: dart,
    dartx: dartx,
    _debugger: _debugger,
    _foreign_helper: _foreign_helper,
    _interceptors: _interceptors,
    _internal: _internal,
    _isolate_helper: _isolate_helper,
    _js_embedded_names: _js_embedded_names,
    _js_helper: _js_helper,
    _js_mirrors: _js_mirrors,
    _js_primitives: _js_primitives,
    _metadata: _metadata,
    _native_typed_data: _native_typed_data,
    async: async,
    collection: collection,
    convert: convert,
    core: core,
    developer: developer,
    isolate: isolate,
    js: js,
    js_util: js_util,
    math: math,
    mirrors: mirrors,
    typed_data: typed_data,
    indexed_db: indexed_db,
    html: html$,
    html_common: html_common,
    svg: svg$,
    web_audio: web_audio,
    web_gl: web_gl,
    web_sql: web_sql
  };
});
