export const dart = Object.create(null);
export const dartx = Object.create(null);
export const _debugger = Object.create(null);
export const _foreign_helper = Object.create(null);
export const _interceptors = Object.create(null);
export const _internal = Object.create(null);
export const _isolate_helper = Object.create(null);
export const _js_embedded_names = Object.create(null);
export const _js_helper = Object.create(null);
export const _js_mirrors = Object.create(null);
export const _js_primitives = Object.create(null);
export const _metadata = Object.create(null);
export const _native_typed_data = Object.create(null);
export const async = Object.create(null);
export const collection = Object.create(null);
export const convert = Object.create(null);
export const core = Object.create(null);
export const developer = Object.create(null);
export const io = Object.create(null);
export const isolate = Object.create(null);
export const js = Object.create(null);
export const js_util = Object.create(null);
export const math = Object.create(null);
export const mirrors = Object.create(null);
export const typed_data = Object.create(null);
export const indexed_db = Object.create(null);
export const html = Object.create(null);
export const html_common = Object.create(null);
export const svg = Object.create(null);
export const web_audio = Object.create(null);
export const web_gl = Object.create(null);
export 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 FutureOr = () => (FutureOr = dart.constFn(async.FutureOr$()))();
let dynamicToFutureOr = () => (dynamicToFutureOr = dart.constFn(dart.functionType(async.FutureOr, [dart.dynamic])))();
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 ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
let ListOfFileSystemEntityType = () => (ListOfFileSystemEntityType = dart.constFn(core.List$(io.FileSystemEntityType)))();
let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
let JSArrayOf_Credentials = () => (JSArrayOf_Credentials = dart.constFn(_interceptors.JSArray$(io._Credentials)))();
let JSArrayOf_ProxyCredentials = () => (JSArrayOf_ProxyCredentials = dart.constFn(_interceptors.JSArray$(io._ProxyCredentials)))();
let FutureOf_HttpClientRequest = () => (FutureOf_HttpClientRequest = dart.constFn(async.Future$(io._HttpClientRequest)))();
let FutureOrOf_HttpClientRequest = () => (FutureOrOf_HttpClientRequest = dart.constFn(async.FutureOr$(io._HttpClientRequest)))();
let X509CertificateAndStringAndintTobool = () => (X509CertificateAndStringAndintTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate, core.String, core.int])))();
let FutureOfbool = () => (FutureOfbool = dart.constFn(async.Future$(core.bool)))();
let UriAndStringAndStringToFutureOfbool = () => (UriAndStringAndStringToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.Uri, core.String, core.String])))();
let StringAndintAndString__ToFutureOfbool = () => (StringAndintAndString__ToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.String, core.int, core.String, core.String])))();
let UriToString = () => (UriToString = dart.constFn(dart.functionType(core.String, [core.Uri])))();
let MapOfString$_ConnectionTarget = () => (MapOfString$_ConnectionTarget = dart.constFn(core.Map$(core.String, io._ConnectionTarget)))();
let ListOf_Credentials = () => (ListOf_Credentials = dart.constFn(core.List$(io._Credentials)))();
let ListOf_ProxyCredentials = () => (ListOf_ProxyCredentials = dart.constFn(core.List$(io._ProxyCredentials)))();
let MapOfint$_HttpConnection = () => (MapOfint$_HttpConnection = dart.constFn(core.Map$(core.int, io._HttpConnection)))();
let HashMapOfint$_HttpConnection = () => (HashMapOfint$_HttpConnection = dart.constFn(collection.HashMap$(core.int, io._HttpConnection)))();
let LinkedListOf_HttpConnection = () => (LinkedListOf_HttpConnection = dart.constFn(collection.LinkedList$(io._HttpConnection)))();
let StreamControllerOfHttpRequest = () => (StreamControllerOfHttpRequest = dart.constFn(async.StreamController$(io.HttpRequest)))();
let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
let ListOfbool = () => (ListOfbool = dart.constFn(core.List$(core.bool)))();
let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
let ListOfMapOfString$String = () => (ListOfMapOfString$String = dart.constFn(core.List$(MapOfString$String())))();
let FutureOfServiceExtensionResponse = () => (FutureOfServiceExtensionResponse = dart.constFn(async.Future$(developer.ServiceExtensionResponse)))();
let MapOfint$_FileResourceInfo = () => (MapOfint$_FileResourceInfo = dart.constFn(core.Map$(core.int, io._FileResourceInfo)))();
let MapOfint$_ProcessResourceInfo = () => (MapOfint$_ProcessResourceInfo = dart.constFn(core.Map$(core.int, io._ProcessResourceInfo)))();
let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
let X509CertificateTodynamic = () => (X509CertificateTodynamic = dart.constFn(dart.functionType(dart.dynamic, [io.X509Certificate])))();
let intToListOfint = () => (intToListOfint = dart.constFn(dart.functionType(ListOfint(), [core.int])))();
let StreamOfRawSocket = () => (StreamOfRawSocket = dart.constFn(async.Stream$(io.RawSocket)))();
let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
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 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 EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html.EventStreamProvider$(html.SecurityPolicyViolationEvent)))();
let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html.StyleSheet)))();
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 dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
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 _wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = () => (_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = dart.constFn(html._wrapZoneBinaryCallback$(ListOfMutationRecord(), html.MutationObserver, dart.void)))();
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 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 _EventStreamOfBeforeUnloadEvent = () => (_EventStreamOfBeforeUnloadEvent = dart.constFn(html._EventStream$(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 VoidToFunctionType = () => (VoidToFunctionType = dart.constFn(dart.definiteFunctionType(dart.FunctionType, [])))();
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 intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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 dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
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 dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
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 VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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 SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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 FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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 = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = 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 StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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 StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
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 dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
let dynamicTo_Directory = () => (dynamicTo_Directory = dart.constFn(dart.definiteFunctionType(io._Directory, [dart.dynamic])))();
let dynamicToDirectory = () => (dynamicToDirectory = dart.constFn(dart.definiteFunctionType(io.Directory, [dart.dynamic])))();
let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
let dynamicToFutureOfHttpClientResponse = () => (dynamicToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [dart.dynamic])))();
let VoidToFutureOfHttpClientResponse = () => (VoidToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [])))();
let VoidToListOfString = () => (VoidToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [])))();
let _AuthenticationSchemeTo_Credentials = () => (_AuthenticationSchemeTo_Credentials = dart.constFn(dart.definiteFunctionType(io._Credentials, [io._AuthenticationScheme])))();
let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
let _HttpClientConnectionTo_ConnectionInfo = () => (_HttpClientConnectionTo_ConnectionInfo = dart.constFn(dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection])))();
let dynamicToFutureOrOf_ConnectionInfo = () => (dynamicToFutureOrOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOrOf_ConnectionInfo(), [dart.dynamic])))();
let _ConnectionTargetTobool = () => (_ConnectionTargetTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io._ConnectionTarget])))();
let _ConnectionInfoTo_HttpClientRequest = () => (_ConnectionInfoTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._ConnectionInfo])))();
let _ConnectionInfoToFutureOrOf_HttpClientRequest = () => (_ConnectionInfoToFutureOrOf_HttpClientRequest = dart.constFn(dart.definiteFunctionType(FutureOrOf_HttpClientRequest(), [io._ConnectionInfo])))();
let _HttpClientRequestTo_HttpClientRequest = () => (_HttpClientRequestTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._HttpClientRequest])))();
let VoidTo_ConnectionTarget = () => (VoidTo_ConnectionTarget = dart.constFn(dart.definiteFunctionType(io._ConnectionTarget, [])))();
let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
let dynamicToLink = () => (dynamicToLink = dart.constFn(dart.definiteFunctionType(io.Link, [dart.dynamic])))();
let DurationTovoid = () => (DurationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Duration])))();
let RawSecureServerSocketToSecureServerSocket = () => (RawSecureServerSocketToSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])))();
let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
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 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 EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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 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 FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileSystem])))();
let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileError])))();
let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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 MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Metadata])))();
let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
let ElementTobool = () => (ElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.Element])))();
let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileWriter])))();
let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.File])))();
let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Geoposition])))();
let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.PositionError])))();
let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html.HttpRequest])))();
let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.ProgressEvent])))();
let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.MediaStream])))();
let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.NavigatorUserMediaError])))();
let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.RtcSessionDescription])))();
let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.RtcStatsResponse])))();
let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.OptionElement])))();
let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.BeforeUnloadEvent])))();
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 EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html.Event])))();
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 Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
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 AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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;
    },
    fields: () => {
      let s = {};
      for (let m of mixins) {
        dart.copyProperties(s, m[dart._fieldSig]);
      }
      return s;
    },
    getters: () => {
      let s = {};
      for (let m of mixins) {
        dart.copyProperties(s, m[dart._getterSig]);
      }
      return s;
    },
    setters: () => {
      let s = {};
      for (let m of mixins) {
        dart.copyProperties(s, m[dart._setterSig]);
      }
      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.getType = function(obj) {
  return obj == null ? core.Object : obj.__proto__.constructor;
};
dart.getMethodType = function(type, name) {
  let sigObj = type[dart._methodSig];
  if (sigObj === void 0) return void 0;
  return sigObj[name];
};
dart.getFieldType = function(type, name) {
  let sigObj = type[dart._fieldSig];
  if (sigObj === void 0) return void 0;
  return sigObj[name];
};
dart.getSetterType = function(type, name) {
  let sigObj = type[dart._setterSig];
  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(dart.getType(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();
    let proto = f.__proto__;
    sigObj.__proto__ = kind in proto ? proto[kind] : null;
    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._hasSigEntry = function(type, sigF, name) {
  let sigObj = type[sigF];
  if (sigObj === void 0) return false;
  return name in sigObj;
};
dart.hasMethod = function(type, name) {
  return dart._hasSigEntry(type, dart._methodSig, name);
};
dart.hasGetter = function(type, name) {
  return dart._hasSigEntry(type, dart._getterSig, name);
};
dart.hasSetter = function(type, name) {
  return dart._hasSigEntry(type, dart._setterSig, name);
};
dart.hasField = function(type, name) {
  return dart._hasSigEntry(type, dart._fieldSig, name);
};
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);
  function updateSig(sigF) {
    let originalSigFn = dart.getOwnPropertyDescriptor(dartExtType, sigF).get;
    dart.assert(originalSigFn);
    dart.defineMemoizedGetter(jsType, sigF, originalSigFn);
  }
  updateSig(dart._methodSig);
  updateSig(dart._fieldSig);
  updateSig(dart._getterSig);
  updateSig(dart._setterSig);
};
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);
  }
  function upgradeSig(sigF) {
    let originalSigFn = dart.getOwnPropertyDescriptor(type, sigF).get;
    dart.defineMemoizedGetter(type, sigF, function() {
      let sig = originalSigFn();
      let propertyNames = Object.getOwnPropertyNames(sig);
      for (let name of methodNames) {
        if (name in sig) {
          sig[dart.getExtensionSymbol(name)] = sig[name];
        }
      }
      return sig;
    });
  }
  upgradeSig(dart._methodSig);
  upgradeSig(dart._fieldSig);
  upgradeSig(dart._getterSig);
  upgradeSig(dart._setterSig);
};
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 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});
};
dart._warn = function(arg) {
  console.warn(arg);
};
const _jsTypeCallback = Symbol('_jsTypeCallback');
const _rawJSType = Symbol('_rawJSType');
const _dartName = Symbol('_dartName');
dart._isInstanceOfLazyJSType = function(o, t) {
  if (t[_jsTypeCallback] != null) {
    if (t[_rawJSType] == null) {
      let expected = t[_dartName];
      let actual = dart.typeName(dart.getReifiedType(o));
      dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
      return true;
    }
    return dart.is(o, t[_rawJSType]);
  }
  if (o == null) return false;
  return dart._isJSObject(o);
};
dart._asInstanceOfLazyJSType = function(o, t) {
  if (t[_jsTypeCallback] != null) {
    if (t[_rawJSType] == null) {
      let expected = t[_dartName];
      let actual = dart.typeName(dart.getReifiedType(o));
      dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
      return o;
    }
    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.LazyJSType.prototype._check = function check_T(object) {
    return dart._asInstanceOfLazyJSType(object, this);
  };
};
dart._memoizeArray = function(map, arr, create) {
  let len = arr.length;
  map = dart._lookupNonTerminal(map, len);
  for (var i = 0; i < len - 1; ++i) {
    map = dart._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;
};
dart._normalizeParameter = function(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;
};
dart._canonicalizeArray = function(definite, array, map) {
  let arr = definite ? array : array.map(dart._normalizeParameter);
  return dart._memoizeArray(map, arr, () => arr);
};
dart._canonicalizeNamed = function(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 = dart._normalizeParameter(type);
    key.push(name);
    key.push(type);
  }
  if (!definite) named = r;
  return dart._memoizeArray(map, key, () => named);
};
dart._lookupNonTerminal = function(map, key) {
  let result = map.get(key);
  if (result !== void 0) return result;
  map.set(key, result = new Map());
  return result;
};
dart._createSmall = function(count, definite, returnType, required) {
  let map = dart._fnTypeSmallMap[count];
  let args = definite ? required : required.map(dart._normalizeParameter);
  for (var i = 0; i < count; ++i) {
    map = dart._lookupNonTerminal(map, args[i]);
  }
  let result = map.get(returnType);
  if (result !== void 0) return result;
  result = new dart.FunctionType(returnType, args, [], {});
  map.set(returnType, result);
  return result;
};
dart.typedef = function(name, closure) {
  return new dart.Typedef(name, closure);
};
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.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.getMethodType(type, 'call');
};
dart.isFunctionType = function(type) {
  return type instanceof dart.AbstractFunctionType || type === core.Function;
};
dart.isLazyJSSubtype = function(t1, t2, isCovariant) {
  if (dart.equals(t1, t2)) return true;
  if (t1[_jsTypeCallback] == null || t2[_jsTypeCallback] == null) return true;
  return dart.isClassSubType(t1[_rawJSType], t2[_rawJSType], isCovariant);
};
dart.isFunctionSubtype = function(ft1, ft2, isCovariant) {
  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 isCovariant ? false : null;
  }
  for (let i = 0; i < args1.length; ++i) {
    if (!dart._isSubtype(args2[i], args1[i], !isCovariant)) {
      return null;
    }
  }
  let optionals1 = ft1.optionals;
  let optionals2 = ft2.optionals;
  if (args1.length + optionals1.length < args2.length + optionals2.length) {
    return isCovariant ? false : null;
  }
  let j = 0;
  for (let i = args1.length; i < args2.length; ++i, ++j) {
    if (!dart._isSubtype(args2[i], optionals1[j], !isCovariant)) {
      return null;
    }
  }
  for (let i = 0; i < optionals2.length; ++i, ++j) {
    if (!dart._isSubtype(optionals2[i], optionals1[j], !isCovariant)) {
      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 isCovariant ? false : null;
    }
    if (!dart._isSubtype(n2, n1, !isCovariant)) {
      return null;
    }
  }
  if (ret1 === dart.void) return dart._isTop(ret2);
  if (!dart._isSubtype(ret1, ret2, isCovariant)) 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 || type == core.Null;
};
dart._isTop = function(type) {
  if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
    return dart._isTop(dart.getGenericArgs(type)[0]);
  }
  return type == core.Object || type == dart.dynamic || type == dart.void;
};
dart._isSubtype = function(t1, t2, isCovariant) {
  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, isCovariant);
    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, isCovariant);
  }
  if (t1 instanceof dart.LazyJSType && t2 instanceof dart.LazyJSType) {
    return dart.isLazyJSSubtype(t1, t2, isCovariant);
  }
  return false;
};
dart.isClassSubType = function(t1, t2, isCovariant) {
  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], isCovariant);
      if (!result) {
        return result;
      }
    }
    return true;
  }
  if (raw1 === dart.getGenericClass(async.FutureOr)) {
    let t1TypeArg = dart.getGenericArgs(t1)[0];
    let t1Future = dart.getGenericClass(async.Future)(t1TypeArg);
    return dart.isSubtype(t1Future, t2) && dart.isSubtype(t1TypeArg, t2);
  } else if (raw2 === dart.getGenericClass(async.FutureOr)) {
    let t2TypeArg = dart.getGenericArgs(t2)[0];
    let t2Future = dart.getGenericClass(async.Future)(t2TypeArg);
    return dart.isSubtype(t1, t2Future) || dart.isSubtype(t1, t2TypeArg);
  }
  let indefinite = false;
  function definitive(t1, t2) {
    let result = dart.isClassSubType(t1, t2, isCovariant);
    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.trapRuntimeErrors = function(flag) {
  dart._trapRuntimeErrors = flag;
};
dart.throwCastError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.CastErrorImplementation(object, found, expected));
};
dart.throwTypeError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.TypeErrorImplementation(object, found, expected));
};
dart.throwStrongModeCastError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.StrongModeCastError(object, found, expected));
};
dart.throwStrongModeTypeError = function(object, actual, type) {
  var found = dart.typeName(actual);
  var expected = dart.typeName(type);
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new _js_helper.StrongModeTypeError(object, found, expected));
};
dart.throwUnimplementedError = function(message) {
  if (dart._trapRuntimeErrors) debugger;
  dart.throw(new core.UnimplementedError(message));
};
dart.throwAssertionError = function(message) {
  if (message === void 0) message = null;
  return (() => {
    if (dart._trapRuntimeErrors) debugger;
    let error = message != null ? new _js_helper.AssertionErrorWithMessage(message()) : new core.AssertionError();
    dart.throw(error);
  })();
};
dart.throwNullValueError = function() {
  if (dart._trapRuntimeErrors) 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).microtask(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) {
    let type = dart.getType(obj);
    if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
    if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, void 0);
  }
  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [], {isGetter: true}));
};
dart.dput = function(obj, field, value) {
  let f = dart._canonicalMember(obj, field);
  dart._trackCall(obj);
  if (f != null) {
    let objType = dart.getType(obj);
    let setterType = dart.getSetterType(objType, f);
    if (setterType != void 0) {
      if (dart.test(dart.instanceOfOrNull(value, setterType.args[0]))) {
        return obj[f] = value;
      }
    } else {
      let fieldType = dart.getFieldType(objType, f);
      if (fieldType != void 0) {
        if (dart.test(dart.instanceOfOrNull(value, fieldType))) {
          return obj[f] = value;
        }
      }
    }
  }
  return dart.noSuchMethod(obj, new dart.InvocationImpl(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) {
    dart.check(actuals[i], type.args[i]);
    ++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) {
      dart.check(actuals[j], type.optionals[i]);
    }
    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;
    }
    dart.check(opts[name], type.named[name]);
  }
  return true;
};
dart._toSymbolName = function(symbol) {
  let str = symbol.toString();
  return str.substring(7, str.length - 1);
};
dart._toDisplayName = function(name) {
  if (name[0] === '_') {
    switch (name) {
      case '_get':
      {
        return '[]';
      }
      case '_set':
      {
        return '[]=';
      }
      case '_negate':
      {
        return 'unary-';
      }
      case '_constructor':
      case '_prototype':
      {
        return name.substring(1);
      }
    }
  }
  return name;
};
dart._dartSymbol = function(name) {
  return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
};
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(dart.getType(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(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(displayName, core.List._check(args), {isMethod: true}));
  }
  let f = obj != null ? obj[symbol] : null;
  let type = dart.getType(obj);
  let ftype = dart.getMethodType(type, 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) {
  if (obj == null) {
    return type == core.Null || dart._isTop(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, message) {
  if (message === void 0) message = null;
  return (() => {
    if (!condition) dart.throwAssertionError(message);
  })();
};
dart.throw = function(obj) {
  dart._stack = new Error();
  throw obj;
};
dart.getError = function(exception) {
  var stack = dart._stack;
  return stack !== null ? 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) {
  if (dart.test(dart._trapRuntimeErrors)) debugger;
  throw new _js_helper.StrongModeErrorImplementation(message);
};
dart.throwInternalError = function(message) {
  if (dart.test(dart._trapRuntimeErrors)) 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 = (function() {
  if (typeof NodeList !== "undefined") {
    NodeList.prototype.get = function(i) {
      return this[i];
    };
    NamedNodeMap.prototype.get = function(i) {
      return this[i];
    };
    DOMTokenList.prototype.get = function(i) {
      return this[i];
    };
    HTMLCollection.prototype.get = function(i) {
      return this[i];
    };
    if (typeof PannerNode == "undefined") {
      let audioContext;
      if (typeof AudioContext == "undefined" && typeof webkitAudioContext != "undefined") {
        audioContext = new webkitAudioContext();
      } else {
        audioContext = new AudioContext();
        window.StereoPannerNode = audioContext.createStereoPanner().constructor;
      }
      window.PannerNode = audioContext.createPanner().constructor;
    }
    if (typeof AudioSourceNode == "undefined") {
      window.AudioSourceNode = MediaElementAudioSourceNode.__proto__;
    }
    if (typeof FontFaceSet == "undefined") {
      window.FontFaceSet = document.fonts.__proto__.constructor;
    }
    if (typeof MemoryInfo == "undefined") {
      if (typeof window.performance.memory != "undefined") {
        window.MemoryInfo = window.performance.memory.constructor;
      }
    }
    if (typeof Geolocation == "undefined") {
      navigator.geolocation.constructor;
    }
    if (typeof Animation == "undefined") {
      let d = document.createElement('div');
      if (typeof d.animate != "undefined") {
        window.Animation = d.animate(d).constructor;
      }
    }
    if (typeof SourceBufferList == "undefined") {
      window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
    }
  }
  return 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';
  }
};
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 dart.typeName(this[_wrappedType]);
  }
};
dart.setSignature(dart.WrappedType, {
  constructors: () => ({new: dart.definiteFunctionType(dart.WrappedType, [dart.dynamic])}),
  fields: () => ({[_wrappedType]: dart.dynamic})
});
const _stringValue = Symbol('_stringValue');
dart.AbstractFunctionType = class AbstractFunctionType extends dart.TypeRep {
  new() {
    this[_stringValue] = null;
    super.new();
  }
  toString() {
    return this.name;
  }
  get name() {
    if (this[_stringValue] != null) return this[_stringValue];
    let buffer = '(';
    for (let i = 0; i < this.args.length; ++i) {
      if (i > 0) {
        buffer = dart.notNull(buffer) + ', ';
      }
      buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.args[i]));
    }
    if (this.optionals.length > 0) {
      if (this.args.length > 0) {
        buffer = dart.notNull(buffer) + ', ';
      }
      buffer = dart.notNull(buffer) + '[';
      for (let i = 0; i < this.optionals.length; ++i) {
        if (i > 0) {
          buffer = dart.notNull(buffer) + ', ';
        }
        buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.optionals[i]));
      }
      buffer = dart.notNull(buffer) + ']';
    } else if (Object.keys(this.named).length > 0) {
      if (this.args.length > 0) {
        buffer = dart.notNull(buffer) + ', ';
      }
      buffer = dart.notNull(buffer) + '{';
      let names = dart.getOwnPropertyNames(this.named);
      names.sort();
      for (let i = 0; i < names.length; ++i) {
        if (i > 0) {
          buffer = dart.notNull(buffer) + ', ';
        }
        let typeNameString = dart.typeName(this.named[names[i]]);
        buffer = dart.notNull(buffer) + dart.str`${names[i]}: ${typeNameString}`;
      }
      buffer = dart.notNull(buffer) + '}';
    }
    let returnTypeName = dart.typeName(this.returnType);
    buffer = dart.notNull(buffer) + dart.str`) -> ${returnTypeName}`;
    this[_stringValue] = buffer;
    return buffer;
  }
};
dart.setSignature(dart.AbstractFunctionType, {
  constructors: () => ({new: dart.definiteFunctionType(dart.AbstractFunctionType, [])}),
  fields: () => ({[_stringValue]: core.String})
});
dart._fnTypeNamedArgMap = new Map();
dart._fnTypeArrayArgMap = new Map();
dart._fnTypeTypeMap = new Map();
dart._fnTypeSmallMap = [new Map(), new Map(), new Map()];
const _process = Symbol('_process');
dart.FunctionType = class FunctionType extends dart.AbstractFunctionType {
  static create(definite, returnType, args, extra) {
    if (extra === void 0 && args.length < 3) {
      return dart._createSmall(args.length, definite, returnType, args);
    }
    args = dart._canonicalizeArray(definite, args, dart._fnTypeArrayArgMap);
    let keys = null;
    let create = null;
    if (extra === void 0) {
      keys = [returnType, args];
      create = dart.fn(() => new dart.FunctionType(returnType, args, [], {}), VoidToFunctionType());
    } else if (extra instanceof Array) {
      let optionals = dart._canonicalizeArray(definite, extra, dart._fnTypeArrayArgMap);
      keys = [returnType, args, optionals];
      create = dart.fn(() => new dart.FunctionType(returnType, args, optionals, {}), VoidToFunctionType());
    } else {
      let named = dart._canonicalizeNamed(definite, extra, dart._fnTypeNamedArgMap);
      keys = [returnType, args, named];
      create = dart.fn(() => new dart.FunctionType(returnType, args, [], named), VoidToFunctionType());
    }
    return dart._memoizeArray(dart._fnTypeTypeMap, keys, create);
  }
  [_process](array, metadata) {
    let result = [];
    for (let i = 0; i < array.length; ++i) {
      let arg = array[i];
      if (arg instanceof Array) {
        dart.dsend(metadata, 'add', arg.slice(1));
        result[dartx.add](arg[0]);
      } else {
        metadata.push([]);
        result.push(arg);
      }
    }
    return result;
  }
  new(returnType, args, optionals, named) {
    this.returnType = returnType;
    this.args = args;
    this.optionals = optionals;
    this.named = named;
    this.metadata = null;
    super.new();
    this.metadata = [];
    this.args = this[_process](this.args, this.metadata);
    this.optionals = this[_process](this.optionals, this.metadata);
  }
};
dart.setSignature(dart.FunctionType, {
  constructors: () => ({new: dart.definiteFunctionType(dart.FunctionType, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
  fields: () => ({
    returnType: dart.dynamic,
    args: dart.dynamic,
    optionals: dart.dynamic,
    named: dart.dynamic,
    metadata: dart.dynamic
  }),
  methods: () => ({[_process]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])}),
  statics: () => ({create: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
  names: ['create']
});
const _name = Symbol('_name');
const _closure = Symbol('_closure');
const _functionType = Symbol('_functionType');
dart.Typedef = class Typedef extends dart.AbstractFunctionType {
  new(name, closure) {
    this[_name] = name;
    this[_closure] = closure;
    this[_functionType] = null;
    super.new();
  }
  get name() {
    return core.String._check(this[_name]);
  }
  get functionType() {
    if (this[_functionType] == null) {
      this[_functionType] = this[_closure]();
    }
    return this[_functionType];
  }
  get returnType() {
    return this.functionType.returnType;
  }
  get args() {
    return core.List._check(this.functionType.args);
  }
  get optionals() {
    return core.List._check(this.functionType.optionals);
  }
  get named() {
    return this.functionType.named;
  }
  get metadata() {
    return core.List._check(this.functionType.metadata);
  }
};
dart.setSignature(dart.Typedef, {
  constructors: () => ({new: dart.definiteFunctionType(dart.Typedef, [dart.dynamic, dart.dynamic])}),
  fields: () => ({
    [_name]: dart.dynamic,
    [_closure]: dart.dynamic,
    [_functionType]: dart.AbstractFunctionType
  }),
  getters: () => ({
    functionType: dart.definiteFunctionType(dart.AbstractFunctionType, []),
    returnType: dart.definiteFunctionType(dart.dynamic, []),
    args: dart.definiteFunctionType(core.List, []),
    optionals: dart.definiteFunctionType(core.List, []),
    named: dart.definiteFunctionType(dart.dynamic, []),
    metadata: dart.definiteFunctionType(core.List, [])
  })
});
dart._typeFormalCount = Symbol("_typeFormalCount");
dart.isSubtype = dart._subtypeMemo((t1, t2) => t1 === t2 || dart._isSubtype(t1, t2, true));
dart._trapRuntimeErrors = 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, [dart.dynamic, 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 = null;
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 (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
  return 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}));
      }, intAnddynamicToNull()));
    } 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 (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 (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);
      }
    }, dynamicAnddynamicToNull()));
    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}));
      }
    }, StringAndObjectToNull()));
    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 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}));
    }, dynamicAnddynamicToNull()));
    _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');
const _filter = Symbol('_filter');
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 JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(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) {
      this[_filter](test, false);
    }
    retainWhere(test) {
      this[_filter](test, true);
    }
    [_filter](test, retainMatching) {
      let source = this;
      let retained = JSArrayOfE().of([]);
      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()]),
      [_filter]: dart.definiteFunctionType(dart.void, [dynamicTobool(), core.bool]),
      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()])
    })
  });
  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), [])}),
    methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
  });
  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, [])
    })
  });
  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), [])})
  });
  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()
    })
  });
  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), [])})
  });
  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), [])}),
    methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
  });
  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})
});
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()})
  });
  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);
    }, VoidToNull()));
  } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
    rootContext.eval(dart.fn(() => {
      dart.dcall(entry, args, null);
    }, VoidToNull()));
  } 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);
    _isolate_helper.global.onmessage = func;
    _isolate_helper.global.dartPrint = _isolate_helper.global.dartPrint || (function(serialize) {
      return function(object) {
        var _self = _isolate_helper.global;
        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 (_isolate_helper.global.console && _isolate_helper.global.console.error) {
        _isolate_helper.global.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, VoidToNull());
      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));
        }, VoidToNull()), '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);
    }, ListToNull()), {onError: dart.fn(errorMessage => {
        dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
      }, StringToNull())});
  }
  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) {
    _isolate_helper.global.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));
      }
    }, dynamicToNull()));
    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);
    }, VoidToNull()), '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);
      }
    }, VoidToNull()), 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 _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 _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 TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [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 TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [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 TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
  let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
  let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
  let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [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]();
      }, TToNull()), {onError: dart.fn((error, stackTrace) => {
          controller[_addError](error, core.StackTrace._check(stackTrace));
          controller[_closeUnchecked]();
        }, dynamicAnddynamicToNull())});
      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]();
        }
      }, TToNull());
      let onError = dart.fn((error, stack) => {
        if (!dart.test(controller.isClosed)) {
          controller[_addError](error, core.StackTrace._check(stack));
          if (--count == 0) controller[_closeUnchecked]();
        }
      }, dynamicAnddynamicToNull());
      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();
        }, TimerToNull()));
      }
      dart.fn(startPeriodicTimer, VoidTovoid());
      controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
          watch.start();
          startPeriodicTimer();
        }, VoidToNull()), onPause: dart.fn(() => {
          timer.cancel();
          timer = null;
          watch.stop();
        }, VoidToNull()), 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();
          }, VoidToNull()));
        }, VoidToNull()), onCancel: dart.fn(() => {
          if (timer != null) timer.cancel();
          timer = null;
        }, VoidToNull())});
      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.void)(add, {onError: addError}).whenComplete(dart.bind(subscription, 'resume'));
            } else {
              controller.add(E.as(newValue));
            }
          }, TToNull()), {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();
            }, VoidToNull()), sync: true});
        } else {
          controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
              subscription.pause();
            }, VoidToNull()), onResume: dart.fn(() => {
              subscription.resume();
            }, VoidToNull()), onCancel: dart.fn(() => {
              subscription.cancel();
            }, VoidToNull()), 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'));
            }
          }, TToNull()), {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();
            }, VoidToNull()), sync: true});
        } else {
          controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
              subscription.pause();
            }, VoidToNull()), onResume: dart.fn(() => {
              subscription.resume();
            }, VoidToNull()), onCancel: dart.fn(() => {
              subscription.cancel();
            }, VoidToNull()), 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;
          }, TToNull()), async._cancelAndErrorClosure(subscription, result));
        } else {
          value = element;
          seenFirst = true;
        }
      }, TToNull()), {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);
          }
        }, VoidToNull()), 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(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
        }, TToNull()), {onError: dart.fn((e, st) => {
            result[_completeError](e, core.StackTrace._check(st));
          }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
            result[_complete](value);
          }, VoidToNull()), 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);
        }

      }, TToNull()), {onError: dart.fn(e => {
          result[_completeError](e);
        }, dynamicToNull()), onDone: dart.fn(() => {
          result[_complete](buffer.toString());
        }, VoidToNull()), 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);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](false);
        }, VoidToNull()), 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(_ => {
        }, dynamicToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](null);
        }, VoidToNull()), 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);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](true);
        }, VoidToNull()), 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);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](false);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get length() {
      let future = new (_FutureOfint())();
      let count = 0;
      this.listen(dart.fn(_ => {
        count++;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](count);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    get isEmpty() {
      let future = new (_FutureOfbool())();
      let subscription = null;
      subscription = this.listen(dart.fn(_ => {
        async._cancelAndValue(subscription, future, false);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](true);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    toList() {
      let result = JSArrayOfT().of([]);
      let future = new (_FutureOfListOfT())();
      this.listen(dart.fn(data => {
        result[dartx.add](data);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](result);
        }, VoidToNull()), cancelOnError: true});
      return future;
    }
    toSet() {
      let result = SetOfT().new();
      let future = new (_FutureOfSetOfT())();
      this.listen(dart.fn(data => {
        result.add(data);
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_complete](result);
        }, VoidToNull()), 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);
      }, TToNull()), {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);
          }

        }, VoidToNull()), 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;
      }, TToNull()), {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);
          }

        }, VoidToNull()), 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;
      }, TToNull()), {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);
          }

        }, VoidToNull()), 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);
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {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);
          }

        }, VoidToNull()), 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;
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {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);
          }

        }, VoidToNull()), 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;
          }
        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
      }, TToNull()), {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);
          }

        }, VoidToNull()), 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;
      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
          future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
        }, VoidToNull()), 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);
          }, VoidToNull());
        } 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;
          }, VoidToNull());
        }
        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();
      }, VoidToNull()), dart.fn(() => {
        subscription.resume();
        timer = zone.createTimer(timeLimit, timeout);
      }, VoidToNull()), 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] = _isolate_helper.global.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] = _isolate_helper.global.setInterval(dart.fn(() => {
        callback(this);
      }, VoidToNull()), 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])) {
        _isolate_helper.global.clearTimeout(this[_handle]);
      } else {
        _isolate_helper.global.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 _isolate_helper.global.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})
});
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.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
  new(message) {
    this[_message] = message;
    super.new();
  }
  toString() {
    return dart.str`Assertion failed: ${this[_message]}`;
  }
};
dart.setSignature(_js_helper.AssertionErrorWithMessage, {
  constructors: () => ({new: dart.definiteFunctionType(_js_helper.AssertionErrorWithMessage, [core.Object])}),
  fields: () => ({[_message]: core.Object})
});
_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 = 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] = null;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      let ret = this[_jsIterator].next();
      this[_current] = 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]: 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();
_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 = 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 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 KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [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 KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
  class JsLinkedHashMap extends core.Object {
    new() {
      this[_length] = 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];
    }
    get isEmpty() {
      return this[_length] == 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);
      }, KAndVToNull()));
    }
    _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) {
        this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
        this[_length] = 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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 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]: 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();
    }
  }
  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];
    }
    get isEmpty() {
      return this[_map][_length] == 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), [])})
  });
  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] = null;
      this[_cell] = this[_map][_first];
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      if (this[_modifications] != this[_map][_modifications]) {
        dart.throw(new core.ConcurrentModificationError(this[_map]));
      } else if (this[_cell] == null) {
        this[_current] = null;
        return false;
      } else {
        this[_current] = 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]: 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] = null;
  }
  get current() {
    return this[_current];
  }
  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] = match;
        let nextIndex = match.end;
        if (match.start == nextIndex) {
          nextIndex = dart.notNull(nextIndex) + 1;
        }
        this[_nextIndex] = nextIndex;
        return true;
      }
    }
    this[_current] = 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]: 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 = Symbol('_index');
_js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
  new(input, pattern, index) {
    this[_input] = input;
    this[_pattern] = pattern;
    this[_index] = index;
    super.new();
  }
  get iterator() {
    return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index]);
  }
  get first() {
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index]);
    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]: core.int
  }),
  getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(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] = index;
    this[_current] = null;
  }
  moveNext() {
    if (dart.notNull(this[_index]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
      this[_current] = null;
      return false;
    }
    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index]);
    if (dart.notNull(index) < 0) {
      this[_index] = dart.notNull(this[_input][dartx.length]) + 1;
      this[_current] = null;
      return false;
    }
    let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
    this[_current] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
    if (end == this[_index]) end++;
    this[_index] = end;
    return true;
  }
  get current() {
    return this[_current];
  }
};
_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]: core.int,
    [_current]: 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;
  }
  let name = _js_mirrors.getName(symbol);
  switch (name) {
    case '[]':
    {
      name = '_get';
      break;
    }
    case '[]=':
    {
      name = '_set';
      break;
    }
    case 'unary-':
    {
      name = '_negate';
      break;
    }
    case 'constructor':
    case 'prototype':
    {
      name = dart.str`_${name}`;
      break;
    }
  }
  return name;
};
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;
  }, SymbolAnddynamicToNull()));
  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;
const _declarations = Symbol('_declarations');
const _raw = Symbol('_raw');
const _mixin = Symbol('_mixin');
const _typeArguments = Symbol('_typeArguments');
let const;
_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 || (const = 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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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));
      }, SymbolAnddynamicToNull()));
      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 || (const = 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;
let const;
let const;
_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 || (const = dart.constList([], mirrors.ParameterMirror));
      this[_metadata] = const || (const = 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 || (const = 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])
  })
});
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])
  })
});
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])
  })
});
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])
  })
});
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])})
});
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])
  }),
  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])
  }),
  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])}),
  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])}),
  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])}),
  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])}),
  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])}),
  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])}),
  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])}),
  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._Callback = dart.typedef('_Callback', () => dart.functionType(dart.void, []));
async._TakeCallback = dart.typedef('_TakeCallback', () => dart.functionType(dart.void, [async._Callback]));
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: () => ({'==': 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;
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.void)(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);
        }, VoidToNull());
        this[_onError] = dart.fn((error, stackTrace) => {
          this.cancel();
          result[_completeError](error, core.StackTrace._check(stackTrace));
        }, dynamicAnddynamicToNull());
        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 || (const = 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.void, 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.void)(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;
      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, [VoidTovoid()]),
      [_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 _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_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);
      }, _BufferingStreamSubscriptionOfTToNull()));
    }
    [_sendError](error, stackTrace) {
      if (dart.test(this[_isEmpty])) return;
      this[_forEachListener](dart.fn(subscription => {
        subscription[_addError](error, stackTrace);
      }, _BufferingStreamSubscriptionOfTToNull()));
    }
    [_sendDone]() {
      if (!dart.test(this[_isEmpty])) {
        this[_forEachListener](dart.fn(subscription => {
          subscription[_close]();
        }, _BufferingStreamSubscriptionOfTToNull()));
      } 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;
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 || (const = 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;
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 || (const = 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])})
  });
  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.void)(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})
});
async.FutureOr$ = dart.generic(T => {
  class FutureOr extends core.Object {
    _() {
      dart.throw(new core.UnsupportedError("FutureOr can't be instantiated"));
    }
  }
  dart.addTypeTests(FutureOr);
  dart.defineNamedConstructor(FutureOr, '_');
  dart.setSignature(FutureOr, {
    constructors: () => ({_: dart.definiteFunctionType(async.FutureOr$(T), [])})
  });
  return FutureOr;
});
async.FutureOr = FutureOr();
const _completeWithValue = Symbol('_completeWithValue');
let const;
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);
        }

      }, VoidToNull()));
      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);
        }

      }, VoidToNull()));
      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](dart.nullSafe(computation, _ => _()));
        } catch (e) {
          let s = dart.stackTrace(e);
          async._completeWithErrorCallback(result, e, s);
        }

      }, VoidToNull()));
      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);
                  }, VoidToNull()));
                }
              }
            }
            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());
        try {
          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);
                  }, VoidToNull()));
                }
                if (remaining == 0 && !dart.test(eagerError)) {
                  result[_completeError](error, stackTrace);
                }
              }
            }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
            remaining++;
          }
          if (remaining == 0) {
            return async.Future$(core.List$(T)).value(const || (const = dart.constList([], dart.dynamic)));
          }
          values = core.List$(T).new(remaining);
        } catch (e) {
          let st = dart.stackTrace(e);
          if (remaining == 0 || dart.test(eagerError)) {
            return async.Future$(core.List$(T)).error(e, st);
          } else {
            error = e;
            stackTrace = st;
          }
        }

        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(core.Null, [T]));
        let onError = dart.fn((error, stack) => {
          if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
        }, dynamicAnddynamicToNull());
        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)(dynamicToFutureOr()._check(nextIteration), {onError: dart.bind(doneSignal, _completeError)});
        } else {
          doneSignal[_complete](null);
        }
      }, boolToNull()), {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 _clearPendingComplete = Symbol('_clearPendingComplete');
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 TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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(async.FutureOr$(E), 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;
    }
    [_clearPendingComplete]() {
      dart.assert(this[_isPendingComplete]);
      this[_state] = async._Future._INCOMPLETE;
    }
    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);
        }, VoidToNull()));
      }
    }
    [_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);
        }, VoidToNull()));
      }
    }
    [_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[_clearPendingComplete]();
          target[_complete](value);
        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
            if (stackTrace === void 0) stackTrace = null;
            dart.assert(target[_isPendingComplete]);
            target[_completeError](error, core.StackTrace._check(stackTrace));
          }, dynamic__ToNull())});
      } catch (e) {
        let s = dart.stackTrace(e);
        async.scheduleMicrotask(dart.fn(() => {
          target[_completeError](e, s);
        }, VoidToNull()));
      }

    }
    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);
            }, VoidToNull()));
          } 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);
      }, VoidToNull()));
    }
    [_asyncCompleteError](error, stackTrace) {
      dart.assert(!dart.test(this[_isComplete]));
      this[_setPendingComplete]();
      this[_zone].scheduleMicrotask(dart.fn(() => {
        this[_completeError](error, stackTrace);
      }, VoidToNull()));
    }
    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));
        }, VoidToNull()));
      } 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);
          }

        }, VoidToNull()));
      }
      this.then(dart.dynamic)(dart.fn(v => {
        if (dart.test(timer.isActive)) {
          timer.cancel();
          result[_completeWithValue](v);
        }
      }, TToNull()), {onError: dart.fn((e, s) => {
          if (dart.test(timer.isActive)) {
            timer.cancel();
            result[_completeError](e, core.StackTrace._check(s));
          }
        }, dynamicAnddynamicToNull())});
      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), [dart.functionType(async.FutureOr$(E), [T])], {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, []),
      [_clearPendingComplete]: 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.void)(callback));
    return;
  }
  async.Zone.current.scheduleMicrotask(async.Zone.current.bindCallback(dart.void)(callback, {runGuarded: true}));
};
dart.fn(async.scheduleMicrotask, _AsyncCallbackTovoid());
async._AsyncRun = class _AsyncRun extends core.Object {
  static _scheduleImmediate(callback) {
    async._AsyncRun._scheduleImmediateClosure(callback);
  }
  static _initializeScheduleImmediate() {
    if (_isolate_helper.global.scheduleImmediate != null) {
      return async._AsyncRun._scheduleImmediateJsOverride;
    }
    if (_isolate_helper.global.MutationObserver != null && _isolate_helper.global.document != null) {
      let div = _isolate_helper.global.document.createElement("div");
      let span = _isolate_helper.global.document.createElement("span");
      let storedCallback = null;
      function internalCallback(_) {
        _isolate_helper.leaveJsAsync();
        let f = storedCallback;
        storedCallback = null;
        f();
      }
      dart.fn(internalCallback, dynamicToNull());
      ;
      let observer = new _isolate_helper.global.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);
      }, FnToNull());
    } else if (_isolate_helper.global.setImmediate != null) {
      return async._AsyncRun._scheduleImmediateWithSetImmediate;
    }
    return async._AsyncRun._scheduleImmediateWithTimer;
  }
  static _scheduleImmediateJsOverride(callback) {
    function internalCallback() {
      _isolate_helper.leaveJsAsync();
      callback();
    }
    dart.fn(internalCallback, VoidToNull());
    ;
    _isolate_helper.enterJsAsync();
    _isolate_helper.global.scheduleImmediate(internalCallback);
  }
  static _scheduleImmediateWithSetImmediate(callback) {
    function internalCallback() {
      _isolate_helper.leaveJsAsync();
      callback();
    }
    dart.fn(internalCallback, VoidToNull());
    ;
    _isolate_helper.enterJsAsync();
    _isolate_helper.global.setImmediate(internalCallback);
  }
  static _scheduleImmediateWithTimer(callback) {
    async.Timer._createTimer(core.Duration.ZERO, callback);
  }
};
dart.setSignature(async._AsyncRun, {
  sfields: () => ({_scheduleImmediateClosure: async._TakeCallback}),
  statics: () => ({
    _scheduleImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    _initializeScheduleImmediate: dart.definiteFunctionType(async._TakeCallback, []),
    _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: () => ({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;
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 || (const = 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);
      }, VoidToNull()));
      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;
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 || (const = 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]();
      }, dynamicAndStackTraceToNull());
    }
    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);
      }, VoidToNull()));
    }
    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
    })
  });
  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);
      }, VoidToNull()));
      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);
        }, VoidToNull());
        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.void)(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.void, _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.void, _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 = 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] = 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];
    }
    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] = 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] = 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] = 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] = 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]: 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);
  }, dynamicAndStackTraceToNull());
};
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: () => ({
      [_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()})
  });
  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()})
  });
  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()})
  });
  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})
  });
  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()})
  });
  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})
  });
  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()})
  });
  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
    }),
    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: () => ({
      [_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()})}),
    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.void)(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);
    }, VoidToNull()));
  };
};
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());
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());
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.void)(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;
async._rootFork = function(self, parent, zone, specification, zoneValues) {
  _internal.printToZone = async._printToZone;
  if (specification == null) {
    specification = const || (const = 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;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
async._RootZone = class _RootZone extends async._Zone {
  new() {
    super.new();
  }
  get [_run]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
  }
  get [_runUnary]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
  }
  get [_runBinary]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
  }
  get [_registerCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
  }
  get [_registerUnaryCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
  }
  get [_registerBinaryCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
  }
  get [_errorCallback]() {
    return const || (const = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
  }
  get [_scheduleMicrotask]() {
    return const || (const = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
  }
  get [_createTimer]() {
    return const || (const = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
  }
  get [_createPeriodicTimer]() {
    return const || (const = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
  }
  get [_print]() {
    return const || (const = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
  }
  get [_fork]() {
    return const || (const = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
  }
  get [_handleUncaughtError]() {
    return const || (const = 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 = 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 ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [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 KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
  class _HashMap extends core.Object {
    new() {
      this[_length] = 0;
      this[_strings] = null;
      this[_nums] = null;
      this[_rest] = null;
      this[_keys] = null;
    }
    get length() {
      return this[_length];
    }
    get isEmpty() {
      return this[_length] == 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);
      }, KAndVToNull()));
    }
    _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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 1;
      this[_keys] = null;
      return bucket.splice(index, 2)[1];
    }
    clear() {
      if (dart.notNull(this[_length]) > 0) {
        this[_strings] = this[_nums] = this[_rest] = this[_keys] = null;
        this[_length] = 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]);
      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]);
      return this[_keys] = result;
    }
    [_addHashTableEntry](table, key, value) {
      K._check(key);
      V._check(value);
      if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
        this[_length] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 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]: 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()
    })
  });
  dart.defineExtensionMembers(_CustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
  return _CustomHashMap;
});
collection._CustomHashMap = _CustomHashMap();
const _map = 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] = map;
      super.new();
    }
    get length() {
      return this[_map][_length];
    }
    get isEmpty() {
      return this[_map][_length] == 0;
    }
    get iterator() {
      return new (_HashMapKeyIteratorOfE())(this[_map], this[_map][_computeKeys]());
    }
    contains(element) {
      return this[_map].containsKey(element);
    }
    forEach(f) {
      let keys = this[_map][_computeKeys]();
      for (let i = 0, length = keys.length; i < length; i++) {
        f(keys[i]);
        if (keys !== this[_map][_keys]) {
          dart.throw(new core.ConcurrentModificationError(this[_map]));
        }
      }
    }
  }
  _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_HashMapKeyIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
    fields: () => ({[_map]: _HashMapOfE$dynamic()}),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(_HashMapKeyIterable, [
    'contains',
    'forEach',
    'length',
    'isEmpty',
    'iterator'
  ]);
  return _HashMapKeyIterable;
});
collection._HashMapKeyIterable = _HashMapKeyIterable();
const _offset = Symbol('_offset');
const _current = 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] = map;
      this[_keys] = keys;
      this[_offset] = 0;
      this[_current] = null;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      let keys = this[_keys];
      let offset = this[_offset];
      if (keys !== this[_map][_keys]) {
        dart.throw(new core.ConcurrentModificationError(this[_map]));
      } else if (dart.notNull(offset) >= keys.length) {
        this[_current] = null;
        return false;
      } else {
        this[_current] = 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]: _HashMapOfE$dynamic(),
      [_keys]: ListOfE(),
      [_offset]: core.int,
      [_current]: 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 InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
  let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
  let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
  class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
    new() {
      this[_map] = new Map();
      this[_modifications] = 0;
      super.new();
    }
    get length() {
      return this[_map].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].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);
      }, KAndVToNull()));
    }
    _get(key) {
      return this[_map].get(key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_map].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].delete(key);
      this[_modified]();
      return value;
    }
    clear() {
      this[_map].clear();
      this[_modified]();
    }
    forEach(action) {
      let jsEntries = this[_map].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]: dart.dynamic,
      [_modifications]: core.int
    }),
    methods: () => ({[_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] = map;
      this[_isKeys] = isKeys;
      super.new();
    }
    get length() {
      return core.int._check(dart.dload(this[_map], 'length'));
    }
    get isEmpty() {
      return core.bool._check(dart.dload(this[_map], 'isEmpty'));
    }
    get iterator() {
      return new (_Es6MapIteratorOfE())(this[_map], core.int._check(dart.dload(this[_map], _modifications)), this[_isKeys]);
    }
    contains(element) {
      return core.bool._check(dart.dsend(this[_map], 'containsKey', element));
    }
    forEach(f) {
      let jsIterator = null;
      if (dart.test(this[_isKeys])) {
        jsIterator = dart.dload(this[_map], _map).keys();
      } else {
        jsIterator = dart.dload(this[_map], _map).values();
      }
      let modifications = core.int._check(dart.dload(this[_map], _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], _modifications))) {
          dart.throw(new core.ConcurrentModificationError(this[_map]));
        }
      }
    }
  }
  _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_Es6MapIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
    fields: () => ({
      [_map]: dart.dynamic,
      [_isKeys]: core.bool
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
  });
  dart.defineExtensionMembers(_Es6MapIterable, [
    'contains',
    'forEach',
    'length',
    'isEmpty',
    'iterator'
  ]);
  return _Es6MapIterable;
});
collection._Es6MapIterable = _Es6MapIterable();
const _jsIterator = Symbol('_jsIterator');
const _next = 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] = map;
      this[_modifications] = modifications;
      this[_isKeys] = isKeys;
      this[_jsIterator] = null;
      this[_next] = null;
      this[_current] = null;
      this[_done] = null;
      if (dart.test(this[_isKeys])) {
        this[_jsIterator] = dart.dload(this[_map], _map).keys();
      } else {
        this[_jsIterator] = dart.dload(this[_map], _map).values();
      }
      this[_done] = false;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      if (!dart.equals(this[_modifications], dart.dload(this[_map], _modifications))) {
        dart.throw(new core.ConcurrentModificationError(this[_map]));
      }
      if (dart.test(this[_done])) return false;
      this[_next] = this[_jsIterator].next();
      let done = this[_next].done;
      if (done) {
        this[_current] = null;
        this[_done] = true;
        return false;
      } else {
        this[_current] = this[_next].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]: dart.dynamic,
      [_modifications]: core.int,
      [_isKeys]: core.bool,
      [_jsIterator]: dart.dynamic,
      [_next]: dart.dynamic,
      [_current]: 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()
    })
  });
  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 = 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: () => ({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] = 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];
    }
    get isEmpty() {
      return this[_length] == 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](element);
      }
    }
    [_add](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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 1;
      this[_elements] = null;
      bucket.splice(index, 1);
      return true;
    }
    clear() {
      if (dart.notNull(this[_length]) > 0) {
        this[_strings] = this[_nums] = this[_rest] = this[_elements] = null;
        this[_length] = 0;
      }
    }
    [_computeElements]() {
      if (this[_elements] != null) return this[_elements];
      let result = ListOfE().new(this[_length]);
      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]);
      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] = dart.notNull(this[_length]) + 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] = dart.notNull(this[_length]) - 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]: 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]: dart.definiteFunctionType(core.bool, [E]),
      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;
    }
  }
  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](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()
    })
  });
  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] = null;
    }
    get current() {
      return this[_current];
    }
    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] = null;
        return false;
      } else {
        this[_current] = 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]: 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 = 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] = 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];
    }
    get isEmpty() {
      return this[_length] == 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];
      }
    }
    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](element);
      }
    }
    [_add](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];
        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]) > 0) {
        this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
        this[_length] = 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] = last;
        this[_last] = last[_next] = cell;
      }
      this[_length] = dart.notNull(this[_length]) + 1;
      this[_modified]();
      return cell;
    }
    [_unlinkCell](cell) {
      _LinkedHashSetCellOfE()._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] = dart.notNull(this[_length]) - 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]: 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, [])
    }),
    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]),
      add: dart.definiteFunctionType(core.bool, [E]),
      [_add]: dart.definiteFunctionType(core.bool, [E]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
      [_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;
    }
  }
  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](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()
    })
  });
  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] = null;
      this[_previous] = null;
    }
  }
  dart.addTypeTests(_LinkedHashSetCell);
  dart.setSignature(_LinkedHashSetCell, {
    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
    fields: () => ({
      [_element]: E,
      [_next]: _LinkedHashSetCellOfE(),
      [_previous]: _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] = null;
      this[_cell] = collection._LinkedHashSetCell._check(dart.dload(this[_set], _first));
    }
    get current() {
      return this[_current];
    }
    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] = null;
        return false;
      } else {
        this[_current] = E._check(this[_cell][_element]);
        this[_cell] = this[_cell][_next];
        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]: E
    }),
    getters: () => ({current: dart.definiteFunctionType(E, [])}),
    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
  });
  return _LinkedHashSetIterator;
});
collection._LinkedHashSetIterator = _LinkedHashSetIterator();
const _source = 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] = source;
    }
    get length() {
      return this[_source][dartx.length];
    }
    set length(value) {
      super.length = value;
    }
    _get(index) {
      return this[_source][dartx.elementAt](index);
    }
  }
  dart.setSignature(UnmodifiableListView, {
    constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
    fields: () => ({[_source]: 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));
      }, dynamicAnddynamicToNull()));
      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 = 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] = 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].current;
      this[_move]();
      return result;
    }
    [_move]() {
      if (dart.test(this[_iterator].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]: 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));
      }, dynamicAnddynamicToNull()));
      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] = 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];
    }
    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];
        entry[_next] = entry[_previous] = entry[_list] = null;
      } while (!core.identical(next, this[_first]));
      this[_first] = null;
      this[_length] = 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];
    }
    get single() {
      if (dart.test(this.isEmpty)) {
        dart.throw(new core.StateError('No such element'));
      }
      if (dart.notNull(this[_length]) > 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];
      } while (!core.identical(current, this[_first]));
    }
    get isEmpty() {
      return this[_length] == 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] = newEntry[_next] = newEntry;
        this[_first] = newEntry;
        this[_length] = dart.notNull(this[_length]) + 1;
        return;
      }
      let predecessor = entry[_previous];
      let successor = entry;
      newEntry[_previous] = predecessor;
      newEntry[_next] = successor;
      predecessor[_next] = newEntry;
      successor[_previous] = newEntry;
      if (dart.test(updateFirst) && core.identical(entry, this[_first])) {
        this[_first] = newEntry;
      }
      this[_length] = dart.notNull(this[_length]) + 1;
    }
    [_unlink](entry) {
      E._check(entry);
      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
      entry[_next][_previous] = entry[_previous];
      let next = entry[_previous][_next] = entry[_next];
      this[_length] = dart.notNull(this[_length]) - 1;
      entry[_list] = entry[_next] = entry[_previous] = 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]: core.int,
      [_first]: E
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(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, []),
      [_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] = list[_first];
      this[_visitedFirst] = false;
      this[_current] = null;
    }
    get current() {
      return this[_current];
    }
    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], this[_list].first)) {
        this[_current] = null;
        return false;
      }
      this[_visitedFirst] = true;
      this[_current] = E._check(this[_next]);
      this[_next] = this[_next][_next];
      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]: E,
      [_next]: 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] = null;
      this[_previous] = null;
    }
    get list() {
      return this[_list];
    }
    unlink() {
      this[_list][_unlink](E._check(this));
    }
    get next() {
      if (core.identical(this, this[_next])) return null;
      return this[_next];
    }
    get previous() {
      if (core.identical(this, this[_previous])) return null;
      return this[_previous];
    }
    insertAfter(entry) {
      E._check(entry);
      this[_list][_insertBefore](this[_next], 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]: E,
      [_previous]: 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] = map;
      super.new();
    }
    get length() {
      return this[_map][dartx.length];
    }
    get isEmpty() {
      return this[_map][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map][dartx.isNotEmpty];
    }
    get first() {
      return this[_map][dartx._get](this[_map][dartx.keys][dartx.first]);
    }
    get single() {
      return this[_map][dartx._get](this[_map][dartx.keys][dartx.single]);
    }
    get last() {
      return this[_map][dartx._get](this[_map][dartx.keys][dartx.last]);
    }
    get iterator() {
      return new (_MapBaseValueIteratorOfK$V())(this[_map]);
    }
  }
  _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_MapBaseValueIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
    fields: () => ({[_map]: MapOfK$V()}),
    getters: () => ({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] = map;
      this[_keys] = map[dartx.keys][dartx.iterator];
      this[_current] = null;
    }
    moveNext() {
      if (dart.test(this[_keys].moveNext())) {
        this[_current] = this[_map][dartx._get](this[_keys].current);
        return true;
      }
      this[_current] = null;
      return false;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(_MapBaseValueIterator);
  _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
  dart.setSignature(_MapBaseValueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
    fields: () => ({
      [_keys]: IteratorOfK(),
      [_map]: MapOfK$V(),
      [_current]: 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] = map;
    }
    _get(key) {
      return this[_map][dartx._get](key);
    }
    _set(key, value) {
      K._check(key);
      V._check(value);
      this[_map][dartx._set](key, value);
      return value;
    }
    addAll(other) {
      MapOfK$V()._check(other);
      this[_map][dartx.addAll](other);
    }
    clear() {
      this[_map][dartx.clear]();
    }
    putIfAbsent(key, ifAbsent) {
      K._check(key);
      VoidToV()._check(ifAbsent);
      return this[_map][dartx.putIfAbsent](key, ifAbsent);
    }
    containsKey(key) {
      return this[_map][dartx.containsKey](key);
    }
    containsValue(value) {
      return this[_map][dartx.containsValue](value);
    }
    forEach(action) {
      this[_map][dartx.forEach](action);
    }
    get isEmpty() {
      return this[_map][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map][dartx.isNotEmpty];
    }
    get length() {
      return this[_map][dartx.length];
    }
    get keys() {
      return this[_map][dartx.keys];
    }
    remove(key) {
      return this[_map][dartx.remove](key);
    }
    toString() {
      return dart.toString(this[_map]);
    }
    get values() {
      return this[_map][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]: 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);
      }, dynamicAnddynamicToNull()));
      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');
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: () => ({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] = null;
    }
    moveNext() {
      if (core.identical(this[_nextEntry], this[_sentinel])) {
        this[_current] = 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] = elementEntry.element;
      this[_nextEntry] = elementEntry[_nextLink];
      return true;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(_DoubleLinkedQueueIterator);
  _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_DoubleLinkedQueueIterator, {
    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [_DoubleLinkedQueueSentinelOfE()])}),
    fields: () => ({
      [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
      [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
      [_current]: 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](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](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](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](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), [])}),
    methods: () => ({
      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]: 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] = null;
    }
    get current() {
      return this[_current];
    }
    moveNext() {
      this[_queue][_checkModification](this[_modificationCount]);
      if (this[_position] == this[_end]) {
        this[_current] = null;
        return false;
      }
      this[_current] = 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]: 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 _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 KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [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 KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [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));
      }, dynamicAnddynamicToNull()));
      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);
      }, KAndVToNull()));
    }
    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), [])})
  });
  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] = map;
      super.new();
    }
    get length() {
      return this[_map][_count];
    }
    get isEmpty() {
      return this[_map][_count] == 0;
    }
    get iterator() {
      return new (_SplayTreeValueIteratorOfK$V())(this[_map]);
    }
  }
  _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
  dart.setSignature(_SplayTreeValueIterable, {
    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
    fields: () => ({[_map]: 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), [])}),
    methods: () => ({
      [_compare]: dart.definiteFunctionType(core.int, [E, E]),
      add: dart.definiteFunctionType(core.bool, [E]),
      remove: dart.definiteFunctionType(core.bool, [core.Object]),
      lookup: dart.definiteFunctionType(E, [core.Object]),
      [_clone]: dart.definiteFunctionType(collection.SplayTreeSet$(E), []),
      [_copyNode]: dart.definiteFunctionType(collection._SplayTreeNode$(E), [_SplayTreeNodeOfE()])
    })
  });
  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);
    }, dynamicAnddynamicToNull()));
  }
  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}),
  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;
let const;
let const;
let const;
let const;
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 || (const = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
    } else {
      return (const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const || (const = dart.const(new convert.AsciiEncoder()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const || (const = 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()])
  })
});
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])
  })
});
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})})
});
const _utf8Sink = Symbol('_utf8Sink');
let const;
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 || (const = 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;
const _encoder = Symbol('_encoder');
let const;
let const;
convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
  new() {
    this[_encoder] = const || (const = dart.const(new convert.Base64Encoder()));
    super.new();
  }
  urlSafe() {
    this[_encoder] = const || (const = dart.const(new convert.Base64Encoder.urlSafe()));
    super.new();
  }
  get encoder() {
    return this[_encoder];
  }
  get decoder() {
    return const || (const = 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 = 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;
  }
  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]);
    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] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state]);
    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]: 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 = Symbol('_add');
convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
  new() {
    super.new();
  }
  add(source) {
    this[_add](source, 0, source[dartx.length], false);
  }
  close() {
    this[_add](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](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](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]: 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](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]: 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;
  }
  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]))) {
      this[_state] = convert._Base64Decoder._checkPadding(input, start, end, this[_state]);
      return null;
    }
    if (start == end) return typed_data.Uint8List.new(0);
    let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state]);
    this[_state] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state]);
    return buffer;
  }
  close(input, end) {
    if (dart.notNull(this[_state]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
      dart.throw(new core.FormatException("Missing padding character", input, end));
    }
    if (dart.notNull(this[_state]) > 0) {
      dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
    }
    this[_state] = 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]: 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 = 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].encoder.fuse(T)(this[_second].encoder);
    }
    get decoder() {
      return this[_second].decoder.fuse(S)(this[_first].decoder);
    }
    new(first, second) {
      this[_first] = first;
      this[_second] = second;
      super.new();
    }
  }
  dart.setSignature(_FusedCodec, {
    constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
    fields: () => ({
      [_first]: 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), [])
    })
  });
  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] = first;
      this[_second] = second;
      super.new();
    }
    convert(input) {
      S._check(input);
      return this[_second].convert(this[_first].convert(input));
    }
    startChunkedConversion(sink) {
      SinkOfT()._check(sink);
      return this[_first].startChunkedConversion(this[_second].startChunkedConversion(sink));
    }
  }
  dart.setSignature(_FusedConverter, {
    constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
    fields: () => ({
      [_first]: ConverterOfS$M(),
      [_second]: ConverterOfM$T()
    }),
    methods: () => ({convert: dart.definiteFunctionType(T, [S])})
  });
  return _FusedConverter;
});
convert._FusedConverter = _FusedConverter();
const _name = Symbol('_name');
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
  _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
    this[_name] = 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] = name;
  }
  toString() {
    return this[_name];
  }
};
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]: 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 || (const = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
  },
  get ATTRIBUTE() {
    return const || (const = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
  },
  get SQ_ATTRIBUTE() {
    return const || (const = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
  },
  get ELEMENT() {
    return const || (const = 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;
let const;
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 || (const = dart.const(new convert.JsonEncoder()));
    return new convert.JsonEncoder(this[_toEncodable]);
  }
  get decoder() {
    if (this[_reviver] == null) return const || (const = 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()])
  })
});
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()])
  }),
  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()])
  })
});
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);
    }, dynamicAnddynamicToNull()));
    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);
    }, dynamicAnddynamicToNull()));
    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;
let const;
let const;
let const;
let const;
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 || (const = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
    } else {
      return (const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
    }
  }
  get encoder() {
    return const || (const = dart.const(new convert.Latin1Encoder()));
  }
  get decoder() {
    return dart.test(this[_allowInvalid]) ? const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const || (const = 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})})
});
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;
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 || (const = 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;
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 || (const = 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()])
  })
});
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()])
  }),
  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++;
      }, SymbolAnddynamicToNull()));
    }
    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);
    }, SymbolAnddynamicToNull()));
    return result;
  }
};
core.Function.is = function is_Function(o) {
  return typeof o == "function";
};
core.Function.as = function as_Function(o) {
  if (typeof o == "function" || o == null) return o;
  return dart.as(o, core.Function);
};
core.Function._check = function check_String(o) {
  if (typeof o == "function" || o == null) return o;
  return dart.check(o, core.Function);
};
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 = 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;
      this[_generator] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
      super.new();
    }
    slice(start, end, generator) {
      this[_start] = start;
      this[_end] = end;
      this[_generator] = generator;
      super.new();
    }
    get iterator() {
      return new (_GeneratorIteratorOfE())(this[_start], this[_end], this[_generator]);
    }
    get length() {
      return dart.notNull(this[_end]) - dart.notNull(this[_start]);
    }
    skip(count) {
      core.RangeError.checkNotNegative(count, "count");
      if (count == 0) return this;
      let newStart = dart.notNull(this[_start]) + 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]) + dart.notNull(count);
      if (newEnd >= dart.notNull(this[_end])) return this;
      return new (_GeneratorIterableOfE()).slice(this[_start], 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]: core.int,
      [_end]: core.int,
      [_generator]: _GeneratorOfE()
    }),
    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
    statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
    names: ['_id']
  });
  dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
  return _GeneratorIterable;
});
core._GeneratorIterable = _GeneratorIterable();
const _index = Symbol('_index');
const _current = 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] = index;
      this[_end] = end;
      this[_generator] = generator;
      this[_current] = null;
    }
    moveNext() {
      if (dart.notNull(this[_index]) < dart.notNull(this[_end])) {
        this[_current] = this[_generator](this[_index]);
        this[_index] = dart.notNull(this[_index]) + 1;
        return true;
      } else {
        this[_current] = null;
        return false;
      }
    }
    get current() {
      return this[_current];
    }
  }
  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]: core.int,
      [_current]: 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] = null;
    this[_stop] = null;
    core.Stopwatch._initTicker();
  }
  start() {
    if (dart.test(this.isRunning)) return;
    if (this[_start] == null) {
      this[_start] = core.Stopwatch._now();
    } else {
      this[_start] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start]));
      this[_stop] = null;
    }
  }
  stop() {
    if (!dart.test(this.isRunning)) return;
    this[_stop] = core.Stopwatch._now();
  }
  reset() {
    if (this[_start] == null) return;
    this[_start] = core.Stopwatch._now();
    if (this[_stop] != null) {
      this[_stop] = this[_start];
    }
  }
  get elapsedTicks() {
    if (this[_start] == null) {
      return 0;
    }
    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start]) : dart.notNull(this[_stop]) - dart.notNull(this[_start]);
  }
  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] != 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]: 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, [])})
});
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;
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}`));
        }
      }
    }, StringToNull()));
  }
  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 || (const = 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);
        }
      }
    }, StringAnddynamicToNull()));
    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));
    }, StringAndStringToNull())));
  }
  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 = Symbol('_value');
const _toJSON = Symbol('_toJSON');
developer.Gauge = class Gauge extends developer.Metric {
  get value() {
    return this[_value];
  }
  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] = v;
  }
  new(name, description, min, max) {
    this.min = min;
    this.max = max;
    this[_value] = 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] = 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]: 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;
    super.new(name, description);
  }
  get value() {
    return this[_value];
  }
  set value(v) {
    this[_value] = 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]: 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 = 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]();
  }
  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]() {
    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]: 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] = start;
    this[_startCpu] = startCpu;
    this.category = 'Dart';
    this[_arguments] = null;
  }
  finish() {
    developer._reportCompleteEvent(this[_start], 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]: 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());
io.BytesBuilder = class BytesBuilder extends core.Object {
  static new(opts) {
    let copy = opts && 'copy' in opts ? opts.copy : true;
    if (dart.test(copy)) {
      return new io._CopyingBytesBuilder();
    } else {
      return new io._BytesBuilder();
    }
  }
};
dart.setSignature(io.BytesBuilder, {
  constructors: () => ({new: dart.definiteFunctionType(io.BytesBuilder, [], {copy: core.bool})})
});
const _length = Symbol('_length');
const _buffer = Symbol('_buffer');
const _pow2roundup = Symbol('_pow2roundup');
io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
  new() {
    this[_length] = 0;
    this[_buffer] = null;
  }
  add(bytes) {
    let bytesLength = bytes[dartx.length];
    if (bytesLength == 0) return;
    let required = dart.notNull(this[_length]) + dart.notNull(bytesLength);
    if (this[_buffer] == null) {
      let size = this[_pow2roundup](required);
      size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
      this[_buffer] = typed_data.Uint8List.new(size);
    } else if (dart.notNull(this[_buffer][dartx.length]) < required) {
      let size = dart.notNull(this[_pow2roundup](required)) * 2;
      let newBuffer = typed_data.Uint8List.new(size);
      newBuffer[dartx.setRange](0, this[_buffer][dartx.length], this[_buffer]);
      this[_buffer] = newBuffer;
    }
    dart.assert(dart.notNull(this[_buffer][dartx.length]) >= required);
    if (typed_data.Uint8List.is(bytes)) {
      this[_buffer][dartx.setRange](this[_length], required, bytes);
    } else {
      for (let i = 0; i < dart.notNull(bytesLength); i++) {
        this[_buffer][dartx._set](dart.notNull(this[_length]) + i, bytes[dartx._get](i));
      }
    }
    this[_length] = required;
  }
  addByte(byte) {
    this.add(JSArrayOfint().of([byte]));
  }
  takeBytes() {
    if (this[_buffer] == null) return typed_data.Uint8List.new(0);
    let buffer = typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]);
    this.clear();
    return buffer;
  }
  toBytes() {
    if (this[_buffer] == null) return typed_data.Uint8List.new(0);
    return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
  }
  get length() {
    return this[_length];
  }
  get isEmpty() {
    return this[_length] == 0;
  }
  get isNotEmpty() {
    return this[_length] != 0;
  }
  clear() {
    this[_length] = 0;
    this[_buffer] = null;
  }
  [_pow2roundup](x) {
    x = dart.notNull(x) - 1;
    x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](4)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](8)) >>> 0;
    x = (dart.notNull(x) | x[dartx['>>']](16)) >>> 0;
    return dart.notNull(x) + 1;
  }
};
io._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setSignature(io._CopyingBytesBuilder, {
  fields: () => ({
    [_length]: core.int,
    [_buffer]: typed_data.Uint8List
  }),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addByte: dart.definiteFunctionType(dart.void, [core.int]),
    takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
    toBytes: dart.definiteFunctionType(core.List$(core.int), []),
    clear: dart.definiteFunctionType(dart.void, []),
    [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
  }),
  sfields: () => ({_INIT_SIZE: core.int})
});
io._CopyingBytesBuilder._INIT_SIZE = 1024;
const _chunks = Symbol('_chunks');
io._BytesBuilder = class _BytesBuilder extends core.Object {
  new() {
    this[_chunks] = JSArrayOfListOfint().of([]);
    this[_length] = 0;
  }
  add(bytes) {
    if (!typed_data.Uint8List.is(bytes)) {
      bytes = typed_data.Uint8List.fromList(bytes);
    }
    this[_chunks][dartx.add](bytes);
    this[_length] = dart.notNull(this[_length]) + dart.notNull(bytes[dartx.length]);
  }
  addByte(byte) {
    this.add(JSArrayOfint().of([byte]));
  }
  takeBytes() {
    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
    if (this[_chunks][dartx.length] == 1) {
      let buffer = this[_chunks][dartx.single];
      this.clear();
      return buffer;
    }
    let buffer = typed_data.Uint8List.new(this[_length]);
    let offset = 0;
    for (let chunk of this[_chunks]) {
      buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
      offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
    }
    this.clear();
    return buffer;
  }
  toBytes() {
    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
    let buffer = typed_data.Uint8List.new(this[_length]);
    let offset = 0;
    for (let chunk of this[_chunks]) {
      buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
      offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
    }
    return buffer;
  }
  get length() {
    return this[_length];
  }
  get isEmpty() {
    return this[_length] == 0;
  }
  get isNotEmpty() {
    return this[_length] != 0;
  }
  clear() {
    this[_length] = 0;
    this[_chunks][dartx.clear]();
  }
};
io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
dart.setSignature(io._BytesBuilder, {
  fields: () => ({
    [_length]: core.int,
    [_chunks]: ListOfListOfint()
  }),
  getters: () => ({
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addByte: dart.definiteFunctionType(dart.void, [core.int]),
    takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
    toBytes: dart.definiteFunctionType(core.List$(core.int), []),
    clear: dart.definiteFunctionType(dart.void, [])
  })
});
io._SUCCESS_RESPONSE = 0;
io._ILLEGAL_ARGUMENT_RESPONSE = 1;
io._OSERROR_RESPONSE = 2;
io._FILE_CLOSED_RESPONSE = 3;
io._ERROR_RESPONSE_ERROR_TYPE = 0;
io._OSERROR_RESPONSE_ERROR_CODE = 1;
io._OSERROR_RESPONSE_MESSAGE = 2;
io._isErrorResponse = function(response) {
  return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
};
dart.fn(io._isErrorResponse, dynamicTobool());
io._exceptionFromResponse = function(response, message, path) {
  dart.assert(io._isErrorResponse(response));
  switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
    case io._ILLEGAL_ARGUMENT_RESPONSE:
    {
      return new core.ArgumentError();
    }
    case io._OSERROR_RESPONSE:
    {
      let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
      return new io.FileSystemException(message, path, err);
    }
    case io._FILE_CLOSED_RESPONSE:
    {
      return new io.FileSystemException("File closed", path);
    }
    default:
    {
      return core.Exception.new("Unknown error");
    }
  }
};
dart.fn(io._exceptionFromResponse, dynamicAndStringAndStringTodynamic());
io.IOException = class IOException extends core.Object {
  toString() {
    return "IOException";
  }
};
io.IOException[dart.implements] = () => [core.Exception];
io.OSError = class OSError extends core.Object {
  new(message, errorCode) {
    if (message === void 0) message = "";
    if (errorCode === void 0) errorCode = io.OSError.noErrorCode;
    this.message = message;
    this.errorCode = errorCode;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write("OS Error");
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(": ");
      sb.write(this.message);
      if (this.errorCode != io.OSError.noErrorCode) {
        sb.write(", errno = ");
        sb.write(dart.toString(this.errorCode));
      }
    } else if (this.errorCode != io.OSError.noErrorCode) {
      sb.write(": errno = ");
      sb.write(dart.toString(this.errorCode));
    }
    return sb.toString();
  }
};
dart.setSignature(io.OSError, {
  constructors: () => ({new: dart.definiteFunctionType(io.OSError, [], [core.String, core.int])}),
  fields: () => ({
    message: core.String,
    errorCode: core.int
  }),
  sfields: () => ({noErrorCode: core.int})
});
io.OSError.noErrorCode = -1;
io._BufferAndStart = class _BufferAndStart extends core.Object {
  new(buffer, start) {
    this.buffer = buffer;
    this.start = start;
  }
};
dart.setSignature(io._BufferAndStart, {
  constructors: () => ({new: dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int])}),
  fields: () => ({
    buffer: core.List,
    start: core.int
  })
});
io._ensureFastAndSerializableByteData = function(buffer, start, end) {
  if (typed_data.Uint8List.is(buffer) || typed_data.Int8List.is(buffer)) {
    return new io._BufferAndStart(buffer, start);
  }
  let length = dart.notNull(end) - dart.notNull(start);
  let newBuffer = typed_data.Uint8List.new(length);
  let j = start;
  for (let i = 0; i < length; i++) {
    let value = core.int._check(buffer[dartx._get](j));
    if (!(typeof value == 'number')) {
      dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
    }
    newBuffer[dartx._set](i, value);
    j = dart.notNull(j) + 1;
  }
  return new io._BufferAndStart(newBuffer, 0);
};
dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
io._IOCrypto = class _IOCrypto extends core.Object {
  static getRandomBytes(count) {
    dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
  }
};
dart.setSignature(io._IOCrypto, {
  statics: () => ({getRandomBytes: dart.definiteFunctionType(typed_data.Uint8List, [core.int])}),
  names: ['getRandomBytes']
});
io._CryptoUtils = class _CryptoUtils extends core.Object {
  static bytesToHex(bytes) {
    let result = new core.StringBuffer();
    for (let part of bytes) {
      result.write(dart.str`${dart.notNull(part) < 16 ? '0' : ''}${part[dartx.toRadixString](16)}`);
    }
    return result.toString();
  }
  static bytesToBase64(bytes, urlSafe, addLineSeparator) {
    if (urlSafe === void 0) urlSafe = false;
    if (addLineSeparator === void 0) addLineSeparator = false;
    let len = bytes[dartx.length];
    if (len == 0) {
      return "";
    }
    let lookup = dart.test(urlSafe) ? io._CryptoUtils._encodeTableUrlSafe : io._CryptoUtils._encodeTable;
    let remainderLength = dart.asInt(len[dartx.remainder](3));
    let chunkLength = dart.notNull(len) - dart.notNull(remainderLength);
    let outputLen = (dart.notNull(len) / 3)[dartx.truncate]() * 4 + (dart.notNull(remainderLength) > 0 ? 4 : 0);
    if (dart.test(addLineSeparator)) {
      outputLen = outputLen + (((outputLen - 1) / io._CryptoUtils.LINE_LENGTH)[dartx.truncate]() << 1 >>> 0);
    }
    let out = ListOfint().new(outputLen);
    let j = 0, i = 0, c = 0;
    while (i < chunkLength) {
      let x = (dart.notNull(bytes[dartx._get](i++)) << 16 & 16777215 | dart.notNull(bytes[dartx._get](i++)) << 8 & 16777215 | dart.notNull(bytes[dartx._get](i++))) >>> 0;
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](18)));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 12 & 63));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 6 & 63));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x & 63));
      if (dart.test(addLineSeparator) && ++c == 19 && j < outputLen - 2) {
        out[dartx._set](j++, io._CryptoUtils.CR);
        out[dartx._set](j++, io._CryptoUtils.LF);
        c = 0;
      }
    }
    if (remainderLength == 1) {
      let x = bytes[dartx._get](i);
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(x) << 4 & 63));
      out[dartx._set](j++, io._CryptoUtils.PAD);
      out[dartx._set](j++, io._CryptoUtils.PAD);
    } else if (remainderLength == 2) {
      let x = bytes[dartx._get](i);
      let y = bytes[dartx._get](i + 1);
      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
      out[dartx._set](j++, lookup[dartx.codeUnitAt]((dart.notNull(x) << 4 | dart.notNull(y) >> 4) & 63));
      out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(y) << 2 & 63));
      out[dartx._set](j++, io._CryptoUtils.PAD);
    }
    return core.String.fromCharCodes(out);
  }
  static base64StringToBytes(input, ignoreInvalidCharacters) {
    if (ignoreInvalidCharacters === void 0) ignoreInvalidCharacters = true;
    let len = input[dartx.length];
    if (len == 0) {
      return ListOfint().new(0);
    }
    let extrasLen = 0;
    for (let i = 0; i < dart.notNull(len); i++) {
      let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i));
      if (dart.notNull(c) < 0) {
        extrasLen++;
        if (c == -2 && !dart.test(ignoreInvalidCharacters)) {
          dart.throw(new core.FormatException(dart.str`Invalid character: ${input[dartx._get](i)}`));
        }
      }
    }
    if ((dart.notNull(len) - extrasLen)[dartx['%']](4) != 0) {
      dart.throw(new core.FormatException(dart.str`Size of Base 64 characters in Input\n          must be a multiple of 4. Input: ${input}`));
    }
    let padLength = 0;
    for (let i = dart.notNull(len) - 1; i >= 0; i--) {
      let currentCodeUnit = input[dartx.codeUnitAt](i);
      if (dart.notNull(io._CryptoUtils._decodeTable[dartx._get](currentCodeUnit)) > 0) break;
      if (currentCodeUnit == io._CryptoUtils.PAD) padLength++;
    }
    let outputLen = ((dart.notNull(len) - extrasLen) * 6)[dartx['>>']](3) - padLength;
    let out = ListOfint().new(outputLen);
    for (let i = 0, o = 0; o < outputLen;) {
      let x = 0;
      for (let j = 4; j > 0;) {
        let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i++));
        if (dart.notNull(c) >= 0) {
          x = (x << 6 & 16777215 | dart.notNull(c)) >>> 0;
          j--;
        }
      }
      out[dartx._set](o++, x[dartx['>>']](16));
      if (o < outputLen) {
        out[dartx._set](o++, x >> 8 & 255);
        if (o < outputLen) out[dartx._set](o++, x & 255);
      }
    }
    return out;
  }
};
dart.setSignature(io._CryptoUtils, {
  sfields: () => ({
    PAD: core.int,
    CR: core.int,
    LF: core.int,
    LINE_LENGTH: core.int,
    _encodeTable: core.String,
    _encodeTableUrlSafe: core.String,
    _decodeTable: ListOfint()
  }),
  statics: () => ({
    bytesToHex: dart.definiteFunctionType(core.String, [ListOfint()]),
    bytesToBase64: dart.definiteFunctionType(core.String, [ListOfint()], [core.bool, core.bool]),
    base64StringToBytes: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.bool])
  }),
  names: ['bytesToHex', 'bytesToBase64', 'base64StringToBytes']
});
io._CryptoUtils.PAD = 61;
io._CryptoUtils.CR = 13;
io._CryptoUtils.LF = 10;
io._CryptoUtils.LINE_LENGTH = 76;
io._CryptoUtils._encodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
io._CryptoUtils._encodeTableUrlSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
io._CryptoUtils._decodeTable = dart.constList([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, 0, -2, -2, -2, 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, -2, -2, -2, -2, 63, -2, 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, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2], core.int);
io._MASK_8 = 255;
io._MASK_32 = 4294967295;
io._BITS_PER_BYTE = 8;
io._BYTES_PER_WORD = 4;
const _chunkSizeInWords = Symbol('_chunkSizeInWords');
const _digestSizeInWords = Symbol('_digestSizeInWords');
const _bigEndianWords = Symbol('_bigEndianWords');
const _pendingData = Symbol('_pendingData');
const _lengthInBytes = Symbol('_lengthInBytes');
const _currentChunk = Symbol('_currentChunk');
const _h = Symbol('_h');
const _digestCalled = Symbol('_digestCalled');
const _iterate = Symbol('_iterate');
const _resultAsBytes = Symbol('_resultAsBytes');
const _finalizeData = Symbol('_finalizeData');
const _add32 = Symbol('_add32');
const _roundUp = Symbol('_roundUp');
const _rotl32 = Symbol('_rotl32');
const _wordToBytes = Symbol('_wordToBytes');
const _bytesToChunk = Symbol('_bytesToChunk');
const _updateHash = Symbol('_updateHash');
io._HashBase = class _HashBase extends core.Object {
  new(chunkSizeInWords, digestSizeInWords, bigEndianWords) {
    this[_chunkSizeInWords] = chunkSizeInWords;
    this[_digestSizeInWords] = digestSizeInWords;
    this[_bigEndianWords] = bigEndianWords;
    this[_pendingData] = JSArrayOfint().of([]);
    this[_lengthInBytes] = 0;
    this[_currentChunk] = null;
    this[_h] = null;
    this[_digestCalled] = false;
    this[_currentChunk] = ListOfint().new(this[_chunkSizeInWords]);
    this[_h] = ListOfint().new(this[_digestSizeInWords]);
  }
  add(data) {
    if (dart.test(this[_digestCalled])) {
      dart.throw(new core.StateError('Hash update method called after digest was retrieved'));
    }
    this[_lengthInBytes] = dart.notNull(this[_lengthInBytes]) + dart.notNull(data[dartx.length]);
    this[_pendingData][dartx.addAll](data);
    this[_iterate]();
  }
  close() {
    if (dart.test(this[_digestCalled])) {
      return ListOfint()._check(this[_resultAsBytes]());
    }
    this[_digestCalled] = true;
    this[_finalizeData]();
    this[_iterate]();
    dart.assert(this[_pendingData][dartx.length] == 0);
    return ListOfint()._check(this[_resultAsBytes]());
  }
  get blockSize() {
    return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
  }
  [_add32](x, y) {
    return dart.dsend(dart.dsend(x, '+', y), '&', io._MASK_32);
  }
  [_roundUp](val, n) {
    return dart.dsend(dart.dsend(dart.dsend(val, '+', n), '-', 1), '&', dart.dsend(n, '_negate'));
  }
  [_rotl32](val, shift) {
    let mod_shift = dart.notNull(shift) & 31;
    return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
  }
  [_resultAsBytes]() {
    let result = [];
    for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
      result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
    }
    return result;
  }
  [_bytesToChunk](data, dataIndex) {
    dart.assert(dart.notNull(data[dartx.length]) - dart.notNull(dataIndex) >= dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD);
    for (let wordIndex = 0; wordIndex < dart.notNull(this[_chunkSizeInWords]); wordIndex++) {
      let w3 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dataIndex) : data[dartx._get](dart.notNull(dataIndex) + 3);
      let w2 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 1) : data[dartx._get](dart.notNull(dataIndex) + 2);
      let w1 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 2) : data[dartx._get](dart.notNull(dataIndex) + 1);
      let w0 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 3) : data[dartx._get](dataIndex);
      dataIndex = dart.notNull(dataIndex) + 4;
      let word = (dart.notNull(w3) & 255) << 24 >>> 0;
      word = (word | (dart.notNull(w2) & io._MASK_8) << 16) >>> 0;
      word = (word | (dart.notNull(w1) & io._MASK_8) << 8) >>> 0;
      word = (word | dart.notNull(w0) & io._MASK_8) >>> 0;
      this[_currentChunk][dartx._set](wordIndex, word);
    }
  }
  [_wordToBytes](word) {
    let bytes = ListOfint().new(io._BYTES_PER_WORD);
    bytes[dartx._set](0, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 24 : 0) & io._MASK_8);
    bytes[dartx._set](1, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 16 : 8) & io._MASK_8);
    bytes[dartx._set](2, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 8 : 16) & io._MASK_8);
    bytes[dartx._set](3, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 0 : 24) & io._MASK_8);
    return bytes;
  }
  [_iterate]() {
    let len = this[_pendingData][dartx.length];
    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
    if (dart.notNull(len) >= chunkSizeInBytes) {
      let index = 0;
      for (; dart.notNull(len) - index >= chunkSizeInBytes; index = index + chunkSizeInBytes) {
        this[_bytesToChunk](this[_pendingData], index);
        this[_updateHash](this[_currentChunk]);
      }
      this[_pendingData] = this[_pendingData][dartx.sublist](index, len);
    }
  }
  [_finalizeData]() {
    this[_pendingData][dartx.add](128);
    let contentsLength = dart.notNull(this[_lengthInBytes]) + 9;
    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
    let finalizedLength = this[_roundUp](contentsLength, chunkSizeInBytes);
    let zeroPadding = dart.dsend(finalizedLength, '-', contentsLength);
    for (let i = 0; i < dart.notNull(core.num._check(zeroPadding)); i++) {
      this[_pendingData][dartx.add](0);
    }
    let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
    dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
    if (dart.test(this[_bigEndianWords])) {
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
    } else {
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
    }
  }
};
dart.setSignature(io._HashBase, {
  constructors: () => ({new: dart.definiteFunctionType(io._HashBase, [core.int, core.int, core.bool])}),
  fields: () => ({
    [_chunkSizeInWords]: core.int,
    [_digestSizeInWords]: core.int,
    [_bigEndianWords]: core.bool,
    [_lengthInBytes]: core.int,
    [_pendingData]: ListOfint(),
    [_currentChunk]: ListOfint(),
    [_h]: ListOfint(),
    [_digestCalled]: core.bool
  }),
  getters: () => ({blockSize: dart.definiteFunctionType(core.int, [])}),
  methods: () => ({
    add: dart.definiteFunctionType(dart.dynamic, [ListOfint()]),
    close: dart.definiteFunctionType(core.List$(core.int), []),
    [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
    [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
    [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
    [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
    [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
    [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
    [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
  })
});
io._MD5 = class _MD5 extends io._HashBase {
  new() {
    super.new(16, 4, false);
    this[_h][dartx._set](0, 1732584193);
    this[_h][dartx._set](1, 4023233417);
    this[_h][dartx._set](2, 2562383102);
    this[_h][dartx._set](3, 271733878);
  }
  newInstance() {
    return new io._MD5();
  }
  [_updateHash](m) {
    dart.assert(m[dartx.length] == 16);
    let a = this[_h][dartx._get](0);
    let b = this[_h][dartx._get](1);
    let c = this[_h][dartx._get](2);
    let d = this[_h][dartx._get](3);
    let t0 = null;
    let t1 = null;
    for (let i = 0; i < 64; i++) {
      if (i < 16) {
        t0 = (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & io._MASK_32 & dart.notNull(d)) >>> 0;
        t1 = i;
      } else if (i < 32) {
        t0 = (dart.notNull(d) & dart.notNull(b) | ~dart.notNull(d) & io._MASK_32 & dart.notNull(c)) >>> 0;
        t1 = (5 * i + 1)[dartx['%']](16);
      } else if (i < 48) {
        t0 = (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0;
        t1 = (3 * i + 5)[dartx['%']](16);
      } else {
        t0 = (dart.notNull(c) ^ (dart.notNull(b) | ~dart.notNull(d) & io._MASK_32)) >>> 0;
        t1 = (7 * i)[dartx['%']](16);
      }
      let temp = d;
      d = c;
      c = b;
      b = core.int._check(this[_add32](b, this[_rotl32](core.int._check(this[_add32](this[_add32](a, t0), this[_add32](io._MD5._k[dartx._get](i), m[dartx._get](core.int._check(t1))))), io._MD5._r[dartx._get](i))));
      a = temp;
    }
    this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
    this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
    this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
    this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
  }
};
dart.setSignature(io._MD5, {
  constructors: () => ({new: dart.definiteFunctionType(io._MD5, [])}),
  methods: () => ({
    newInstance: dart.definiteFunctionType(io._MD5, []),
    [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
  }),
  sfields: () => ({
    _k: ListOfint(),
    _r: ListOfint()
  })
});
io._MD5._k = dart.constList([3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745], core.int);
io._MD5._r = dart.constList([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21], core.int);
const _w = Symbol('_w');
io._SHA1 = class _SHA1 extends io._HashBase {
  new() {
    this[_w] = ListOfint().new(80);
    super.new(16, 5, true);
    this[_h][dartx._set](0, 1732584193);
    this[_h][dartx._set](1, 4023233417);
    this[_h][dartx._set](2, 2562383102);
    this[_h][dartx._set](3, 271733878);
    this[_h][dartx._set](4, 3285377520);
  }
  newInstance() {
    return new io._SHA1();
  }
  [_updateHash](m) {
    dart.assert(m[dartx.length] == 16);
    let a = this[_h][dartx._get](0);
    let b = this[_h][dartx._get](1);
    let c = this[_h][dartx._get](2);
    let d = this[_h][dartx._get](3);
    let e = this[_h][dartx._get](4);
    for (let i = 0; i < 80; i++) {
      if (i < 16) {
        this[_w][dartx._set](i, m[dartx._get](i));
      } else {
        let n = (dart.notNull(this[_w][dartx._get](i - 3)) ^ dart.notNull(this[_w][dartx._get](i - 8)) ^ dart.notNull(this[_w][dartx._get](i - 14)) ^ dart.notNull(this[_w][dartx._get](i - 16))) >>> 0;
        this[_w][dartx._set](i, this[_rotl32](n, 1));
      }
      let t = this[_add32](this[_add32](this[_rotl32](a, 5), e), this[_w][dartx._get](i));
      if (i < 20) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & dart.notNull(d)) >>> 0), 1518500249);
      } else if (i < 40) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 1859775393);
      } else if (i < 60) {
        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | dart.notNull(b) & dart.notNull(d) | dart.notNull(c) & dart.notNull(d)) >>> 0), 2400959708);
      } else {
        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 3395469782);
      }
      e = d;
      d = c;
      c = this[_rotl32](b, 30);
      b = a;
      a = core.int._check(dart.dsend(t, '&', io._MASK_32));
    }
    this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
    this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
    this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
    this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
    this[_h][dartx._set](4, core.int._check(this[_add32](e, this[_h][dartx._get](4))));
  }
};
dart.setSignature(io._SHA1, {
  constructors: () => ({new: dart.definiteFunctionType(io._SHA1, [])}),
  fields: () => ({[_w]: ListOfint()}),
  methods: () => ({
    newInstance: dart.definiteFunctionType(io._SHA1, []),
    [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
  })
});
io.ZLibOption = class ZLibOption extends core.Object {};
dart.setSignature(io.ZLibOption, {
  sfields: () => ({
    MIN_WINDOW_BITS: core.int,
    MAX_WINDOW_BITS: core.int,
    DEFAULT_WINDOW_BITS: core.int,
    MIN_LEVEL: core.int,
    MAX_LEVEL: core.int,
    DEFAULT_LEVEL: core.int,
    MIN_MEM_LEVEL: core.int,
    MAX_MEM_LEVEL: core.int,
    DEFAULT_MEM_LEVEL: core.int,
    STRATEGY_FILTERED: core.int,
    STRATEGY_HUFFMAN_ONLY: core.int,
    STRATEGY_RLE: core.int,
    STRATEGY_FIXED: core.int,
    STRATEGY_DEFAULT: core.int
  })
});
io.ZLibOption.MIN_WINDOW_BITS = 8;
io.ZLibOption.MAX_WINDOW_BITS = 15;
io.ZLibOption.DEFAULT_WINDOW_BITS = 15;
io.ZLibOption.MIN_LEVEL = -1;
io.ZLibOption.MAX_LEVEL = 9;
io.ZLibOption.DEFAULT_LEVEL = 6;
io.ZLibOption.MIN_MEM_LEVEL = 1;
io.ZLibOption.MAX_MEM_LEVEL = 9;
io.ZLibOption.DEFAULT_MEM_LEVEL = 8;
io.ZLibOption.STRATEGY_FILTERED = 1;
io.ZLibOption.STRATEGY_HUFFMAN_ONLY = 2;
io.ZLibOption.STRATEGY_RLE = 3;
io.ZLibOption.STRATEGY_FIXED = 4;
io.ZLibOption.STRATEGY_DEFAULT = 0;
io.ZLibCodec = class ZLibCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    let gzip = opts && 'gzip' in opts ? opts.gzip : false;
    this.level = level;
    this.windowBits = windowBits;
    this.memLevel = memLevel;
    this.strategy = strategy;
    this.dictionary = dictionary;
    this.raw = raw;
    this.gzip = gzip;
    super.new();
    io._validateZLibeLevel(this.level);
    io._validateZLibMemLevel(this.memLevel);
    io._validateZLibStrategy(this.strategy);
    io._validateZLibWindowBits(this.windowBits);
  }
  _default() {
    this.level = io.ZLibOption.DEFAULT_LEVEL;
    this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
    this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
    this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
    this.raw = false;
    this.gzip = false;
    this.dictionary = null;
    super.new();
  }
  get encoder() {
    return new io.ZLibEncoder({gzip: false, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
  }
  get decoder() {
    return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
  }
};
dart.addSimpleTypeTests(io.ZLibCodec);
dart.defineNamedConstructor(io.ZLibCodec, '_default');
dart.setSignature(io.ZLibCodec, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.ZLibCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
    _default: dart.definiteFunctionType(io.ZLibCodec, [])
  }),
  fields: () => ({
    gzip: core.bool,
    level: core.int,
    memLevel: core.int,
    strategy: core.int,
    windowBits: core.int,
    raw: core.bool,
    dictionary: ListOfint()
  }),
  getters: () => ({
    encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
    decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
  })
});
io.ZLIB = dart.const(new io.ZLibCodec._default());
io.GZipCodec = class GZipCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    let gzip = opts && 'gzip' in opts ? opts.gzip : true;
    this.level = level;
    this.windowBits = windowBits;
    this.memLevel = memLevel;
    this.strategy = strategy;
    this.dictionary = dictionary;
    this.raw = raw;
    this.gzip = gzip;
    super.new();
    io._validateZLibeLevel(this.level);
    io._validateZLibMemLevel(this.memLevel);
    io._validateZLibStrategy(this.strategy);
    io._validateZLibWindowBits(this.windowBits);
  }
  _default() {
    this.level = io.ZLibOption.DEFAULT_LEVEL;
    this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
    this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
    this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
    this.raw = false;
    this.gzip = true;
    this.dictionary = null;
    super.new();
  }
  get encoder() {
    return new io.ZLibEncoder({gzip: true, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
  }
  get decoder() {
    return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
  }
};
dart.addSimpleTypeTests(io.GZipCodec);
dart.defineNamedConstructor(io.GZipCodec, '_default');
dart.setSignature(io.GZipCodec, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.GZipCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
    _default: dart.definiteFunctionType(io.GZipCodec, [])
  }),
  fields: () => ({
    gzip: core.bool,
    level: core.int,
    memLevel: core.int,
    strategy: core.int,
    windowBits: core.int,
    dictionary: ListOfint(),
    raw: core.bool
  }),
  getters: () => ({
    encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
    decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
  })
});
io.GZIP = dart.const(new io.GZipCodec._default());
io.ZLibEncoder = class ZLibEncoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let gzip = opts && 'gzip' in opts ? opts.gzip : false;
    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    this.gzip = gzip;
    this.level = level;
    this.windowBits = windowBits;
    this.memLevel = memLevel;
    this.strategy = strategy;
    this.dictionary = dictionary;
    this.raw = raw;
    super.new();
    io._validateZLibeLevel(this.level);
    io._validateZLibMemLevel(this.memLevel);
    io._validateZLibStrategy(this.strategy);
    io._validateZLibWindowBits(this.windowBits);
  }
  convert(bytes) {
    let sink = new io._BufferSink();
    let _ = this.startChunkedConversion(sink);
    _.add(bytes);
    _.close();
    return sink.builder.takeBytes();
  }
  startChunkedConversion(sink) {
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new io._ZLibEncoderSink(convert.ByteConversionSink._check(sink), this.gzip, this.level, this.windowBits, this.memLevel, this.strategy, this.dictionary, this.raw);
  }
};
dart.addSimpleTypeTests(io.ZLibEncoder);
dart.setSignature(io.ZLibEncoder, {
  constructors: () => ({new: dart.definiteFunctionType(io.ZLibEncoder, [], {gzip: core.bool, level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool})}),
  fields: () => ({
    gzip: core.bool,
    level: core.int,
    memLevel: core.int,
    strategy: core.int,
    windowBits: core.int,
    dictionary: ListOfint(),
    raw: core.bool
  }),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
  })
});
io.ZLibDecoder = class ZLibDecoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
  new(opts) {
    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
    let raw = opts && 'raw' in opts ? opts.raw : false;
    this.windowBits = windowBits;
    this.dictionary = dictionary;
    this.raw = raw;
    super.new();
    io._validateZLibWindowBits(this.windowBits);
  }
  convert(bytes) {
    let sink = new io._BufferSink();
    let _ = this.startChunkedConversion(sink);
    _.add(bytes);
    _.close();
    return sink.builder.takeBytes();
  }
  startChunkedConversion(sink) {
    if (!convert.ByteConversionSink.is(sink)) {
      sink = convert.ByteConversionSink.from(sink);
    }
    return new io._ZLibDecoderSink(convert.ByteConversionSink._check(sink), this.windowBits, this.dictionary, this.raw);
  }
};
dart.addSimpleTypeTests(io.ZLibDecoder);
dart.setSignature(io.ZLibDecoder, {
  constructors: () => ({new: dart.definiteFunctionType(io.ZLibDecoder, [], {windowBits: core.int, dictionary: ListOfint(), raw: core.bool})}),
  fields: () => ({
    windowBits: core.int,
    dictionary: ListOfint(),
    raw: core.bool
  }),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
  })
});
io._BufferSink = class _BufferSink extends convert.ByteConversionSink {
  new() {
    this.builder = io.BytesBuilder.new({copy: false});
    super.new();
  }
  add(chunk) {
    this.builder.add(chunk);
  }
  addSlice(chunk, start, end, isLast) {
    if (typed_data.Uint8List.is(chunk)) {
      let list = chunk;
      this.builder.add(typed_data.Uint8List.view(list[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
    } else {
      this.builder.add(chunk[dartx.sublist](start, end));
    }
  }
  close() {}
};
dart.setSignature(io._BufferSink, {
  fields: () => ({builder: io.BytesBuilder}),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
const _sink = Symbol('_sink');
const _filter = Symbol('_filter');
const _closed = Symbol('_closed');
const _empty = Symbol('_empty');
let const;
io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
  new(sink, filter) {
    this[_sink] = sink;
    this[_filter] = filter;
    this[_closed] = false;
    this[_empty] = true;
    super.new();
  }
  add(data) {
    this.addSlice(data, 0, data[dartx.length], false);
  }
  addSlice(data, start, end, isLast) {
    if (dart.test(this[_closed])) return;
    if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
    core.RangeError.checkValidRange(start, end, data[dartx.length]);
    try {
      this[_empty] = false;
      let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
      this[_filter].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
      let out = null;
      while ((out = this[_filter].processed({flush: false})) != null) {
        this[_sink].add(ListOfint()._check(out));
      }
    } catch (e) {
      this[_closed] = true;
      throw e;
    }

    if (dart.test(isLast)) this.close();
  }
  close() {
    if (dart.test(this[_closed])) return;
    if (dart.test(this[_empty])) this[_filter].process(const || (const = dart.constList([], core.int)), 0, 0);
    try {
      let out = null;
      while ((out = this[_filter].processed({end: true})) != null) {
        this[_sink].add(ListOfint()._check(out));
      }
    } catch (e) {
      this[_closed] = true;
      dart.throw(e);
    }

    this[_closed] = true;
    this[_sink].close();
  }
};
dart.setSignature(io._FilterSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._FilterSink, [convert.ByteConversionSink, io._Filter])}),
  fields: () => ({
    [_filter]: io._Filter,
    [_sink]: convert.ByteConversionSink,
    [_closed]: core.bool,
    [_empty]: core.bool
  }),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
io._ZLibEncoderSink = class _ZLibEncoderSink extends io._FilterSink {
  new(sink, gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
    super.new(sink, io._Filter._newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw));
  }
};
dart.setSignature(io._ZLibEncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._ZLibEncoderSink, [convert.ByteConversionSink, core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool])})
});
io._ZLibDecoderSink = class _ZLibDecoderSink extends io._FilterSink {
  new(sink, windowBits, dictionary, raw) {
    super.new(sink, io._Filter._newZLibInflateFilter(windowBits, dictionary, raw));
  }
};
dart.setSignature(io._ZLibDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._ZLibDecoderSink, [convert.ByteConversionSink, core.int, ListOfint(), core.bool])})
});
io._Filter = class _Filter extends core.Object {
  static _newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
    dart.throw(new core.UnsupportedError("_newZLibDeflateFilter"));
  }
  static _newZLibInflateFilter(windowBits, dictionary, raw) {
    dart.throw(new core.UnsupportedError("_newZLibInflateFilter"));
  }
};
dart.setSignature(io._Filter, {
  statics: () => ({
    _newZLibDeflateFilter: dart.definiteFunctionType(io._Filter, [core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool]),
    _newZLibInflateFilter: dart.definiteFunctionType(io._Filter, [core.int, ListOfint(), core.bool])
  }),
  names: ['_newZLibDeflateFilter', '_newZLibInflateFilter']
});
io._validateZLibWindowBits = function(windowBits) {
  if (io.ZLibOption.MIN_WINDOW_BITS > dart.notNull(windowBits) || io.ZLibOption.MAX_WINDOW_BITS < dart.notNull(windowBits)) {
    dart.throw(new core.RangeError.range(windowBits, io.ZLibOption.MIN_WINDOW_BITS, io.ZLibOption.MAX_WINDOW_BITS));
  }
};
dart.fn(io._validateZLibWindowBits, intTovoid());
io._validateZLibeLevel = function(level) {
  if (io.ZLibOption.MIN_LEVEL > dart.notNull(level) || io.ZLibOption.MAX_LEVEL < dart.notNull(level)) {
    dart.throw(new core.RangeError.range(level, io.ZLibOption.MIN_LEVEL, io.ZLibOption.MAX_LEVEL));
  }
};
dart.fn(io._validateZLibeLevel, intTovoid());
io._validateZLibMemLevel = function(memLevel) {
  if (io.ZLibOption.MIN_MEM_LEVEL > dart.notNull(memLevel) || io.ZLibOption.MAX_MEM_LEVEL < dart.notNull(memLevel)) {
    dart.throw(new core.RangeError.range(memLevel, io.ZLibOption.MIN_MEM_LEVEL, io.ZLibOption.MAX_MEM_LEVEL));
  }
};
dart.fn(io._validateZLibMemLevel, intTovoid());
let const;
io._validateZLibStrategy = function(strategy) {
  let strategies = const || (const = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
  if (strategies[dartx.indexOf](strategy) == -1) {
    dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
  }
};
dart.fn(io._validateZLibStrategy, intTovoid());
io.Directory = class Directory extends core.Object {
  static new(path) {
    return new io._Directory(path);
  }
  static fromUri(uri) {
    return io.Directory.new(uri.toFilePath());
  }
  static get current() {
    return io._Directory.current;
  }
  static set current(path) {
    io._Directory.current = path;
  }
  static get systemTemp() {
    return io._Directory.systemTemp;
  }
};
io.Directory[dart.implements] = () => [io.FileSystemEntity];
dart.setSignature(io.Directory, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.Directory, [core.String]),
    fromUri: dart.definiteFunctionType(io.Directory, [core.Uri])
  }),
  fields: () => ({path: core.String}),
  sgetters: () => ({
    current: dart.definiteFunctionType(io.Directory, []),
    systemTemp: dart.definiteFunctionType(io.Directory, [])
  }),
  ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])})
});
const _isErrorResponse = Symbol('_isErrorResponse');
const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
const _absolutePath = Symbol('_absolutePath');
const _computeExistingIndex = Symbol('_computeExistingIndex');
const _delete = Symbol('_delete');
const _deleteSync = Symbol('_deleteSync');
const _type = Symbol('_type');
io.FileSystemEntity = class FileSystemEntity extends core.Object {
  get uri() {
    return core.Uri.file(this.path);
  }
  resolveSymbolicLinks() {
    return io._IOService._dispatch(io._FILE_RESOLVE_SYMBOLIC_LINKS, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot resolve symbolic links", this.path));
      }
      return FutureOrOfString()._check(response);
    }, dynamicToFutureOrOfString()));
  }
  resolveSymbolicLinksSync() {
    let result = io.FileSystemEntity._resolveSymbolicLinks(this.path);
    io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
    return core.String._check(result);
  }
  delete(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return this[_delete]({recursive: recursive});
  }
  deleteSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return this[_deleteSync]({recursive: recursive});
  }
  watch(opts) {
    let events = opts && 'events' in opts ? opts.events : io.FileSystemEvent.ALL;
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return io._FileSystemWatcher._watch(io.FileSystemEntity._trimTrailingPathSeparators(this.path), events, recursive);
  }
  static identical(path1, path2) {
    return io._IOService._dispatch(io._FILE_IDENTICAL, JSArrayOfString().of([path1, path2])).then(core.bool)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, dart.str`Error in FileSystemEntity.identical(${path1}, ${path2})`, ""));
      }
      return FutureOrOfbool()._check(response);
    }, dynamicToFutureOrOfbool()));
  }
  get isAbsolute() {
    if (dart.test(io.Platform.isWindows)) {
      return this.path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern);
    } else {
      return this.path[dartx.startsWith]('/');
    }
  }
  get [_absolutePath]() {
    if (dart.test(this.isAbsolute)) return this.path;
    let current = io.Directory.current.path;
    if (dart.test(current[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(current[dartx.endsWith]('\\'))) {
      return dart.str`${current}${this.path}`;
    } else {
      return dart.str`${current}${io.Platform.pathSeparator}${this.path}`;
    }
  }
  static identicalSync(path1, path2) {
    let result = io.FileSystemEntity._identical(path1, path2);
    io.FileSystemEntity._throwIfError(result, 'Error in FileSystemEntity.identicalSync');
    return core.bool._check(result);
  }
  static get isWatchSupported() {
    return io._FileSystemWatcher.isSupported;
  }
  static type(path, opts) {
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return io.FileSystemEntity._getTypeAsync(path, followLinks).then(io.FileSystemEntityType)(io.FileSystemEntityType._lookup);
  }
  static typeSync(path, opts) {
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return io.FileSystemEntityType._lookup(io.FileSystemEntity._getTypeSync(path, followLinks));
  }
  static isLink(path) {
    return io.FileSystemEntity._getTypeAsync(path, false).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.LINK[_type], intTobool()));
  }
  static isFile(path) {
    return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.FILE[_type], intTobool()));
  }
  static isDirectory(path) {
    return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.DIRECTORY[_type], intTobool()));
  }
  static isLinkSync(path) {
    return io.FileSystemEntity._getTypeSync(path, false) == io.FileSystemEntityType.LINK[_type];
  }
  static isFileSync(path) {
    return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.FILE[_type];
  }
  static isDirectorySync(path) {
    return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.DIRECTORY[_type];
  }
  static _getType(path, followLinks) {
    dart.throw(new core.UnsupportedError("FileSystemEntity._getType"));
  }
  static _identical(path1, path2) {
    dart.throw(new core.UnsupportedError("FileSystemEntity._identical"));
  }
  static _resolveSymbolicLinks(path) {
    dart.throw(new core.UnsupportedError("FileSystemEntity._resolveSymbolicLinks"));
  }
  static parentOf(path) {
    let rootEnd = -1;
    if (dart.test(io.Platform.isWindows)) {
      if (dart.test(path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern))) {
        rootEnd = path[dartx.indexOf](core.RegExp.new('[/\\\\]'), 2);
        if (rootEnd == -1) return path;
      } else if (dart.test(path[dartx.startsWith]('\\')) || dart.test(path[dartx.startsWith]('/'))) {
        rootEnd = 0;
      }
    } else if (dart.test(path[dartx.startsWith]('/'))) {
      rootEnd = 0;
    }
    let pos = path[dartx.lastIndexOf](io.FileSystemEntity._parentRegExp);
    if (dart.notNull(pos) > dart.notNull(rootEnd)) {
      return path[dartx.substring](0, dart.notNull(pos) + 1);
    } else if (dart.notNull(rootEnd) > -1) {
      return path[dartx.substring](0, dart.notNull(rootEnd) + 1);
    } else {
      return '.';
    }
  }
  get parent() {
    return io.Directory.new(io.FileSystemEntity.parentOf(this.path));
  }
  static _getTypeSync(path, followLinks) {
    let result = io.FileSystemEntity._getType(path, followLinks);
    io.FileSystemEntity._throwIfError(result, 'Error getting type of FileSystemEntity');
    return core.int._check(result);
  }
  static _getTypeAsync(path, followLinks) {
    return io._IOService._dispatch(io._FILE_TYPE, JSArrayOfObject().of([path, followLinks])).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Error getting type", path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  static _throwIfError(result, msg, path) {
    if (path === void 0) path = null;
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException(msg, path, result));
    } else if (core.ArgumentError.is(result)) {
      dart.throw(result);
    }
  }
  static _trimTrailingPathSeparators(path) {
    if (!(typeof path == 'string')) return path;
    if (dart.test(io.Platform.isWindows)) {
      while (dart.notNull(path[dartx.length]) > 1 && (dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) || dart.test(path[dartx.endsWith]('/')))) {
        path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
      }
    } else {
      while (dart.notNull(path[dartx.length]) > 1 && dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
        path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
      }
    }
    return path;
  }
  static _ensureTrailingPathSeparators(path) {
    if (!(typeof path == 'string')) return path;
    if (dart.test(path[dartx.isEmpty])) path = '.';
    if (dart.test(io.Platform.isWindows)) {
      while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) && !dart.test(path[dartx.endsWith]('/'))) {
        path = dart.str`${path}${io.Platform.pathSeparator}`;
      }
    } else {
      while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
        path = dart.str`${path}${io.Platform.pathSeparator}`;
      }
    }
    return path;
  }
};
dart.setSignature(io.FileSystemEntity, {
  getters: () => ({
    uri: dart.definiteFunctionType(core.Uri, []),
    isAbsolute: dart.definiteFunctionType(core.bool, []),
    [_absolutePath]: dart.definiteFunctionType(core.String, []),
    parent: dart.definiteFunctionType(io.Directory, [])
  }),
  methods: () => ({
    resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
    resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
    delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
    deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
  }),
  sfields: () => ({
    _absoluteWindowsPathPattern: core.RegExp,
    _parentRegExp: core.RegExp
  }),
  sgetters: () => ({isWatchSupported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({
    identical: dart.definiteFunctionType(async.Future$(core.bool), [core.String, core.String]),
    identicalSync: dart.definiteFunctionType(core.bool, [core.String, core.String]),
    type: dart.definiteFunctionType(async.Future$(io.FileSystemEntityType), [core.String], {followLinks: core.bool}),
    typeSync: dart.definiteFunctionType(io.FileSystemEntityType, [core.String], {followLinks: core.bool}),
    isLink: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
    isFile: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
    isDirectory: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
    isLinkSync: dart.definiteFunctionType(core.bool, [core.String]),
    isFileSync: dart.definiteFunctionType(core.bool, [core.String]),
    isDirectorySync: dart.definiteFunctionType(core.bool, [core.String]),
    _getType: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
    _identical: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _resolveSymbolicLinks: dart.definiteFunctionType(dart.dynamic, [core.String]),
    parentOf: dart.definiteFunctionType(core.String, [core.String]),
    _getTypeSync: dart.definiteFunctionType(core.int, [core.String, core.bool]),
    _getTypeAsync: dart.definiteFunctionType(async.Future$(core.int), [core.String, core.bool]),
    _throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String]),
    _trimTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String]),
    _ensureTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String])
  }),
  names: ['identical', 'identicalSync', 'type', 'typeSync', 'isLink', 'isFile', 'isDirectory', 'isLinkSync', 'isFileSync', 'isDirectorySync', '_getType', '_identical', '_resolveSymbolicLinks', 'parentOf', '_getTypeSync', '_getTypeAsync', '_throwIfError', '_trimTrailingPathSeparators', '_ensureTrailingPathSeparators']
});
dart.defineLazy(io.FileSystemEntity, {
  get _absoluteWindowsPathPattern() {
    return core.RegExp.new('^(\\\\\\\\|[a-zA-Z]:[/\\\\])');
  },
  get _parentRegExp() {
    return dart.test(io.Platform.isWindows) ? core.RegExp.new('[^/\\\\][/\\\\]+[^/\\\\]') : core.RegExp.new('[^/]/+[^/]');
  }
});
io._Directory = class _Directory extends io.FileSystemEntity {
  new(path) {
    this.path = path;
    if (!(typeof this.path == 'string')) {
      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
    }
  }
  static _current() {
    dart.throw(new core.UnsupportedError("Directory._current"));
  }
  static _setCurrent(path) {
    dart.throw(new core.UnsupportedError("Directory_SetCurrent"));
  }
  static _createTemp(path) {
    dart.throw(new core.UnsupportedError("Directory._createTemp"));
  }
  static _systemTemp() {
    dart.throw(new core.UnsupportedError("Directory._systemTemp"));
  }
  static _exists(path) {
    dart.throw(new core.UnsupportedError("Directory._exists"));
  }
  static _create(path) {
    dart.throw(new core.UnsupportedError("Directory._create"));
  }
  static _deleteNative(path, recursive) {
    dart.throw(new core.UnsupportedError("Directory._deleteNative"));
  }
  static _rename(path, newPath) {
    dart.throw(new core.UnsupportedError("Directory._rename"));
  }
  static _fillWithDirectoryListing(list, path, recursive, followLinks) {
    dart.throw(new core.UnsupportedError("Directory._fillWithDirectoryListing"));
  }
  static get current() {
    let result = io._Directory._current();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Getting current working directory failed", "", result));
    }
    return new io._Directory(core.String._check(result));
  }
  static set current(path) {
    if (io.Directory.is(path)) path = dart.dload(path, 'path');
    let result = io._Directory._setCurrent(path);
    if (core.ArgumentError.is(result)) dart.throw(result);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Setting current working directory failed", core.String._check(path), result));
    }
  }
  get uri() {
    return core.Uri.directory(this.path);
  }
  exists() {
    return io._IOService._dispatch(io._DIRECTORY_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Exists failed"));
      }
      return dart.equals(response, 1);
    }, dynamicTobool()));
  }
  existsSync() {
    let result = io._Directory._exists(this.path);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Exists failed", this.path, result));
    }
    return dart.equals(result, 1);
  }
  get absolute() {
    return io.Directory.new(this[_absolutePath]);
  }
  stat() {
    return io.FileStat.stat(this.path);
  }
  statSync() {
    return io.FileStat.statSync(this.path);
  }
  [_computeExistingIndex](dirsToCreate) {
    let future = null;
    let notFound = dirsToCreate[dartx.length];
    for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
      if (future == null) {
        future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
      } else {
        future = dart.dsend(future, 'then', dart.fn(index => {
          if (!dart.equals(index, notFound)) {
            return async.Future.value(index);
          }
          return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
        }, dynamicTodynamic()));
      }
    }
    if (future == null) {
      return FutureOfint().value(notFound);
    } else {
      return FutureOfint()._check(future);
    }
  }
  create(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return this.exists().then(io.Directory)(dart.fn(exists => {
        if (dart.test(exists)) return this;
        if (this.path != this.parent.path) {
          return this.parent.create({recursive: true}).then(io.Directory)(dart.fn(_ => this.create(), DirectoryToFutureOfDirectory()));
        } else {
          return this.create();
        }
      }, boolToFutureOrOfDirectory()));
    } else {
      return io._IOService._dispatch(io._DIRECTORY_CREATE, JSArrayOfString().of([this.path])).then(io._Directory)(dart.fn(response => {
        if (dart.test(this[_isErrorResponse](response))) {
          dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation failed"));
        }
        return this;
      }, dynamicTo_Directory()));
    }
  }
  createSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      if (dart.test(this.existsSync())) return;
      if (this.path != this.parent.path) {
        this.parent.createSync({recursive: true});
      }
    }
    let result = io._Directory._create(this.path);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Creation failed", this.path, result));
    }
  }
  static get systemTemp() {
    return io.Directory.new(io._Directory._systemTemp());
  }
  createTemp(prefix) {
    if (prefix === void 0) prefix = null;
    if (prefix == null) prefix = '';
    if (this.path == '') {
      dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
    }
    let fullPrefix = null;
    if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
      fullPrefix = dart.str`${this.path}${prefix}`;
    } else {
      fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
    }
    return io._IOService._dispatch(io._DIRECTORY_CREATE_TEMP, JSArrayOfString().of([fullPrefix])).then(io.Directory)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation of temporary directory failed"));
      }
      return io.Directory.new(core.String._check(response));
    }, dynamicToDirectory()));
  }
  createTempSync(prefix) {
    if (prefix === void 0) prefix = null;
    if (prefix == null) prefix = '';
    if (this.path == '') {
      dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
    }
    let fullPrefix = null;
    if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
      fullPrefix = dart.str`${this.path}${prefix}`;
    } else {
      fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
    }
    let result = io._Directory._createTemp(fullPrefix);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Creation of temporary directory failed", fullPrefix, result));
    }
    return io.Directory.new(core.String._check(result));
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    return io._IOService._dispatch(io._DIRECTORY_DELETE, JSArrayOfObject().of([this.path, recursive])).then(io._Directory)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Deletion failed"));
      }
      return this;
    }, dynamicTo_Directory()));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let result = io._Directory._deleteNative(this.path, recursive);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Deletion failed", this.path, result));
    }
  }
  rename(newPath) {
    return io._IOService._dispatch(io._DIRECTORY_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.Directory)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionOrErrorFromResponse](response, "Rename failed"));
      }
      return io.Directory.new(newPath);
    }, dynamicToDirectory()));
  }
  renameSync(newPath) {
    if (!(typeof newPath == 'string')) {
      dart.throw(new core.ArgumentError());
    }
    let result = io._Directory._rename(this.path, newPath);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("Rename failed", this.path, result));
    }
    return io.Directory.new(newPath);
  }
  list(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
  }
  listSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
    if (!(typeof recursive == 'boolean') || !(typeof followLinks == 'boolean')) {
      dart.throw(new core.ArgumentError());
    }
    let result = JSArrayOfFileSystemEntity().of([]);
    io._Directory._fillWithDirectoryListing(result, io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks);
    return result;
  }
  toString() {
    return dart.str`Directory: '${this.path}'`;
  }
  [_isErrorResponse](response) {
    return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
  }
  [_exceptionOrErrorFromResponse](response, message) {
    dart.assert(this[_isErrorResponse](response));
    switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
      case io._ILLEGAL_ARGUMENT_RESPONSE:
      {
        return new core.ArgumentError();
      }
      case io._OSERROR_RESPONSE:
      {
        let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
        return new io.FileSystemException(message, this.path, err);
      }
      default:
      {
        return core.Exception.new("Unknown error");
      }
    }
  }
};
io._Directory[dart.implements] = () => [io.Directory];
dart.setSignature(io._Directory, {
  constructors: () => ({new: dart.definiteFunctionType(io._Directory, [core.String])}),
  fields: () => ({path: core.String}),
  getters: () => ({absolute: dart.definiteFunctionType(io.Directory, [])}),
  methods: () => ({
    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
    existsSync: dart.definiteFunctionType(core.bool, []),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
    statSync: dart.definiteFunctionType(io.FileStat, []),
    [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
    create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
    createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
    createTempSync: dart.definiteFunctionType(io.Directory, [], [core.String]),
    [_delete]: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    rename: dart.definiteFunctionType(async.Future$(io.Directory), [core.String]),
    renameSync: dart.definiteFunctionType(io.Directory, [core.String]),
    list: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
    listSync: dart.definiteFunctionType(core.List$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
    [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [_exceptionOrErrorFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])
  }),
  sgetters: () => ({
    current: dart.definiteFunctionType(io.Directory, []),
    systemTemp: dart.definiteFunctionType(io.Directory, [])
  }),
  ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
  statics: () => ({
    _current: dart.definiteFunctionType(dart.dynamic, []),
    _setCurrent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
    _createTemp: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _systemTemp: dart.definiteFunctionType(core.String, []),
    _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
    _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _fillWithDirectoryListing: dart.definiteFunctionType(dart.void, [ListOfFileSystemEntity(), core.String, core.bool, core.bool])
  }),
  names: ['_current', '_setCurrent', '_createTemp', '_systemTemp', '_exists', '_create', '_deleteNative', '_rename', '_fillWithDirectoryListing']
});
io._AsyncDirectoryListerOps = class _AsyncDirectoryListerOps extends core.Object {
  static new(pointer) {
    dart.throw(new core.UnsupportedError("Directory._list"));
  }
};
dart.setSignature(io._AsyncDirectoryListerOps, {
  constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryListerOps, [core.int])})
});
const _ops = Symbol('_ops');
const _pointer = Symbol('_pointer');
const _cleanup = Symbol('_cleanup');
io._AsyncDirectoryLister = class _AsyncDirectoryLister extends core.Object {
  new(path, recursive, followLinks) {
    this.closeCompleter = async.Completer.new();
    this.path = path;
    this.recursive = recursive;
    this.followLinks = followLinks;
    this.controller = null;
    this.canceled = false;
    this.nextRunning = false;
    this.closed = false;
    this[_ops] = null;
    this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
  }
  [_pointer]() {
    return this[_ops] == null ? null : this[_ops].getPointer();
  }
  get stream() {
    return this.controller.stream;
  }
  onListen() {
    io._IOService._dispatch(io._DIRECTORY_LIST_START, JSArrayOfObject().of([this.path, this.recursive, this.followLinks])).then(dart.dynamic)(dart.fn(response => {
      if (typeof response == 'number') {
        this[_ops] = io._AsyncDirectoryListerOps.new(response);
        this.next();
      } else if (core.Error.is(response)) {
        this.controller.addError(response, response.stackTrace);
        this.close();
      } else {
        this.error(response);
        this.close();
      }
    }, dynamicToNull()));
  }
  onResume() {
    if (!dart.test(this.nextRunning)) {
      this.next();
    }
  }
  onCancel() {
    this.canceled = true;
    if (!dart.test(this.nextRunning)) {
      this.close();
    }
    return this.closeCompleter.future;
  }
  next() {
    if (dart.test(this.canceled)) {
      this.close();
      return;
    }
    if (dart.test(this.controller.isPaused) || dart.test(this.nextRunning)) {
      return;
    }
    let pointer = this[_pointer]();
    if (pointer == null) {
      return;
    }
    this.nextRunning = true;
    io._IOService._dispatch(io._DIRECTORY_LIST_NEXT, JSArrayOfint().of([pointer])).then(dart.dynamic)(dart.fn(result => {
      this.nextRunning = false;
      if (core.List.is(result)) {
        this.next();
        dart.assert(result[dartx.length][dartx['%']](2) == 0);
        for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
          dart.assert(i[dartx['%']](2) == 0);
          switch (result[dartx._get](i++)) {
            case io._AsyncDirectoryLister.LIST_FILE:
            {
              this.controller.add(io.File.new(core.String._check(result[dartx._get](i))));
              break;
            }
            case io._AsyncDirectoryLister.LIST_DIRECTORY:
            {
              this.controller.add(io.Directory.new(core.String._check(result[dartx._get](i))));
              break;
            }
            case io._AsyncDirectoryLister.LIST_LINK:
            {
              this.controller.add(io.Link.new(core.String._check(result[dartx._get](i))));
              break;
            }
            case io._AsyncDirectoryLister.LIST_ERROR:
            {
              this.error(result[dartx._get](i));
              break;
            }
            case io._AsyncDirectoryLister.LIST_DONE:
            {
              this.canceled = true;
              return;
            }
          }
        }
      } else {
        this.controller.addError(new io.FileSystemException("Internal error"));
      }
    }, dynamicToNull()));
  }
  [_cleanup]() {
    this.controller.close();
    this.closeCompleter.complete();
    this[_ops] = null;
  }
  close() {
    if (dart.test(this.closed)) {
      return;
    }
    if (dart.test(this.nextRunning)) {
      return;
    }
    this.closed = true;
    let pointer = this[_pointer]();
    if (pointer == null) {
      this[_cleanup]();
    } else {
      io._IOService._dispatch(io._DIRECTORY_LIST_STOP, JSArrayOfint().of([pointer])).whenComplete(dart.bind(this, _cleanup));
    }
  }
  error(message) {
    let errorType = dart.dindex(dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR), io._ERROR_RESPONSE_ERROR_TYPE);
    if (dart.equals(errorType, io._ILLEGAL_ARGUMENT_RESPONSE)) {
      this.controller.addError(new core.ArgumentError());
    } else if (dart.equals(errorType, io._OSERROR_RESPONSE)) {
      let responseError = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR);
      let err = new io.OSError(core.String._check(dart.dindex(responseError, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(responseError, io._OSERROR_RESPONSE_ERROR_CODE)));
      let errorPath = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_PATH);
      if (errorPath == null) errorPath = this.path;
      this.controller.addError(new io.FileSystemException("Directory listing failed", core.String._check(errorPath), err));
    } else {
      this.controller.addError(new io.FileSystemException("Internal error"));
    }
  }
};
dart.setSignature(io._AsyncDirectoryLister, {
  constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryLister, [core.String, core.bool, core.bool])}),
  fields: () => ({
    path: core.String,
    recursive: core.bool,
    followLinks: core.bool,
    controller: async.StreamController,
    canceled: core.bool,
    nextRunning: core.bool,
    closed: core.bool,
    [_ops]: io._AsyncDirectoryListerOps,
    closeCompleter: async.Completer
  }),
  getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
  methods: () => ({
    [_pointer]: dart.definiteFunctionType(core.int, []),
    onListen: dart.definiteFunctionType(dart.void, []),
    onResume: dart.definiteFunctionType(dart.void, []),
    onCancel: dart.definiteFunctionType(async.Future, []),
    next: dart.definiteFunctionType(dart.void, []),
    [_cleanup]: dart.definiteFunctionType(dart.void, []),
    close: dart.definiteFunctionType(dart.void, []),
    error: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  sfields: () => ({
    LIST_FILE: core.int,
    LIST_DIRECTORY: core.int,
    LIST_LINK: core.int,
    LIST_ERROR: core.int,
    LIST_DONE: core.int,
    RESPONSE_TYPE: core.int,
    RESPONSE_PATH: core.int,
    RESPONSE_COMPLETE: core.int,
    RESPONSE_ERROR: core.int
  })
});
io._AsyncDirectoryLister.LIST_FILE = 0;
io._AsyncDirectoryLister.LIST_DIRECTORY = 1;
io._AsyncDirectoryLister.LIST_LINK = 2;
io._AsyncDirectoryLister.LIST_ERROR = 3;
io._AsyncDirectoryLister.LIST_DONE = 4;
io._AsyncDirectoryLister.RESPONSE_TYPE = 0;
io._AsyncDirectoryLister.RESPONSE_PATH = 1;
io._AsyncDirectoryLister.RESPONSE_COMPLETE = 1;
io._AsyncDirectoryLister.RESPONSE_ERROR = 2;
io._EventHandler = class _EventHandler extends core.Object {
  static _sendData(sender, sendPort, data) {
    dart.throw(new core.UnsupportedError("EventHandler._sendData"));
  }
};
dart.setSignature(io._EventHandler, {
  statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
  names: ['_sendData']
});
const _mode = Symbol('_mode');
io.FileMode = class FileMode extends core.Object {
  _internal(mode) {
    this[_mode] = mode;
  }
};
dart.defineNamedConstructor(io.FileMode, '_internal');
dart.setSignature(io.FileMode, {
  constructors: () => ({_internal: dart.definiteFunctionType(io.FileMode, [core.int])}),
  fields: () => ({[_mode]: core.int}),
  sfields: () => ({
    READ: io.FileMode,
    WRITE: io.FileMode,
    APPEND: io.FileMode,
    WRITE_ONLY: io.FileMode,
    WRITE_ONLY_APPEND: io.FileMode
  })
});
dart.defineLazy(io.FileMode, {
  get READ() {
    return dart.const(new io.FileMode._internal(0));
  },
  get WRITE() {
    return dart.const(new io.FileMode._internal(1));
  },
  get APPEND() {
    return dart.const(new io.FileMode._internal(2));
  },
  get WRITE_ONLY() {
    return dart.const(new io.FileMode._internal(3));
  },
  get WRITE_ONLY_APPEND() {
    return dart.const(new io.FileMode._internal(4));
  }
});
io.READ = io.FileMode.READ;
io.WRITE = io.FileMode.WRITE;
io.APPEND = io.FileMode.APPEND;
io.WRITE_ONLY = io.FileMode.WRITE_ONLY;
io.WRITE_ONLY_APPEND = io.FileMode.WRITE_ONLY_APPEND;
io.FileLock = class FileLock extends core.Object {
  new(index) {
    this.index = index;
  }
  toString() {
    return {
      0: "FileLock.SHARED",
      1: "FileLock.EXCLUSIVE"
    }[this.index];
  }
};
dart.setSignature(io.FileLock, {
  fields: () => ({index: core.int})
});
dart.defineEnumValues(io.FileLock, [
  'SHARED',
  'EXCLUSIVE'
]);
io.File = class File extends core.Object {
  static new(path) {
    return new io._File(path);
  }
  static fromUri(uri) {
    return io.File.new(uri.toFilePath());
  }
};
io.File[dart.implements] = () => [io.FileSystemEntity];
dart.setSignature(io.File, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.File, [core.String]),
    fromUri: dart.definiteFunctionType(io.File, [core.Uri])
  })
});
io.RandomAccessFile = class RandomAccessFile extends core.Object {};
io.FileSystemException = class FileSystemException extends core.Object {
  new(message, path, osError) {
    if (message === void 0) message = "";
    if (path === void 0) path = "";
    if (osError === void 0) osError = null;
    this.message = message;
    this.path = path;
    this.osError = osError;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write("FileSystemException");
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(dart.str`: ${this.message}`);
      if (this.path != null) {
        sb.write(dart.str`, path = '${this.path}'`);
      }
      if (this.osError != null) {
        sb.write(dart.str` (${this.osError})`);
      }
    } else if (this.osError != null) {
      sb.write(dart.str`: ${this.osError}`);
      if (this.path != null) {
        sb.write(dart.str`, path = '${this.path}'`);
      }
    } else if (this.path != null) {
      sb.write(dart.str`: ${this.path}`);
    }
    return sb.toString();
  }
};
io.FileSystemException[dart.implements] = () => [io.IOException];
dart.setSignature(io.FileSystemException, {
  constructors: () => ({new: dart.definiteFunctionType(io.FileSystemException, [], [core.String, core.String, io.OSError])}),
  fields: () => ({
    message: core.String,
    path: core.String,
    osError: io.OSError
  })
});
io._BLOCK_SIZE = 64 * 1024;
const _closeCompleter = Symbol('_closeCompleter');
const _path = Symbol('_path');
const _position = Symbol('_position');
const _end = Symbol('_end');
const _controller = Symbol('_controller');
const _openedFile = Symbol('_openedFile');
const _unsubscribed = Symbol('_unsubscribed');
const _readInProgress = Symbol('_readInProgress');
const _atEnd = Symbol('_atEnd');
const _setupController = Symbol('_setupController');
const _start = Symbol('_start');
const _readBlock = Symbol('_readBlock');
const _closeFile = Symbol('_closeFile');
io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
  new(path, position, end) {
    this[_closeCompleter] = async.Completer.new();
    this[_path] = path;
    this[_position] = position;
    this[_end] = end;
    this[_controller] = null;
    this[_openedFile] = null;
    this[_unsubscribed] = false;
    this[_readInProgress] = true;
    this[_closed] = false;
    this[_atEnd] = false;
    super.new();
    if (this[_position] == null) this[_position] = 0;
  }
  forStdin() {
    this[_closeCompleter] = async.Completer.new();
    this[_position] = 0;
    this[_controller] = null;
    this[_path] = null;
    this[_openedFile] = null;
    this[_end] = null;
    this[_unsubscribed] = false;
    this[_readInProgress] = true;
    this[_closed] = false;
    this[_atEnd] = false;
    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;
    this[_setupController]();
    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  [_setupController]() {
    this[_controller] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
        this[_unsubscribed] = true;
        return this[_closeFile]();
      }, VoidToFuture())});
  }
  [_closeFile]() {
    if (dart.test(this[_readInProgress]) || dart.test(this[_closed])) {
      return this[_closeCompleter].future;
    }
    this[_closed] = true;
    const done = (function() {
      this[_closeCompleter].complete();
      this[_controller].close();
    }).bind(this);
    dart.fn(done, VoidTovoid());
    this[_openedFile].close().catchError(dart.bind(this[_controller], 'addError')).whenComplete(done);
    return this[_closeCompleter].future;
  }
  [_readBlock]() {
    if (dart.test(this[_readInProgress])) return;
    if (dart.test(this[_atEnd])) {
      this[_closeFile]();
      return;
    }
    this[_readInProgress] = true;
    let readBytes = io._BLOCK_SIZE;
    if (this[_end] != null) {
      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end]) - dart.notNull(this[_position]));
      if (dart.notNull(readBytes) < 0) {
        this[_readInProgress] = false;
        if (!dart.test(this[_unsubscribed])) {
          this[_controller].addError(new core.RangeError(dart.str`Bad end position: ${this[_end]}`));
          this[_closeFile]();
          this[_unsubscribed] = true;
        }
        return;
      }
    }
    this[_openedFile].read(readBytes).then(dart.dynamic)(dart.fn(block => {
      this[_readInProgress] = false;
      if (dart.test(this[_unsubscribed])) {
        this[_closeFile]();
        return;
      }
      this[_position] = dart.notNull(this[_position]) + dart.notNull(block[dartx.length]);
      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end] != null && this[_position] == this[_end]) {
        this[_atEnd] = true;
      }
      if (!dart.test(this[_atEnd]) && !dart.test(this[_controller].isPaused)) {
        this[_readBlock]();
      }
      this[_controller].add(block);
      if (dart.test(this[_atEnd])) {
        this[_closeFile]();
      }
    }, ListOfintToNull())).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_unsubscribed])) {
        this[_controller].addError(e, core.StackTrace._check(s));
        this[_closeFile]();
        this[_unsubscribed] = true;
      }
    }, dynamicAnddynamicToNull()));
  }
  [_start]() {
    if (dart.notNull(this[_position]) < 0) {
      this[_controller].addError(new core.RangeError(dart.str`Bad start position: ${this[_position]}`));
      this[_controller].close();
      this[_closeCompleter].complete();
      return;
    }
    const onReady = (function(file) {
      this[_openedFile] = file;
      this[_readInProgress] = false;
      this[_readBlock]();
    }).bind(this);
    dart.fn(onReady, RandomAccessFileTovoid());
    const onOpenFile = (function(file) {
      if (dart.notNull(this[_position]) > 0) {
        file.setPosition(this[_position]).then(dart.void)(onReady, {onError: dart.fn((e, s) => {
            this[_controller].addError(e, core.StackTrace._check(s));
            this[_readInProgress] = false;
            this[_closeFile]();
          }, dynamicAnddynamicToNull())});
      } else {
        onReady(file);
      }
    }).bind(this);
    dart.fn(onOpenFile, RandomAccessFileTovoid());
    const openFailed = (function(error, stackTrace) {
      this[_controller].addError(error, core.StackTrace._check(stackTrace));
      this[_controller].close();
      this[_closeCompleter].complete();
    }).bind(this);
    dart.fn(openFailed, dynamicAnddynamicTovoid());
    if (this[_path] != null) {
      io.File.new(this[_path]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
    } else {
      try {
        onOpenFile(io._File._openStdioSync(0));
      } catch (e) {
        let s = dart.stackTrace(e);
        openFailed(e, s);
      }

    }
  }
};
dart.addSimpleTypeTests(io._FileStream);
dart.defineNamedConstructor(io._FileStream, 'forStdin');
dart.setSignature(io._FileStream, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._FileStream, [core.String, core.int, core.int]),
    forStdin: dart.definiteFunctionType(io._FileStream, [])
  }),
  fields: () => ({
    [_controller]: StreamControllerOfListOfint(),
    [_path]: core.String,
    [_openedFile]: io.RandomAccessFile,
    [_position]: core.int,
    [_end]: core.int,
    [_closeCompleter]: async.Completer,
    [_unsubscribed]: core.bool,
    [_readInProgress]: core.bool,
    [_closed]: core.bool,
    [_atEnd]: core.bool
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    [_setupController]: dart.definiteFunctionType(dart.void, []),
    [_closeFile]: dart.definiteFunctionType(async.Future, []),
    [_readBlock]: dart.definiteFunctionType(dart.void, []),
    [_start]: dart.definiteFunctionType(dart.void, [])
  })
});
const _file = Symbol('_file');
const _openFuture = Symbol('_openFuture');
io._FileStreamConsumer = class _FileStreamConsumer extends async.StreamConsumer$(core.List$(core.int)) {
  new(file, mode) {
    this[_file] = file;
    this[_openFuture] = null;
    this[_openFuture] = this[_file].open({mode: mode});
  }
  fromStdio(fd) {
    this[_file] = null;
    this[_openFuture] = null;
    dart.assert(1 <= dart.notNull(fd) && dart.notNull(fd) <= 2);
    this[_openFuture] = FutureOfRandomAccessFile().value(io._File._openStdioSync(fd));
  }
  addStream(stream) {
    let completer = CompleterOfFile().sync();
    this[_openFuture].then(dart.dynamic)(dart.fn(openedFile => {
      let _subscription = null;
      function error(e, stackTrace) {
        if (stackTrace === void 0) stackTrace = null;
        dart.dsend(_subscription, 'cancel');
        openedFile.close();
        completer.completeError(e, stackTrace);
      }
      dart.fn(error, dynamic__Tovoid());
      _subscription = stream.listen(dart.fn(d => {
        dart.dsend(_subscription, 'pause');
        try {
          openedFile.writeFrom(d, 0, d[dartx.length]).then(dart.dynamic)(dart.fn(_ => dart.dsend(_subscription, 'resume'), RandomAccessFileToFutureOr()), {onError: error});
        } catch (e) {
          let stackTrace = dart.stackTrace(e);
          error(e, stackTrace);
        }

      }, ListOfintToNull()), {onDone: dart.fn(() => {
          completer.complete(this[_file]);
        }, VoidToNull()), onError: error, cancelOnError: true});
    }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
    return completer.future;
  }
  close() {
    return this[_openFuture].then(io.File)(dart.fn(openedFile => openedFile.close(), RandomAccessFileToFutureOfRandomAccessFile()));
  }
};
dart.addSimpleTypeTests(io._FileStreamConsumer);
dart.defineNamedConstructor(io._FileStreamConsumer, 'fromStdio');
dart.setSignature(io._FileStreamConsumer, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._FileStreamConsumer, [io.File, io.FileMode]),
    fromStdio: dart.definiteFunctionType(io._FileStreamConsumer, [core.int])
  }),
  fields: () => ({
    [_file]: io.File,
    [_openFuture]: FutureOfRandomAccessFile()
  }),
  methods: () => ({
    addStream: dart.definiteFunctionType(async.Future$(io.File), [StreamOfListOfint()]),
    close: dart.definiteFunctionType(async.Future$(io.File), [])
  })
});
const _tryDecode = Symbol('_tryDecode');
let const;
let const;
io._File = class _File extends io.FileSystemEntity {
  new(path) {
    this.path = path;
    if (!(typeof this.path == 'string')) {
      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
    }
  }
  exists() {
    return io._IOService._dispatch(io._FILE_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot check existence", this.path));
      }
      return FutureOrOfbool()._check(response);
    }, dynamicToFutureOrOfbool()));
  }
  static _exists(path) {
    dart.throw(new core.UnsupportedError("File._exists"));
  }
  existsSync() {
    let result = io._File._exists(this.path);
    io._File.throwIfError(result, "Cannot check existence of file", this.path);
    return core.bool._check(result);
  }
  get absolute() {
    return io.File.new(this[_absolutePath]);
  }
  stat() {
    return io.FileStat.stat(this.path);
  }
  statSync() {
    return io.FileStat.statSync(this.path);
  }
  create(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
    return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE, JSArrayOfString().of([this.path])), dynamicToFuture())).then(io._File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot create file", this.path));
      }
      return this;
    }, dynamicTo_File()));
  }
  static _create(path) {
    dart.throw(new core.UnsupportedError("File._create"));
  }
  static _createLink(path, target) {
    dart.throw(new core.UnsupportedError("File._createLink"));
  }
  static _linkTarget(path) {
    dart.throw(new core.UnsupportedError("File._linkTarget"));
  }
  createSync(opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      this.parent.createSync({recursive: true});
    }
    let result = io._File._create(this.path);
    io._File.throwIfError(result, "Cannot create file", this.path);
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).delete({recursive: true}).then(io._File)(dart.fn(_ => this, FileSystemEntityTo_File()));
    }
    return io._IOService._dispatch(io._FILE_DELETE, JSArrayOfString().of([this.path])).then(io._File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot delete file", this.path));
      }
      return this;
    }, dynamicTo_File()));
  }
  static _deleteNative(path) {
    dart.throw(new core.UnsupportedError("File._deleteNative"));
  }
  static _deleteLinkNative(path) {
    dart.throw(new core.UnsupportedError("File._deleteLinkNative"));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).deleteSync({recursive: true});
    }
    let result = io._File._deleteNative(this.path);
    io._File.throwIfError(result, "Cannot delete file", this.path);
  }
  rename(newPath) {
    return io._IOService._dispatch(io._FILE_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, dart.str`Cannot rename file to '${newPath}'`, this.path));
      }
      return io.File.new(newPath);
    }, dynamicToFile()));
  }
  static _rename(oldPath, newPath) {
    dart.throw(new core.UnsupportedError("File._rename"));
  }
  static _renameLink(oldPath, newPath) {
    dart.throw(new core.UnsupportedError("File._renameLink"));
  }
  renameSync(newPath) {
    let result = io._File._rename(this.path, newPath);
    io._File.throwIfError(result, dart.str`Cannot rename file to '${newPath}'`, this.path);
    return io.File.new(newPath);
  }
  copy(newPath) {
    return io._IOService._dispatch(io._FILE_COPY, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, dart.str`Cannot copy file to '${newPath}'`, this.path));
      }
      return io.File.new(newPath);
    }, dynamicToFile()));
  }
  static _copy(oldPath, newPath) {
    dart.throw(new core.UnsupportedError("File._copy"));
  }
  copySync(newPath) {
    let result = io._File._copy(this.path, newPath);
    io._File.throwIfError(result, dart.str`Cannot copy file to '${newPath}'`, this.path);
    return io.File.new(newPath);
  }
  open(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
    if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
      return FutureOfRandomAccessFile().error(new core.ArgumentError('Invalid file mode for this operation'));
    }
    return io._IOService._dispatch(io._FILE_OPEN, JSArrayOfObject().of([this.path, mode[_mode]])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot open file", this.path));
      }
      return new io._RandomAccessFile(core.int._check(response), this.path);
    }, dynamicTo_RandomAccessFile()));
  }
  length() {
    return io._IOService._dispatch(io._FILE_LENGTH_FROM_PATH, JSArrayOfString().of([this.path])).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve length of file", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  static _lengthFromPath(path) {
    dart.throw(new core.UnsupportedError("File._lengthFromPath"));
  }
  lengthSync() {
    let result = io._File._lengthFromPath(this.path);
    io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
    return core.int._check(result);
  }
  lastModified() {
    return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve modification time", this.path));
      }
      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
    }, dynamicToDateTime()));
  }
  static _lastModified(path) {
    dart.throw(new core.UnsupportedError("File._lastModified"));
  }
  lastModifiedSync() {
    let ms = io._File._lastModified(this.path);
    io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
    return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
  }
  static _open(path, mode) {
    dart.throw(new core.UnsupportedError("File._open"));
  }
  openSync(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
    if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
      dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
    }
    let id = io._File._open(this.path, mode[_mode]);
    io._File.throwIfError(id, "Cannot open file", this.path);
    return new io._RandomAccessFile(core.int._check(id), this.path);
  }
  static _openStdio(fd) {
    dart.throw(new core.UnsupportedError("File._openStdio"));
  }
  static _openStdioSync(fd) {
    let id = io._File._openStdio(fd);
    if (id == 0) {
      dart.throw(new io.FileSystemException(dart.str`Cannot open stdio file for: ${fd}`));
    }
    return new io._RandomAccessFile(id, "");
  }
  openRead(start, end) {
    if (start === void 0) start = null;
    if (end === void 0) end = null;
    return new io._FileStream(this.path, start, end);
  }
  openWrite(opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    if (!dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
      dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
    }
    let consumer = new io._FileStreamConsumer(this, mode);
    return io.IOSink.new(consumer, {encoding: encoding});
  }
  readAsBytes() {
    function readDataChunked(file) {
      let builder = io.BytesBuilder.new({copy: false});
      let completer = async.Completer.new();
      function read() {
        dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
            builder.add(ListOfint()._check(data));
            read();
          } else {
            completer.complete(builder.takeBytes());
          }
        }, dynamicToNull()), {onError: dart.bind(completer, 'completeError')});
      }
      dart.fn(read, VoidTovoid());
      read();
      return FutureOfListOfint()._check(completer.future);
    }
    dart.fn(readDataChunked, dynamicToFutureOfListOfint());
    return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
      if (length == 0) {
        return readDataChunked(file);
      }
      return file.read(length);
    }, intToFutureOfListOfint())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOfListOfint()));
  }
  readAsBytesSync() {
    let opened = this.openSync();
    try {
      let data = null;
      let length = opened.lengthSync();
      if (length == 0) {
        let builder = io.BytesBuilder.new({copy: false});
        do {
          data = opened.readSync(io._BLOCK_SIZE);
          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
        } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
        data = builder.takeBytes();
      } else {
        data = opened.readSync(length);
      }
      return ListOfint()._check(data);
    } finally {
      opened.closeSync();
    }
  }
  [_tryDecode](bytes, encoding) {
    try {
      return encoding.decode(bytes);
    } catch (_) {
      dart.throw(new io.FileSystemException(dart.str`Failed to decode data using encoding '${encoding.name}'`, this.path));
    }

  }
  readAsString(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return this.readAsBytes().then(core.String)(dart.fn(bytes => this[_tryDecode](bytes, encoding), ListOfintToString()));
  }
  readAsStringSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return this[_tryDecode](this.readAsBytesSync(), encoding);
  }
  readAsLines(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const || (const = dart.const(new convert.LineSplitter())), 'convert'));
  }
  readAsLinesSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return (const || (const = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
  }
  writeAsBytes(bytes, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    return this.open({mode: mode}).then(io.File)(dart.fn(file => file.writeFrom(bytes, 0, bytes[dartx.length]).then(dart.dynamic)(dart.fn(_ => {
      if (dart.test(flush)) return file.flush().then(io._File)(dart.fn(_ => this, RandomAccessFileTo_File()));
      return this;
    }, RandomAccessFileToObject())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOrOfFile()));
  }
  writeAsBytesSync(bytes, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    let opened = this.openSync({mode: mode});
    try {
      opened.writeFromSync(bytes, 0, bytes[dartx.length]);
      if (dart.test(flush)) opened.flushSync();
    } finally {
      opened.closeSync();
    }
  }
  writeAsString(contents, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    try {
      return this.writeAsBytes(encoding.encode(contents), {mode: mode, flush: flush});
    } catch (e) {
      return FutureOfFile().error(e);
    }

  }
  writeAsStringSync(contents, opts) {
    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    let flush = opts && 'flush' in opts ? opts.flush : false;
    this.writeAsBytesSync(encoding.encode(contents), {mode: mode, flush: flush});
  }
  toString() {
    return dart.str`File: '${this.path}'`;
  }
  static throwIfError(result, msg, path) {
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException(msg, path, result));
    }
  }
};
io._File[dart.implements] = () => [io.File];
dart.setSignature(io._File, {
  constructors: () => ({new: dart.definiteFunctionType(io._File, [core.String])}),
  fields: () => ({path: core.String}),
  getters: () => ({absolute: dart.definiteFunctionType(io.File, [])}),
  methods: () => ({
    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
    existsSync: dart.definiteFunctionType(core.bool, []),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
    statSync: dart.definiteFunctionType(io.FileStat, []),
    create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
    createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    rename: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
    renameSync: dart.definiteFunctionType(io.File, [core.String]),
    copy: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
    copySync: dart.definiteFunctionType(io.File, [core.String]),
    open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
    length: dart.definiteFunctionType(async.Future$(core.int), []),
    lengthSync: dart.definiteFunctionType(core.int, []),
    lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
    lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
    openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
    openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
    openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
    readAsBytes: dart.definiteFunctionType(async.Future$(core.List$(core.int)), []),
    readAsBytesSync: dart.definiteFunctionType(core.List$(core.int), []),
    [_tryDecode]: dart.definiteFunctionType(core.String, [ListOfint(), convert.Encoding]),
    readAsString: dart.definiteFunctionType(async.Future$(core.String), [], {encoding: convert.Encoding}),
    readAsStringSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding}),
    readAsLines: dart.definiteFunctionType(async.Future$(core.List$(core.String)), [], {encoding: convert.Encoding}),
    readAsLinesSync: dart.definiteFunctionType(core.List$(core.String), [], {encoding: convert.Encoding}),
    writeAsBytes: dart.definiteFunctionType(async.Future$(io.File), [ListOfint()], {mode: io.FileMode, flush: core.bool}),
    writeAsBytesSync: dart.definiteFunctionType(dart.void, [ListOfint()], {mode: io.FileMode, flush: core.bool}),
    writeAsString: dart.definiteFunctionType(async.Future$(io.File), [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool}),
    writeAsStringSync: dart.definiteFunctionType(dart.void, [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool})
  }),
  statics: () => ({
    _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _createLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _linkTarget: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _deleteLinkNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
    _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
    _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
    _openStdio: dart.definiteFunctionType(core.int, [core.int]),
    _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
    throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
  }),
  names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
});
io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
  static new(pointer) {
    dart.throw(new core.UnsupportedError("RandomAccessFile"));
  }
};
dart.setSignature(io._RandomAccessFileOps, {
  constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFileOps, [core.int])})
});
const _asyncDispatched = Symbol('_asyncDispatched');
const _fileService = Symbol('_fileService');
const _resourceInfo = Symbol('_resourceInfo');
const _maybeConnectHandler = Symbol('_maybeConnectHandler');
const _maybePerformCleanup = Symbol('_maybePerformCleanup');
const _dispatch = Symbol('_dispatch');
const _checkAvailable = Symbol('_checkAvailable');
io._RandomAccessFile = class _RandomAccessFile extends core.Object {
  new(pointer, path) {
    this.path = path;
    this[_asyncDispatched] = false;
    this[_fileService] = null;
    this[_resourceInfo] = null;
    this[_ops] = null;
    this.closed = false;
    this[_ops] = io._RandomAccessFileOps.new(pointer);
    this[_resourceInfo] = new io._FileResourceInfo(this);
    this[_maybeConnectHandler]();
  }
  [_maybePerformCleanup]() {
    if (dart.test(this.closed)) {
      io._FileResourceInfo.FileClosed(this[_resourceInfo]);
    }
  }
  [_maybeConnectHandler]() {
    if (!dart.test(io._RandomAccessFile._connectedResourceHandler)) {
      developer.registerExtension('ext.dart.io.getOpenFiles', io._FileResourceInfo.getOpenFiles);
      developer.registerExtension('ext.dart.io.getFileByID', io._FileResourceInfo.getFileInfoMapByID);
      io._RandomAccessFile._connectedResourceHandler = true;
    }
  }
  close() {
    return this[_dispatch](io._FILE_CLOSE, [null], {markClosed: true}).then(io._RandomAccessFile)(dart.fn(result => {
      if (!dart.equals(result, -1)) {
        this.closed = dart.test(this.closed) || dart.equals(result, 0);
        this[_maybePerformCleanup]();
        return this;
      } else {
        dart.throw(new io.FileSystemException("Cannot close file", this.path));
      }
    }, dynamicTo_RandomAccessFile()));
  }
  closeSync() {
    this[_checkAvailable]();
    let id = this[_ops].close();
    if (id == -1) {
      dart.throw(new io.FileSystemException("Cannot close file", this.path));
    }
    this.closed = dart.test(this.closed) || id == 0;
    this[_maybePerformCleanup]();
  }
  readByte() {
    return this[_dispatch](io._FILE_READ_BYTE, [null]).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "readByte failed", this.path));
      }
      this[_resourceInfo].addRead(1);
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  readByteSync() {
    this[_checkAvailable]();
    let result = this[_ops].readByte();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("readByte failed", this.path, result));
    }
    this[_resourceInfo].addRead(1);
    return core.int._check(result);
  }
  read(bytes) {
    if (!(typeof bytes == 'number')) {
      dart.throw(new core.ArgumentError(bytes));
    }
    return this[_dispatch](io._FILE_READ, JSArrayOfint().of([null, bytes])).then(ListOfint())(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
      }
      this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
      return FutureOrOfListOfint()._check(dart.dindex(response, 1));
    }, dynamicToFutureOrOfListOfint()));
  }
  readSync(bytes) {
    this[_checkAvailable]();
    if (!(typeof bytes == 'number')) {
      dart.throw(new core.ArgumentError(bytes));
    }
    let result = this[_ops].read(bytes);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("readSync failed", this.path, result));
    }
    this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
    return ListOfint()._check(result);
  }
  readInto(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return FutureOfint().value(0);
    }
    let length = dart.notNull(end) - dart.notNull(start);
    return this[_dispatch](io._FILE_READ_INTO, JSArrayOfint().of([null, length])).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
      }
      let read = dart.dindex(response, 1);
      let data = dart.dindex(response, 2);
      buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
      this[_resourceInfo].addRead(core.int._check(read));
      return FutureOrOfint()._check(read);
    }, dynamicToFutureOrOfint()));
  }
  readIntoSync(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    this[_checkAvailable]();
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return 0;
    }
    let result = this[_ops].readInto(buffer, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("readInto failed", this.path, result));
    }
    this[_resourceInfo].addRead(core.int._check(result));
    return core.int._check(result);
  }
  writeByte(value) {
    if (!(typeof value == 'number')) {
      dart.throw(new core.ArgumentError(value));
    }
    return this[_dispatch](io._FILE_WRITE_BYTE, JSArrayOfint().of([null, value])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "writeByte failed", this.path));
      }
      this[_resourceInfo].addWrite(1);
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  writeByteSync(value) {
    this[_checkAvailable]();
    if (!(typeof value == 'number')) {
      dart.throw(new core.ArgumentError(value));
    }
    let result = this[_ops].writeByte(value);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("writeByte failed", this.path, result));
    }
    this[_resourceInfo].addWrite(1);
    return core.int._check(result);
  }
  writeFrom(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError("Invalid arguments to writeFrom"));
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return FutureOfRandomAccessFile().value(this);
    }
    let result = null;
    try {
      result = io._ensureFastAndSerializableByteData(buffer, start, end);
    } catch (e) {
      return FutureOfRandomAccessFile().error(e);
    }

    let request = core.List.new(4);
    request[dartx._set](0, null);
    request[dartx._set](1, result.buffer);
    request[dartx._set](2, result.start);
    request[dartx._set](3, dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
    return this[_dispatch](io._FILE_WRITE_FROM, request).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "writeFrom failed", this.path));
      }
      this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  writeFromSync(buffer, start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = null;
    this[_checkAvailable]();
    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError("Invalid arguments to writeFromSync"));
    }
    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
    if (end == start) {
      return;
    }
    let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
    let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
    }
    this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
  }
  writeString(string, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    if (!convert.Encoding.is(encoding)) {
      dart.throw(new core.ArgumentError(encoding));
    }
    let data = encoding.encode(string);
    return this.writeFrom(data, 0, data[dartx.length]);
  }
  writeStringSync(string, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    if (!convert.Encoding.is(encoding)) {
      dart.throw(new core.ArgumentError(encoding));
    }
    let data = encoding.encode(string);
    this.writeFromSync(data, 0, data[dartx.length]);
  }
  position() {
    return this[_dispatch](io._FILE_POSITION, [null]).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "position failed", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  positionSync() {
    this[_checkAvailable]();
    let result = this[_ops].position();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("position failed", this.path, result));
    }
    return core.int._check(result);
  }
  setPosition(position) {
    return this[_dispatch](io._FILE_SET_POSITION, JSArrayOfint().of([null, position])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "setPosition failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  setPositionSync(position) {
    this[_checkAvailable]();
    let result = this[_ops].setPosition(position);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("setPosition failed", this.path, result));
    }
  }
  truncate(length) {
    return this[_dispatch](io._FILE_TRUNCATE, JSArrayOfint().of([null, length])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "truncate failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  truncateSync(length) {
    this[_checkAvailable]();
    let result = this[_ops].truncate(length);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("truncate failed", this.path, result));
    }
  }
  length() {
    return this[_dispatch](io._FILE_LENGTH, [null]).then(core.int)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "length failed", this.path));
      }
      return FutureOrOfint()._check(response);
    }, dynamicToFutureOrOfint()));
  }
  lengthSync() {
    this[_checkAvailable]();
    let result = this[_ops].length();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("length failed", this.path, result));
    }
    return core.int._check(result);
  }
  flush() {
    return this[_dispatch](io._FILE_FLUSH, [null]).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, "flush failed", this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  flushSync() {
    this[_checkAvailable]();
    let result = this[_ops].flush();
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException("flush failed", this.path, result));
    }
  }
  lock(mode, start, end) {
    if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
      dart.throw(new core.ArgumentError());
    }
    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
    return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  unlock(start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    if (!(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (start == end) {
      dart.throw(new core.ArgumentError());
    }
    return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, io._RandomAccessFile.LOCK_UNLOCK, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        dart.throw(io._exceptionFromResponse(response, 'unlock failed', this.path));
      }
      return this;
    }, dynamicTo_RandomAccessFile()));
  }
  lockSync(mode, start, end) {
    if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    this[_checkAvailable]();
    if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
      dart.throw(new core.ArgumentError());
    }
    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
    let result = this[_ops].lock(lock, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException('lock failed', this.path, result));
    }
  }
  unlockSync(start, end) {
    if (start === void 0) start = 0;
    if (end === void 0) end = -1;
    this[_checkAvailable]();
    if (!(typeof start == 'number') || !(typeof end == 'number')) {
      dart.throw(new core.ArgumentError());
    }
    if (start == end) {
      dart.throw(new core.ArgumentError());
    }
    let result = this[_ops].lock(io._RandomAccessFile.LOCK_UNLOCK, start, end);
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException('unlock failed', this.path, result));
    }
  }
  [_pointer]() {
    return this[_ops].getPointer();
  }
  [_dispatch](request, data, opts) {
    let markClosed = opts && 'markClosed' in opts ? opts.markClosed : false;
    if (dart.test(this.closed)) {
      return async.Future.error(new io.FileSystemException("File closed", this.path));
    }
    if (dart.test(this[_asyncDispatched])) {
      let msg = "An async operation is currently pending";
      return async.Future.error(new io.FileSystemException(msg, this.path));
    }
    if (dart.test(markClosed)) {
      this.closed = true;
    }
    this[_asyncDispatched] = true;
    data[dartx._set](0, this[_pointer]());
    return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
      this[_asyncDispatched] = false;
    }, VoidToNull()));
  }
  [_checkAvailable]() {
    if (dart.test(this[_asyncDispatched])) {
      dart.throw(new io.FileSystemException("An async operation is currently pending", this.path));
    }
    if (dart.test(this.closed)) {
      dart.throw(new io.FileSystemException("File closed", this.path));
    }
  }
};
io._RandomAccessFile[dart.implements] = () => [io.RandomAccessFile];
dart.setSignature(io._RandomAccessFile, {
  constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFile, [core.int, core.String])}),
  fields: () => ({
    path: core.String,
    [_asyncDispatched]: core.bool,
    [_fileService]: isolate.SendPort,
    [_resourceInfo]: io._FileResourceInfo,
    [_ops]: io._RandomAccessFileOps,
    closed: core.bool
  }),
  methods: () => ({
    [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
    [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
    close: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
    closeSync: dart.definiteFunctionType(dart.void, []),
    readByte: dart.definiteFunctionType(async.Future$(core.int), []),
    readByteSync: dart.definiteFunctionType(core.int, []),
    read: dart.definiteFunctionType(async.Future$(core.List$(core.int)), [core.int]),
    readSync: dart.definiteFunctionType(core.List$(core.int), [core.int]),
    readInto: dart.definiteFunctionType(async.Future$(core.int), [ListOfint()], [core.int, core.int]),
    readIntoSync: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
    writeByte: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
    writeByteSync: dart.definiteFunctionType(core.int, [core.int]),
    writeFrom: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [ListOfint()], [core.int, core.int]),
    writeFromSync: dart.definiteFunctionType(dart.void, [ListOfint()], [core.int, core.int]),
    writeString: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.String], {encoding: convert.Encoding}),
    writeStringSync: dart.definiteFunctionType(dart.void, [core.String], {encoding: convert.Encoding}),
    position: dart.definiteFunctionType(async.Future$(core.int), []),
    positionSync: dart.definiteFunctionType(core.int, []),
    setPosition: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
    setPositionSync: dart.definiteFunctionType(dart.void, [core.int]),
    truncate: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
    truncateSync: dart.definiteFunctionType(dart.void, [core.int]),
    length: dart.definiteFunctionType(async.Future$(core.int), []),
    lengthSync: dart.definiteFunctionType(core.int, []),
    flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
    flushSync: dart.definiteFunctionType(dart.void, []),
    lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
    unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
    lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
    unlockSync: dart.definiteFunctionType(dart.void, [], [core.int, core.int]),
    [_pointer]: dart.definiteFunctionType(core.int, []),
    [_dispatch]: dart.definiteFunctionType(async.Future, [core.int, core.List], {markClosed: core.bool}),
    [_checkAvailable]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    _connectedResourceHandler: core.bool,
    LOCK_UNLOCK: core.int,
    LOCK_SHARED: core.int,
    LOCK_EXCLUSIVE: core.int
  })
});
io._RandomAccessFile._connectedResourceHandler = false;
io._RandomAccessFile.LOCK_UNLOCK = 0;
io._RandomAccessFile.LOCK_SHARED = 1;
io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
let const;
io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
  _internal(type) {
    this[_type] = type;
  }
  static _lookup(type) {
    return io.FileSystemEntityType._typeList[dartx._get](type);
  }
  toString() {
    return (const || (const = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
  }
};
dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
dart.setSignature(io.FileSystemEntityType, {
  constructors: () => ({_internal: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
  fields: () => ({[_type]: core.int}),
  sfields: () => ({
    FILE: io.FileSystemEntityType,
    DIRECTORY: io.FileSystemEntityType,
    LINK: io.FileSystemEntityType,
    NOT_FOUND: io.FileSystemEntityType,
    _typeList: ListOfFileSystemEntityType()
  }),
  statics: () => ({_lookup: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
  names: ['_lookup']
});
dart.defineLazy(io.FileSystemEntityType, {
  get FILE() {
    return dart.const(new io.FileSystemEntityType._internal(0));
  },
  get DIRECTORY() {
    return dart.const(new io.FileSystemEntityType._internal(1));
  },
  get LINK() {
    return dart.const(new io.FileSystemEntityType._internal(2));
  },
  get NOT_FOUND() {
    return dart.const(new io.FileSystemEntityType._internal(3));
  },
  get _typeList() {
    return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
  }
});
let const;
io.FileStat = class FileStat extends core.Object {
  _internal(changed, modified, accessed, type, mode, size) {
    this.changed = changed;
    this.modified = modified;
    this.accessed = accessed;
    this.type = type;
    this.mode = mode;
    this.size = size;
  }
  _internalNotFound() {
    this.changed = null;
    this.modified = null;
    this.accessed = null;
    this.type = io.FileSystemEntityType.NOT_FOUND;
    this.mode = 0;
    this.size = -1;
  }
  static _statSync(path) {
    dart.throw(new core.UnsupportedError("FileStat.stat"));
  }
  static statSync(path) {
    if (dart.test(io.Platform.isWindows)) {
      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
    }
    let data = io.FileStat._statSync(path);
    if (io.OSError.is(data)) return io.FileStat._notFound;
    return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(dart.dindex(data, io.FileStat._TYPE))), core.int._check(dart.dindex(data, io.FileStat._MODE)), core.int._check(dart.dindex(data, io.FileStat._SIZE)));
  }
  static stat(path) {
    if (dart.test(io.Platform.isWindows)) {
      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
    }
    return io._IOService._dispatch(io._FILE_STAT, JSArrayOfString().of([path])).then(io.FileStat)(dart.fn(response => {
      if (dart.test(io._isErrorResponse(response))) {
        return io.FileStat._notFound;
      }
      let data = core.List._check(dart.dindex(response, 1));
      return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(data[dartx._get](io.FileStat._TYPE))), core.int._check(data[dartx._get](io.FileStat._MODE)), core.int._check(data[dartx._get](io.FileStat._SIZE)));
    }, dynamicToFileStat()));
  }
  toString() {
    return dart.str`FileStat: type ${this.type}\n          changed ${this.changed}\n          modified ${this.modified}\n          accessed ${this.accessed}\n          mode ${this.modeString()}\n          size ${this.size}`;
  }
  modeString() {
    let permissions = dart.notNull(this.mode) & 4095;
    let codes = const || (const = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
    let result = [];
    if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
    if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
    if ((permissions & 512) != 0) result[dartx.add]("(sticky) ");
    result[dartx.add](codes[dartx._get](permissions >> 6 & 7));
    result[dartx.add](codes[dartx._get](permissions >> 3 & 7));
    result[dartx.add](codes[dartx._get](permissions & 7));
    return result[dartx.join]();
  }
};
dart.defineNamedConstructor(io.FileStat, '_internal');
dart.defineNamedConstructor(io.FileStat, '_internalNotFound');
dart.setSignature(io.FileStat, {
  constructors: () => ({
    _internal: dart.definiteFunctionType(io.FileStat, [core.DateTime, core.DateTime, core.DateTime, io.FileSystemEntityType, core.int, core.int]),
    _internalNotFound: dart.definiteFunctionType(io.FileStat, [])
  }),
  fields: () => ({
    changed: core.DateTime,
    modified: core.DateTime,
    accessed: core.DateTime,
    type: io.FileSystemEntityType,
    mode: core.int,
    size: core.int
  }),
  methods: () => ({modeString: dart.definiteFunctionType(core.String, [])}),
  sfields: () => ({
    _TYPE: core.int,
    _CHANGED_TIME: core.int,
    _MODIFIED_TIME: core.int,
    _ACCESSED_TIME: core.int,
    _MODE: core.int,
    _SIZE: core.int,
    _notFound: io.FileStat
  }),
  statics: () => ({
    _statSync: dart.definiteFunctionType(dart.dynamic, [core.String]),
    statSync: dart.definiteFunctionType(io.FileStat, [core.String]),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), [core.String])
  }),
  names: ['_statSync', 'statSync', 'stat']
});
io.FileStat._TYPE = 0;
io.FileStat._CHANGED_TIME = 1;
io.FileStat._MODIFIED_TIME = 2;
io.FileStat._ACCESSED_TIME = 3;
io.FileStat._MODE = 4;
io.FileStat._SIZE = 5;
dart.defineLazy(io.FileStat, {
  get _notFound() {
    return dart.const(new io.FileStat._internalNotFound());
  }
});
io.FileSystemEvent = class FileSystemEvent extends core.Object {
  _(type, path, isDirectory) {
    this.type = type;
    this.path = path;
    this.isDirectory = isDirectory;
  }
};
dart.defineNamedConstructor(io.FileSystemEvent, '_');
dart.setSignature(io.FileSystemEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemEvent, [core.int, core.String, core.bool])}),
  fields: () => ({
    type: core.int,
    path: core.String,
    isDirectory: core.bool
  }),
  sfields: () => ({
    CREATE: core.int,
    MODIFY: core.int,
    DELETE: core.int,
    MOVE: core.int,
    ALL: core.int,
    _MODIFY_ATTRIBUTES: core.int,
    _DELETE_SELF: core.int,
    _IS_DIR: core.int
  })
});
io.FileSystemEvent.CREATE = 1 << 0;
io.FileSystemEvent.MODIFY = 1 << 1;
io.FileSystemEvent.DELETE = 1 << 2;
io.FileSystemEvent.MOVE = 1 << 3;
io.FileSystemEvent._MODIFY_ATTRIBUTES = 1 << 4;
io.FileSystemEvent._DELETE_SELF = 1 << 5;
io.FileSystemEvent._IS_DIR = 1 << 6;
dart.defineLazy(io.FileSystemEvent, {
  get ALL() {
    return io.FileSystemEvent.CREATE | io.FileSystemEvent.MODIFY | io.FileSystemEvent.DELETE | io.FileSystemEvent.MOVE;
  }
});
io.FileSystemCreateEvent = class FileSystemCreateEvent extends io.FileSystemEvent {
  _(path, isDirectory) {
    super._(io.FileSystemEvent.CREATE, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    return dart.str`FileSystemCreateEvent('${this.path}')`;
  }
};
dart.defineNamedConstructor(io.FileSystemCreateEvent, '_');
dart.setSignature(io.FileSystemCreateEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemCreateEvent, [dart.dynamic, dart.dynamic])})
});
io.FileSystemModifyEvent = class FileSystemModifyEvent extends io.FileSystemEvent {
  _(path, isDirectory, contentChanged) {
    this.contentChanged = contentChanged;
    super._(io.FileSystemEvent.MODIFY, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    return dart.str`FileSystemModifyEvent('${this.path}', contentChanged=${this.contentChanged})`;
  }
};
dart.defineNamedConstructor(io.FileSystemModifyEvent, '_');
dart.setSignature(io.FileSystemModifyEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemModifyEvent, [dart.dynamic, dart.dynamic, core.bool])}),
  fields: () => ({contentChanged: core.bool})
});
io.FileSystemDeleteEvent = class FileSystemDeleteEvent extends io.FileSystemEvent {
  _(path, isDirectory) {
    super._(io.FileSystemEvent.DELETE, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    return dart.str`FileSystemDeleteEvent('${this.path}')`;
  }
};
dart.defineNamedConstructor(io.FileSystemDeleteEvent, '_');
dart.setSignature(io.FileSystemDeleteEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemDeleteEvent, [dart.dynamic, dart.dynamic])})
});
io.FileSystemMoveEvent = class FileSystemMoveEvent extends io.FileSystemEvent {
  _(path, isDirectory, destination) {
    this.destination = destination;
    super._(io.FileSystemEvent.MOVE, core.String._check(path), core.bool._check(isDirectory));
  }
  toString() {
    let buffer = new core.StringBuffer();
    buffer.write(dart.str`FileSystemMoveEvent('${this.path}'`);
    if (this.destination != null) buffer.write(dart.str`, '${this.destination}'`);
    buffer.write(')');
    return buffer.toString();
  }
};
dart.defineNamedConstructor(io.FileSystemMoveEvent, '_');
dart.setSignature(io.FileSystemMoveEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemMoveEvent, [dart.dynamic, dart.dynamic, core.String])}),
  fields: () => ({destination: core.String})
});
io._FileSystemWatcher = class _FileSystemWatcher extends core.Object {
  static _watch(path, events, recursive) {
    dart.throw(new core.UnsupportedError("_FileSystemWatcher.watch"));
  }
  static get isSupported() {
    dart.throw(new core.UnsupportedError("_FileSystemWatcher.isSupported"));
  }
};
dart.setSignature(io._FileSystemWatcher, {
  sgetters: () => ({isSupported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({_watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [core.String, core.int, core.bool])}),
  names: ['_watch']
});
io.HttpStatus = class HttpStatus extends core.Object {};
dart.setSignature(io.HttpStatus, {
  sfields: () => ({
    CONTINUE: core.int,
    SWITCHING_PROTOCOLS: core.int,
    OK: core.int,
    CREATED: core.int,
    ACCEPTED: core.int,
    NON_AUTHORITATIVE_INFORMATION: core.int,
    NO_CONTENT: core.int,
    RESET_CONTENT: core.int,
    PARTIAL_CONTENT: core.int,
    MULTIPLE_CHOICES: core.int,
    MOVED_PERMANENTLY: core.int,
    FOUND: core.int,
    MOVED_TEMPORARILY: core.int,
    SEE_OTHER: core.int,
    NOT_MODIFIED: core.int,
    USE_PROXY: core.int,
    TEMPORARY_REDIRECT: core.int,
    BAD_REQUEST: core.int,
    UNAUTHORIZED: core.int,
    PAYMENT_REQUIRED: core.int,
    FORBIDDEN: core.int,
    NOT_FOUND: core.int,
    METHOD_NOT_ALLOWED: core.int,
    NOT_ACCEPTABLE: core.int,
    PROXY_AUTHENTICATION_REQUIRED: core.int,
    REQUEST_TIMEOUT: core.int,
    CONFLICT: core.int,
    GONE: core.int,
    LENGTH_REQUIRED: core.int,
    PRECONDITION_FAILED: core.int,
    REQUEST_ENTITY_TOO_LARGE: core.int,
    REQUEST_URI_TOO_LONG: core.int,
    UNSUPPORTED_MEDIA_TYPE: core.int,
    REQUESTED_RANGE_NOT_SATISFIABLE: core.int,
    EXPECTATION_FAILED: core.int,
    INTERNAL_SERVER_ERROR: core.int,
    NOT_IMPLEMENTED: core.int,
    BAD_GATEWAY: core.int,
    SERVICE_UNAVAILABLE: core.int,
    GATEWAY_TIMEOUT: core.int,
    HTTP_VERSION_NOT_SUPPORTED: core.int,
    NETWORK_CONNECT_TIMEOUT_ERROR: core.int
  })
});
io.HttpStatus.CONTINUE = 100;
io.HttpStatus.SWITCHING_PROTOCOLS = 101;
io.HttpStatus.OK = 200;
io.HttpStatus.CREATED = 201;
io.HttpStatus.ACCEPTED = 202;
io.HttpStatus.NON_AUTHORITATIVE_INFORMATION = 203;
io.HttpStatus.NO_CONTENT = 204;
io.HttpStatus.RESET_CONTENT = 205;
io.HttpStatus.PARTIAL_CONTENT = 206;
io.HttpStatus.MULTIPLE_CHOICES = 300;
io.HttpStatus.MOVED_PERMANENTLY = 301;
io.HttpStatus.FOUND = 302;
io.HttpStatus.MOVED_TEMPORARILY = 302;
io.HttpStatus.SEE_OTHER = 303;
io.HttpStatus.NOT_MODIFIED = 304;
io.HttpStatus.USE_PROXY = 305;
io.HttpStatus.TEMPORARY_REDIRECT = 307;
io.HttpStatus.BAD_REQUEST = 400;
io.HttpStatus.UNAUTHORIZED = 401;
io.HttpStatus.PAYMENT_REQUIRED = 402;
io.HttpStatus.FORBIDDEN = 403;
io.HttpStatus.NOT_FOUND = 404;
io.HttpStatus.METHOD_NOT_ALLOWED = 405;
io.HttpStatus.NOT_ACCEPTABLE = 406;
io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED = 407;
io.HttpStatus.REQUEST_TIMEOUT = 408;
io.HttpStatus.CONFLICT = 409;
io.HttpStatus.GONE = 410;
io.HttpStatus.LENGTH_REQUIRED = 411;
io.HttpStatus.PRECONDITION_FAILED = 412;
io.HttpStatus.REQUEST_ENTITY_TOO_LARGE = 413;
io.HttpStatus.REQUEST_URI_TOO_LONG = 414;
io.HttpStatus.UNSUPPORTED_MEDIA_TYPE = 415;
io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE = 416;
io.HttpStatus.EXPECTATION_FAILED = 417;
io.HttpStatus.INTERNAL_SERVER_ERROR = 500;
io.HttpStatus.NOT_IMPLEMENTED = 501;
io.HttpStatus.BAD_GATEWAY = 502;
io.HttpStatus.SERVICE_UNAVAILABLE = 503;
io.HttpStatus.GATEWAY_TIMEOUT = 504;
io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED = 505;
io.HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR = 599;
io.HttpServer = class HttpServer extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io._HttpServer.bind(address, port, backlog, v6Only, shared);
  }
  static bindSecure(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io._HttpServer.bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared);
  }
  static listenOn(serverSocket) {
    return new io._HttpServer.listenOn(serverSocket);
  }
};
io.HttpServer[dart.implements] = () => [StreamOfHttpRequest()];
dart.setSignature(io.HttpServer, {
  constructors: () => ({listenOn: dart.definiteFunctionType(io.HttpServer, [io.ServerSocket])}),
  fields: () => ({
    serverHeader: core.String,
    autoCompress: core.bool,
    idleTimeout: core.Duration
  }),
  statics: () => ({
    bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool}),
    bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, shared: core.bool})
  }),
  names: ['bind', 'bindSecure']
});
io.HttpConnectionsInfo = class HttpConnectionsInfo extends core.Object {
  new() {
    this.total = 0;
    this.active = 0;
    this.idle = 0;
    this.closing = 0;
  }
};
dart.setSignature(io.HttpConnectionsInfo, {
  fields: () => ({
    total: core.int,
    active: core.int,
    idle: core.int,
    closing: core.int
  })
});
io.HttpHeaders = class HttpHeaders extends core.Object {
  new() {
    this.date = null;
    this.expires = null;
    this.ifModifiedSince = null;
    this.host = null;
    this.port = null;
    this.contentType = null;
    this.contentLength = null;
    this.persistentConnection = null;
    this.chunkedTransferEncoding = null;
  }
};
dart.setSignature(io.HttpHeaders, {
  fields: () => ({
    date: core.DateTime,
    expires: core.DateTime,
    ifModifiedSince: core.DateTime,
    host: core.String,
    port: core.int,
    contentType: io.ContentType,
    contentLength: core.int,
    persistentConnection: core.bool,
    chunkedTransferEncoding: core.bool
  }),
  sfields: () => ({
    ACCEPT: core.String,
    ACCEPT_CHARSET: core.String,
    ACCEPT_ENCODING: core.String,
    ACCEPT_LANGUAGE: core.String,
    ACCEPT_RANGES: core.String,
    AGE: core.String,
    ALLOW: core.String,
    AUTHORIZATION: core.String,
    CACHE_CONTROL: core.String,
    CONNECTION: core.String,
    CONTENT_ENCODING: core.String,
    CONTENT_LANGUAGE: core.String,
    CONTENT_LENGTH: core.String,
    CONTENT_LOCATION: core.String,
    CONTENT_MD5: core.String,
    CONTENT_RANGE: core.String,
    CONTENT_TYPE: core.String,
    DATE: core.String,
    ETAG: core.String,
    EXPECT: core.String,
    EXPIRES: core.String,
    FROM: core.String,
    HOST: core.String,
    IF_MATCH: core.String,
    IF_MODIFIED_SINCE: core.String,
    IF_NONE_MATCH: core.String,
    IF_RANGE: core.String,
    IF_UNMODIFIED_SINCE: core.String,
    LAST_MODIFIED: core.String,
    LOCATION: core.String,
    MAX_FORWARDS: core.String,
    PRAGMA: core.String,
    PROXY_AUTHENTICATE: core.String,
    PROXY_AUTHORIZATION: core.String,
    RANGE: core.String,
    REFERER: core.String,
    RETRY_AFTER: core.String,
    SERVER: core.String,
    TE: core.String,
    TRAILER: core.String,
    TRANSFER_ENCODING: core.String,
    UPGRADE: core.String,
    USER_AGENT: core.String,
    VARY: core.String,
    VIA: core.String,
    WARNING: core.String,
    WWW_AUTHENTICATE: core.String,
    COOKIE: core.String,
    SET_COOKIE: core.String,
    GENERAL_HEADERS: ListOfString(),
    ENTITY_HEADERS: ListOfString(),
    RESPONSE_HEADERS: ListOfString(),
    REQUEST_HEADERS: ListOfString()
  })
});
io.HttpHeaders.ACCEPT = "accept";
io.HttpHeaders.ACCEPT_CHARSET = "accept-charset";
io.HttpHeaders.ACCEPT_ENCODING = "accept-encoding";
io.HttpHeaders.ACCEPT_LANGUAGE = "accept-language";
io.HttpHeaders.ACCEPT_RANGES = "accept-ranges";
io.HttpHeaders.AGE = "age";
io.HttpHeaders.ALLOW = "allow";
io.HttpHeaders.AUTHORIZATION = "authorization";
io.HttpHeaders.CACHE_CONTROL = "cache-control";
io.HttpHeaders.CONNECTION = "connection";
io.HttpHeaders.CONTENT_ENCODING = "content-encoding";
io.HttpHeaders.CONTENT_LANGUAGE = "content-language";
io.HttpHeaders.CONTENT_LENGTH = "content-length";
io.HttpHeaders.CONTENT_LOCATION = "content-location";
io.HttpHeaders.CONTENT_MD5 = "content-md5";
io.HttpHeaders.CONTENT_RANGE = "content-range";
io.HttpHeaders.CONTENT_TYPE = "content-type";
io.HttpHeaders.DATE = "date";
io.HttpHeaders.ETAG = "etag";
io.HttpHeaders.EXPECT = "expect";
io.HttpHeaders.EXPIRES = "expires";
io.HttpHeaders.FROM = "from";
io.HttpHeaders.HOST = "host";
io.HttpHeaders.IF_MATCH = "if-match";
io.HttpHeaders.IF_MODIFIED_SINCE = "if-modified-since";
io.HttpHeaders.IF_NONE_MATCH = "if-none-match";
io.HttpHeaders.IF_RANGE = "if-range";
io.HttpHeaders.IF_UNMODIFIED_SINCE = "if-unmodified-since";
io.HttpHeaders.LAST_MODIFIED = "last-modified";
io.HttpHeaders.LOCATION = "location";
io.HttpHeaders.MAX_FORWARDS = "max-forwards";
io.HttpHeaders.PRAGMA = "pragma";
io.HttpHeaders.PROXY_AUTHENTICATE = "proxy-authenticate";
io.HttpHeaders.PROXY_AUTHORIZATION = "proxy-authorization";
io.HttpHeaders.RANGE = "range";
io.HttpHeaders.REFERER = "referer";
io.HttpHeaders.RETRY_AFTER = "retry-after";
io.HttpHeaders.SERVER = "server";
io.HttpHeaders.TE = "te";
io.HttpHeaders.TRAILER = "trailer";
io.HttpHeaders.TRANSFER_ENCODING = "transfer-encoding";
io.HttpHeaders.UPGRADE = "upgrade";
io.HttpHeaders.USER_AGENT = "user-agent";
io.HttpHeaders.VARY = "vary";
io.HttpHeaders.VIA = "via";
io.HttpHeaders.WARNING = "warning";
io.HttpHeaders.WWW_AUTHENTICATE = "www-authenticate";
io.HttpHeaders.COOKIE = "cookie";
io.HttpHeaders.SET_COOKIE = "set-cookie";
dart.defineLazy(io.HttpHeaders, {
  get GENERAL_HEADERS() {
    return dart.constList([io.HttpHeaders.CACHE_CONTROL, io.HttpHeaders.CONNECTION, io.HttpHeaders.DATE, io.HttpHeaders.PRAGMA, io.HttpHeaders.TRAILER, io.HttpHeaders.TRANSFER_ENCODING, io.HttpHeaders.UPGRADE, io.HttpHeaders.VIA, io.HttpHeaders.WARNING], core.String);
  },
  get ENTITY_HEADERS() {
    return dart.constList([io.HttpHeaders.ALLOW, io.HttpHeaders.CONTENT_ENCODING, io.HttpHeaders.CONTENT_LANGUAGE, io.HttpHeaders.CONTENT_LENGTH, io.HttpHeaders.CONTENT_LOCATION, io.HttpHeaders.CONTENT_MD5, io.HttpHeaders.CONTENT_RANGE, io.HttpHeaders.CONTENT_TYPE, io.HttpHeaders.EXPIRES, io.HttpHeaders.LAST_MODIFIED], core.String);
  },
  get RESPONSE_HEADERS() {
    return dart.constList([io.HttpHeaders.ACCEPT_RANGES, io.HttpHeaders.AGE, io.HttpHeaders.ETAG, io.HttpHeaders.LOCATION, io.HttpHeaders.PROXY_AUTHENTICATE, io.HttpHeaders.RETRY_AFTER, io.HttpHeaders.SERVER, io.HttpHeaders.VARY, io.HttpHeaders.WWW_AUTHENTICATE], core.String);
  },
  get REQUEST_HEADERS() {
    return dart.constList([io.HttpHeaders.ACCEPT, io.HttpHeaders.ACCEPT_CHARSET, io.HttpHeaders.ACCEPT_ENCODING, io.HttpHeaders.ACCEPT_LANGUAGE, io.HttpHeaders.AUTHORIZATION, io.HttpHeaders.EXPECT, io.HttpHeaders.FROM, io.HttpHeaders.HOST, io.HttpHeaders.IF_MATCH, io.HttpHeaders.IF_MODIFIED_SINCE, io.HttpHeaders.IF_NONE_MATCH, io.HttpHeaders.IF_RANGE, io.HttpHeaders.IF_UNMODIFIED_SINCE, io.HttpHeaders.MAX_FORWARDS, io.HttpHeaders.PROXY_AUTHORIZATION, io.HttpHeaders.RANGE, io.HttpHeaders.REFERER, io.HttpHeaders.TE, io.HttpHeaders.USER_AGENT], core.String);
  }
});
io.HeaderValue = class HeaderValue extends core.Object {
  static new(value, parameters) {
    if (value === void 0) value = "";
    if (parameters === void 0) parameters = null;
    return new io._HeaderValue(value, parameters);
  }
  static parse(value, opts) {
    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
    return io._HeaderValue.parse(value, {parameterSeparator: parameterSeparator, valueSeparator: valueSeparator, preserveBackslash: preserveBackslash});
  }
};
dart.setSignature(io.HeaderValue, {
  constructors: () => ({new: dart.definiteFunctionType(io.HeaderValue, [], [core.String, MapOfString$String()])}),
  statics: () => ({parse: dart.definiteFunctionType(io.HeaderValue, [core.String], {parameterSeparator: core.String, valueSeparator: core.String, preserveBackslash: core.bool})}),
  names: ['parse']
});
io.HttpSession = class HttpSession extends core.Object {};
io.HttpSession[dart.implements] = () => [core.Map];
io.ContentType = class ContentType extends core.Object {
  static new(primaryType, subType, opts) {
    let charset = opts && 'charset' in opts ? opts.charset : null;
    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
    return new io._ContentType(primaryType, subType, charset, parameters);
  }
  static parse(value) {
    return io._ContentType.parse(value);
  }
};
io.ContentType[dart.implements] = () => [io.HeaderValue];
dart.setSignature(io.ContentType, {
  constructors: () => ({new: dart.definiteFunctionType(io.ContentType, [core.String, core.String], {charset: core.String, parameters: MapOfString$String()})}),
  sfields: () => ({
    TEXT: io.ContentType,
    HTML: io.ContentType,
    JSON: io.ContentType,
    BINARY: io.ContentType
  }),
  statics: () => ({parse: dart.definiteFunctionType(io.ContentType, [core.String])}),
  names: ['parse']
});
dart.defineLazy(io.ContentType, {
  get TEXT() {
    return io.ContentType.new("text", "plain", {charset: "utf-8"});
  },
  get HTML() {
    return io.ContentType.new("text", "html", {charset: "utf-8"});
  },
  get JSON() {
    return io.ContentType.new("application", "json", {charset: "utf-8"});
  },
  get BINARY() {
    return io.ContentType.new("application", "octet-stream");
  }
});
io.Cookie = class Cookie extends core.Object {
  static new(name, value) {
    if (name === void 0) name = null;
    if (value === void 0) value = null;
    return new io._Cookie(name, value);
  }
  static fromSetCookieValue(value) {
    return new io._Cookie.fromSetCookieValue(value);
  }
};
dart.setSignature(io.Cookie, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.Cookie, [], [core.String, core.String]),
    fromSetCookieValue: dart.definiteFunctionType(io.Cookie, [core.String])
  }),
  fields: () => ({
    name: core.String,
    value: core.String,
    expires: core.DateTime,
    maxAge: core.int,
    domain: core.String,
    path: core.String,
    secure: core.bool,
    httpOnly: core.bool
  })
});
io.HttpRequest = class HttpRequest extends core.Object {};
io.HttpRequest[dart.implements] = () => [StreamOfListOfint()];
io.HttpResponse = class HttpResponse extends core.Object {
  new() {
    this.contentLength = null;
    this.statusCode = null;
    this.reasonPhrase = null;
    this.persistentConnection = null;
    this.deadline = null;
    this.bufferOutput = null;
  }
};
io.HttpResponse[dart.implements] = () => [io.IOSink];
dart.setSignature(io.HttpResponse, {
  fields: () => ({
    contentLength: core.int,
    statusCode: core.int,
    reasonPhrase: core.String,
    persistentConnection: core.bool,
    deadline: core.Duration,
    bufferOutput: core.bool
  })
});
io.HttpClient = class HttpClient extends core.Object {
  static new(opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    return new io._HttpClient(context);
  }
  static findProxyFromEnvironment(url, opts) {
    let environment = opts && 'environment' in opts ? opts.environment : null;
    return io._HttpClient._findProxyFromEnvironment(url, environment);
  }
};
dart.setSignature(io.HttpClient, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpClient, [], {context: io.SecurityContext})}),
  fields: () => ({
    idleTimeout: core.Duration,
    maxConnectionsPerHost: core.int,
    autoUncompress: core.bool,
    userAgent: core.String
  }),
  sfields: () => ({
    DEFAULT_HTTP_PORT: core.int,
    DEFAULT_HTTPS_PORT: core.int
  }),
  statics: () => ({findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri], {environment: MapOfString$String()})}),
  names: ['findProxyFromEnvironment']
});
io.HttpClient.DEFAULT_HTTP_PORT = 80;
io.HttpClient.DEFAULT_HTTPS_PORT = 443;
io.HttpClientRequest = class HttpClientRequest extends core.Object {
  new() {
    this.persistentConnection = null;
    this.followRedirects = null;
    this.maxRedirects = null;
    this.contentLength = null;
    this.bufferOutput = null;
  }
};
io.HttpClientRequest[dart.implements] = () => [io.IOSink];
dart.setSignature(io.HttpClientRequest, {
  fields: () => ({
    persistentConnection: core.bool,
    followRedirects: core.bool,
    maxRedirects: core.int,
    contentLength: core.int,
    bufferOutput: core.bool
  })
});
io.HttpClientResponse = class HttpClientResponse extends core.Object {};
io.HttpClientResponse[dart.implements] = () => [StreamOfListOfint()];
io.HttpClientCredentials = class HttpClientCredentials extends core.Object {};
io.HttpClientBasicCredentials = class HttpClientBasicCredentials extends io.HttpClientCredentials {
  static new(username, password) {
    return new io._HttpClientBasicCredentials(username, password);
  }
};
dart.setSignature(io.HttpClientBasicCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpClientBasicCredentials, [core.String, core.String])})
});
io.HttpClientDigestCredentials = class HttpClientDigestCredentials extends io.HttpClientCredentials {
  static new(username, password) {
    return new io._HttpClientDigestCredentials(username, password);
  }
};
dart.setSignature(io.HttpClientDigestCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpClientDigestCredentials, [core.String, core.String])})
});
io.HttpConnectionInfo = class HttpConnectionInfo extends core.Object {};
io.RedirectInfo = class RedirectInfo extends core.Object {};
io.DetachedSocket = class DetachedSocket extends core.Object {};
io.HttpException = class HttpException extends core.Object {
  new(message, opts) {
    let uri = opts && 'uri' in opts ? opts.uri : null;
    this.message = message;
    this.uri = uri;
  }
  toString() {
    let b = new core.StringBuffer();
    b.write('HttpException: ');
    b.write(this.message);
    if (this.uri != null) {
      b.write(dart.str`, uri = ${this.uri}`);
    }
    return b.toString();
  }
};
io.HttpException[dart.implements] = () => [io.IOException];
dart.setSignature(io.HttpException, {
  constructors: () => ({new: dart.definiteFunctionType(io.HttpException, [core.String], {uri: core.Uri})}),
  fields: () => ({
    message: core.String,
    uri: core.Uri
  })
});
io.RedirectException = class RedirectException extends core.Object {
  new(message, redirects) {
    this.message = message;
    this.redirects = redirects;
  }
  toString() {
    return dart.str`RedirectException: ${this.message}`;
  }
  get uri() {
    return this.redirects[dartx.last].location;
  }
};
io.RedirectException[dart.implements] = () => [io.HttpException];
dart.setSignature(io.RedirectException, {
  constructors: () => ({new: dart.definiteFunctionType(io.RedirectException, [core.String, ListOfRedirectInfo()])}),
  fields: () => ({
    message: core.String,
    redirects: ListOfRedirectInfo()
  }),
  getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
});
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
io.HttpDate = class HttpDate extends core.Object {
  static format(date) {
    let wkday = const || (const = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
    let month = const || (const = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
    let d = date.toUtc();
    let sb = new core.StringBuffer();
    sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
    sb.write(", ");
    sb.write(dart.notNull(d.day) <= 9 ? "0" : "");
    sb.write(dart.toString(d.day));
    sb.write(" ");
    sb.write(month[dartx._get](dart.notNull(d.month) - 1));
    sb.write(" ");
    sb.write(dart.toString(d.year));
    sb.write(dart.notNull(d.hour) <= 9 ? " 0" : " ");
    sb.write(dart.toString(d.hour));
    sb.write(dart.notNull(d.minute) <= 9 ? ":0" : ":");
    sb.write(dart.toString(d.minute));
    sb.write(dart.notNull(d.second) <= 9 ? ":0" : ":");
    sb.write(dart.toString(d.second));
    sb.write(" GMT");
    return sb.toString();
  }
  static parse(date) {
    let SP = 32;
    let wkdays = const || (const = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
    let weekdays = const || (const = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
    let months = const || (const = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
    let wkdaysLowerCase = const || (const = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
    let weekdaysLowerCase = const || (const = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
    let monthsLowerCase = const || (const = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
    let formatRfc1123 = 0;
    let formatRfc850 = 1;
    let formatAsctime = 2;
    let index = 0;
    let tmp = null;
    let format = null;
    function expect(s) {
      if (dart.notNull(date[dartx.length]) - dart.notNull(index) < dart.notNull(s[dartx.length])) {
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
      let tmp = date[dartx.substring](index, dart.notNull(index) + dart.notNull(s[dartx.length]));
      if (tmp != s) {
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
      index = dart.notNull(index) + dart.notNull(s[dartx.length]);
    }
    dart.fn(expect, StringTovoid());
    function expectWeekday() {
      let weekday = null;
      let pos = date[dartx.indexOf](",", index);
      if (pos == -1) {
        let pos = date[dartx.indexOf](" ", index);
        if (pos == -1) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        tmp = date[dartx.substring](index, pos);
        index = dart.notNull(pos) + 1;
        weekday = wkdays[dartx.indexOf](tmp);
        if (weekday != -1) {
          format = formatAsctime;
          return weekday;
        }
      } else {
        tmp = date[dartx.substring](index, pos);
        index = dart.notNull(pos) + 1;
        weekday = wkdays[dartx.indexOf](tmp);
        if (weekday != -1) {
          format = formatRfc1123;
          return weekday;
        }
        weekday = weekdays[dartx.indexOf](tmp);
        if (weekday != -1) {
          format = formatRfc850;
          return weekday;
        }
      }
      dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
    }
    dart.fn(expectWeekday, VoidToint());
    function expectMonth(separator) {
      let pos = date[dartx.indexOf](separator, index);
      if (dart.notNull(pos) - dart.notNull(index) != 3) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      tmp = date[dartx.substring](index, pos);
      index = dart.notNull(pos) + 1;
      let month = months[dartx.indexOf](tmp);
      if (month != -1) return month;
      dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
    }
    dart.fn(expectMonth, StringToint());
    function expectNum(separator) {
      let pos = null;
      if (dart.notNull(separator[dartx.length]) > 0) {
        pos = date[dartx.indexOf](separator, index);
      } else {
        pos = date[dartx.length];
      }
      let tmp = date[dartx.substring](index, pos);
      index = dart.notNull(pos) + dart.notNull(separator[dartx.length]);
      try {
        let value = core.int.parse(tmp);
        return value;
      } catch (e) {
        if (core.FormatException.is(e)) {
          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
        } else
          throw e;
      }

    }
    dart.fn(expectNum, StringToint());
    function expectEnd() {
      if (index != date[dartx.length]) {
        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
      }
    }
    dart.fn(expectEnd, VoidTovoid());
    let weekday = expectWeekday();
    let day = null;
    let month = null;
    let year = null;
    let hours = null;
    let minutes = null;
    let seconds = null;
    if (format == formatAsctime) {
      month = expectMonth(" ");
      if (date[dartx.codeUnitAt](index) == SP) {
        index = dart.notNull(index) + 1;
      }
      day = expectNum(" ");
      hours = expectNum(":");
      minutes = expectNum(":");
      seconds = expectNum(" ");
      year = expectNum("");
    } else {
      expect(" ");
      day = expectNum(format == formatRfc1123 ? " " : "-");
      month = expectMonth(format == formatRfc1123 ? " " : "-");
      year = expectNum(" ");
      hours = expectNum(":");
      minutes = expectNum(":");
      seconds = expectNum(" ");
      expect("GMT");
    }
    expectEnd();
    return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
  }
  static _parseCookieDate(date) {
    let monthsLowerCase = const || (const = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
    let position = 0;
    function error() {
      dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
    }
    dart.fn(error, VoidTovoid());
    function isEnd() {
      return position == date[dartx.length];
    }
    dart.fn(isEnd, VoidTobool());
    function isDelimiter(s) {
      let char = s[dartx.codeUnitAt](0);
      if (char == 9) return true;
      if (dart.notNull(char) >= 32 && dart.notNull(char) <= 47) return true;
      if (dart.notNull(char) >= 59 && dart.notNull(char) <= 64) return true;
      if (dart.notNull(char) >= 91 && dart.notNull(char) <= 96) return true;
      if (dart.notNull(char) >= 123 && dart.notNull(char) <= 126) return true;
      return false;
    }
    dart.fn(isDelimiter, StringTobool());
    function isNonDelimiter(s) {
      let char = s[dartx.codeUnitAt](0);
      if (dart.notNull(char) >= 0 && dart.notNull(char) <= 8) return true;
      if (dart.notNull(char) >= 10 && dart.notNull(char) <= 31) return true;
      if (dart.notNull(char) >= 48 && dart.notNull(char) <= 57) return true;
      if (char == 58) return true;
      if (dart.notNull(char) >= 65 && dart.notNull(char) <= 90) return true;
      if (dart.notNull(char) >= 97 && dart.notNull(char) <= 122) return true;
      if (dart.notNull(char) >= 127 && dart.notNull(char) <= 255) return true;
      return false;
    }
    dart.fn(isNonDelimiter, StringTobool());
    function isDigit(s) {
      let char = s[dartx.codeUnitAt](0);
      if (dart.notNull(char) > 47 && dart.notNull(char) < 58) return true;
      return false;
    }
    dart.fn(isDigit, StringTobool());
    function getMonth(month) {
      if (dart.notNull(month[dartx.length]) < 3) return -1;
      return monthsLowerCase[dartx.indexOf](month[dartx.substring](0, 3));
    }
    dart.fn(getMonth, StringToint());
    function toInt(s) {
      let index = 0;
      for (; index < dart.notNull(s[dartx.length]) && dart.test(isDigit(s[dartx._get](index))); index++)
        ;
      return core.int.parse(s[dartx.substring](0, index));
    }
    dart.fn(toInt, StringToint());
    let tokens = [];
    while (!dart.test(isEnd())) {
      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
        position++;
      let start = position;
      while (!dart.test(isEnd()) && dart.test(isNonDelimiter(date[dartx._get](position))))
        position++;
      tokens[dartx.add](date[dartx.substring](start, position)[dartx.toLowerCase]());
      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
        position++;
    }
    let timeStr = null;
    let dayOfMonthStr = null;
    let monthStr = null;
    let yearStr = null;
    for (let token of tokens) {
      if (dart.test(dart.dsend(dart.dload(token, 'length'), '<', 1))) continue;
      if (timeStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 5)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && (dart.equals(dart.dindex(token, 1), ":") || dart.test(isDigit(core.String._check(dart.dindex(token, 1)))) && dart.equals(dart.dindex(token, 2), ":"))) {
        timeStr = core.String._check(token);
      } else if (dayOfMonthStr == null && dart.test(isDigit(core.String._check(dart.dindex(token, 0))))) {
        dayOfMonthStr = core.String._check(token);
      } else if (monthStr == null && dart.notNull(getMonth(core.String._check(token))) >= 0) {
        monthStr = core.String._check(token);
      } else if (yearStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 2)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && dart.test(isDigit(core.String._check(dart.dindex(token, 1))))) {
        yearStr = core.String._check(token);
      }
    }
    if (timeStr == null || dayOfMonthStr == null || monthStr == null || yearStr == null) {
      error();
    }
    let year = toInt(yearStr);
    if (dart.notNull(year) >= 70 && dart.notNull(year) <= 99) {
      year = dart.notNull(year) + 1900;
    } else if (dart.notNull(year) >= 0 && dart.notNull(year) <= 69) {
      year = dart.notNull(year) + 2000;
    }
    if (dart.notNull(year) < 1601) error();
    let dayOfMonth = toInt(dayOfMonthStr);
    if (dart.notNull(dayOfMonth) < 1 || dart.notNull(dayOfMonth) > 31) error();
    let month = dart.notNull(getMonth(monthStr)) + 1;
    let timeList = timeStr[dartx.split](":");
    if (timeList[dartx.length] != 3) error();
    let hour = toInt(timeList[dartx._get](0));
    let minute = toInt(timeList[dartx._get](1));
    let second = toInt(timeList[dartx._get](2));
    if (dart.notNull(hour) > 23) error();
    if (dart.notNull(minute) > 59) error();
    if (dart.notNull(second) > 59) error();
    return new core.DateTime.utc(year, month, dayOfMonth, hour, minute, second, 0);
  }
};
dart.setSignature(io.HttpDate, {
  statics: () => ({
    format: dart.definiteFunctionType(core.String, [core.DateTime]),
    parse: dart.definiteFunctionType(core.DateTime, [core.String]),
    _parseCookieDate: dart.definiteFunctionType(core.DateTime, [core.String])
  }),
  names: ['format', 'parse', '_parseCookieDate']
});
const _headers = Symbol('_headers');
const _defaultPortForScheme = Symbol('_defaultPortForScheme');
const _mutable = Symbol('_mutable');
const _noFoldingHeaders = Symbol('_noFoldingHeaders');
const _contentLength = Symbol('_contentLength');
const _persistentConnection = Symbol('_persistentConnection');
const _chunkedTransferEncoding = Symbol('_chunkedTransferEncoding');
const _host = Symbol('_host');
const _port = Symbol('_port');
const _checkMutable = Symbol('_checkMutable');
const _addAll = Symbol('_addAll');
const _add = Symbol('_add');
const _set = Symbol('_set');
const _addValue = Symbol('_addValue');
const _updateHostHeader = Symbol('_updateHostHeader');
const _addDate = Symbol('_addDate');
const _addHost = Symbol('_addHost');
const _addExpires = Symbol('_addExpires');
const _addConnection = Symbol('_addConnection');
const _addContentType = Symbol('_addContentType');
const _addContentLength = Symbol('_addContentLength');
const _addTransferEncoding = Symbol('_addTransferEncoding');
const _addIfModifiedSince = Symbol('_addIfModifiedSince');
const _foldHeader = Symbol('_foldHeader');
const _finalize = Symbol('_finalize');
const _write = Symbol('_write');
const _parseCookies = Symbol('_parseCookies');
io._HttpHeaders = class _HttpHeaders extends core.Object {
  new(protocolVersion, opts) {
    let defaultPortForScheme = opts && 'defaultPortForScheme' in opts ? opts.defaultPortForScheme : io.HttpClient.DEFAULT_HTTP_PORT;
    let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
    this.protocolVersion = protocolVersion;
    this[_headers] = HashMapOfString$ListOfString().new();
    this[_defaultPortForScheme] = defaultPortForScheme;
    this[_mutable] = true;
    this[_noFoldingHeaders] = null;
    this[_contentLength] = -1;
    this[_persistentConnection] = true;
    this[_chunkedTransferEncoding] = false;
    this[_host] = null;
    this[_port] = null;
    if (initialHeaders != null) {
      initialHeaders[_headers][dartx.forEach](dart.fn((name, value) => this[_headers][dartx._set](name, value), StringAndListOfStringToListOfString()));
      this[_contentLength] = initialHeaders[_contentLength];
      this[_persistentConnection] = initialHeaders[_persistentConnection];
      this[_chunkedTransferEncoding] = initialHeaders[_chunkedTransferEncoding];
      this[_host] = initialHeaders[_host];
      this[_port] = initialHeaders[_port];
    }
    if (this.protocolVersion == "1.0") {
      this[_persistentConnection] = false;
      this[_chunkedTransferEncoding] = false;
    }
  }
  _get(name) {
    return this[_headers][dartx._get](name[dartx.toLowerCase]());
  }
  value(name) {
    name = name[dartx.toLowerCase]();
    let values = this[_headers][dartx._get](name);
    if (values == null) return null;
    if (dart.notNull(values[dartx.length]) > 1) {
      dart.throw(new io.HttpException(dart.str`More than one value for header ${name}`));
    }
    return values[dartx._get](0);
  }
  add(name, value) {
    this[_checkMutable]();
    this[_addAll](io._HttpHeaders._validateField(name), value);
  }
  [_addAll](name, value) {
    dart.assert(name == io._HttpHeaders._validateField(name));
    if (core.Iterable.is(value)) {
      for (let v of value) {
        this[_add](name, io._HttpHeaders._validateValue(v));
      }
    } else {
      this[_add](name, io._HttpHeaders._validateValue(value));
    }
  }
  set(name, value) {
    this[_checkMutable]();
    name = io._HttpHeaders._validateField(name);
    this[_headers][dartx.remove](name);
    if (name == io.HttpHeaders.TRANSFER_ENCODING) {
      this[_chunkedTransferEncoding] = false;
    }
    this[_addAll](name, value);
  }
  remove(name, value) {
    this[_checkMutable]();
    name = io._HttpHeaders._validateField(name);
    value = io._HttpHeaders._validateValue(value);
    let values = this[_headers][dartx._get](name);
    if (values != null) {
      let index = values[dartx.indexOf](core.String._check(value));
      if (index != -1) {
        values[dartx.removeRange](index, dart.notNull(index) + 1);
      }
      if (values[dartx.length] == 0) this[_headers][dartx.remove](name);
    }
    if (name == io.HttpHeaders.TRANSFER_ENCODING && dart.equals(value, "chunked")) {
      this[_chunkedTransferEncoding] = false;
    }
  }
  removeAll(name) {
    this[_checkMutable]();
    name = io._HttpHeaders._validateField(name);
    this[_headers][dartx.remove](name);
  }
  forEach(f) {
    this[_headers][dartx.forEach](f);
  }
  noFolding(name) {
    if (this[_noFoldingHeaders] == null) this[_noFoldingHeaders] = ListOfString().new();
    this[_noFoldingHeaders][dartx.add](name);
  }
  get persistentConnection() {
    return this[_persistentConnection];
  }
  set persistentConnection(persistentConnection) {
    this[_checkMutable]();
    if (persistentConnection == this[_persistentConnection]) return;
    if (dart.test(persistentConnection)) {
      if (this.protocolVersion == "1.1") {
        this.remove(io.HttpHeaders.CONNECTION, "close");
      } else {
        if (this[_contentLength] == -1) {
          dart.throw(new io.HttpException("Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with " + "no ContentLength"));
        }
        this.add(io.HttpHeaders.CONNECTION, "keep-alive");
      }
    } else {
      if (this.protocolVersion == "1.1") {
        this.add(io.HttpHeaders.CONNECTION, "close");
      } else {
        this.remove(io.HttpHeaders.CONNECTION, "keep-alive");
      }
    }
    this[_persistentConnection] = persistentConnection;
  }
  get contentLength() {
    return this[_contentLength];
  }
  set contentLength(contentLength) {
    this[_checkMutable]();
    if (this.protocolVersion == "1.0" && dart.test(this.persistentConnection) && contentLength == -1) {
      dart.throw(new io.HttpException("Trying to clear ContentLength on HTTP 1.0 headers with " + "'Connection: Keep-Alive' set"));
    }
    if (this[_contentLength] == contentLength) return;
    this[_contentLength] = contentLength;
    if (dart.notNull(this[_contentLength]) >= 0) {
      if (dart.test(this.chunkedTransferEncoding)) this.chunkedTransferEncoding = false;
      this[_set](io.HttpHeaders.CONTENT_LENGTH, dart.toString(contentLength));
    } else {
      this.removeAll(io.HttpHeaders.CONTENT_LENGTH);
      if (this.protocolVersion == "1.1") {
        this.chunkedTransferEncoding = true;
      }
    }
  }
  get chunkedTransferEncoding() {
    return this[_chunkedTransferEncoding];
  }
  set chunkedTransferEncoding(chunkedTransferEncoding) {
    this[_checkMutable]();
    if (dart.test(chunkedTransferEncoding) && this.protocolVersion == "1.0") {
      dart.throw(new io.HttpException("Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers"));
    }
    if (chunkedTransferEncoding == this[_chunkedTransferEncoding]) return;
    if (dart.test(chunkedTransferEncoding)) {
      let values = this[_headers][dartx._get](io.HttpHeaders.TRANSFER_ENCODING);
      if (values == null || values[dartx.last] != "chunked") {
        this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, "chunked");
      }
      this.contentLength = -1;
    } else {
      this.remove(io.HttpHeaders.TRANSFER_ENCODING, "chunked");
    }
    this[_chunkedTransferEncoding] = chunkedTransferEncoding;
  }
  get host() {
    return this[_host];
  }
  set host(host) {
    this[_checkMutable]();
    this[_host] = host;
    this[_updateHostHeader]();
  }
  get port() {
    return this[_port];
  }
  set port(port) {
    this[_checkMutable]();
    this[_port] = port;
    this[_updateHostHeader]();
  }
  get ifModifiedSince() {
    let values = this[_headers][dartx._get](io.HttpHeaders.IF_MODIFIED_SINCE);
    if (values != null) {
      try {
        return io.HttpDate.parse(values[dartx._get](0));
      } catch (e) {
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e;
      }

    }
    return null;
  }
  set ifModifiedSince(ifModifiedSince) {
    this[_checkMutable]();
    let formatted = io.HttpDate.format(ifModifiedSince.toUtc());
    this[_set](io.HttpHeaders.IF_MODIFIED_SINCE, formatted);
  }
  get date() {
    let values = this[_headers][dartx._get](io.HttpHeaders.DATE);
    if (values != null) {
      try {
        return io.HttpDate.parse(values[dartx._get](0));
      } catch (e) {
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e;
      }

    }
    return null;
  }
  set date(date) {
    this[_checkMutable]();
    let formatted = io.HttpDate.format(date.toUtc());
    this[_set]("date", formatted);
  }
  get expires() {
    let values = this[_headers][dartx._get](io.HttpHeaders.EXPIRES);
    if (values != null) {
      try {
        return io.HttpDate.parse(values[dartx._get](0));
      } catch (e) {
        if (core.Exception.is(e)) {
          return null;
        } else
          throw e;
      }

    }
    return null;
  }
  set expires(expires) {
    this[_checkMutable]();
    let formatted = io.HttpDate.format(expires.toUtc());
    this[_set](io.HttpHeaders.EXPIRES, formatted);
  }
  get contentType() {
    let values = this[_headers][dartx._get]("content-type");
    if (values != null) {
      return io.ContentType.parse(values[dartx._get](0));
    } else {
      return null;
    }
  }
  set contentType(contentType) {
    this[_checkMutable]();
    this[_set](io.HttpHeaders.CONTENT_TYPE, dart.toString(contentType));
  }
  clear() {
    this[_checkMutable]();
    this[_headers][dartx.clear]();
    this[_contentLength] = -1;
    this[_persistentConnection] = true;
    this[_chunkedTransferEncoding] = false;
    this[_host] = null;
    this[_port] = null;
  }
  [_add](name, value) {
    dart.assert(name == io._HttpHeaders._validateField(name));
    switch (name[dartx.length]) {
      case 4:
      {
        if (io.HttpHeaders.DATE == name) {
          this[_addDate](name, value);
          return;
        }
        if (io.HttpHeaders.HOST == name) {
          this[_addHost](name, value);
          return;
        }
        break;
      }
      case 7:
      {
        if (io.HttpHeaders.EXPIRES == name) {
          this[_addExpires](name, value);
          return;
        }
        break;
      }
      case 10:
      {
        if (io.HttpHeaders.CONNECTION == name) {
          this[_addConnection](name, value);
          return;
        }
        break;
      }
      case 12:
      {
        if (io.HttpHeaders.CONTENT_TYPE == name) {
          this[_addContentType](name, value);
          return;
        }
        break;
      }
      case 14:
      {
        if (io.HttpHeaders.CONTENT_LENGTH == name) {
          this[_addContentLength](name, value);
          return;
        }
        break;
      }
      case 17:
      {
        if (io.HttpHeaders.TRANSFER_ENCODING == name) {
          this[_addTransferEncoding](name, value);
          return;
        }
        if (io.HttpHeaders.IF_MODIFIED_SINCE == name) {
          this[_addIfModifiedSince](name, value);
          return;
        }
      }
    }
    this[_addValue](name, value);
  }
  [_addContentLength](name, value) {
    if (typeof value == 'number') {
      this.contentLength = value;
    } else if (typeof value == 'string') {
      this.contentLength = core.int.parse(value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addTransferEncoding](name, value) {
    if (dart.equals(value, "chunked")) {
      this.chunkedTransferEncoding = true;
    } else {
      this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, value);
    }
  }
  [_addDate](name, value) {
    if (core.DateTime.is(value)) {
      this.date = value;
    } else if (typeof value == 'string') {
      this[_set](io.HttpHeaders.DATE, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addExpires](name, value) {
    if (core.DateTime.is(value)) {
      this.expires = value;
    } else if (typeof value == 'string') {
      this[_set](io.HttpHeaders.EXPIRES, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addIfModifiedSince](name, value) {
    if (core.DateTime.is(value)) {
      this.ifModifiedSince = value;
    } else if (typeof value == 'string') {
      this[_set](io.HttpHeaders.IF_MODIFIED_SINCE, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addHost](name, value) {
    if (typeof value == 'string') {
      let pos = value[dartx.indexOf](":");
      if (pos == -1) {
        this[_host] = value;
        this[_port] = io.HttpClient.DEFAULT_HTTP_PORT;
      } else {
        if (dart.notNull(pos) > 0) {
          this[_host] = value[dartx.substring](0, pos);
        } else {
          this[_host] = null;
        }
        if (dart.notNull(pos) + 1 == value[dartx.length]) {
          this[_port] = io.HttpClient.DEFAULT_HTTP_PORT;
        } else {
          try {
            this[_port] = core.int.parse(value[dartx.substring](dart.notNull(pos) + 1));
          } catch (e) {
            if (core.FormatException.is(e)) {
              this[_port] = null;
            } else
              throw e;
          }

        }
      }
      this[_set](io.HttpHeaders.HOST, value);
    } else {
      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
    }
  }
  [_addConnection](name, value) {
    let lowerCaseValue = dart.dsend(value, 'toLowerCase');
    if (dart.equals(lowerCaseValue, 'close')) {
      this[_persistentConnection] = false;
    } else if (dart.equals(lowerCaseValue, 'keep-alive')) {
      this[_persistentConnection] = true;
    }
    this[_addValue](name, value);
  }
  [_addContentType](name, value) {
    this[_set](io.HttpHeaders.CONTENT_TYPE, core.String._check(value));
  }
  [_addValue](name, value) {
    let values = this[_headers][dartx._get](name);
    if (values == null) {
      values = ListOfString().new();
      this[_headers][dartx._set](name, values);
    }
    if (core.DateTime.is(value)) {
      values[dartx.add](io.HttpDate.format(value));
    } else if (typeof value == 'string') {
      values[dartx.add](value);
    } else {
      values[dartx.add](core.String._check(io._HttpHeaders._validateValue(dart.toString(value))));
    }
  }
  [_set](name, value) {
    dart.assert(name == io._HttpHeaders._validateField(name));
    let values = ListOfString().new();
    this[_headers][dartx._set](name, values);
    values[dartx.add](value);
  }
  [_checkMutable]() {
    if (!dart.test(this[_mutable])) dart.throw(new io.HttpException("HTTP headers are not mutable"));
  }
  [_updateHostHeader]() {
    let defaultPort = this[_port] == null || this[_port] == this[_defaultPortForScheme];
    this[_set]("host", defaultPort ? this.host : dart.str`${this.host}:${this[_port]}`);
  }
  [_foldHeader](name) {
    if (name == io.HttpHeaders.SET_COOKIE || this[_noFoldingHeaders] != null && this[_noFoldingHeaders][dartx.indexOf](name) != -1) {
      return false;
    }
    return true;
  }
  [_finalize]() {
    this[_mutable] = false;
  }
  [_write](buffer, offset) {
    function write(bytes) {
      let len = bytes[dartx.length];
      for (let i = 0; i < dart.notNull(len); i++) {
        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
      }
      offset = dart.notNull(offset) + dart.notNull(len);
    }
    dart.fn(write, ListOfintTovoid());
    for (let name of this[_headers][dartx.keys]) {
      let values = this[_headers][dartx._get](name);
      let fold = core.bool._check(this[_foldHeader](name));
      let nameData = name[dartx.codeUnits];
      write(nameData);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.COLON);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.SP);
      for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
        if (i > 0) {
          if (dart.test(fold)) {
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.COMMA);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.SP);
          } else {
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.CR);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.LF);
            write(nameData);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.COLON);
            buffer[dartx._set]((() => {
              let x = offset;
              offset = dart.notNull(x) + 1;
              return x;
            })(), io._CharCode.SP);
          }
        }
        write(values[dartx._get](i)[dartx.codeUnits]);
      }
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.CR);
      buffer[dartx._set]((() => {
        let x = offset;
        offset = dart.notNull(x) + 1;
        return x;
      })(), io._CharCode.LF);
    }
    return offset;
  }
  toString() {
    let sb = new core.StringBuffer();
    this[_headers][dartx.forEach](dart.fn((name, values) => {
      sb.write(name);
      sb.write(": ");
      let fold = core.bool._check(this[_foldHeader](name));
      for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
        if (i > 0) {
          if (dart.test(fold)) {
            sb.write(", ");
          } else {
            sb.write("\n");
            sb.write(name);
            sb.write(": ");
          }
        }
        sb.write(values[dartx._get](i));
      }
      sb.write("\n");
    }, StringAndListOfStringToNull()));
    return sb.toString();
  }
  [_parseCookies]() {
    let cookies = ListOfCookie().new();
    function parseCookieString(s) {
      let index = 0;
      function done() {
        return index == -1 || index == s[dartx.length];
      }
      dart.fn(done, VoidTobool());
      function skipWS() {
        while (!dart.test(done())) {
          if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
          index = dart.notNull(index) + 1;
        }
      }
      dart.fn(skipWS, VoidTovoid());
      function parseName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=") break;
          index = dart.notNull(index) + 1;
        }
        return s[dartx.substring](start, index);
      }
      dart.fn(parseName, VoidToString());
      function parseValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == ";") break;
          index = dart.notNull(index) + 1;
        }
        return s[dartx.substring](start, index);
      }
      dart.fn(parseValue, VoidToString());
      function expect(expected) {
        if (dart.test(done())) return false;
        if (s[dartx._get](index) != expected) return false;
        index = dart.notNull(index) + 1;
        return true;
      }
      dart.fn(expect, StringTobool());
      while (!dart.test(done())) {
        skipWS();
        if (dart.test(done())) return;
        let name = parseName();
        skipWS();
        if (!dart.test(expect("="))) {
          index = s[dartx.indexOf](';', index);
          continue;
        }
        skipWS();
        let value = parseValue();
        try {
          cookies[dartx.add](new io._Cookie(name, value));
        } catch (_) {
        }

        skipWS();
        if (dart.test(done())) return;
        if (!dart.test(expect(";"))) {
          index = s[dartx.indexOf](';', index);
          continue;
        }
      }
    }
    dart.fn(parseCookieString, StringTovoid());
    let values = this[_headers][dartx._get](io.HttpHeaders.COOKIE);
    if (values != null) {
      values[dartx.forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid()));
    }
    return cookies;
  }
  static _validateField(field) {
    for (let i = 0; i < dart.notNull(field[dartx.length]); i++) {
      if (!dart.test(io._HttpParser._isTokenChar(field[dartx.codeUnitAt](i)))) {
        dart.throw(new core.FormatException(dart.str`Invalid HTTP header field name: ${convert.JSON.encode(field)}`));
      }
    }
    return field[dartx.toLowerCase]();
  }
  static _validateValue(value) {
    if (!(typeof value == 'string')) return value;
    for (let i = 0; i < dart.notNull(core.num._check(dart.dload(value, 'length'))); i++) {
      if (!dart.test(io._HttpParser._isValueChar(core.int._check(dart.dsend(value, 'codeUnitAt', i))))) {
        dart.throw(new core.FormatException(dart.str`Invalid HTTP header field value: ${convert.JSON.encode(value)}`));
      }
    }
    return value;
  }
};
io._HttpHeaders[dart.implements] = () => [io.HttpHeaders];
dart.setSignature(io._HttpHeaders, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpHeaders, [core.String], {defaultPortForScheme: core.int, initialHeaders: io._HttpHeaders})}),
  fields: () => ({
    [_headers]: MapOfString$ListOfString(),
    protocolVersion: core.String,
    [_mutable]: core.bool,
    [_noFoldingHeaders]: ListOfString(),
    [_contentLength]: core.int,
    [_persistentConnection]: core.bool,
    [_chunkedTransferEncoding]: core.bool,
    [_host]: core.String,
    [_port]: core.int,
    [_defaultPortForScheme]: core.int
  }),
  getters: () => ({
    persistentConnection: dart.definiteFunctionType(core.bool, []),
    contentLength: dart.definiteFunctionType(core.int, []),
    chunkedTransferEncoding: dart.definiteFunctionType(core.bool, []),
    host: dart.definiteFunctionType(core.String, []),
    port: dart.definiteFunctionType(core.int, []),
    ifModifiedSince: dart.definiteFunctionType(core.DateTime, []),
    date: dart.definiteFunctionType(core.DateTime, []),
    expires: dart.definiteFunctionType(core.DateTime, []),
    contentType: dart.definiteFunctionType(io.ContentType, [])
  }),
  setters: () => ({
    persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
    contentLength: dart.definiteFunctionType(dart.void, [core.int]),
    chunkedTransferEncoding: dart.definiteFunctionType(dart.void, [core.bool]),
    host: dart.definiteFunctionType(dart.void, [core.String]),
    port: dart.definiteFunctionType(dart.void, [core.int]),
    ifModifiedSince: dart.definiteFunctionType(dart.void, [core.DateTime]),
    date: dart.definiteFunctionType(dart.void, [core.DateTime]),
    expires: dart.definiteFunctionType(dart.void, [core.DateTime]),
    contentType: dart.definiteFunctionType(dart.void, [io.ContentType])
  }),
  methods: () => ({
    _get: dart.definiteFunctionType(core.List$(core.String), [core.String]),
    value: dart.definiteFunctionType(core.String, [core.String]),
    add: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    [_addAll]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    set: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    remove: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    removeAll: dart.definiteFunctionType(dart.void, [core.String]),
    forEach: dart.definiteFunctionType(dart.void, [StringAndListOfStringTovoid()]),
    noFolding: dart.definiteFunctionType(dart.void, [core.String]),
    clear: dart.definiteFunctionType(dart.void, []),
    [_add]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addContentLength]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addTransferEncoding]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addDate]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addExpires]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addIfModifiedSince]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addHost]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addConnection]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addContentType]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
    [_addValue]: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
    [_set]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
    [_checkMutable]: dart.definiteFunctionType(dart.dynamic, []),
    [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
    [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
    [_finalize]: dart.definiteFunctionType(dart.void, []),
    [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
    [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
  }),
  statics: () => ({
    _validateField: dart.definiteFunctionType(core.String, [core.String]),
    _validateValue: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
  }),
  names: ['_validateField', '_validateValue']
});
const _value = Symbol('_value');
const _parameters = Symbol('_parameters');
const _unmodifiableParameters = Symbol('_unmodifiableParameters');
const _parse = Symbol('_parse');
const _ensureParameters = Symbol('_ensureParameters');
io._HeaderValue = class _HeaderValue extends core.Object {
  new(value, parameters) {
    if (value === void 0) value = "";
    if (parameters === void 0) parameters = null;
    this[_value] = value;
    this[_parameters] = null;
    this[_unmodifiableParameters] = null;
    if (parameters != null) {
      this[_parameters] = HashMapOfString$String().from(parameters);
    }
  }
  static parse(value, opts) {
    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
    let result = new io._HeaderValue();
    result[_parse](value, core.String._check(parameterSeparator), core.String._check(valueSeparator), core.bool._check(preserveBackslash));
    return result;
  }
  get value() {
    return this[_value];
  }
  [_ensureParameters]() {
    if (this[_parameters] == null) {
      this[_parameters] = HashMapOfString$String().new();
    }
  }
  get parameters() {
    this[_ensureParameters]();
    if (this[_unmodifiableParameters] == null) {
      this[_unmodifiableParameters] = new (UnmodifiableMapViewOfString$String())(this[_parameters]);
    }
    return this[_unmodifiableParameters];
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write(this[_value]);
    if (this.parameters != null && dart.notNull(this.parameters[dartx.length]) > 0) {
      this[_parameters][dartx.forEach](dart.fn((name, value) => {
        sb.write("; ");
        sb.write(name);
        sb.write("=");
        sb.write(value);
      }, StringAndStringToNull()));
    }
    return sb.toString();
  }
  [_parse](s, parameterSeparator, valueSeparator, preserveBackslash) {
    let index = 0;
    function done() {
      return index == s[dartx.length];
    }
    dart.fn(done, VoidTobool());
    function skipWS() {
      while (!dart.test(done())) {
        if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
        index++;
      }
    }
    dart.fn(skipWS, VoidTovoid());
    function parseValue() {
      let start = index;
      while (!dart.test(done())) {
        if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == valueSeparator || s[dartx._get](index) == parameterSeparator) break;
        index++;
      }
      return s[dartx.substring](start, index);
    }
    dart.fn(parseValue, VoidToString());
    function expect(expected) {
      if (dart.test(done()) || s[dartx._get](index) != expected) {
        dart.throw(new io.HttpException("Failed to parse header value"));
      }
      index++;
    }
    dart.fn(expect, StringTovoid());
    function maybeExpect(expected) {
      if (s[dartx._get](index) == expected) index++;
    }
    dart.fn(maybeExpect, StringTovoid());
    const parseParameters = (function() {
      let parameters = HashMapOfString$String().new();
      this[_parameters] = new (UnmodifiableMapViewOfString$String())(parameters);
      function parseParameterName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=" || s[dartx._get](index) == parameterSeparator || s[dartx._get](index) == valueSeparator) break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.toLowerCase]();
      }
      dart.fn(parseParameterName, VoidToString());
      function parseParameterValue() {
        if (!dart.test(done()) && s[dartx._get](index) == "\"") {
          let sb = new core.StringBuffer();
          index++;
          while (!dart.test(done())) {
            if (s[dartx._get](index) == "\\") {
              if (index + 1 == s[dartx.length]) {
                dart.throw(new io.HttpException("Failed to parse header value"));
              }
              if (dart.test(preserveBackslash) && s[dartx._get](index + 1) != "\"") {
                sb.write(s[dartx._get](index));
              }
              index++;
            } else if (s[dartx._get](index) == "\"") {
              index++;
              break;
            }
            sb.write(s[dartx._get](index));
            index++;
          }
          return sb.toString();
        } else {
          let val = parseValue();
          return val == "" ? null : val;
        }
      }
      dart.fn(parseParameterValue, VoidToString());
      while (!dart.test(done())) {
        skipWS();
        if (dart.test(done())) return;
        let name = parseParameterName();
        skipWS();
        if (dart.test(done())) {
          parameters._set(name, null);
          return;
        }
        maybeExpect("=");
        skipWS();
        if (dart.test(done())) {
          parameters._set(name, null);
          return;
        }
        let value = parseParameterValue();
        if (name == 'charset' && io._ContentType.is(this)) {
          value = value[dartx.toLowerCase]();
        }
        parameters._set(name, value);
        skipWS();
        if (dart.test(done())) return;
        if (s[dartx._get](index) == valueSeparator) return;
        expect(parameterSeparator);
      }
    }).bind(this);
    dart.fn(parseParameters, VoidTovoid());
    skipWS();
    this[_value] = parseValue();
    skipWS();
    if (dart.test(done())) return;
    maybeExpect(parameterSeparator);
    parseParameters();
  }
};
io._HeaderValue[dart.implements] = () => [io.HeaderValue];
dart.setSignature(io._HeaderValue, {
  constructors: () => ({new: dart.definiteFunctionType(io._HeaderValue, [], [core.String, MapOfString$String()])}),
  fields: () => ({
    [_value]: core.String,
    [_parameters]: MapOfString$String(),
    [_unmodifiableParameters]: MapOfString$String()
  }),
  getters: () => ({
    value: dart.definiteFunctionType(core.String, []),
    parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
  }),
  methods: () => ({
    [_ensureParameters]: dart.definiteFunctionType(dart.void, []),
    [_parse]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String, core.bool])
  }),
  statics: () => ({parse: dart.definiteFunctionType(io._HeaderValue, [core.String], {parameterSeparator: dart.dynamic, valueSeparator: dart.dynamic, preserveBackslash: dart.dynamic})}),
  names: ['parse']
});
const _primaryType = Symbol('_primaryType');
const _subType = Symbol('_subType');
io._ContentType = class _ContentType extends io._HeaderValue {
  new(primaryType, subType, charset, parameters) {
    this[_primaryType] = primaryType;
    this[_subType] = subType;
    super.new("");
    if (this[_primaryType] == null) this[_primaryType] = "";
    if (this[_subType] == null) this[_subType] = "";
    this[_value] = dart.str`${this[_primaryType]}/${this[_subType]}`;
    if (parameters != null) {
      this[_ensureParameters]();
      parameters[dartx.forEach](dart.fn((key, value) => {
        let lowerCaseKey = key[dartx.toLowerCase]();
        if (lowerCaseKey == "charset") {
          value = value[dartx.toLowerCase]();
        }
        this[_parameters][dartx._set](lowerCaseKey, value);
      }, StringAndStringToNull()));
    }
    if (charset != null) {
      this[_ensureParameters]();
      this[_parameters][dartx._set]("charset", charset[dartx.toLowerCase]());
    }
  }
  _() {
    this[_primaryType] = "";
    this[_subType] = "";
    super.new();
  }
  static parse(value) {
    let result = new io._ContentType._();
    result[_parse](value, ";", null, false);
    let index = result[_value][dartx.indexOf]("/");
    if (index == -1 || index == dart.notNull(result[_value][dartx.length]) - 1) {
      result[_primaryType] = result[_value][dartx.trim]()[dartx.toLowerCase]();
      result[_subType] = "";
    } else {
      result[_primaryType] = result[_value][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
      result[_subType] = result[_value][dartx.substring](dart.notNull(index) + 1)[dartx.trim]()[dartx.toLowerCase]();
    }
    return result;
  }
  get mimeType() {
    return dart.str`${this.primaryType}/${this.subType}`;
  }
  get primaryType() {
    return this[_primaryType];
  }
  get subType() {
    return this[_subType];
  }
  get charset() {
    return this.parameters[dartx._get]("charset");
  }
};
dart.defineNamedConstructor(io._ContentType, '_');
io._ContentType[dart.implements] = () => [io.ContentType];
dart.setSignature(io._ContentType, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._ContentType, [core.String, core.String, core.String, MapOfString$String()]),
    _: dart.definiteFunctionType(io._ContentType, [])
  }),
  fields: () => ({
    [_primaryType]: core.String,
    [_subType]: core.String
  }),
  getters: () => ({
    mimeType: dart.definiteFunctionType(core.String, []),
    primaryType: dart.definiteFunctionType(core.String, []),
    subType: dart.definiteFunctionType(core.String, []),
    charset: dart.definiteFunctionType(core.String, [])
  }),
  statics: () => ({parse: dart.definiteFunctionType(io._ContentType, [core.String])}),
  names: ['parse']
});
const _validate = Symbol('_validate');
const _parseSetCookieValue = Symbol('_parseSetCookieValue');
let const;
io._Cookie = class _Cookie extends core.Object {
  new(name, value) {
    if (name === void 0) name = null;
    if (value === void 0) value = null;
    this.name = name;
    this.value = value;
    this.expires = null;
    this.maxAge = null;
    this.domain = null;
    this.path = null;
    this.httpOnly = false;
    this.secure = false;
    this.httpOnly = true;
    this[_validate]();
  }
  fromSetCookieValue(value) {
    this.name = null;
    this.value = null;
    this.expires = null;
    this.maxAge = null;
    this.domain = null;
    this.path = null;
    this.httpOnly = false;
    this.secure = false;
    this[_parseSetCookieValue](value);
  }
  [_parseSetCookieValue](s) {
    let index = 0;
    function done() {
      return index == s[dartx.length];
    }
    dart.fn(done, VoidTobool());
    function parseName() {
      let start = index;
      while (!dart.test(done())) {
        if (s[dartx._get](index) == "=") break;
        index++;
      }
      return s[dartx.substring](start, index)[dartx.trim]();
    }
    dart.fn(parseName, VoidToString());
    function parseValue() {
      let start = index;
      while (!dart.test(done())) {
        if (s[dartx._get](index) == ";") break;
        index++;
      }
      return s[dartx.substring](start, index)[dartx.trim]();
    }
    dart.fn(parseValue, VoidToString());
    function expect(expected) {
      if (dart.test(done())) dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
      if (s[dartx._get](index) != expected) {
        dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
      }
      index++;
    }
    dart.fn(expect, StringTovoid());
    const parseAttributes = (function() {
      function parseAttributeName() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == "=" || s[dartx._get](index) == ";") break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
      }
      dart.fn(parseAttributeName, VoidToString());
      function parseAttributeValue() {
        let start = index;
        while (!dart.test(done())) {
          if (s[dartx._get](index) == ";") break;
          index++;
        }
        return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
      }
      dart.fn(parseAttributeValue, VoidToString());
      while (!dart.test(done())) {
        let name = parseAttributeName();
        let value = "";
        if (!dart.test(done()) && s[dartx._get](index) == "=") {
          index++;
          value = parseAttributeValue();
        }
        if (name == "expires") {
          this.expires = io.HttpDate._parseCookieDate(value);
        } else if (name == "max-age") {
          this.maxAge = core.int.parse(value);
        } else if (name == "domain") {
          this.domain = value;
        } else if (name == "path") {
          this.path = value;
        } else if (name == "httponly") {
          this.httpOnly = true;
        } else if (name == "secure") {
          this.secure = true;
        }
        if (!dart.test(done())) index++;
      }
    }).bind(this);
    dart.fn(parseAttributes, VoidTovoid());
    this.name = parseName();
    if (dart.test(done()) || this.name[dartx.length] == 0) {
      dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
    }
    index++;
    this.value = parseValue();
    this[_validate]();
    if (dart.test(done())) return;
    index++;
    parseAttributes();
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write(this.name);
    sb.write("=");
    sb.write(this.value);
    if (this.expires != null) {
      sb.write("; Expires=");
      sb.write(io.HttpDate.format(this.expires));
    }
    if (this.maxAge != null) {
      sb.write("; Max-Age=");
      sb.write(this.maxAge);
    }
    if (this.domain != null) {
      sb.write("; Domain=");
      sb.write(this.domain);
    }
    if (this.path != null) {
      sb.write("; Path=");
      sb.write(this.path);
    }
    if (dart.test(this.secure)) sb.write("; Secure");
    if (dart.test(this.httpOnly)) sb.write("; HttpOnly");
    return sb.toString();
  }
  [_validate]() {
    let SEPERATORS = const || (const = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
    for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
      let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
      if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
        dart.throw(new core.FormatException(dart.str`Invalid character in cookie name, code unit: '${codeUnit}'`));
      }
    }
    for (let i = 0; i < dart.notNull(this.value[dartx.length]); i++) {
      let codeUnit = this.value[dartx.codeUnits][dartx._get](i);
      if (!(codeUnit == 33 || dart.notNull(codeUnit) >= 35 && dart.notNull(codeUnit) <= 43 || dart.notNull(codeUnit) >= 45 && dart.notNull(codeUnit) <= 58 || dart.notNull(codeUnit) >= 60 && dart.notNull(codeUnit) <= 91 || dart.notNull(codeUnit) >= 93 && dart.notNull(codeUnit) <= 126)) {
        dart.throw(new core.FormatException(dart.str`Invalid character in cookie value, code unit: '${codeUnit}'`));
      }
    }
  }
};
dart.defineNamedConstructor(io._Cookie, 'fromSetCookieValue');
io._Cookie[dart.implements] = () => [io.Cookie];
dart.setSignature(io._Cookie, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._Cookie, [], [core.String, core.String]),
    fromSetCookieValue: dart.definiteFunctionType(io._Cookie, [core.String])
  }),
  fields: () => ({
    name: core.String,
    value: core.String,
    expires: core.DateTime,
    maxAge: core.int,
    domain: core.String,
    path: core.String,
    httpOnly: core.bool,
    secure: core.bool
  }),
  methods: () => ({
    [_parseSetCookieValue]: dart.definiteFunctionType(dart.void, [core.String]),
    [_validate]: dart.definiteFunctionType(dart.void, [])
  })
});
io._OUTGOING_BUFFER_SIZE = 8 * 1024;
const _transferLength = Symbol('_transferLength');
const _dataCompleter = Symbol('_dataCompleter');
const _stream = Symbol('_stream');
io._HttpIncoming = class _HttpIncoming extends async.Stream$(core.List$(core.int)) {
  get transferLength() {
    return this[_transferLength];
  }
  new(headers, transferLength, stream) {
    this[_dataCompleter] = async.Completer.new();
    this.headers = headers;
    this[_transferLength] = transferLength;
    this[_stream] = stream;
    this.fullBodyRead = false;
    this.upgraded = false;
    this.statusCode = null;
    this.reasonPhrase = null;
    this.method = null;
    this.uri = null;
    this.hasSubscriber = false;
    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;
    this.hasSubscriber = true;
    return this[_stream].handleError(dart.fn(error => {
      dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
    }, dynamicToNull())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get dataDone() {
    return this[_dataCompleter].future;
  }
  close(closing) {
    this.fullBodyRead = true;
    this.hasSubscriber = true;
    this[_dataCompleter].complete(closing);
  }
};
dart.addSimpleTypeTests(io._HttpIncoming);
dart.setSignature(io._HttpIncoming, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpIncoming, [io._HttpHeaders, core.int, StreamOfListOfint()])}),
  fields: () => ({
    [_transferLength]: core.int,
    [_dataCompleter]: async.Completer,
    [_stream]: StreamOfListOfint(),
    fullBodyRead: core.bool,
    headers: io._HttpHeaders,
    upgraded: core.bool,
    statusCode: core.int,
    reasonPhrase: core.String,
    method: core.String,
    uri: core.Uri,
    hasSubscriber: core.bool
  }),
  getters: () => ({
    transferLength: dart.definiteFunctionType(core.int, []),
    dataDone: dart.definiteFunctionType(async.Future, [])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(dart.void, [core.bool])
  })
});
const _incoming = Symbol('_incoming');
const _cookies = Symbol('_cookies');
io._HttpInboundMessage = class _HttpInboundMessage extends async.Stream$(core.List$(core.int)) {
  new(incoming) {
    this[_incoming] = incoming;
    this[_cookies] = null;
    super.new();
  }
  get cookies() {
    if (this[_cookies] != null) return this[_cookies];
    return this[_cookies] = this.headers[_parseCookies]();
  }
  get headers() {
    return this[_incoming].headers;
  }
  get protocolVersion() {
    return this.headers.protocolVersion;
  }
  get contentLength() {
    return this.headers.contentLength;
  }
  get persistentConnection() {
    return this.headers.persistentConnection;
  }
};
dart.addSimpleTypeTests(io._HttpInboundMessage);
dart.setSignature(io._HttpInboundMessage, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpInboundMessage, [io._HttpIncoming])}),
  fields: () => ({
    [_incoming]: io._HttpIncoming,
    [_cookies]: ListOfCookie()
  }),
  getters: () => ({
    cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
    headers: dart.definiteFunctionType(io._HttpHeaders, []),
    protocolVersion: dart.definiteFunctionType(core.String, []),
    contentLength: dart.definiteFunctionType(core.int, []),
    persistentConnection: dart.definiteFunctionType(core.bool, [])
  })
});
const _httpServer = Symbol('_httpServer');
const _httpConnection = Symbol('_httpConnection');
const _session = Symbol('_session');
const _requestedUri = Symbol('_requestedUri');
const _sessionManagerInstance = Symbol('_sessionManagerInstance');
const _sessionManager = Symbol('_sessionManager');
const _markSeen = Symbol('_markSeen');
const _socket = Symbol('_socket');
const _destroyed = Symbol('_destroyed');
io._HttpRequest = class _HttpRequest extends io._HttpInboundMessage {
  new(response, _incoming, httpServer, httpConnection) {
    this.response = response;
    this[_httpServer] = httpServer;
    this[_httpConnection] = httpConnection;
    this[_session] = null;
    this[_requestedUri] = null;
    super.new(_incoming);
    if (this.headers.protocolVersion == "1.1") {
      let _ = this.response.headers;
      _.chunkedTransferEncoding = true;
      _.persistentConnection = this.headers.persistentConnection;
    }
    if (this[_httpServer][_sessionManagerInstance] != null) {
      let sessionIds = this.cookies[dartx.where](dart.fn(cookie => cookie.name[dartx.toUpperCase]() == io._DART_SESSION_ID, CookieTobool()))[dartx.map](core.String)(dart.fn(cookie => cookie.value, CookieToString()));
      for (let sessionId of sessionIds) {
        this[_session] = this[_httpServer][_sessionManager].getSession(sessionId);
        if (this[_session] != null) {
          this[_session][_markSeen]();
          break;
        }
      }
    }
  }
  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[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get uri() {
    return this[_incoming].uri;
  }
  get requestedUri() {
    if (this[_requestedUri] == null) {
      let proto = this.headers._get('x-forwarded-proto');
      let scheme = proto != null ? proto[dartx.first] : io.SecureSocket.is(this[_httpConnection][_socket]) ? "https" : "http";
      let hostList = this.headers._get('x-forwarded-host');
      let host = null;
      if (hostList != null) {
        host = hostList[dartx.first];
      } else {
        hostList = this.headers._get('host');
        if (hostList != null) {
          host = hostList[dartx.first];
        } else {
          host = dart.str`${this[_httpServer].address.host}:${this[_httpServer].port}`;
        }
      }
      this[_requestedUri] = core.Uri.parse(dart.str`${scheme}://${host}${this.uri}`);
    }
    return this[_requestedUri];
  }
  get method() {
    return this[_incoming].method;
  }
  get session() {
    if (this[_session] != null) {
      if (dart.test(this[_session][_destroyed])) {
        this[_session] = null;
        return this.session;
      }
      return this[_session];
    }
    return this[_session] = this[_httpServer][_sessionManager].createSession();
  }
  get connectionInfo() {
    return this[_httpConnection].connectionInfo;
  }
  get certificate() {
    let socket = this[_httpConnection][_socket];
    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
    return null;
  }
};
io._HttpRequest[dart.implements] = () => [io.HttpRequest];
dart.setSignature(io._HttpRequest, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpRequest, [io.HttpResponse, io._HttpIncoming, io._HttpServer, io._HttpConnection])}),
  fields: () => ({
    response: io.HttpResponse,
    [_httpServer]: io._HttpServer,
    [_httpConnection]: io._HttpConnection,
    [_session]: io._HttpSession,
    [_requestedUri]: core.Uri
  }),
  getters: () => ({
    uri: dart.definiteFunctionType(core.Uri, []),
    requestedUri: dart.definiteFunctionType(core.Uri, []),
    method: dart.definiteFunctionType(core.String, []),
    session: dart.definiteFunctionType(io.HttpSession, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    certificate: dart.definiteFunctionType(io.X509Certificate, [])
  }),
  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
});
const _responseRedirects = Symbol('_responseRedirects');
const _httpRequest = Symbol('_httpRequest');
const _httpClient = Symbol('_httpClient');
const _httpClientConnection = Symbol('_httpClientConnection');
const _openUrlFromRequest = Symbol('_openUrlFromRequest');
const _connectionClosed = Symbol('_connectionClosed');
const _shouldAuthenticateProxy = Symbol('_shouldAuthenticateProxy');
const _shouldAuthenticate = Symbol('_shouldAuthenticate');
const _proxy = Symbol('_proxy');
const _findProxyCredentials = Symbol('_findProxyCredentials');
const _findCredentials = Symbol('_findCredentials');
const _removeProxyCredentials = Symbol('_removeProxyCredentials');
const _removeCredentials = Symbol('_removeCredentials');
const _authenticateProxy = Symbol('_authenticateProxy');
const _authenticate = Symbol('_authenticate');
io._HttpClientResponse = class _HttpClientResponse extends io._HttpInboundMessage {
  get redirects() {
    return this[_httpRequest][_responseRedirects];
  }
  new(_incoming, httpRequest, httpClient) {
    this[_httpRequest] = httpRequest;
    this[_httpClient] = httpClient;
    super.new(_incoming);
    _incoming.uri = this[_httpRequest].uri;
  }
  get statusCode() {
    return this[_incoming].statusCode;
  }
  get reasonPhrase() {
    return this[_incoming].reasonPhrase;
  }
  get certificate() {
    let socket = this[_httpRequest][_httpClientConnection][_socket];
    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
    dart.throw(new core.UnsupportedError("Socket is not a SecureSocket"));
  }
  get cookies() {
    if (this[_cookies] != null) return this[_cookies];
    this[_cookies] = ListOfCookie().new();
    let values = this.headers._get(io.HttpHeaders.SET_COOKIE);
    if (values != null) {
      values[dartx.forEach](dart.fn(value => {
        this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
      }, StringToNull()));
    }
    return this[_cookies];
  }
  get isRedirect() {
    if (this[_httpRequest].method == "GET" || this[_httpRequest].method == "HEAD") {
      return this.statusCode == io.HttpStatus.MOVED_PERMANENTLY || this.statusCode == io.HttpStatus.FOUND || this.statusCode == io.HttpStatus.SEE_OTHER || this.statusCode == io.HttpStatus.TEMPORARY_REDIRECT;
    } else if (this[_httpRequest].method == "POST") {
      return this.statusCode == io.HttpStatus.SEE_OTHER;
    }
    return false;
  }
  redirect(method, url, followLoops) {
    if (method === void 0) method = null;
    if (url === void 0) url = null;
    if (followLoops === void 0) followLoops = null;
    if (method == null) {
      if (this.statusCode == io.HttpStatus.SEE_OTHER && this[_httpRequest].method == "POST") {
        method = "GET";
      } else {
        method = this[_httpRequest].method;
      }
    }
    if (url == null) {
      let location = this.headers.value(io.HttpHeaders.LOCATION);
      if (location == null) {
        dart.throw(new core.StateError("Response has no Location header for redirect"));
      }
      url = core.Uri.parse(location);
    }
    if (followLoops != true) {
      for (let redirect of this.redirects) {
        if (dart.equals(redirect.location, url)) {
          return FutureOfHttpClientResponse().error(new io.RedirectException("Redirect loop detected", this.redirects));
        }
      }
    }
    return this[_httpClient][_openUrlFromRequest](method, url, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => {
      let _ = request[_responseRedirects];
      _[dartx.addAll](this.redirects);
      _[dartx.add](new io._RedirectInfo(this.statusCode, method, url));
      return request.close();
    }, _HttpClientRequestToFutureOfHttpClientResponse()));
  }
  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 (dart.test(this[_incoming].upgraded)) {
      this[_httpRequest][_httpClientConnection].destroy();
      return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
    }
    let stream = this[_incoming];
    if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
      stream = io._HttpIncoming._check(stream.transform(ListOfint())(io.GZIP.decoder));
    }
    return stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  detachSocket() {
    this[_httpClient][_connectionClosed](this[_httpRequest][_httpClientConnection]);
    return this[_httpRequest][_httpClientConnection].detachSocket();
  }
  get connectionInfo() {
    return this[_httpRequest].connectionInfo;
  }
  get [_shouldAuthenticateProxy]() {
    let challenge = this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE);
    return this.statusCode == io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED && challenge != null && challenge[dartx.length] == 1;
  }
  get [_shouldAuthenticate]() {
    let challenge = this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
    return this.statusCode == io.HttpStatus.UNAUTHORIZED && challenge != null && challenge[dartx.length] == 1;
  }
  [_authenticate](proxyAuth) {
    const retry = (function() {
      return this.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => this[_httpClient][_openUrlFromRequest](this[_httpRequest].method, this[_httpRequest].uri, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => request.close(), _HttpClientRequestToFutureOfHttpClientResponse())), dynamicToFutureOfHttpClientResponse()));
    }).bind(this);
    dart.fn(retry, VoidToFutureOfHttpClientResponse());
    const authChallenge = (function() {
      return dart.test(proxyAuth) ? this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE) : this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
    }).bind(this);
    dart.fn(authChallenge, VoidToListOfString());
    const findCredentials = (function(scheme) {
      return dart.test(proxyAuth) ? this[_httpClient][_findProxyCredentials](this[_httpRequest][_proxy], scheme) : this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
    }).bind(this);
    dart.fn(findCredentials, _AuthenticationSchemeTo_Credentials());
    const removeCredentials = (function(cr) {
      if (dart.test(proxyAuth)) {
        this[_httpClient][_removeProxyCredentials](cr);
      } else {
        this[_httpClient][_removeCredentials](cr);
      }
    }).bind(this);
    dart.fn(removeCredentials, _CredentialsTovoid());
    const requestAuthentication = (function(scheme, realm) {
      if (dart.test(proxyAuth)) {
        if (this[_httpClient][_authenticateProxy] == null) {
          return async.Future.value(false);
        }
        let proxy = this[_httpRequest][_proxy];
        return async.Future._check(dart.dsend(this[_httpClient], _authenticateProxy, proxy.host, proxy.port, dart.toString(scheme), realm));
      } else {
        if (this[_httpClient][_authenticate] == null) {
          return async.Future.value(false);
        }
        return async.Future._check(dart.dsend(this[_httpClient], _authenticate, this[_httpRequest].uri, dart.toString(scheme), realm));
      }
    }).bind(this);
    dart.fn(requestAuthentication, _AuthenticationSchemeAndStringToFuture());
    let challenge = authChallenge();
    dart.assert(challenge != null || challenge[dartx.length] == 1);
    let header = io._HeaderValue.parse(challenge[dartx._get](0), {parameterSeparator: ","});
    let scheme = io._AuthenticationScheme.fromString(header.value);
    let realm = header.parameters[dartx._get]("realm");
    let cr = findCredentials(scheme);
    if (cr != null) {
      if (dart.equals(cr.scheme, io._AuthenticationScheme.BASIC) && !dart.test(cr.used)) {
        return retry();
      }
      if (dart.equals(cr.scheme, io._AuthenticationScheme.DIGEST) && (header.parameters[dartx._get]("algorithm") == null || header.parameters[dartx._get]("algorithm")[dartx.toLowerCase]() == "md5")) {
        if (cr.nonce == null || cr.nonce == header.parameters[dartx._get]("nonce")) {
          if (cr.nonce == null) {
            let _ = cr;
            _.nonce = header.parameters[dartx._get]("nonce");
            _.algorithm = "MD5";
            _.qop = header.parameters[dartx._get]("qop");
            _.nonceCount = 0;
          }
          return retry();
        } else if (header.parameters[dartx._get]("stale") != null && header.parameters[dartx._get]("stale")[dartx.toLowerCase]() == "true") {
          cr.nonce = header.parameters[dartx._get]("nonce");
          return retry();
        }
      }
    }
    if (cr != null) {
      removeCredentials(cr);
      cr = null;
    }
    return requestAuthentication(scheme, realm).then(io.HttpClientResponse)(dart.fn(credsAvailable => {
      if (dart.test(credsAvailable)) {
        cr = this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
        return retry();
      } else {
        return this;
      }
    }, dynamicToFutureOrOfHttpClientResponse()));
  }
};
io._HttpClientResponse[dart.implements] = () => [io.HttpClientResponse];
dart.setSignature(io._HttpClientResponse, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientResponse, [io._HttpIncoming, io._HttpClientRequest, io._HttpClient])}),
  fields: () => ({
    [_httpClient]: io._HttpClient,
    [_httpRequest]: io._HttpClientRequest
  }),
  getters: () => ({
    redirects: dart.definiteFunctionType(core.List$(io.RedirectInfo), []),
    statusCode: dart.definiteFunctionType(core.int, []),
    reasonPhrase: dart.definiteFunctionType(core.String, []),
    certificate: dart.definiteFunctionType(io.X509Certificate, []),
    isRedirect: dart.definiteFunctionType(core.bool, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    [_shouldAuthenticateProxy]: dart.definiteFunctionType(core.bool, []),
    [_shouldAuthenticate]: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    redirect: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [], [core.String, core.Uri, core.bool]),
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
    [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
  })
});
const _uri = Symbol('_uri');
const _outgoing = Symbol('_outgoing');
const _encodingSet = Symbol('_encodingSet');
const _bufferOutput = Symbol('_bufferOutput');
const _encodingMutable = Symbol('_encodingMutable');
const _encoding = Symbol('_encoding');
const _isConnectionClosed = Symbol('_isConnectionClosed');
const _doneCompleter = Symbol('_doneCompleter');
const _target = Symbol('_target');
const _controllerInstance = Symbol('_controllerInstance');
const _controllerCompleter = Symbol('_controllerCompleter');
const _isClosed = Symbol('_isClosed');
const _isBound = Symbol('_isBound');
const _hasError = Symbol('_hasError');
const _closeTarget = Symbol('_closeTarget');
const _completeDoneValue = Symbol('_completeDoneValue');
const _completeDoneError = Symbol('_completeDoneError');
io._StreamSinkImpl$ = dart.generic(T => {
  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
  class _StreamSinkImpl extends core.Object {
    new(target) {
      this[_doneCompleter] = async.Completer.new();
      this[_target] = target;
      this[_controllerInstance] = null;
      this[_controllerCompleter] = null;
      this[_isClosed] = false;
      this[_isBound] = false;
      this[_hasError] = false;
    }
    add(data) {
      T._check(data);
      if (dart.test(this[_isClosed])) return;
      this[_controller].add(data);
    }
    addError(error, stackTrace) {
      if (stackTrace === void 0) stackTrace = null;
      this[_controller].addError(error, stackTrace);
    }
    addStream(stream) {
      StreamOfT()._check(stream);
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is already bound to a stream"));
      }
      this[_isBound] = true;
      if (dart.test(this[_hasError])) return this.done;
      const targetAddStream = (function() {
        return this[_target].addStream(stream).whenComplete(dart.fn(() => {
          this[_isBound] = false;
        }, VoidToNull()));
      }).bind(this);
      dart.fn(targetAddStream, VoidToFuture());
      if (this[_controllerInstance] == null) return targetAddStream();
      let future = this[_controllerCompleter].future;
      this[_controllerInstance].close();
      return future.then(dart.dynamic)(dart.fn(_ => targetAddStream(), dynamicToFuture()));
    }
    flush() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is bound to a stream"));
      }
      if (this[_controllerInstance] == null) return async.Future.value(this);
      this[_isBound] = true;
      let future = this[_controllerCompleter].future;
      this[_controllerInstance].close();
      return future.whenComplete(dart.fn(() => {
        this[_isBound] = false;
      }, VoidToNull()));
    }
    close() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is bound to a stream"));
      }
      if (!dart.test(this[_isClosed])) {
        this[_isClosed] = true;
        if (this[_controllerInstance] != null) {
          this[_controllerInstance].close();
        } else {
          this[_closeTarget]();
        }
      }
      return this.done;
    }
    [_closeTarget]() {
      this[_target].close().then(dart.void)(dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
    }
    get done() {
      return this[_doneCompleter].future;
    }
    [_completeDoneValue](value) {
      if (!dart.test(this[_doneCompleter].isCompleted)) {
        this[_doneCompleter].complete(value);
      }
    }
    [_completeDoneError](error, stackTrace) {
      if (!dart.test(this[_doneCompleter].isCompleted)) {
        this[_hasError] = true;
        this[_doneCompleter].completeError(error, stackTrace);
      }
    }
    get [_controller]() {
      if (dart.test(this[_isBound])) {
        dart.throw(new core.StateError("StreamSink is bound to a stream"));
      }
      if (dart.test(this[_isClosed])) {
        dart.throw(new core.StateError("StreamSink is closed"));
      }
      if (this[_controllerInstance] == null) {
        this[_controllerInstance] = StreamControllerOfT().new({sync: true});
        this[_controllerCompleter] = async.Completer.new();
        this[_target].addStream(this[_controller].stream).then(dart.dynamic)(dart.fn(_ => {
          if (dart.test(this[_isBound])) {
            this[_controllerCompleter].complete(this);
            this[_controllerCompleter] = null;
            this[_controllerInstance] = null;
          } else {
            this[_closeTarget]();
          }
        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
            if (dart.test(this[_isBound])) {
              this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
              this[_controllerCompleter] = null;
              this[_controllerInstance] = null;
            } else {
              this[_completeDoneError](error, core.StackTrace._check(stackTrace));
            }
          }, dynamicAnddynamicToNull())});
      }
      return this[_controllerInstance];
    }
  }
  dart.addTypeTests(_StreamSinkImpl);
  _StreamSinkImpl[dart.implements] = () => [StreamSinkOfT()];
  dart.setSignature(_StreamSinkImpl, {
    constructors: () => ({new: dart.definiteFunctionType(io._StreamSinkImpl$(T), [StreamConsumerOfT()])}),
    fields: () => ({
      [_target]: StreamConsumerOfT(),
      [_doneCompleter]: async.Completer,
      [_controllerInstance]: StreamControllerOfT(),
      [_controllerCompleter]: async.Completer,
      [_isClosed]: core.bool,
      [_isBound]: core.bool,
      [_hasError]: core.bool
    }),
    getters: () => ({
      done: dart.definiteFunctionType(async.Future, []),
      [_controller]: dart.definiteFunctionType(async.StreamController$(T), [])
    }),
    methods: () => ({
      add: dart.definiteFunctionType(dart.void, [T]),
      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()]),
      flush: dart.definiteFunctionType(async.Future, []),
      close: dart.definiteFunctionType(async.Future, []),
      [_closeTarget]: dart.definiteFunctionType(dart.void, []),
      [_completeDoneValue]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
      [_completeDoneError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])
    })
  });
  return _StreamSinkImpl;
});
io._StreamSinkImpl = _StreamSinkImpl();
io._IOSinkImpl = class _IOSinkImpl extends io._StreamSinkImpl$(core.List$(core.int)) {
  new(target, encoding) {
    this[_encoding] = encoding;
    this[_encodingMutable] = true;
    super.new(target);
  }
  get encoding() {
    return this[_encoding];
  }
  set encoding(value) {
    if (!dart.test(this[_encodingMutable])) {
      dart.throw(new core.StateError("IOSink encoding is not mutable"));
    }
    this[_encoding] = value;
  }
  write(obj) {
    let string = dart.str`${obj}`;
    if (dart.test(string[dartx.isEmpty])) return;
    this.add(this[_encoding].encode(string));
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    let iterator = objects[dartx.iterator];
    if (!dart.test(iterator.moveNext())) return;
    if (dart.test(separator[dartx.isEmpty])) {
      do {
        this.write(iterator.current);
      } while (dart.test(iterator.moveNext()));
    } else {
      this.write(iterator.current);
      while (dart.test(iterator.moveNext())) {
        this.write(separator);
        this.write(iterator.current);
      }
    }
  }
  writeln(object) {
    if (object === void 0) object = "";
    this.write(object);
    this.write("\n");
  }
  writeCharCode(charCode) {
    this.write(core.String.fromCharCode(charCode));
  }
};
dart.addSimpleTypeTests(io._IOSinkImpl);
io._IOSinkImpl[dart.implements] = () => [io.IOSink];
dart.setSignature(io._IOSinkImpl, {
  constructors: () => ({new: dart.definiteFunctionType(io._IOSinkImpl, [StreamConsumerOfListOfint(), convert.Encoding])}),
  fields: () => ({
    [_encoding]: convert.Encoding,
    [_encodingMutable]: core.bool
  }),
  getters: () => ({encoding: dart.definiteFunctionType(convert.Encoding, [])}),
  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
  methods: () => ({
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
  })
});
io._HttpOutboundMessage$ = dart.generic(T => {
  class _HttpOutboundMessage extends io._IOSinkImpl {
    new(uri, protocolVersion, outgoing, opts) {
      let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
      this[_uri] = uri;
      this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
      this[_outgoing] = outgoing;
      this[_encodingSet] = false;
      this[_bufferOutput] = true;
      super.new(outgoing, null);
      this[_outgoing].outbound = this;
      this[_encodingMutable] = false;
    }
    get contentLength() {
      return this.headers.contentLength;
    }
    set contentLength(contentLength) {
      this.headers.contentLength = contentLength;
    }
    get persistentConnection() {
      return this.headers.persistentConnection;
    }
    set persistentConnection(p) {
      this.headers.persistentConnection = p;
    }
    get bufferOutput() {
      return this[_bufferOutput];
    }
    set bufferOutput(bufferOutput) {
      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
      this[_bufferOutput] = bufferOutput;
    }
    get encoding() {
      if (dart.test(this[_encodingSet]) && dart.test(this[_outgoing].headersWritten)) {
        return this[_encoding];
      }
      let charset = null;
      if (this.headers.contentType != null && this.headers.contentType.charset != null) {
        charset = this.headers.contentType.charset;
      } else {
        charset = "iso-8859-1";
      }
      return convert.Encoding.getByName(core.String._check(charset));
    }
    set encoding(value) {
      super.encoding = value;
    }
    add(data) {
      if (data[dartx.length] == 0) return;
      super.add(data);
    }
    write(obj) {
      if (!dart.test(this[_encodingSet])) {
        this[_encoding] = this.encoding;
        this[_encodingSet] = true;
      }
      super.write(obj);
    }
    get [_isConnectionClosed]() {
      return false;
    }
  }
  dart.addTypeTests(_HttpOutboundMessage);
  dart.setSignature(_HttpOutboundMessage, {
    constructors: () => ({new: dart.definiteFunctionType(io._HttpOutboundMessage$(T), [core.Uri, core.String, io._HttpOutgoing], {initialHeaders: io._HttpHeaders})}),
    fields: () => ({
      [_encodingSet]: core.bool,
      [_bufferOutput]: core.bool,
      [_uri]: core.Uri,
      [_outgoing]: io._HttpOutgoing,
      headers: io._HttpHeaders
    }),
    getters: () => ({
      contentLength: dart.definiteFunctionType(core.int, []),
      persistentConnection: dart.definiteFunctionType(core.bool, []),
      bufferOutput: dart.definiteFunctionType(core.bool, []),
      [_isConnectionClosed]: dart.definiteFunctionType(core.bool, [])
    }),
    setters: () => ({
      contentLength: dart.definiteFunctionType(dart.void, [core.int]),
      persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
      bufferOutput: dart.definiteFunctionType(dart.void, [core.bool])
    })
  });
  return _HttpOutboundMessage;
});
io._HttpOutboundMessage = _HttpOutboundMessage();
const _statusCode = Symbol('_statusCode');
const _reasonPhrase = Symbol('_reasonPhrase');
const _deadline = Symbol('_deadline');
const _deadlineTimer = Symbol('_deadlineTimer');
const _isClosing = Symbol('_isClosing');
const _findReasonPhrase = Symbol('_findReasonPhrase');
const _isNew = Symbol('_isNew');
const _writeHeader = Symbol('_writeHeader');
io._HttpResponse = class _HttpResponse extends io._HttpOutboundMessage$(io.HttpResponse) {
  new(uri, protocolVersion, outgoing, defaultHeaders, serverHeader) {
    this[_statusCode] = 200;
    this[_reasonPhrase] = null;
    this[_cookies] = null;
    this[_httpRequest] = null;
    this[_deadline] = null;
    this[_deadlineTimer] = null;
    super.new(uri, protocolVersion, outgoing, {initialHeaders: io._HttpHeaders._check(defaultHeaders)});
    if (serverHeader != null) this.headers.set('server', serverHeader);
  }
  get [_isConnectionClosed]() {
    return this[_httpRequest][_httpConnection][_isClosing];
  }
  get cookies() {
    if (this[_cookies] == null) this[_cookies] = ListOfCookie().new();
    return this[_cookies];
  }
  get statusCode() {
    return this[_statusCode];
  }
  set statusCode(statusCode) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
    this[_statusCode] = statusCode;
  }
  get reasonPhrase() {
    return this[_findReasonPhrase](this.statusCode);
  }
  set reasonPhrase(reasonPhrase) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
    this[_reasonPhrase] = reasonPhrase;
  }
  redirect(location, opts) {
    let status = opts && 'status' in opts ? opts.status : io.HttpStatus.MOVED_TEMPORARILY;
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
    this.statusCode = status;
    this.headers.set("location", dart.toString(location));
    return this.close();
  }
  detachSocket(opts) {
    let writeHeaders = opts && 'writeHeaders' in opts ? opts.writeHeaders : true;
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Headers already sent"));
    this.deadline = null;
    let future = this[_httpRequest][_httpConnection].detachSocket();
    if (dart.test(writeHeaders)) {
      let headersFuture = this[_outgoing].writeHeaders({drainRequest: false, setOutgoing: false});
      dart.assert(headersFuture == null);
    } else {
      this[_outgoing].headersWritten = true;
    }
    this.close();
    this.done.catchError(dart.fn(_ => {
    }, dynamicToNull()));
    return future;
  }
  get connectionInfo() {
    return this[_httpRequest].connectionInfo;
  }
  get deadline() {
    return this[_deadline];
  }
  set deadline(d) {
    if (this[_deadlineTimer] != null) this[_deadlineTimer].cancel();
    this[_deadline] = d;
    if (this[_deadline] == null) return;
    this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
      this[_httpRequest][_httpConnection].destroy();
    }, VoidToNull()));
  }
  [_writeHeader]() {
    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
    let offset = 0;
    function write(bytes) {
      let len = bytes[dartx.length];
      for (let i = 0; i < dart.notNull(len); i++) {
        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
      }
      offset = dart.notNull(offset) + dart.notNull(len);
    }
    dart.fn(write, ListOfintTovoid());
    if (this.headers.protocolVersion == "1.1") {
      write(io._Const.HTTP11);
    } else {
      write(io._Const.HTTP10);
    }
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(dart.toString(this.statusCode)[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(this.reasonPhrase[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    let session = this[_httpRequest][_session];
    if (session != null && !dart.test(session[_destroyed])) {
      session[_isNew] = false;
      let found = false;
      for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
        if (this.cookies[dartx._get](i).name[dartx.toUpperCase]() == io._DART_SESSION_ID) {
          let _ = this.cookies[dartx._get](i);
          _.value = session.id;
          _.httpOnly = true;
          _.path = "/";
          found = true;
        }
      }
      if (!found) {
        let cookie = io.Cookie.new(io._DART_SESSION_ID, session.id);
        this.cookies[dartx.add](((() => {
          cookie.httpOnly = true;
          cookie.path = "/";
          return cookie;
        })()));
      }
    }
    if (this[_cookies] != null) {
      this[_cookies][dartx.forEach](dart.fn(cookie => {
        this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
      }, CookieToNull()));
    }
    this.headers[_finalize]();
    offset = this.headers[_write](buffer, offset);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    this[_outgoing].setHeader(buffer, offset);
  }
  [_findReasonPhrase](statusCode) {
    if (this[_reasonPhrase] != null) {
      return this[_reasonPhrase];
    }
    switch (statusCode) {
      case io.HttpStatus.CONTINUE:
      {
        return "Continue";
      }
      case io.HttpStatus.SWITCHING_PROTOCOLS:
      {
        return "Switching Protocols";
      }
      case io.HttpStatus.OK:
      {
        return "OK";
      }
      case io.HttpStatus.CREATED:
      {
        return "Created";
      }
      case io.HttpStatus.ACCEPTED:
      {
        return "Accepted";
      }
      case io.HttpStatus.NON_AUTHORITATIVE_INFORMATION:
      {
        return "Non-Authoritative Information";
      }
      case io.HttpStatus.NO_CONTENT:
      {
        return "No Content";
      }
      case io.HttpStatus.RESET_CONTENT:
      {
        return "Reset Content";
      }
      case io.HttpStatus.PARTIAL_CONTENT:
      {
        return "Partial Content";
      }
      case io.HttpStatus.MULTIPLE_CHOICES:
      {
        return "Multiple Choices";
      }
      case io.HttpStatus.MOVED_PERMANENTLY:
      {
        return "Moved Permanently";
      }
      case io.HttpStatus.FOUND:
      {
        return "Found";
      }
      case io.HttpStatus.SEE_OTHER:
      {
        return "See Other";
      }
      case io.HttpStatus.NOT_MODIFIED:
      {
        return "Not Modified";
      }
      case io.HttpStatus.USE_PROXY:
      {
        return "Use Proxy";
      }
      case io.HttpStatus.TEMPORARY_REDIRECT:
      {
        return "Temporary Redirect";
      }
      case io.HttpStatus.BAD_REQUEST:
      {
        return "Bad Request";
      }
      case io.HttpStatus.UNAUTHORIZED:
      {
        return "Unauthorized";
      }
      case io.HttpStatus.PAYMENT_REQUIRED:
      {
        return "Payment Required";
      }
      case io.HttpStatus.FORBIDDEN:
      {
        return "Forbidden";
      }
      case io.HttpStatus.NOT_FOUND:
      {
        return "Not Found";
      }
      case io.HttpStatus.METHOD_NOT_ALLOWED:
      {
        return "Method Not Allowed";
      }
      case io.HttpStatus.NOT_ACCEPTABLE:
      {
        return "Not Acceptable";
      }
      case io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED:
      {
        return "Proxy Authentication Required";
      }
      case io.HttpStatus.REQUEST_TIMEOUT:
      {
        return "Request Time-out";
      }
      case io.HttpStatus.CONFLICT:
      {
        return "Conflict";
      }
      case io.HttpStatus.GONE:
      {
        return "Gone";
      }
      case io.HttpStatus.LENGTH_REQUIRED:
      {
        return "Length Required";
      }
      case io.HttpStatus.PRECONDITION_FAILED:
      {
        return "Precondition Failed";
      }
      case io.HttpStatus.REQUEST_ENTITY_TOO_LARGE:
      {
        return "Request Entity Too Large";
      }
      case io.HttpStatus.REQUEST_URI_TOO_LONG:
      {
        return "Request-URI Too Large";
      }
      case io.HttpStatus.UNSUPPORTED_MEDIA_TYPE:
      {
        return "Unsupported Media Type";
      }
      case io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE:
      {
        return "Requested range not satisfiable";
      }
      case io.HttpStatus.EXPECTATION_FAILED:
      {
        return "Expectation Failed";
      }
      case io.HttpStatus.INTERNAL_SERVER_ERROR:
      {
        return "Internal Server Error";
      }
      case io.HttpStatus.NOT_IMPLEMENTED:
      {
        return "Not Implemented";
      }
      case io.HttpStatus.BAD_GATEWAY:
      {
        return "Bad Gateway";
      }
      case io.HttpStatus.SERVICE_UNAVAILABLE:
      {
        return "Service Unavailable";
      }
      case io.HttpStatus.GATEWAY_TIMEOUT:
      {
        return "Gateway Time-out";
      }
      case io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED:
      {
        return "Http Version not supported";
      }
      default:
      {
        return dart.str`Status ${statusCode}`;
      }
    }
  }
};
dart.addSimpleTypeTests(io._HttpResponse);
io._HttpResponse[dart.implements] = () => [io.HttpResponse];
dart.setSignature(io._HttpResponse, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpResponse, [core.Uri, core.String, io._HttpOutgoing, io.HttpHeaders, core.String])}),
  fields: () => ({
    [_statusCode]: core.int,
    [_reasonPhrase]: core.String,
    [_cookies]: ListOfCookie(),
    [_httpRequest]: io._HttpRequest,
    [_deadline]: core.Duration,
    [_deadlineTimer]: async.Timer
  }),
  getters: () => ({
    cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
    statusCode: dart.definiteFunctionType(core.int, []),
    reasonPhrase: dart.definiteFunctionType(core.String, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    deadline: dart.definiteFunctionType(core.Duration, [])
  }),
  setters: () => ({
    statusCode: dart.definiteFunctionType(dart.void, [core.int]),
    reasonPhrase: dart.definiteFunctionType(dart.void, [core.String]),
    deadline: dart.definiteFunctionType(dart.void, [core.Duration])
  }),
  methods: () => ({
    redirect: dart.definiteFunctionType(async.Future, [core.Uri], {status: core.int}),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), [], {writeHeaders: core.bool}),
    [_writeHeader]: dart.definiteFunctionType(dart.void, []),
    [_findReasonPhrase]: dart.definiteFunctionType(core.String, [core.int])
  })
});
const _responseCompleter = Symbol('_responseCompleter');
const _response = Symbol('_response');
const _followRedirects = Symbol('_followRedirects');
const _maxRedirects = Symbol('_maxRedirects');
const _onIncoming = Symbol('_onIncoming');
const _onError = Symbol('_onError');
const _proxyTunnel = Symbol('_proxyTunnel');
const _requestUri = Symbol('_requestUri');
io._HttpClientRequest = class _HttpClientRequest extends io._HttpOutboundMessage$(io.HttpClientResponse) {
  new(outgoing, uri, method, proxy, httpClient, httpClientConnection) {
    this.cookies = ListOfCookie().new();
    this[_responseCompleter] = CompleterOfHttpClientResponse().new();
    this[_responseRedirects] = JSArrayOfRedirectInfo().of([]);
    this.method = method;
    this[_proxy] = proxy;
    this[_httpClient] = httpClient;
    this[_httpClientConnection] = httpClientConnection;
    this.uri = uri;
    this[_response] = null;
    this[_followRedirects] = true;
    this[_maxRedirects] = 5;
    super.new(uri, "1.1", outgoing);
    if (this.method == "GET" || this.method == "HEAD") {
      this.contentLength = 0;
    } else {
      this.headers.chunkedTransferEncoding = true;
    }
  }
  get done() {
    if (this[_response] == null) {
      this[_response] = async.Future.wait(dart.dynamic)(JSArrayOfFuture().of([this[_responseCompleter].future, super.done]), {eagerError: true}).then(io.HttpClientResponse)(dart.fn(list => FutureOrOfHttpClientResponse()._check(list[dartx._get](0)), ListToFutureOrOfHttpClientResponse()));
    }
    return this[_response];
  }
  close() {
    super.close();
    return this.done;
  }
  get maxRedirects() {
    return this[_maxRedirects];
  }
  set maxRedirects(maxRedirects) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
    this[_maxRedirects] = maxRedirects;
  }
  get followRedirects() {
    return this[_followRedirects];
  }
  set followRedirects(followRedirects) {
    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
    this[_followRedirects] = followRedirects;
  }
  get connectionInfo() {
    return this[_httpClientConnection].connectionInfo;
  }
  [_onIncoming](incoming) {
    let response = new io._HttpClientResponse(incoming, this, this[_httpClient]);
    let future = null;
    if (dart.test(this.followRedirects) && dart.test(response.isRedirect)) {
      if (dart.notNull(response.redirects[dartx.length]) < dart.notNull(this.maxRedirects)) {
        future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => response.redirect(), dynamicToFutureOfHttpClientResponse()));
      } else {
        future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => FutureOfHttpClientResponse().error(new io.RedirectException("Redirect limit exceeded", response.redirects)), dynamicToFutureOfHttpClientResponse()));
      }
    } else if (dart.test(response[_shouldAuthenticateProxy])) {
      future = response[_authenticate](true);
    } else if (dart.test(response[_shouldAuthenticate])) {
      future = response[_authenticate](false);
    } else {
      future = FutureOfHttpClientResponse().value(response);
    }
    future.then(dart.void)(dart.fn(v => this[_responseCompleter].complete(v), HttpClientResponseTovoid()), {onError: dart.bind(this[_responseCompleter], 'completeError')});
  }
  [_onError](error, stackTrace) {
    this[_responseCompleter].completeError(error, stackTrace);
  }
  [_requestUri]() {
    const uriStartingFromPath = (function() {
      let result = this.uri.path;
      if (dart.test(result[dartx.isEmpty])) result = "/";
      if (dart.test(this.uri.hasQuery)) {
        result = dart.str`${result}?${this.uri.query}`;
      }
      return result;
    }).bind(this);
    dart.fn(uriStartingFromPath, VoidToString());
    if (dart.test(this[_proxy].isDirect)) {
      return uriStartingFromPath();
    } else {
      if (this.method == "CONNECT") {
        return dart.str`${this.uri.host}:${this.uri.port}`;
      } else {
        if (dart.test(this[_httpClientConnection][_proxyTunnel])) {
          return uriStartingFromPath();
        } else {
          return dart.toString(this.uri.removeFragment());
        }
      }
    }
  }
  [_writeHeader]() {
    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
    let offset = 0;
    function write(bytes) {
      let len = bytes[dartx.length];
      for (let i = 0; i < dart.notNull(len); i++) {
        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
      }
      offset = dart.notNull(offset) + dart.notNull(len);
    }
    dart.fn(write, ListOfintTovoid());
    write(this.method[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(this[_requestUri]()[dartx.codeUnits]);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.SP);
    write(io._Const.HTTP11);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    if (!dart.test(this.cookies[dartx.isEmpty])) {
      let sb = new core.StringBuffer();
      for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
        if (i > 0) sb.write("; ");
        sb.write(this.cookies[dartx._get](i).name);
        sb.write("=");
        sb.write(this.cookies[dartx._get](i).value);
      }
      this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
    }
    this.headers[_finalize]();
    offset = this.headers[_write](buffer, offset);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.CR);
    buffer[dartx._set]((() => {
      let x = offset;
      offset = dart.notNull(x) + 1;
      return x;
    })(), io._CharCode.LF);
    this[_outgoing].setHeader(buffer, offset);
  }
};
dart.addSimpleTypeTests(io._HttpClientRequest);
io._HttpClientRequest[dart.implements] = () => [io.HttpClientRequest];
dart.setSignature(io._HttpClientRequest, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientRequest, [io._HttpOutgoing, core.Uri, core.String, io._Proxy, io._HttpClient, io._HttpClientConnection])}),
  fields: () => ({
    method: core.String,
    uri: core.Uri,
    cookies: ListOfCookie(),
    [_httpClient]: io._HttpClient,
    [_httpClientConnection]: io._HttpClientConnection,
    [_responseCompleter]: CompleterOfHttpClientResponse(),
    [_proxy]: io._Proxy,
    [_response]: FutureOfHttpClientResponse(),
    [_followRedirects]: core.bool,
    [_maxRedirects]: core.int,
    [_responseRedirects]: ListOfRedirectInfo()
  }),
  getters: () => ({
    done: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
    maxRedirects: dart.definiteFunctionType(core.int, []),
    followRedirects: dart.definiteFunctionType(core.bool, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])
  }),
  setters: () => ({
    maxRedirects: dart.definiteFunctionType(dart.void, [core.int]),
    followRedirects: dart.definiteFunctionType(dart.void, [core.bool])
  }),
  methods: () => ({
    close: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
    [_onIncoming]: dart.definiteFunctionType(dart.void, [io._HttpIncoming]),
    [_onError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
    [_requestUri]: dart.definiteFunctionType(core.String, []),
    [_writeHeader]: dart.definiteFunctionType(dart.void, [])
  })
});
const _consume = Symbol('_consume');
io._HttpGZipSink = class _HttpGZipSink extends convert.ByteConversionSink {
  new(consume) {
    this[_consume] = consume;
    super.new();
  }
  add(chunk) {
    dart.dcall(this[_consume], chunk);
  }
  addSlice(chunk, start, end, isLast) {
    if (typed_data.Uint8List.is(chunk)) {
      dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
    } else {
      dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
    }
  }
  close() {}
};
dart.setSignature(io._HttpGZipSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpGZipSink, [core.Function])}),
  fields: () => ({[_consume]: core.Function}),
  methods: () => ({
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
    close: dart.definiteFunctionType(dart.void, [])
  })
});
const _closeFuture = Symbol('_closeFuture');
const _pendingChunkedFooter = Symbol('_pendingChunkedFooter');
const _bytesWritten = Symbol('_bytesWritten');
const _gzip = Symbol('_gzip');
const _gzipSink = Symbol('_gzipSink');
const _gzipAdd = Symbol('_gzipAdd');
const _gzipBuffer = Symbol('_gzipBuffer');
const _gzipBufferLength = Symbol('_gzipBufferLength');
const _socketError = Symbol('_socketError');
const _addGZipChunk = Symbol('_addGZipChunk');
const _addChunk = Symbol('_addChunk');
const _chunkHeader = Symbol('_chunkHeader');
const _ignoreError = Symbol('_ignoreError');
let const;
io._HttpOutgoing = class _HttpOutgoing extends core.Object {
  new(socket) {
    this[_doneCompleter] = async.Completer.new();
    this.socket = socket;
    this.ignoreBody = false;
    this.headersWritten = false;
    this[_buffer] = null;
    this[_length] = 0;
    this[_closeFuture] = null;
    this.chunked = false;
    this[_pendingChunkedFooter] = 0;
    this.contentLength = null;
    this[_bytesWritten] = 0;
    this[_gzip] = false;
    this[_gzipSink] = null;
    this[_gzipAdd] = null;
    this[_gzipBuffer] = null;
    this[_gzipBufferLength] = 0;
    this[_socketError] = false;
    this.outbound = null;
  }
  writeHeaders(opts) {
    let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
    let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
    const write = (function() {
      try {
        this.outbound[_writeHeader]();
      } catch (_) {
        return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
      }

      return null;
    }).bind(this);
    dart.fn(write, VoidToFuture());
    if (dart.test(this.headersWritten)) return null;
    this.headersWritten = true;
    let drainFuture = null;
    let gzip = false;
    if (io._HttpResponse.is(this.outbound)) {
      let response = io._HttpResponse._check(this.outbound);
      if (dart.test(response[_httpRequest][_httpServer].autoCompress) && dart.test(this.outbound.bufferOutput) && dart.test(this.outbound.headers.chunkedTransferEncoding)) {
        let acceptEncodings = response[_httpRequest].headers._get(io.HttpHeaders.ACCEPT_ENCODING);
        let contentEncoding = this.outbound.headers._get(io.HttpHeaders.CONTENT_ENCODING);
        if (acceptEncodings != null && dart.test(acceptEncodings[dartx.expand](dart.dynamic)(dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', ",")), dynamicToIterable()))[dartx.any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim'), 'toLowerCase'), "gzip"), dynamicTobool()))) && contentEncoding == null) {
          this.outbound.headers.set(io.HttpHeaders.CONTENT_ENCODING, "gzip");
          gzip = true;
        }
      }
      if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
        drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
        }, dynamicToNull()));
      }
    } else {
      drainRequest = false;
    }
    if (dart.test(this.ignoreBody)) {
      return write();
    }
    if (dart.test(setOutgoing)) {
      let contentLength = this.outbound.headers.contentLength;
      if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
        this.chunked = true;
        if (gzip) this.gzip = true;
      } else if (dart.notNull(contentLength) >= 0) {
        this.contentLength = contentLength;
      }
    }
    if (drainFuture != null) {
      return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
    }
    return write();
  }
  addStream(stream) {
    if (dart.test(this[_socketError])) {
      stream.listen(null).cancel();
      return async.Future.value(this.outbound);
    }
    if (dart.test(this.ignoreBody)) {
      stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
      }, dynamicToNull()));
      let future = this.writeHeaders();
      if (future != null) {
        return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
      }
      return this.close();
    }
    let sub = null;
    let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid()), sync: true});
    const onData = (function(data) {
      if (dart.test(this[_socketError])) return;
      if (dart.equals(dart.dload(data, 'length'), 0)) return;
      if (dart.test(this.chunked)) {
        if (dart.test(this[_gzip])) {
          this[_gzipAdd] = dart.bind(controller, 'add');
          this[_addGZipChunk](data, dart.bind(this[_gzipSink], 'add'));
          this[_gzipAdd] = null;
          return;
        }
        this[_addChunk](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
        this[_pendingChunkedFooter] = 2;
      } else {
        if (this.contentLength != null) {
          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
          if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
            controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
            return;
          }
        }
      }
      this[_addChunk](data, dart.bind(controller, 'add'));
    }).bind(this);
    dart.fn(onData, dynamicTovoid());
    sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
    if (!dart.test(this.headersWritten)) {
      let future = this.writeHeaders();
      if (future != null) {
        dart.dsend(sub, 'pause', future);
      }
    }
    return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
        if (dart.test(this[_gzip])) this[_gzipSink].close();
        this[_socketError] = true;
        this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
        if (dart.test(this[_ignoreError](error))) {
          return this.outbound;
        } else {
          dart.throw(error);
        }
      }, dynamicAnddynamicTo_HttpOutboundMessage())});
  }
  close() {
    if (this[_closeFuture] != null) return this[_closeFuture];
    if (dart.test(this[_socketError])) return async.Future.value(this.outbound);
    if (dart.test(this.outbound[_isConnectionClosed])) return async.Future.value(this.outbound);
    if (!dart.test(this.headersWritten) && !dart.test(this.ignoreBody)) {
      if (this.outbound.headers.contentLength == -1) {
        this.outbound.headers.chunkedTransferEncoding = false;
        this.outbound.headers.contentLength = 0;
      } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
        let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
        this[_doneCompleter].completeError(error);
        return this[_closeFuture] = async.Future.error(error);
      }
    }
    if (this.contentLength != null) {
      if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
        let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
        this[_doneCompleter].completeError(error);
        return this[_closeFuture] = async.Future.error(error);
      }
    }
    const finalize = (function() {
      if (dart.test(this.chunked)) {
        if (dart.test(this[_gzip])) {
          this[_gzipAdd] = dart.bind(this.socket, 'add');
          if (dart.notNull(this[_gzipBufferLength]) > 0) {
            this[_gzipSink].add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
          }
          this[_gzipBuffer] = null;
          this[_gzipSink].close();
          this[_gzipAdd] = null;
        }
        this[_addChunk](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
      }
      if (dart.notNull(this[_length]) > 0) {
        this.socket.add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
      }
      this[_buffer] = null;
      return this.socket.flush().then(io._HttpOutboundMessage)(dart.fn(_ => {
        this[_doneCompleter].complete(this.socket);
        return this.outbound;
      }, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
          this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
          if (dart.test(this[_ignoreError](error))) {
            return this.outbound;
          } else {
            dart.throw(error);
          }
        }, dynamicAnddynamicTo_HttpOutboundMessage())});
    }).bind(this);
    dart.fn(finalize, VoidToFuture());
    let future = this.writeHeaders();
    if (future != null) {
      return this[_closeFuture] = future.whenComplete(finalize);
    }
    return this[_closeFuture] = finalize();
  }
  get done() {
    return this[_doneCompleter].future;
  }
  setHeader(data, length) {
    dart.assert(this[_length] == 0);
    dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
    this[_buffer] = typed_data.Uint8List._check(data);
    this[_length] = length;
  }
  set gzip(value) {
    this[_gzip] = value;
    if (dart.test(this[_gzip])) {
      this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      dart.assert(this[_gzipSink] == null);
      this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
        if (this[_gzipAdd] == null) return;
        this[_addChunk](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
        this[_pendingChunkedFooter] = 2;
        this[_addChunk](data, ListOfintTovoid()._check(this[_gzipAdd]));
      }, dynamicToNull())));
    }
  }
  [_ignoreError](error) {
    return (io.SocketException.is(error) || io.TlsException.is(error)) && io.HttpResponse.is(this.outbound);
  }
  [_addGZipChunk](chunk, add) {
    if (!dart.test(this.outbound.bufferOutput)) {
      add(ListOfint()._check(chunk));
      return;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
      add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
      this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      this[_gzipBufferLength] = 0;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
      add(ListOfint()._check(chunk));
    } else {
      this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
    }
  }
  [_addChunk](chunk, add) {
    if (!dart.test(this.outbound.bufferOutput)) {
      if (this[_buffer] != null) {
        add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
        this[_buffer] = null;
        this[_length] = 0;
      }
      add(ListOfint()._check(chunk));
      return;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_length])))) {
      add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
      this[_buffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
      this[_length] = 0;
    }
    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
      add(ListOfint()._check(chunk));
    } else {
      this[_buffer][dartx.setRange](this[_length], dart.asInt(dart.notNull(this[_length]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
      this[_length] = dart.notNull(this[_length]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
    }
  }
  [_chunkHeader](length) {
    let hexDigits = const || (const = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
    if (length == 0) {
      if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
      return io._HttpOutgoing._chunk0Length;
    }
    let size = this[_pendingChunkedFooter];
    let len = length;
    while (dart.notNull(len) > 0) {
      size = dart.notNull(size) + 1;
      len = len[dartx['>>']](4);
    }
    let footerAndHeader = typed_data.Uint8List.new(dart.notNull(size) + 2);
    if (this[_pendingChunkedFooter] == 2) {
      footerAndHeader[dartx._set](0, io._CharCode.CR);
      footerAndHeader[dartx._set](1, io._CharCode.LF);
    }
    let index = size;
    while (dart.notNull(index) > dart.notNull(this[_pendingChunkedFooter])) {
      footerAndHeader[dartx._set]((index = dart.notNull(index) - 1), hexDigits[dartx._get](dart.notNull(length) & 15));
      length = length[dartx['>>']](4);
    }
    footerAndHeader[dartx._set](dart.notNull(size) + 0, io._CharCode.CR);
    footerAndHeader[dartx._set](dart.notNull(size) + 1, io._CharCode.LF);
    return footerAndHeader;
  }
};
io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
dart.setSignature(io._HttpOutgoing, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpOutgoing, [io.Socket])}),
  fields: () => ({
    [_doneCompleter]: async.Completer,
    socket: io.Socket,
    ignoreBody: core.bool,
    headersWritten: core.bool,
    [_buffer]: typed_data.Uint8List,
    [_length]: core.int,
    [_closeFuture]: async.Future,
    chunked: core.bool,
    [_pendingChunkedFooter]: core.int,
    contentLength: core.int,
    [_bytesWritten]: core.int,
    [_gzip]: core.bool,
    [_gzipSink]: convert.ByteConversionSink,
    [_gzipAdd]: core.Function,
    [_gzipBuffer]: typed_data.Uint8List,
    [_gzipBufferLength]: core.int,
    [_socketError]: core.bool,
    outbound: io._HttpOutboundMessage
  }),
  getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
  setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
  methods: () => ({
    writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
    close: dart.definiteFunctionType(async.Future, []),
    setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
    [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
    [_addChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
    [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
  }),
  sfields: () => ({
    _footerAndChunk0Length: ListOfint(),
    _chunk0Length: ListOfint()
  })
});
dart.defineLazy(io._HttpOutgoing, {
  get _footerAndChunk0Length() {
    return dart.constList([io._CharCode.CR, io._CharCode.LF, 48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
  },
  get _chunk0Length() {
    return dart.constList([48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
  }
});
const _context = Symbol('_context');
const _httpParser = Symbol('_httpParser');
const _subscription = Symbol('_subscription');
const _dispose = Symbol('_dispose');
const _idleTimer = Symbol('_idleTimer');
const _currentUri = Symbol('_currentUri');
const _nextResponseCompleter = Symbol('_nextResponseCompleter');
const _streamFuture = Symbol('_streamFuture');
const _proxyCredentials = Symbol('_proxyCredentials');
const _returnConnection = Symbol('_returnConnection');
io._HttpClientConnection = class _HttpClientConnection extends core.Object {
  new(key, socket, httpClient, proxyTunnel, context) {
    if (proxyTunnel === void 0) proxyTunnel = false;
    if (context === void 0) context = null;
    this.key = key;
    this[_socket] = socket;
    this[_httpClient] = httpClient;
    this[_proxyTunnel] = proxyTunnel;
    this[_context] = context;
    this[_httpParser] = io._HttpParser.responseParser();
    this[_subscription] = null;
    this[_dispose] = false;
    this[_idleTimer] = null;
    this.closed = false;
    this[_currentUri] = null;
    this[_nextResponseCompleter] = null;
    this[_streamFuture] = null;
    this[_httpParser].listenToStream(this[_socket]);
    this[_subscription] = this[_httpParser].listen(dart.fn(incoming => {
      this[_subscription].pause();
      if (this[_nextResponseCompleter] == null) {
        dart.throw(new io.HttpException("Unexpected response (unsolicited response without request).", {uri: this[_currentUri]}));
      }
      if (incoming.statusCode == 100) {
        incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
          this[_subscription].resume();
        }, dynamicToNull())).catchError(dart.fn((error, stackTrace) => {
          if (stackTrace === void 0) stackTrace = null;
          this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
          this[_nextResponseCompleter] = null;
        }, dynamic__ToNull()));
      } else {
        this[_nextResponseCompleter].complete(incoming);
        this[_nextResponseCompleter] = null;
      }
    }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
        if (stackTrace === void 0) stackTrace = null;
        if (this[_nextResponseCompleter] != null) {
          this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
          this[_nextResponseCompleter] = null;
        }
      }, dynamic__ToNull()), onDone: dart.fn(() => {
        if (this[_nextResponseCompleter] != null) {
          this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
          this[_nextResponseCompleter] = null;
        }
        this.close();
      }, VoidToNull())});
  }
  send(uri, port, method, proxy) {
    if (dart.test(this.closed)) {
      dart.throw(new io.HttpException("Socket closed before request was sent", {uri: uri}));
    }
    this[_currentUri] = uri;
    this[_subscription].pause();
    let proxyCreds = null;
    let creds = null;
    let outgoing = new io._HttpOutgoing(this[_socket]);
    let request = new io._HttpClientRequest(outgoing, uri, method, proxy, this[_httpClient], this);
    let host = uri.host;
    if (dart.test(host[dartx.contains](':'))) host = dart.str`[${host}]`;
    request.headers.host = host;
    request.headers.port = port;
    request.headers[_add](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
    if (this[_httpClient].userAgent != null) {
      request.headers[_add]('user-agent', this[_httpClient].userAgent);
    }
    if (dart.test(proxy.isAuthenticated)) {
      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
    } else if (!dart.test(proxy.isDirect) && dart.notNull(this[_httpClient][_proxyCredentials][dartx.length]) > 0) {
      proxyCreds = this[_httpClient][_findProxyCredentials](proxy);
      if (proxyCreds != null) {
        proxyCreds.authorize(request);
      }
    }
    if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
      request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
    } else {
      creds = this[_httpClient][_findCredentials](uri);
      if (creds != null) {
        creds.authorize(request);
      }
    }
    this[_httpParser].isHead = method == "HEAD";
    this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
      this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
      this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
        this[_currentUri] = null;
        incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
          if (dart.test(incoming.upgraded)) {
            this[_httpClient][_connectionClosed](this);
            this.startTimer();
            return;
          }
          if (dart.test(this.closed)) return;
          if (!dart.test(closing) && !dart.test(this[_dispose]) && dart.test(incoming.headers.persistentConnection) && dart.test(request.persistentConnection)) {
            this[_httpClient][_returnConnection](this);
            this[_subscription].resume();
          } else {
            this.destroy();
          }
        }, dynamicToNull()));
        if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
          let authInfo = incoming.headers._get("proxy-authentication-info");
          if (authInfo != null && authInfo[dartx.length] == 1) {
            let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
            let nextnonce = header.parameters[dartx._get]("nextnonce");
            if (nextnonce != null) proxyCreds.nonce = nextnonce;
          }
        }
        if (creds != null && dart.equals(creds.scheme, io._AuthenticationScheme.DIGEST)) {
          let authInfo = incoming.headers._get("authentication-info");
          if (authInfo != null && authInfo[dartx.length] == 1) {
            let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
            let nextnonce = header.parameters[dartx._get]("nextnonce");
            if (nextnonce != null) creds.nonce = nextnonce;
          }
        }
        request[_onIncoming](incoming);
      }, _HttpIncomingToNull())).catchError(dart.fn(error => {
        dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
      }, dynamicToNull()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
        this.destroy();
        request[_onError](error, core.StackTrace._check(stackTrace));
      }, dynamicAnddynamicToNull()));
      this[_subscription].resume();
      return s;
    }, dynamicTodynamic()), {onError: dart.fn(e => {
        this.destroy();
      }, dynamicToNull())});
    return request;
  }
  detachSocket() {
    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
  }
  destroy() {
    this.closed = true;
    this[_httpClient][_connectionClosed](this);
    this[_socket].destroy();
  }
  close() {
    this.closed = true;
    this[_httpClient][_connectionClosed](this);
    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid()));
  }
  createProxyTunnel(host, port, proxy, callback) {
    let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
    if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
    }
    return request.close().then(io.SecureSocket)(dart.fn(response => {
      if (response.statusCode != io.HttpStatus.OK) {
        dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
      }
      let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
      return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
    }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
      let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
      return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
    }, SecureSocketTo_HttpClientConnection()));
  }
  get connectionInfo() {
    return io._HttpConnectionInfo.create(this[_socket]);
  }
  static makeKey(isSecure, host, port) {
    return dart.test(isSecure) ? dart.str`ssh:${host}:${port}` : dart.str`${host}:${port}`;
  }
  stopTimer() {
    if (this[_idleTimer] != null) {
      this[_idleTimer].cancel();
      this[_idleTimer] = null;
    }
  }
  startTimer() {
    dart.assert(this[_idleTimer] == null);
    this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
      this[_idleTimer] = null;
      this.close();
    }, VoidToNull()));
  }
};
dart.setSignature(io._HttpClientConnection, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientConnection, [core.String, io.Socket, io._HttpClient], [core.bool, io.SecurityContext])}),
  fields: () => ({
    key: core.String,
    [_socket]: io.Socket,
    [_proxyTunnel]: core.bool,
    [_context]: io.SecurityContext,
    [_httpParser]: io._HttpParser,
    [_subscription]: async.StreamSubscription,
    [_httpClient]: io._HttpClient,
    [_dispose]: core.bool,
    [_idleTimer]: async.Timer,
    closed: core.bool,
    [_currentUri]: core.Uri,
    [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
    [_streamFuture]: async.Future
  }),
  getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
  methods: () => ({
    send: dart.definiteFunctionType(io._HttpClientRequest, [core.Uri, core.int, core.String, io._Proxy]),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
    destroy: dart.definiteFunctionType(dart.void, []),
    close: dart.definiteFunctionType(dart.void, []),
    createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
    stopTimer: dart.definiteFunctionType(dart.void, []),
    startTimer: dart.definiteFunctionType(dart.void, [])
  }),
  statics: () => ({makeKey: dart.definiteFunctionType(dart.dynamic, [core.bool, core.String, core.int])}),
  names: ['makeKey']
});
io._ConnectionInfo = class _ConnectionInfo extends core.Object {
  new(connection, proxy) {
    this.connection = connection;
    this.proxy = proxy;
  }
};
dart.setSignature(io._ConnectionInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection, io._Proxy])}),
  fields: () => ({
    connection: io._HttpClientConnection,
    proxy: io._Proxy
  })
});
const _idle = Symbol('_idle');
const _active = Symbol('_active');
const _pending = Symbol('_pending');
const _connecting = Symbol('_connecting');
const _checkPending = Symbol('_checkPending');
const _connectionsChanged = Symbol('_connectionsChanged');
const _badCertificateCallback = Symbol('_badCertificateCallback');
const _getConnectionTarget = Symbol('_getConnectionTarget');
io._ConnectionTarget = class _ConnectionTarget extends core.Object {
  new(key, host, port, isSecure, context) {
    this[_idle] = HashSetOf_HttpClientConnection().new();
    this[_active] = HashSetOf_HttpClientConnection().new();
    this[_pending] = new collection.ListQueue();
    this.key = key;
    this.host = host;
    this.port = port;
    this.isSecure = isSecure;
    this.context = context;
    this[_connecting] = 0;
  }
  get isEmpty() {
    return dart.test(this[_idle].isEmpty) && dart.test(this[_active].isEmpty) && this[_connecting] == 0;
  }
  get hasIdle() {
    return this[_idle].isNotEmpty;
  }
  get hasActive() {
    return dart.test(this[_active].isNotEmpty) || dart.notNull(this[_connecting]) > 0;
  }
  takeIdle() {
    dart.assert(this.hasIdle);
    let connection = this[_idle].first;
    this[_idle].remove(connection);
    connection.stopTimer();
    this[_active].add(connection);
    return connection;
  }
  [_checkPending]() {
    if (dart.test(this[_pending].isNotEmpty)) {
      dart.dcall(this[_pending].removeFirst());
    }
  }
  addNewActive(connection) {
    this[_active].add(connection);
  }
  returnConnection(connection) {
    dart.assert(this[_active].contains(connection));
    this[_active].remove(connection);
    this[_idle].add(connection);
    connection.startTimer();
    this[_checkPending]();
  }
  connectionClosed(connection) {
    dart.assert(!dart.test(this[_active].contains(connection)) || !dart.test(this[_idle].contains(connection)));
    this[_active].remove(connection);
    this[_idle].remove(connection);
    this[_checkPending]();
  }
  close(force) {
    for (let c of this[_idle].toList()) {
      c.close();
    }
    if (dart.test(force)) {
      for (let c of this[_active].toList()) {
        c.destroy();
      }
    }
  }
  connect(uriHost, uriPort, proxy, client) {
    if (dart.test(this.hasIdle)) {
      let connection = this.takeIdle();
      client[_connectionsChanged]();
      return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
    }
    if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
      let completer = async.Completer.new();
      this[_pending].add(dart.fn(() => {
        this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
      }, VoidToNull()));
      return FutureOf_ConnectionInfo()._check(completer.future);
    }
    let currentBadCertificateCallback = client[_badCertificateCallback];
    function callback(certificate) {
      if (currentBadCertificateCallback == null) return false;
      return currentBadCertificateCallback(certificate, uriHost, uriPort);
    }
    dart.fn(callback, X509CertificateTobool());
    let socketFuture = dart.test(this.isSecure) && dart.test(proxy.isDirect) ? io.SecureSocket.connect(this.host, this.port, {context: this.context, onBadCertificate: callback}) : io.Socket.connect(this.host, this.port);
    this[_connecting] = dart.notNull(this[_connecting]) + 1;
    return socketFuture.then(io._ConnectionInfo)(dart.fn(socket => {
      this[_connecting] = dart.notNull(this[_connecting]) - 1;
      dart.dsend(socket, 'setOption', io.SocketOption.TCP_NODELAY, true);
      let connection = new io._HttpClientConnection(this.key, io.Socket._check(socket), client, false, this.context);
      if (dart.test(this.isSecure) && !dart.test(proxy.isDirect)) {
        connection[_dispose] = true;
        return connection.createProxyTunnel(uriHost, uriPort, proxy, callback).then(io._ConnectionInfo)(dart.fn(tunnel => {
          client[_getConnectionTarget](uriHost, uriPort, true).addNewActive(tunnel);
          return new io._ConnectionInfo(tunnel, proxy);
        }, _HttpClientConnectionTo_ConnectionInfo()));
      } else {
        this.addNewActive(connection);
        return new io._ConnectionInfo(connection, proxy);
      }
    }, dynamicToFutureOrOf_ConnectionInfo()), {onError: dart.fn(error => {
        this[_connecting] = dart.notNull(this[_connecting]) - 1;
        this[_checkPending]();
        dart.throw(error);
      }, dynamicToNull())});
  }
};
dart.setSignature(io._ConnectionTarget, {
  constructors: () => ({new: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.String, core.int, core.bool, io.SecurityContext])}),
  fields: () => ({
    key: core.String,
    host: core.String,
    port: core.int,
    isSecure: core.bool,
    context: io.SecurityContext,
    [_idle]: SetOf_HttpClientConnection(),
    [_active]: SetOf_HttpClientConnection(),
    [_pending]: collection.Queue,
    [_connecting]: core.int
  }),
  getters: () => ({
    isEmpty: dart.definiteFunctionType(core.bool, []),
    hasIdle: dart.definiteFunctionType(core.bool, []),
    hasActive: dart.definiteFunctionType(core.bool, [])
  }),
  methods: () => ({
    takeIdle: dart.definiteFunctionType(io._HttpClientConnection, []),
    [_checkPending]: dart.definiteFunctionType(dart.dynamic, []),
    addNewActive: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    returnConnection: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    connectionClosed: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    close: dart.definiteFunctionType(dart.void, [core.bool]),
    connect: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._Proxy, io._HttpClient])
  })
});
io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
const _idleTimeout = Symbol('_idleTimeout');
let const;
const _connectionTargets = Symbol('_connectionTargets');
const _credentials = Symbol('_credentials');
const _closing = Symbol('_closing');
const _closingForcefully = Symbol('_closingForcefully');
const _findProxy = Symbol('_findProxy');
const _openUrl = Symbol('_openUrl');
const _closeConnections = Symbol('_closeConnections');
let const;
const _getConnection = Symbol('_getConnection');
io._HttpClient = class _HttpClient extends core.Object {
  get idleTimeout() {
    return this[_idleTimeout];
  }
  new(context) {
    this[_connectionTargets] = HashMapOfString$_ConnectionTarget().new();
    this[_credentials] = JSArrayOf_Credentials().of([]);
    this[_proxyCredentials] = JSArrayOf_ProxyCredentials().of([]);
    this.userAgent = io._getHttpVersion();
    this[_context] = context;
    this[_closing] = false;
    this[_closingForcefully] = false;
    this[_authenticate] = null;
    this[_authenticateProxy] = null;
    this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
    this[_idleTimeout] = const || (const = dart.const(new core.Duration({seconds: 15})));
    this[_badCertificateCallback] = null;
    this.maxConnectionsPerHost = null;
    this.autoUncompress = true;
  }
  set idleTimeout(timeout) {
    this[_idleTimeout] = timeout;
    for (let c of this[_connectionTargets][dartx.values]) {
      for (let idle of c[_idle]) {
        idle.stopTimer();
        idle.startTimer();
      }
    }
  }
  set badCertificateCallback(callback) {
    this[_badCertificateCallback] = callback;
  }
  open(method, host, port, path) {
    let hashMark = 35;
    let questionMark = 63;
    let fragmentStart = path[dartx.length];
    let queryStart = path[dartx.length];
    for (let i = dart.notNull(path[dartx.length]) - 1; i >= 0; i--) {
      let char = path[dartx.codeUnitAt](i);
      if (char == hashMark) {
        fragmentStart = i;
        queryStart = i;
      } else if (char == questionMark) {
        queryStart = i;
      }
    }
    let query = null;
    if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
      query = path[dartx.substring](dart.notNull(queryStart) + 1, fragmentStart);
      path = path[dartx.substring](0, queryStart);
    }
    let uri = core.Uri.new({scheme: "http", host: host, port: port, path: path, query: query});
    return this[_openUrl](method, uri);
  }
  openUrl(method, url) {
    return this[_openUrl](method, url);
  }
  get(host, port, path) {
    return this.open("get", host, port, path);
  }
  getUrl(url) {
    return this[_openUrl]("get", url);
  }
  post(host, port, path) {
    return this.open("post", host, port, path);
  }
  postUrl(url) {
    return this[_openUrl]("post", url);
  }
  put(host, port, path) {
    return this.open("put", host, port, path);
  }
  putUrl(url) {
    return this[_openUrl]("put", url);
  }
  delete(host, port, path) {
    return this.open("delete", host, port, path);
  }
  deleteUrl(url) {
    return this[_openUrl]("delete", url);
  }
  head(host, port, path) {
    return this.open("head", host, port, path);
  }
  headUrl(url) {
    return this[_openUrl]("head", url);
  }
  patch(host, port, path) {
    return this.open("patch", host, port, path);
  }
  patchUrl(url) {
    return this[_openUrl]("patch", url);
  }
  close(opts) {
    let force = opts && 'force' in opts ? opts.force : false;
    this[_closing] = true;
    this[_closingForcefully] = force;
    this[_closeConnections](this[_closingForcefully]);
    dart.assert(!dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s.hasIdle, _ConnectionTargetTobool()))));
    dart.assert(!dart.test(force) || !dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s[_active].isNotEmpty, _ConnectionTargetTobool()))));
  }
  set authenticate(f) {
    this[_authenticate] = f;
  }
  addCredentials(url, realm, cr) {
    this[_credentials][dartx.add](new io._SiteCredentials(url, realm, io._HttpClientCredentials._check(cr)));
  }
  set authenticateProxy(f) {
    this[_authenticateProxy] = f;
  }
  addProxyCredentials(host, port, realm, cr) {
    this[_proxyCredentials][dartx.add](new io._ProxyCredentials(host, port, realm, io._HttpClientCredentials._check(cr)));
  }
  set findProxy(f) {
    return this[_findProxy] = f;
  }
  [_openUrl](method, uri) {
    uri = uri.removeFragment();
    if (method == null) {
      dart.throw(new core.ArgumentError(method));
    }
    if (method != "CONNECT") {
      if (dart.test(uri.host[dartx.isEmpty])) {
        dart.throw(new core.ArgumentError(dart.str`No host specified in URI ${uri}`));
      } else if (uri.scheme != "http" && uri.scheme != "https") {
        dart.throw(new core.ArgumentError(dart.str`Unsupported scheme '${uri.scheme}' in URI ${uri}`));
      }
    }
    let isSecure = uri.scheme == "https";
    let port = uri.port;
    if (port == 0) {
      port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
    }
    let proxyConf = const || (const = dart.const(new io._ProxyConfiguration.direct()));
    if (this[_findProxy] != null) {
      try {
        proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
      } catch (error) {
        let stackTrace = dart.stackTrace(error);
        return FutureOf_HttpClientRequest().error(error, stackTrace);
      }

    }
    return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(dart.fn(info => {
      function send(info) {
        return info.connection.send(uri, port, method[dartx.toUpperCase](), info.proxy);
      }
      dart.fn(send, _ConnectionInfoTo_HttpClientRequest());
      if (dart.test(info.connection.closed)) {
        return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(send);
      }
      return send(info);
    }, _ConnectionInfoToFutureOrOf_HttpClientRequest()));
  }
  [_openUrlFromRequest](method, uri, previous) {
    let resolved = previous.uri.resolveUri(uri);
    return this[_openUrl](method, resolved).then(io._HttpClientRequest)(dart.fn(request => {
      request.followRedirects = previous.followRedirects;
      request.maxRedirects = previous.maxRedirects;
      for (let header of previous.headers[_headers][dartx.keys]) {
        if (request.headers._get(header) == null) {
          request.headers.set(header, previous.headers._get(header));
        }
      }
      request.headers.chunkedTransferEncoding = false;
      request.contentLength = 0;
      return request;
    }, _HttpClientRequestTo_HttpClientRequest()));
  }
  [_returnConnection](connection) {
    this[_connectionTargets][dartx._get](connection.key).returnConnection(connection);
    this[_connectionsChanged]();
  }
  [_connectionClosed](connection) {
    connection.stopTimer();
    let connectionTarget = this[_connectionTargets][dartx._get](connection.key);
    if (connectionTarget != null) {
      connectionTarget.connectionClosed(connection);
      if (dart.test(connectionTarget.isEmpty)) {
        this[_connectionTargets][dartx.remove](connection.key);
      }
      this[_connectionsChanged]();
    }
  }
  [_connectionsChanged]() {
    if (dart.test(this[_closing])) {
      this[_closeConnections](this[_closingForcefully]);
    }
  }
  [_closeConnections](force) {
    for (let connectionTarget of this[_connectionTargets][dartx.values][dartx.toList]()) {
      connectionTarget.close(force);
    }
  }
  [_getConnectionTarget](host, port, isSecure) {
    let key = core.String._check(io._HttpClientConnection.makeKey(isSecure, host, port));
    return this[_connectionTargets][dartx.putIfAbsent](key, dart.fn(() => new io._ConnectionTarget(key, host, port, isSecure, this[_context]), VoidTo_ConnectionTarget()));
  }
  [_getConnection](uriHost, uriPort, proxyConf, isSecure) {
    let proxies = proxyConf.proxies[dartx.iterator];
    const connect = (function(error) {
      if (!dart.test(proxies.moveNext())) return FutureOf_ConnectionInfo().error(error);
      let proxy = proxies.current;
      let host = dart.test(proxy.isDirect) ? uriHost : proxy.host;
      let port = dart.test(proxy.isDirect) ? uriPort : proxy.port;
      return this[_getConnectionTarget](host, port, isSecure).connect(uriHost, uriPort, proxy, this).catchError(connect);
    }).bind(this);
    dart.fn(connect, dynamicToFutureOf_ConnectionInfo());
    return FutureOf_ConnectionInfo().new(dart.fn(() => connect(new io.HttpException("No proxies given")), VoidToFutureOf_ConnectionInfo()));
  }
  [_findCredentials](url, scheme) {
    if (scheme === void 0) scheme = null;
    let cr = this[_credentials][dartx.fold](io._SiteCredentials)(null, dart.fn((prev, value) => {
      let siteCredentials = io._SiteCredentials.as(value);
      if (dart.test(siteCredentials.applies(url, scheme))) {
        if (prev == null) return io._SiteCredentials._check(value);
        return dart.notNull(siteCredentials.uri.path[dartx.length]) > dart.notNull(prev.uri.path[dartx.length]) ? siteCredentials : prev;
      } else {
        return prev;
      }
    }, _SiteCredentialsAnd_CredentialsTo_SiteCredentials()));
    return cr;
  }
  [_findProxyCredentials](proxy, scheme) {
    if (scheme === void 0) scheme = null;
    let it = this[_proxyCredentials][dartx.iterator];
    while (dart.test(it.moveNext())) {
      if (dart.test(it.current.applies(proxy, scheme))) {
        return it.current;
      }
    }
    return null;
  }
  [_removeCredentials](cr) {
    let index = this[_credentials][dartx.indexOf](cr);
    if (index != -1) {
      this[_credentials][dartx.removeAt](index);
    }
  }
  [_removeProxyCredentials](cr) {
    let index = this[_proxyCredentials][dartx.indexOf](io._ProxyCredentials._check(cr));
    if (index != -1) {
      this[_proxyCredentials][dartx.removeAt](index);
    }
  }
  static _findProxyFromEnvironment(url, environment) {
    function checkNoProxy(option) {
      if (option == null) return null;
      let names = option[dartx.split](",")[dartx.map](core.String)(dart.fn(s => s[dartx.trim](), StringToString()))[dartx.iterator];
      while (dart.test(names.moveNext())) {
        let name = names.current;
        if (dart.test(name[dartx.startsWith]("[")) && dart.test(name[dartx.endsWith]("]")) && dart.str`[${url.host}]` == name || dart.test(name[dartx.isNotEmpty]) && dart.test(url.host[dartx.endsWith](name))) {
          return "DIRECT";
        }
      }
      return null;
    }
    dart.fn(checkNoProxy, StringToString());
    function checkProxy(option) {
      if (option == null) return null;
      option = option[dartx.trim]();
      if (dart.test(option[dartx.isEmpty])) return null;
      let pos = option[dartx.indexOf]("://");
      if (dart.notNull(pos) >= 0) {
        option = option[dartx.substring](dart.notNull(pos) + 3);
      }
      pos = option[dartx.indexOf]("/");
      if (dart.notNull(pos) >= 0) {
        option = option[dartx.substring](0, pos);
      }
      if (option[dartx.indexOf]("[") == 0) {
        let pos = option[dartx.lastIndexOf](":");
        if (dart.notNull(option[dartx.indexOf]("]")) > dart.notNull(pos)) option = dart.str`${option}:1080`;
      } else {
        if (option[dartx.indexOf](":") == -1) option = dart.str`${option}:1080`;
      }
      return dart.str`PROXY ${option}`;
    }
    dart.fn(checkProxy, StringToString());
    if (environment == null) environment = io._HttpClient._platformEnvironmentCache;
    let proxyCfg = null;
    let noProxy = environment[dartx._get]("no_proxy");
    if (noProxy == null) noProxy = environment[dartx._get]("NO_PROXY");
    if ((proxyCfg = checkNoProxy(noProxy)) != null) {
      return proxyCfg;
    }
    if (url.scheme == "http") {
      let proxy = environment[dartx._get]("http_proxy");
      if (proxy == null) proxy = environment[dartx._get]("HTTP_PROXY");
      if ((proxyCfg = checkProxy(proxy)) != null) {
        return proxyCfg;
      }
    } else if (url.scheme == "https") {
      let proxy = environment[dartx._get]("https_proxy");
      if (proxy == null) proxy = environment[dartx._get]("HTTPS_PROXY");
      if ((proxyCfg = checkProxy(proxy)) != null) {
        return proxyCfg;
      }
    }
    return "DIRECT";
  }
};
io._HttpClient[dart.implements] = () => [io.HttpClient];
dart.setSignature(io._HttpClient, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClient, [io.SecurityContext])}),
  fields: () => ({
    [_closing]: core.bool,
    [_closingForcefully]: core.bool,
    [_connectionTargets]: MapOfString$_ConnectionTarget(),
    [_credentials]: ListOf_Credentials(),
    [_proxyCredentials]: ListOf_ProxyCredentials(),
    [_context]: io.SecurityContext,
    [_authenticate]: core.Function,
    [_authenticateProxy]: core.Function,
    [_findProxy]: core.Function,
    [_idleTimeout]: core.Duration,
    [_badCertificateCallback]: io.BadCertificateCallback,
    maxConnectionsPerHost: core.int,
    autoUncompress: core.bool,
    userAgent: core.String
  }),
  getters: () => ({idleTimeout: dart.definiteFunctionType(core.Duration, [])}),
  setters: () => ({
    idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
    badCertificateCallback: dart.definiteFunctionType(dart.void, [X509CertificateAndStringAndintTobool()]),
    authenticate: dart.definiteFunctionType(dart.void, [UriAndStringAndStringToFutureOfbool()]),
    authenticateProxy: dart.definiteFunctionType(dart.void, [StringAndintAndString__ToFutureOfbool()]),
    findProxy: dart.definiteFunctionType(dart.void, [UriToString()])
  }),
  methods: () => ({
    open: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.String, core.int, core.String]),
    openUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.Uri]),
    get: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    getUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    post: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    postUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    put: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    putUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    delete: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    deleteUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    head: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    headUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    patch: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
    patchUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
    close: dart.definiteFunctionType(dart.void, [], {force: core.bool}),
    addCredentials: dart.definiteFunctionType(dart.void, [core.Uri, core.String, io.HttpClientCredentials]),
    addProxyCredentials: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String, io.HttpClientCredentials]),
    [_openUrl]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri]),
    [_openUrlFromRequest]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri, io._HttpClientRequest]),
    [_returnConnection]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
    [_connectionsChanged]: dart.definiteFunctionType(dart.void, []),
    [_closeConnections]: dart.definiteFunctionType(dart.void, [core.bool]),
    [_getConnectionTarget]: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.int, core.bool]),
    [_getConnection]: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._ProxyConfiguration, core.bool]),
    [_findCredentials]: dart.definiteFunctionType(io._SiteCredentials, [core.Uri], [io._AuthenticationScheme]),
    [_findProxyCredentials]: dart.definiteFunctionType(io._ProxyCredentials, [io._Proxy], [io._AuthenticationScheme]),
    [_removeCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials]),
    [_removeProxyCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials])
  }),
  sfields: () => ({_platformEnvironmentCache: MapOfString$String()}),
  statics: () => ({_findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri, MapOfString$String()])}),
  names: ['_findProxyFromEnvironment']
});
dart.defineLazy(io._HttpClient, {
  get _platformEnvironmentCache() {
    return io.Platform.environment;
  },
  set _platformEnvironmentCache(_) {}
});
const _state = Symbol('_state');
const _idleMark = Symbol('_idleMark');
const _owner = Symbol('_owner');
const _serviceId = Symbol('_serviceId');
const _markActive = Symbol('_markActive');
const _markIdle = Symbol('_markIdle');
const _handleRequest = Symbol('_handleRequest');
const _isActive = Symbol('_isActive');
const _isIdle = Symbol('_isIdle');
const _isDetached = Symbol('_isDetached');
const _serviceTypePath = Symbol('_serviceTypePath');
const _serviceTypeName = Symbol('_serviceTypeName');
const _servicePath = Symbol('_servicePath');
const _serviceType = Symbol('_serviceType');
const _toJSON = Symbol('_toJSON');
const __serviceId = Symbol('__serviceId');
io._ServiceObject = class _ServiceObject extends core.Object {
  new() {
    this[__serviceId] = 0;
  }
  get [_serviceId]() {
    if (this[__serviceId] == 0) this[__serviceId] = (() => {
      let x = io._nextServiceId;
      io._nextServiceId = dart.notNull(x) + 1;
      return x;
    })();
    return this[__serviceId];
  }
  get [_servicePath]() {
    return dart.str`${this[_serviceTypePath]}/${this[_serviceId]}`;
  }
  [_serviceType](ref) {
    if (dart.test(ref)) return dart.str`@${this[_serviceTypeName]}`;
    return this[_serviceTypeName];
  }
};
dart.setSignature(io._ServiceObject, {
  fields: () => ({[__serviceId]: core.int}),
  getters: () => ({
    [_serviceId]: dart.definiteFunctionType(core.int, []),
    [_servicePath]: dart.definiteFunctionType(core.String, [])
  }),
  methods: () => ({[_serviceType]: dart.definiteFunctionType(core.String, [core.bool])})
});
io._HttpConnection = class _HttpConnection extends dart.mixin(collection.LinkedListEntry, io._ServiceObject) {
  new(socket, httpServer) {
    this[_socket] = socket;
    this[_httpServer] = httpServer;
    this[_httpParser] = io._HttpParser.requestParser();
    this[_state] = io._HttpConnection._IDLE;
    this[_subscription] = null;
    this[_idleMark] = false;
    this[_streamFuture] = null;
    super.new();
    try {
      dart.dput(this[_socket], _owner, this);
    } catch (_) {
      core.print(_);
    }

    io._HttpConnection._connections[dartx._set](this[_serviceId], this);
    this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
    this[_subscription] = this[_httpParser].listen(dart.fn(incoming => {
      this[_httpServer][_markActive](this);
      incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
        if (dart.test(closing)) this.destroy();
      }, dynamicToNull()));
      this[_subscription].pause();
      this[_state] = io._HttpConnection._ACTIVE;
      let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
      let response = new io._HttpResponse(incoming.uri, incoming.headers.protocolVersion, outgoing, this[_httpServer].defaultResponseHeaders, this[_httpServer].serverHeader);
      let request = new io._HttpRequest(response, incoming, this[_httpServer], this);
      this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(_ => {
        response.deadline = null;
        if (this[_state] == io._HttpConnection._DETACHED) return;
        if (dart.test(response.persistentConnection) && dart.test(request.persistentConnection) && dart.test(incoming.fullBodyRead) && !dart.test(this[_httpParser].upgrade) && !dart.test(this[_httpServer].closed)) {
          this[_state] = io._HttpConnection._IDLE;
          this[_idleMark] = false;
          this[_httpServer][_markIdle](this);
          this[_subscription].resume();
        } else {
          this.destroy();
        }
      }, dynamicToNull()), {onError: dart.fn(_ => {
          this.destroy();
        }, dynamicToNull())});
      outgoing.ignoreBody = request.method == "HEAD";
      response[_httpRequest] = request;
      this[_httpServer][_handleRequest](request);
    }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
        this.destroy();
      }, VoidToNull()), onError: dart.fn(error => {
        this.destroy();
      }, dynamicToNull())});
  }
  markIdle() {
    this[_idleMark] = true;
  }
  get isMarkedIdle() {
    return this[_idleMark];
  }
  destroy() {
    if (this[_state] == io._HttpConnection._CLOSING || this[_state] == io._HttpConnection._DETACHED) return;
    this[_state] = io._HttpConnection._CLOSING;
    dart.dsend(this[_socket], 'destroy');
    this[_httpServer][_connectionClosed](this);
    io._HttpConnection._connections[dartx.remove](this[_serviceId]);
  }
  detachSocket() {
    this[_state] = io._HttpConnection._DETACHED;
    this[_httpServer][_connectionClosed](this);
    let detachedIncoming = this[_httpParser].detachIncoming();
    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
      io._HttpConnection._connections[dartx.remove](this[_serviceId]);
      return new io._DetachedSocket(this[_socket], detachedIncoming);
    }, dynamicTo_DetachedSocket()));
  }
  get connectionInfo() {
    return io._HttpConnectionInfo.create(io.Socket._check(this[_socket]));
  }
  get [_isActive]() {
    return this[_state] == io._HttpConnection._ACTIVE;
  }
  get [_isIdle]() {
    return this[_state] == io._HttpConnection._IDLE;
  }
  get [_isClosing]() {
    return this[_state] == io._HttpConnection._CLOSING;
  }
  get [_isDetached]() {
    return this[_state] == io._HttpConnection._DETACHED;
  }
  get [_serviceTypePath]() {
    return 'io/http/serverconnections';
  }
  get [_serviceTypeName]() {
    return 'HttpServerConnection';
  }
  [_toJSON](ref) {
    let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')} <-> ` + dart.str`${dart.dload(dart.dload(this[_socket], 'remoteAddress'), 'host')}:${dart.dload(this[_socket], 'remotePort')}`;
    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
    if (dart.test(ref)) {
      return r;
    }
    r[dartx._set]('server', this[_httpServer][_toJSON](true));
    try {
      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON, true));
    } catch (_) {
      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
    }

    switch (this[_state]) {
      case io._HttpConnection._ACTIVE:
      {
        r[dartx._set]('state', "Active");
        break;
      }
      case io._HttpConnection._IDLE:
      {
        r[dartx._set]('state', "Idle");
        break;
      }
      case io._HttpConnection._CLOSING:
      {
        r[dartx._set]('state', "Closing");
        break;
      }
      case io._HttpConnection._DETACHED:
      {
        r[dartx._set]('state', "Detached");
        break;
      }
      default:
      {
        r[dartx._set]('state', 'Unknown');
        break;
      }
    }
    return r;
  }
};
dart.setBaseClass(io._HttpConnection, dart.mixin(collection.LinkedListEntry$(io._HttpConnection), io._ServiceObject));
dart.addSimpleTypeTests(io._HttpConnection);
dart.setSignature(io._HttpConnection, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpConnection, [dart.dynamic, io._HttpServer])}),
  fields: () => ({
    [_socket]: dart.dynamic,
    [_httpServer]: io._HttpServer,
    [_httpParser]: io._HttpParser,
    [_state]: core.int,
    [_subscription]: async.StreamSubscription,
    [_idleMark]: core.bool,
    [_streamFuture]: async.Future
  }),
  getters: () => ({
    isMarkedIdle: dart.definiteFunctionType(core.bool, []),
    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
    [_isActive]: dart.definiteFunctionType(core.bool, []),
    [_isIdle]: dart.definiteFunctionType(core.bool, []),
    [_isClosing]: dart.definiteFunctionType(core.bool, []),
    [_isDetached]: dart.definiteFunctionType(core.bool, []),
    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
  }),
  methods: () => ({
    markIdle: dart.definiteFunctionType(dart.void, []),
    destroy: dart.definiteFunctionType(dart.void, []),
    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
    [_toJSON]: dart.definiteFunctionType(core.Map, [core.bool])
  }),
  sfields: () => ({
    _ACTIVE: core.int,
    _IDLE: core.int,
    _CLOSING: core.int,
    _DETACHED: core.int,
    _connections: MapOfint$_HttpConnection()
  })
});
io._HttpConnection._ACTIVE = 0;
io._HttpConnection._IDLE = 1;
io._HttpConnection._CLOSING = 2;
io._HttpConnection._DETACHED = 3;
dart.defineLazy(io._HttpConnection, {
  get _connections() {
    return HashMapOfint$_HttpConnection().new();
  },
  set _connections(_) {}
});
const _activeConnections = Symbol('_activeConnections');
const _idleConnections = Symbol('_idleConnections');
const _serverSocket = Symbol('_serverSocket');
const _closeServer = Symbol('_closeServer');
let const;
let const;
io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
  static bind(address, port, backlog, v6Only, shared) {
    return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
  }
  static bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared) {
    return io.SecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), SecureServerSocketTo_HttpServer()));
  }
  _(serverSocket, closeServer) {
    this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
    this[_activeConnections] = new (LinkedListOf_HttpConnection())();
    this[_idleConnections] = new (LinkedListOf_HttpConnection())();
    this[_serverSocket] = serverSocket;
    this[_closeServer] = closeServer;
    this.serverHeader = null;
    this.autoCompress = false;
    this[_idleTimeout] = null;
    this[_idleTimer] = null;
    this[_sessionManagerInstance] = null;
    this.closed = false;
    this[_controller] = null;
    super.new();
    this[_controller] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
    this.idleTimeout = const || (const = dart.const(new core.Duration({seconds: 120})));
    io._HttpServer._servers[dartx._set](this[_serviceId], this);
    dart.dput(this[_serverSocket], _owner, this);
  }
  listenOn(serverSocket) {
    this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
    this[_activeConnections] = new (LinkedListOf_HttpConnection())();
    this[_idleConnections] = new (LinkedListOf_HttpConnection())();
    this[_serverSocket] = serverSocket;
    this[_closeServer] = false;
    this.serverHeader = null;
    this.autoCompress = false;
    this[_idleTimeout] = null;
    this[_idleTimer] = null;
    this[_sessionManagerInstance] = null;
    this.closed = false;
    this[_controller] = null;
    super.new();
    this[_controller] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
    this.idleTimeout = const || (const = dart.const(new core.Duration({seconds: 120})));
    io._HttpServer._servers[dartx._set](this[_serviceId], this);
    try {
      dart.dput(this[_serverSocket], _owner, this);
    } catch (_) {
    }

  }
  static _initDefaultResponseHeaders() {
    let defaultResponseHeaders = new io._HttpHeaders('1.1');
    defaultResponseHeaders.contentType = io.ContentType.TEXT;
    defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN');
    defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff');
    defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block');
    return defaultResponseHeaders;
  }
  get idleTimeout() {
    return this[_idleTimeout];
  }
  set idleTimeout(duration) {
    if (this[_idleTimer] != null) {
      this[_idleTimer].cancel();
      this[_idleTimer] = null;
    }
    this[_idleTimeout] = duration;
    if (this[_idleTimeout] != null) {
      this[_idleTimer] = async.Timer.periodic(this[_idleTimeout], dart.fn(_ => {
        for (let idle of this[_idleConnections].toList()) {
          if (dart.test(idle.isMarkedIdle)) {
            idle.destroy();
          } else {
            idle.markIdle();
          }
        }
      }, TimerToNull()));
    }
  }
  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;
    dart.dsend(this[_serverSocket], 'listen', dart.fn(socket => {
      socket.setOption(io.SocketOption.TCP_NODELAY, true);
      let connection = new io._HttpConnection(socket, this);
      this[_idleConnections].add(connection);
    }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
        if (!io.HandshakeException.is(error)) {
          this[_controller].addError(error, core.StackTrace._check(stackTrace));
        }
      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller], 'close')});
    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  close(opts) {
    let force = opts && 'force' in opts ? opts.force : false;
    this.closed = true;
    let result = null;
    if (this[_serverSocket] != null && dart.test(this[_closeServer])) {
      result = async.Future._check(dart.dsend(this[_serverSocket], 'close'));
    } else {
      result = async.Future.value();
    }
    this.idleTimeout = null;
    if (dart.test(force)) {
      for (let c of this[_activeConnections].toList()) {
        c.destroy();
      }
      dart.assert(this[_activeConnections].isEmpty);
    }
    for (let c of this[_idleConnections].toList()) {
      c.destroy();
    }
    this[_maybePerformCleanup]();
    return result;
  }
  [_maybePerformCleanup]() {
    if (dart.test(this.closed) && dart.test(this[_idleConnections].isEmpty) && dart.test(this[_activeConnections].isEmpty) && this[_sessionManagerInstance] != null) {
      this[_sessionManagerInstance].close();
      this[_sessionManagerInstance] = null;
      io._HttpServer._servers[dartx.remove](this[_serviceId]);
    }
  }
  get port() {
    if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
    return core.int._check(dart.dload(this[_serverSocket], 'port'));
  }
  get address() {
    if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
    return io.InternetAddress._check(dart.dload(this[_serverSocket], 'address'));
  }
  set sessionTimeout(timeout) {
    this[_sessionManager].sessionTimeout = timeout;
  }
  [_handleRequest](request) {
    if (!dart.test(this.closed)) {
      this[_controller].add(request);
    } else {
      request[_httpConnection].destroy();
    }
  }
  [_connectionClosed](connection) {
    connection.unlink();
    this[_maybePerformCleanup]();
  }
  [_markIdle](connection) {
    this[_activeConnections].remove(connection);
    this[_idleConnections].add(connection);
  }
  [_markActive](connection) {
    this[_idleConnections].remove(connection);
    this[_activeConnections].add(connection);
  }
  get [_sessionManager]() {
    if (this[_sessionManagerInstance] == null) {
      this[_sessionManagerInstance] = new io._HttpSessionManager();
    }
    return this[_sessionManagerInstance];
  }
  connectionsInfo() {
    let result = new io.HttpConnectionsInfo();
    result.total = dart.notNull(this[_activeConnections].length) + dart.notNull(this[_idleConnections].length);
    this[_activeConnections].forEach(dart.fn(conn => {
      if (dart.test(conn[_isActive])) {
        result.active = dart.notNull(result.active) + 1;
      } else {
        dart.assert(conn[_isClosing]);
        result.closing = dart.notNull(result.closing) + 1;
      }
    }, _HttpConnectionToNull()));
    this[_idleConnections].forEach(dart.fn(conn => {
      result.idle = dart.notNull(result.idle) + 1;
      dart.assert(conn[_isIdle]);
    }, _HttpConnectionToNull()));
    return result;
  }
  get [_serviceTypePath]() {
    return 'io/http/servers';
  }
  get [_serviceTypeName]() {
    return 'HttpServer';
  }
  [_toJSON](ref) {
    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: dart.str`${this.address.host}:${this.port}`, user_name: dart.str`${this.address.host}:${this.port}`}, core.String, dart.dynamic);
    if (dart.test(ref)) {
      return r;
    }
    try {
      r[dartx._set]('socket', dart.dsend(this[_serverSocket], _toJSON, true));
    } catch (_) {
      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
    }

    r[dartx._set]('port', this.port);
    r[dartx._set]('address', this.address.host);
    r[dartx._set]('active', this[_activeConnections].map(core.Map)(dart.fn(c => c[_toJSON](true), _HttpConnectionToMap()))[dartx.toList]());
    r[dartx._set]('idle', this[_idleConnections].map(core.Map)(dart.fn(c => c[_toJSON](true), _HttpConnectionToMap()))[dartx.toList]());
    r[dartx._set]('closed', this.closed);
    return r;
  }
};
dart.addSimpleTypeTests(io._HttpServer);
dart.defineNamedConstructor(io._HttpServer, '_');
dart.defineNamedConstructor(io._HttpServer, 'listenOn');
io._HttpServer[dart.implements] = () => [io.HttpServer];
dart.setSignature(io._HttpServer, {
  constructors: () => ({
    _: dart.definiteFunctionType(io._HttpServer, [dart.dynamic, core.bool]),
    listenOn: dart.definiteFunctionType(io._HttpServer, [dart.dynamic])
  }),
  fields: () => ({
    serverHeader: core.String,
    defaultResponseHeaders: io.HttpHeaders,
    autoCompress: core.bool,
    [_idleTimeout]: core.Duration,
    [_idleTimer]: async.Timer,
    [_sessionManagerInstance]: io._HttpSessionManager,
    closed: core.bool,
    [_serverSocket]: dart.dynamic,
    [_closeServer]: core.bool,
    [_activeConnections]: LinkedListOf_HttpConnection(),
    [_idleConnections]: LinkedListOf_HttpConnection(),
    [_controller]: StreamControllerOfHttpRequest()
  }),
  getters: () => ({
    idleTimeout: dart.definiteFunctionType(core.Duration, []),
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, []),
    [_sessionManager]: dart.definiteFunctionType(io._HttpSessionManager, []),
    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({
    idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
    sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.HttpRequest), [HttpRequestTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(async.Future, [], {force: core.bool}),
    [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
    [_handleRequest]: dart.definiteFunctionType(dart.void, [io._HttpRequest]),
    [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
    [_markIdle]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
    [_markActive]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
    connectionsInfo: dart.definiteFunctionType(io.HttpConnectionsInfo, []),
    [_toJSON]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
  }),
  sfields: () => ({_servers: MapOfint$_HttpServer()}),
  statics: () => ({
    bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, core.int, core.bool, core.bool]),
    bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext, core.int, core.bool, core.bool, core.bool]),
    _initDefaultResponseHeaders: dart.definiteFunctionType(io.HttpHeaders, [])
  }),
  names: ['bind', 'bindSecure', '_initDefaultResponseHeaders']
});
dart.defineLazy(io._HttpServer, {
  get _servers() {
    return MapOfint$_HttpServer().new();
  },
  set _servers(_) {}
});
io._Proxy = class _Proxy extends core.Object {
  new(host, port, username, password) {
    this.host = host;
    this.port = port;
    this.username = username;
    this.password = password;
    this.isDirect = false;
  }
  direct() {
    this.host = null;
    this.port = null;
    this.username = null;
    this.password = null;
    this.isDirect = true;
  }
  get isAuthenticated() {
    return this.username != null;
  }
};
dart.defineNamedConstructor(io._Proxy, 'direct');
dart.setSignature(io._Proxy, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._Proxy, [core.String, core.int, core.String, core.String]),
    direct: dart.definiteFunctionType(io._Proxy, [])
  }),
  fields: () => ({
    host: core.String,
    port: core.int,
    username: core.String,
    password: core.String,
    isDirect: core.bool
  }),
  getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
});
let const;
let const;
io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
  new(configuration) {
    this.proxies = ListOf_Proxy().new();
    if (configuration == null) {
      dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
    }
    let list = configuration[dartx.split](";");
    list[dartx.forEach](dart.fn(proxy => {
      proxy = proxy[dartx.trim]();
      if (!dart.test(proxy[dartx.isEmpty])) {
        if (dart.test(proxy[dartx.startsWith](io._ProxyConfiguration.PROXY_PREFIX))) {
          let username = null;
          let password = null;
          proxy = proxy[dartx.substring](io._ProxyConfiguration.PROXY_PREFIX[dartx.length])[dartx.trim]();
          let at = proxy[dartx.indexOf]("@");
          if (at != -1) {
            let userinfo = proxy[dartx.substring](0, at)[dartx.trim]();
            proxy = proxy[dartx.substring](dart.notNull(at) + 1)[dartx.trim]();
            let colon = userinfo[dartx.indexOf](":");
            if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
            }
            username = userinfo[dartx.substring](0, colon)[dartx.trim]();
            password = userinfo[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
          }
          let colon = proxy[dartx.lastIndexOf](":");
          if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
            dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
          }
          let host = proxy[dartx.substring](0, colon)[dartx.trim]();
          if (dart.test(host[dartx.startsWith]("[")) && dart.test(host[dartx.endsWith]("]"))) {
            host = host[dartx.substring](1, dart.notNull(host[dartx.length]) - 1);
          }
          let portString = proxy[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
          let port = null;
          try {
            port = core.int.parse(portString);
          } catch (e) {
            if (core.FormatException.is(e)) {
              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}, ` + dart.str`invalid port '${portString}'`));
            } else
              throw e;
          }

          this.proxies[dartx.add](new io._Proxy(host, port, username, password));
        } else if (proxy[dartx.trim]() == io._ProxyConfiguration.DIRECT_PREFIX) {
          this.proxies[dartx.add](new io._Proxy.direct());
        } else {
          dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
        }
      }
    }, StringToNull()));
  }
  direct() {
    this.proxies = const || (const = dart.constList([const || (const = dart.const(new io._Proxy.direct()))], io._Proxy));
  }
};
dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
dart.setSignature(io._ProxyConfiguration, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._ProxyConfiguration, [core.String]),
    direct: dart.definiteFunctionType(io._ProxyConfiguration, [])
  }),
  fields: () => ({proxies: ListOf_Proxy()}),
  sfields: () => ({
    PROXY_PREFIX: core.String,
    DIRECT_PREFIX: core.String
  })
});
io._ProxyConfiguration.PROXY_PREFIX = "PROXY ";
io._ProxyConfiguration.DIRECT_PREFIX = "DIRECT";
io._HttpConnectionInfo = class _HttpConnectionInfo extends core.Object {
  new() {
    this.remoteAddress = null;
    this.remotePort = null;
    this.localPort = null;
  }
  static create(socket) {
    if (socket == null) return null;
    try {
      let info = new io._HttpConnectionInfo();
      info.remoteAddress = socket.remoteAddress;
      info.remotePort = socket.remotePort;
      info.localPort = socket.port;
      return info;
    } catch (e) {
    }

    return null;
  }
};
io._HttpConnectionInfo[dart.implements] = () => [io.HttpConnectionInfo];
dart.setSignature(io._HttpConnectionInfo, {
  fields: () => ({
    remoteAddress: io.InternetAddress,
    remotePort: core.int,
    localPort: core.int
  }),
  statics: () => ({create: dart.definiteFunctionType(io._HttpConnectionInfo, [io.Socket])}),
  names: ['create']
});
io._DetachedSocket = class _DetachedSocket extends async.Stream$(core.List$(core.int)) {
  new(socket, incoming) {
    this[_socket] = socket;
    this[_incoming] = incoming;
    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;
    return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get encoding() {
    return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
  }
  set encoding(value) {
    dart.dput(this[_socket], 'encoding', value);
  }
  write(obj) {
    dart.dsend(this[_socket], 'write', obj);
  }
  writeln(obj) {
    if (obj === void 0) obj = "";
    dart.dsend(this[_socket], 'writeln', obj);
  }
  writeCharCode(charCode) {
    dart.dsend(this[_socket], 'writeCharCode', charCode);
  }
  writeAll(objects, separator) {
    if (separator === void 0) separator = "";
    dart.dsend(this[_socket], 'writeAll', objects, separator);
  }
  add(bytes) {
    dart.dsend(this[_socket], 'add', bytes);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    return dart.dsend(this[_socket], 'addError', error, stackTrace);
  }
  addStream(stream) {
    return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
  }
  destroy() {
    dart.dsend(this[_socket], 'destroy');
  }
  flush() {
    return async.Future._check(dart.dsend(this[_socket], 'flush'));
  }
  close() {
    return async.Future._check(dart.dsend(this[_socket], 'close'));
  }
  get done() {
    return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
  }
  get port() {
    return core.int._check(dart.dload(this[_socket], 'port'));
  }
  get address() {
    return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
  }
  get remoteAddress() {
    return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
  }
  get remotePort() {
    return core.int._check(dart.dload(this[_socket], 'remotePort'));
  }
  setOption(option, enabled) {
    return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
  }
  [_toJSON](ref) {
    return core.Map._check(dart.dsend(this[_socket], _toJSON, ref));
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
};
dart.addSimpleTypeTests(io._DetachedSocket);
io._DetachedSocket[dart.implements] = () => [io.Socket];
dart.setSignature(io._DetachedSocket, {
  constructors: () => ({new: dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic, StreamOfListOfint()])}),
  fields: () => ({
    [_incoming]: StreamOfListOfint(),
    [_socket]: dart.dynamic
  }),
  getters: () => ({
    encoding: dart.definiteFunctionType(convert.Encoding, []),
    done: dart.definiteFunctionType(async.Future$(io.Socket), []),
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, []),
    remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
    remotePort: dart.definiteFunctionType(core.int, [])
  }),
  setters: () => ({
    encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
    [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
    destroy: dart.definiteFunctionType(dart.void, []),
    flush: dart.definiteFunctionType(async.Future, []),
    close: dart.definiteFunctionType(async.Future, []),
    setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
    [_toJSON]: dart.definiteFunctionType(core.Map, [core.bool])
  })
});
const _scheme = Symbol('_scheme');
io._AuthenticationScheme = class _AuthenticationScheme extends core.Object {
  new(scheme) {
    this[_scheme] = scheme;
  }
  static fromString(scheme) {
    if (scheme[dartx.toLowerCase]() == "basic") return io._AuthenticationScheme.BASIC;
    if (scheme[dartx.toLowerCase]() == "digest") return io._AuthenticationScheme.DIGEST;
    return io._AuthenticationScheme.UNKNOWN;
  }
  toString() {
    if (dart.equals(this, io._AuthenticationScheme.BASIC)) return "Basic";
    if (dart.equals(this, io._AuthenticationScheme.DIGEST)) return "Digest";
    return "Unknown";
  }
};
dart.setSignature(io._AuthenticationScheme, {
  constructors: () => ({
    new: dart.definiteFunctionType(io._AuthenticationScheme, [core.int]),
    fromString: dart.definiteFunctionType(io._AuthenticationScheme, [core.String])
  }),
  fields: () => ({[_scheme]: core.int}),
  sfields: () => ({
    UNKNOWN: io._AuthenticationScheme,
    BASIC: io._AuthenticationScheme,
    DIGEST: io._AuthenticationScheme
  })
});
dart.defineLazy(io._AuthenticationScheme, {
  get UNKNOWN() {
    return dart.const(new io._AuthenticationScheme(-1));
  },
  get BASIC() {
    return dart.const(new io._AuthenticationScheme(0));
  },
  get DIGEST() {
    return dart.const(new io._AuthenticationScheme(1));
  }
});
io._Credentials = class _Credentials extends core.Object {
  new(credentials, realm) {
    this.credentials = credentials;
    this.realm = realm;
    this.used = false;
    this.ha1 = null;
    this.nonce = null;
    this.algorithm = null;
    this.qop = null;
    this.nonceCount = null;
    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST)) {
      let creds = io._HttpClientDigestCredentials._check(this.credentials);
      let hasher = new io._MD5();
      hasher.add(convert.UTF8.encode(creds.username));
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(this.realm[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(convert.UTF8.encode(creds.password));
      this.ha1 = io._CryptoUtils.bytesToHex(hasher.close());
    }
  }
  get scheme() {
    return this.credentials.scheme;
  }
};
dart.setSignature(io._Credentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._Credentials, [io._HttpClientCredentials, core.String])}),
  fields: () => ({
    credentials: io._HttpClientCredentials,
    realm: core.String,
    used: core.bool,
    ha1: core.String,
    nonce: core.String,
    algorithm: core.String,
    qop: core.String,
    nonceCount: core.int
  }),
  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])})
});
io._SiteCredentials = class _SiteCredentials extends io._Credentials {
  new(uri, realm, creds) {
    this.uri = uri;
    super.new(creds, core.String._check(realm));
  }
  applies(uri, scheme) {
    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
    if (uri.host != this.uri.host) return false;
    let thisPort = this.uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
    let otherPort = uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : uri.port;
    if (otherPort != thisPort) return false;
    return uri.path[dartx.startsWith](this.uri.path);
  }
  authorize(request) {
    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
      return;
    }
    this.credentials.authorize(this, request);
    this.used = true;
  }
};
dart.setSignature(io._SiteCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._SiteCredentials, [core.Uri, dart.dynamic, io._HttpClientCredentials])}),
  fields: () => ({uri: core.Uri}),
  methods: () => ({
    applies: dart.definiteFunctionType(core.bool, [core.Uri, io._AuthenticationScheme]),
    authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
  })
});
io._ProxyCredentials = class _ProxyCredentials extends io._Credentials {
  new(host, port, realm, creds) {
    this.host = host;
    this.port = port;
    super.new(creds, core.String._check(realm));
  }
  applies(proxy, scheme) {
    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
    return proxy.host == this.host && proxy.port == this.port;
  }
  authorize(request) {
    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
      return;
    }
    this.credentials.authorizeProxy(this, request);
  }
};
dart.setSignature(io._ProxyCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._ProxyCredentials, [core.String, core.int, dart.dynamic, io._HttpClientCredentials])}),
  fields: () => ({
    host: core.String,
    port: core.int
  }),
  methods: () => ({
    applies: dart.definiteFunctionType(core.bool, [io._Proxy, io._AuthenticationScheme]),
    authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
  })
});
io._HttpClientCredentials = class _HttpClientCredentials extends core.Object {};
io._HttpClientCredentials[dart.implements] = () => [io.HttpClientCredentials];
io._HttpClientBasicCredentials = class _HttpClientBasicCredentials extends io._HttpClientCredentials {
  new(username, password) {
    this.username = username;
    this.password = password;
  }
  get scheme() {
    return io._AuthenticationScheme.BASIC;
  }
  authorization() {
    let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${this.username}:${this.password}`));
    return dart.str`Basic ${auth}`;
  }
  authorize(_, request) {
    request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization());
  }
  authorizeProxy(_, request) {
    request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization());
  }
};
io._HttpClientBasicCredentials[dart.implements] = () => [io.HttpClientBasicCredentials];
dart.setSignature(io._HttpClientBasicCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientBasicCredentials, [core.String, core.String])}),
  fields: () => ({
    username: core.String,
    password: core.String
  }),
  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
  methods: () => ({
    authorization: dart.definiteFunctionType(core.String, []),
    authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
    authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
  })
});
io._HttpClientDigestCredentials = class _HttpClientDigestCredentials extends io._HttpClientCredentials {
  new(username, password) {
    this.username = username;
    this.password = password;
  }
  get scheme() {
    return io._AuthenticationScheme.DIGEST;
  }
  authorization(credentials, request) {
    let requestUri = request[_requestUri]();
    let hasher = new io._MD5();
    hasher.add(request.method[dartx.codeUnits]);
    hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
    hasher.add(requestUri[dartx.codeUnits]);
    let ha2 = io._CryptoUtils.bytesToHex(hasher.close());
    let qop = null;
    let cnonce = null;
    let nc = null;
    let x = null;
    hasher = new io._MD5();
    hasher.add(credentials.ha1[dartx.codeUnits]);
    hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
    if (credentials.qop == "auth") {
      qop = credentials.qop;
      cnonce = io._CryptoUtils.bytesToHex(io._IOCrypto.getRandomBytes(4));
      credentials.nonceCount = dart.notNull(credentials.nonceCount) + 1;
      nc = credentials.nonceCount[dartx.toRadixString](16);
      nc = dart.notNull("00000000"[dartx.substring](0, 8 - dart.notNull(nc[dartx.length]) + 1)) + dart.notNull(nc);
      hasher.add(credentials.nonce[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(nc[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(cnonce[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(credentials.qop[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(ha2[dartx.codeUnits]);
    } else {
      hasher.add(credentials.nonce[dartx.codeUnits]);
      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
      hasher.add(ha2[dartx.codeUnits]);
    }
    let response = io._CryptoUtils.bytesToHex(hasher.close());
    let buffer = new core.StringBuffer();
    buffer.write('Digest ');
    buffer.write(dart.str`username="${this.username}"`);
    buffer.write(dart.str`, realm="${credentials.realm}"`);
    buffer.write(dart.str`, nonce="${credentials.nonce}"`);
    buffer.write(dart.str`, uri="${requestUri}"`);
    buffer.write(dart.str`, algorithm="${credentials.algorithm}"`);
    if (qop == "auth") {
      buffer.write(dart.str`, qop="${qop}"`);
      buffer.write(dart.str`, cnonce="${cnonce}"`);
      buffer.write(dart.str`, nc="${nc}"`);
    }
    buffer.write(dart.str`, response="${response}"`);
    return buffer.toString();
  }
  authorize(credentials, request) {
    request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
  }
  authorizeProxy(credentials, request) {
    request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
  }
};
io._HttpClientDigestCredentials[dart.implements] = () => [io.HttpClientDigestCredentials];
dart.setSignature(io._HttpClientDigestCredentials, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientDigestCredentials, [core.String, core.String])}),
  fields: () => ({
    username: core.String,
    password: core.String
  }),
  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
  methods: () => ({
    authorization: dart.definiteFunctionType(core.String, [io._Credentials, io._HttpClientRequest]),
    authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
    authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
  })
});
io._RedirectInfo = class _RedirectInfo extends core.Object {
  new(statusCode, method, location) {
    this.statusCode = statusCode;
    this.method = method;
    this.location = location;
  }
};
io._RedirectInfo[dart.implements] = () => [io.RedirectInfo];
dart.setSignature(io._RedirectInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._RedirectInfo, [core.int, core.String, core.Uri])}),
  fields: () => ({
    statusCode: core.int,
    method: core.String,
    location: core.Uri
  })
});
io._getHttpVersion = function() {
  let version = io.Platform.version;
  let index = version[dartx.indexOf]('.', dart.notNull(version[dartx.indexOf]('.')) + 1);
  version = version[dartx.substring](0, index);
  return dart.str`Dart/${version} (dart:io)`;
};
dart.fn(io._getHttpVersion, VoidToString());
io._Const = class _Const extends core.Object {};
dart.setSignature(io._Const, {
  sfields: () => ({
    HTTP: ListOfint(),
    HTTP1DOT: ListOfint(),
    HTTP10: ListOfint(),
    HTTP11: ListOfint(),
    T: core.bool,
    F: core.bool,
    SEPARATOR_MAP: ListOfbool()
  })
});
io._Const.HTTP = dart.constList([72, 84, 84, 80], core.int);
io._Const.HTTP1DOT = dart.constList([72, 84, 84, 80, 47, 49, 46], core.int);
io._Const.HTTP10 = dart.constList([72, 84, 84, 80, 47, 49, 46, 48], core.int);
io._Const.HTTP11 = dart.constList([72, 84, 84, 80, 47, 49, 46, 49], core.int);
io._Const.T = true;
io._Const.F = false;
dart.defineLazy(io._Const, {
  get SEPARATOR_MAP() {
    return dart.constList([io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F], core.bool);
  }
});
io._CharCode = class _CharCode extends core.Object {};
dart.setSignature(io._CharCode, {
  sfields: () => ({
    HT: core.int,
    LF: core.int,
    CR: core.int,
    SP: core.int,
    AMPERSAND: core.int,
    COMMA: core.int,
    DASH: core.int,
    SLASH: core.int,
    ZERO: core.int,
    ONE: core.int,
    COLON: core.int,
    SEMI_COLON: core.int,
    EQUAL: core.int
  })
});
io._CharCode.HT = 9;
io._CharCode.LF = 10;
io._CharCode.CR = 13;
io._CharCode.SP = 32;
io._CharCode.AMPERSAND = 38;
io._CharCode.COMMA = 44;
io._CharCode.DASH = 45;
io._CharCode.SLASH = 47;
io._CharCode.ZERO = 48;
io._CharCode.ONE = 49;
io._CharCode.COLON = 58;
io._CharCode.SEMI_COLON = 59;
io._CharCode.EQUAL = 61;
io._State = class _State extends core.Object {};
dart.setSignature(io._State, {
  sfields: () => ({
    START: core.int,
    METHOD_OR_RESPONSE_HTTP_VERSION: core.int,
    RESPONSE_HTTP_VERSION: core.int,
    REQUEST_LINE_METHOD: core.int,
    REQUEST_LINE_URI: core.int,
    REQUEST_LINE_HTTP_VERSION: core.int,
    REQUEST_LINE_ENDING: core.int,
    RESPONSE_LINE_STATUS_CODE: core.int,
    RESPONSE_LINE_REASON_PHRASE: core.int,
    RESPONSE_LINE_ENDING: core.int,
    HEADER_START: core.int,
    HEADER_FIELD: core.int,
    HEADER_VALUE_START: core.int,
    HEADER_VALUE: core.int,
    HEADER_VALUE_FOLDING_OR_ENDING: core.int,
    HEADER_VALUE_FOLD_OR_END: core.int,
    HEADER_ENDING: core.int,
    CHUNK_SIZE_STARTING_CR: core.int,
    CHUNK_SIZE_STARTING_LF: core.int,
    CHUNK_SIZE: core.int,
    CHUNK_SIZE_EXTENSION: core.int,
    CHUNK_SIZE_ENDING: core.int,
    CHUNKED_BODY_DONE_CR: core.int,
    CHUNKED_BODY_DONE_LF: core.int,
    BODY: core.int,
    CLOSED: core.int,
    UPGRADED: core.int,
    FAILURE: core.int,
    FIRST_BODY_STATE: core.int
  })
});
io._State.START = 0;
io._State.METHOD_OR_RESPONSE_HTTP_VERSION = 1;
io._State.RESPONSE_HTTP_VERSION = 2;
io._State.REQUEST_LINE_METHOD = 3;
io._State.REQUEST_LINE_URI = 4;
io._State.REQUEST_LINE_HTTP_VERSION = 5;
io._State.REQUEST_LINE_ENDING = 6;
io._State.RESPONSE_LINE_STATUS_CODE = 7;
io._State.RESPONSE_LINE_REASON_PHRASE = 8;
io._State.RESPONSE_LINE_ENDING = 9;
io._State.HEADER_START = 10;
io._State.HEADER_FIELD = 11;
io._State.HEADER_VALUE_START = 12;
io._State.HEADER_VALUE = 13;
io._State.HEADER_VALUE_FOLDING_OR_ENDING = 14;
io._State.HEADER_VALUE_FOLD_OR_END = 15;
io._State.HEADER_ENDING = 16;
io._State.CHUNK_SIZE_STARTING_CR = 17;
io._State.CHUNK_SIZE_STARTING_LF = 18;
io._State.CHUNK_SIZE = 19;
io._State.CHUNK_SIZE_EXTENSION = 20;
io._State.CHUNK_SIZE_ENDING = 21;
io._State.CHUNKED_BODY_DONE_CR = 22;
io._State.CHUNKED_BODY_DONE_LF = 23;
io._State.BODY = 24;
io._State.CLOSED = 25;
io._State.UPGRADED = 26;
io._State.FAILURE = 27;
dart.defineLazy(io._State, {
  get FIRST_BODY_STATE() {
    return io._State.CHUNK_SIZE_STARTING_CR;
  }
});
io._HttpVersion = class _HttpVersion extends core.Object {};
dart.setSignature(io._HttpVersion, {
  sfields: () => ({
    UNDETERMINED: core.int,
    HTTP10: core.int,
    HTTP11: core.int
  })
});
io._HttpVersion.UNDETERMINED = 0;
io._HttpVersion.HTTP10 = 1;
io._HttpVersion.HTTP11 = 2;
io._MessageType = class _MessageType extends core.Object {};
dart.setSignature(io._MessageType, {
  sfields: () => ({
    UNDETERMINED: core.int,
    REQUEST: core.int,
    RESPONSE: core.int
  })
});
io._MessageType.UNDETERMINED = 0;
io._MessageType.REQUEST = 1;
io._MessageType.RESPONSE = 0;
const _injectData = Symbol('_injectData');
const _userOnData = Symbol('_userOnData');
const _isCanceled = Symbol('_isCanceled');
const _pauseCount = Symbol('_pauseCount');
const _scheduled = Symbol('_scheduled');
const _maybeScheduleData = Symbol('_maybeScheduleData');
io._HttpDetachedStreamSubscription = class _HttpDetachedStreamSubscription extends core.Object {
  new(subscription, injectData, userOnData) {
    this[_subscription] = subscription;
    this[_injectData] = injectData;
    this[_userOnData] = userOnData;
    this[_isCanceled] = false;
    this[_pauseCount] = 1;
    this[_scheduled] = false;
  }
  get isPaused() {
    return this[_subscription].isPaused;
  }
  asFuture(T) {
    return futureValue => {
      if (futureValue === void 0) futureValue = null;
      return this[_subscription].asFuture(T)(futureValue);
    };
  }
  cancel() {
    this[_isCanceled] = true;
    this[_injectData] = null;
    return this[_subscription].cancel();
  }
  onData(handleData) {
    this[_userOnData] = handleData;
    this[_subscription].onData(handleData);
  }
  onDone(handleDone) {
    this[_subscription].onDone(handleDone);
  }
  onError(handleError) {
    this[_subscription].onError(handleError);
  }
  pause(resumeSignal) {
    if (resumeSignal === void 0) resumeSignal = null;
    if (this[_injectData] == null) {
      this[_subscription].pause(resumeSignal);
    } else {
      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
      if (resumeSignal != null) {
        resumeSignal.whenComplete(dart.bind(this, 'resume'));
      }
    }
  }
  resume() {
    if (this[_injectData] == null) {
      this[_subscription].resume();
    } else {
      this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
      this[_maybeScheduleData]();
    }
  }
  [_maybeScheduleData]() {
    if (dart.test(this[_scheduled])) return;
    if (this[_pauseCount] != 0) return;
    this[_scheduled] = true;
    async.scheduleMicrotask(dart.fn(() => {
      this[_scheduled] = false;
      if (dart.notNull(this[_pauseCount]) > 0 || dart.test(this[_isCanceled])) return;
      let data = this[_injectData];
      this[_injectData] = null;
      this[_subscription].resume();
      if (this[_userOnData] != null) {
        dart.dcall(this[_userOnData], data);
      }
    }, VoidToNull()));
  }
};
io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
dart.setSignature(io._HttpDetachedStreamSubscription, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedStreamSubscription, [StreamSubscriptionOfListOfint(), ListOfint(), core.Function])}),
  fields: () => ({
    [_subscription]: StreamSubscriptionOfListOfint(),
    [_injectData]: ListOfint(),
    [_isCanceled]: core.bool,
    [_pauseCount]: core.int,
    [_userOnData]: core.Function,
    [_scheduled]: core.bool
  }),
  getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
  methods: () => ({
    asFuture: dart.definiteFunctionType(T => [async.Future$(T), [], [T]]),
    cancel: dart.definiteFunctionType(async.Future, []),
    onData: dart.definiteFunctionType(dart.void, [ListOfintTovoid()]),
    onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
    onError: dart.definiteFunctionType(dart.void, [core.Function]),
    pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
    resume: dart.definiteFunctionType(dart.void, []),
    [_maybeScheduleData]: dart.definiteFunctionType(dart.void, [])
  })
});
io._HttpDetachedIncoming = class _HttpDetachedIncoming extends async.Stream$(core.List$(core.int)) {
  new(subscription, bufferedData) {
    this.subscription = subscription;
    this.bufferedData = bufferedData;
    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;
    if (this.subscription != null) {
      this.subscription.onData(onData);
      this.subscription.onError(onError);
      this.subscription.onDone(onDone);
      if (this.bufferedData == null) {
        return StreamSubscriptionOfListOfint()._check(((() => {
          this.subscription.resume();
          return this.subscription;
        })()));
      }
      let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
      _.resume();
      return _;
    } else {
      return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
    }
  }
};
dart.addSimpleTypeTests(io._HttpDetachedIncoming);
dart.setSignature(io._HttpDetachedIncoming, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedIncoming, [async.StreamSubscription, ListOfint()])}),
  fields: () => ({
    subscription: async.StreamSubscription,
    bufferedData: ListOfint()
  }),
  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
});
const _method = Symbol('_method');
const _uri_or_reason_phrase = Symbol('_uri_or_reason_phrase');
const _headerField = Symbol('_headerField');
const _headerValue = Symbol('_headerValue');
const _requestParser = Symbol('_requestParser');
const _parserCalled = Symbol('_parserCalled');
const _index = Symbol('_index');
const _httpVersionIndex = Symbol('_httpVersionIndex');
const _messageType = Symbol('_messageType');
const _statusCodeLength = Symbol('_statusCodeLength');
const _httpVersion = Symbol('_httpVersion');
const _connectionUpgrade = Symbol('_connectionUpgrade');
const _chunked = Symbol('_chunked');
const _noMessageBody = Symbol('_noMessageBody');
const _remainingContent = Symbol('_remainingContent');
const _socketSubscription = Symbol('_socketSubscription');
const _paused = Symbol('_paused');
const _bodyPaused = Symbol('_bodyPaused');
const _bodyController = Symbol('_bodyController');
const _pauseStateChanged = Symbol('_pauseStateChanged');
const _reset = Symbol('_reset');
const _onData = Symbol('_onData');
const _onDone = Symbol('_onDone');
const _doParse = Symbol('_doParse');
const _reportError = Symbol('_reportError');
const _createIncoming = Symbol('_createIncoming');
const _closeIncoming = Symbol('_closeIncoming');
const _headersEnd = Symbol('_headersEnd');
const _expect = Symbol('_expect');
const _caseInsensitiveCompare = Symbol('_caseInsensitiveCompare');
const _expectHexDigit = Symbol('_expectHexDigit');
const _releaseBuffer = Symbol('_releaseBuffer');
io._HttpParser = class _HttpParser extends async.Stream$(io._HttpIncoming) {
  static requestParser() {
    return new io._HttpParser._(true);
  }
  static responseParser() {
    return new io._HttpParser._(false);
  }
  _(requestParser) {
    this[_method] = JSArrayOfint().of([]);
    this[_uri_or_reason_phrase] = JSArrayOfint().of([]);
    this[_headerField] = JSArrayOfint().of([]);
    this[_headerValue] = JSArrayOfint().of([]);
    this[_requestParser] = requestParser;
    this[_parserCalled] = false;
    this[_buffer] = null;
    this[_index] = null;
    this[_state] = null;
    this[_httpVersionIndex] = null;
    this[_messageType] = null;
    this[_statusCode] = 0;
    this[_statusCodeLength] = 0;
    this[_httpVersion] = null;
    this[_transferLength] = -1;
    this[_persistentConnection] = null;
    this[_connectionUpgrade] = null;
    this[_chunked] = null;
    this[_noMessageBody] = false;
    this[_remainingContent] = -1;
    this[_headers] = null;
    this[_incoming] = null;
    this[_socketSubscription] = null;
    this[_paused] = true;
    this[_bodyPaused] = false;
    this[_controller] = null;
    this[_bodyController] = null;
    super.new();
    this[_controller] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
        this[_paused] = false;
      }, VoidToNull()), onPause: dart.fn(() => {
        this[_paused] = true;
        this[_pauseStateChanged]();
      }, VoidToNull()), onResume: dart.fn(() => {
        this[_paused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onCancel: dart.fn(() => {
        if (this[_socketSubscription] != null) {
          this[_socketSubscription].cancel();
        }
      }, VoidToNull())});
    this[_reset]();
  }
  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});
  }
  listenToStream(stream) {
    this[_socketSubscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this, _onDone)});
  }
  [_parse]() {
    try {
      this[_doParse]();
    } catch (e) {
      let s = dart.stackTrace(e);
      this[_state] = io._State.FAILURE;
      this[_reportError](e, s);
    }

  }
  [_headersEnd]() {
    this[_headers][_mutable] = false;
    this[_transferLength] = this[_headers].contentLength;
    if (dart.test(this[_chunked])) this[_transferLength] = -1;
    if (this[_messageType] == io._MessageType.REQUEST && dart.notNull(this[_transferLength]) < 0 && this[_chunked] == false) {
      this[_transferLength] = 0;
    }
    if (dart.test(this[_connectionUpgrade])) {
      this[_state] = io._State.UPGRADED;
      this[_transferLength] = 0;
    }
    this[_createIncoming](this[_transferLength]);
    if (dart.test(this[_requestParser])) {
      this[_incoming].method = core.String.fromCharCodes(this[_method]);
      this[_incoming].uri = core.Uri.parse(core.String.fromCharCodes(this[_uri_or_reason_phrase]));
    } else {
      this[_incoming].statusCode = this[_statusCode];
      this[_incoming].reasonPhrase = core.String.fromCharCodes(this[_uri_or_reason_phrase]);
    }
    this[_method][dartx.clear]();
    this[_uri_or_reason_phrase][dartx.clear]();
    if (dart.test(this[_connectionUpgrade])) {
      this[_incoming].upgraded = true;
      this[_parserCalled] = false;
      let tmp = this[_incoming];
      this[_closeIncoming]();
      this[_controller].add(tmp);
      return true;
    }
    if (this[_transferLength] == 0 || this[_messageType] == io._MessageType.RESPONSE && dart.test(this[_noMessageBody])) {
      this[_reset]();
      let tmp = this[_incoming];
      this[_closeIncoming]();
      this[_controller].add(tmp);
      return false;
    } else if (dart.test(this[_chunked])) {
      this[_state] = io._State.CHUNK_SIZE;
      this[_remainingContent] = 0;
    } else if (dart.notNull(this[_transferLength]) > 0) {
      this[_remainingContent] = this[_transferLength];
      this[_state] = io._State.BODY;
    } else {
      this[_state] = io._State.BODY;
    }
    this[_parserCalled] = false;
    this[_controller].add(this[_incoming]);
    return true;
  }
  [_doParse]() {
    dart.assert(!dart.test(this[_parserCalled]));
    this[_parserCalled] = true;
    if (this[_state] == io._State.CLOSED) {
      dart.throw(new io.HttpException("Data on closed connection"));
    }
    if (this[_state] == io._State.FAILURE) {
      dart.throw(new io.HttpException("Data on failed connection"));
    }
    while (this[_buffer] != null && dart.notNull(this[_index]) < dart.notNull(this[_buffer][dartx.length]) && this[_state] != io._State.FAILURE && this[_state] != io._State.UPGRADED) {
      if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
        this[_parserCalled] = false;
        return;
      }
      let byte = this[_buffer][dartx._get]((() => {
        let x = this[_index];
        this[_index] = dart.notNull(x) + 1;
        return x;
      })());
      switch (this[_state]) {
        case io._State.START:
        {
          if (byte == io._Const.HTTP[dartx._get](0)) {
            this[_httpVersionIndex] = 1;
            this[_state] = io._State.METHOD_OR_RESPONSE_HTTP_VERSION;
          } else {
            if (!dart.test(io._HttpParser._isTokenChar(byte))) {
              dart.throw(new io.HttpException("Invalid request method"));
            }
            this[_method][dartx.add](byte);
            if (!dart.test(this[_requestParser])) {
              dart.throw(new io.HttpException("Invalid response line"));
            }
            this[_state] = io._State.REQUEST_LINE_METHOD;
          }
          break;
        }
        case io._State.METHOD_OR_RESPONSE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP[dartx.length]) && byte == io._Const.HTTP[dartx._get](this[_httpVersionIndex])) {
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP[dartx.length] && byte == io._CharCode.SLASH) {
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            if (dart.test(this[_requestParser])) {
              dart.throw(new io.HttpException("Invalid request line"));
            }
            this[_state] = io._State.RESPONSE_HTTP_VERSION;
          } else {
            for (let i = 0; i < dart.notNull(this[_httpVersionIndex]); i++) {
              this[_method][dartx.add](io._Const.HTTP[dartx._get](i));
            }
            if (byte == io._CharCode.SP) {
              this[_state] = io._State.REQUEST_LINE_URI;
            } else {
              this[_method][dartx.add](byte);
              this[_httpVersion] = io._HttpVersion.UNDETERMINED;
              if (!dart.test(this[_requestParser])) {
                dart.throw(new io.HttpException("Invalid response line"));
              }
              this[_state] = io._State.REQUEST_LINE_METHOD;
            }
          }
          break;
        }
        case io._State.RESPONSE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
            this[_expect](byte, io._Const.HTTP1DOT[dartx._get](this[_httpVersionIndex]));
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ONE) {
            this[_httpVersion] = io._HttpVersion.HTTP11;
            this[_persistentConnection] = true;
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ZERO) {
            this[_httpVersion] = io._HttpVersion.HTTP10;
            this[_persistentConnection] = false;
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == dart.notNull(io._Const.HTTP1DOT[dartx.length]) + 1) {
            this[_expect](byte, io._CharCode.SP);
            this[_state] = io._State.RESPONSE_LINE_STATUS_CODE;
          } else {
            dart.throw(new io.HttpException("Invalid response line"));
          }
          break;
        }
        case io._State.REQUEST_LINE_METHOD:
        {
          if (byte == io._CharCode.SP) {
            this[_state] = io._State.REQUEST_LINE_URI;
          } else {
            if (dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte)) || byte == io._CharCode.CR || byte == io._CharCode.LF) {
              dart.throw(new io.HttpException("Invalid request method"));
            }
            this[_method][dartx.add](byte);
          }
          break;
        }
        case io._State.REQUEST_LINE_URI:
        {
          if (byte == io._CharCode.SP) {
            if (this[_uri_or_reason_phrase][dartx.length] == 0) {
              dart.throw(new io.HttpException("Invalid request URI"));
            }
            this[_state] = io._State.REQUEST_LINE_HTTP_VERSION;
            this[_httpVersionIndex] = 0;
          } else {
            if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
              dart.throw(new io.HttpException("Invalid request URI"));
            }
            this[_uri_or_reason_phrase][dartx.add](byte);
          }
          break;
        }
        case io._State.REQUEST_LINE_HTTP_VERSION:
        {
          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
            this[_expect](byte, io._Const.HTTP11[dartx._get](this[_httpVersionIndex]));
            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length]) {
            if (byte == io._CharCode.ONE) {
              this[_httpVersion] = io._HttpVersion.HTTP11;
              this[_persistentConnection] = true;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else if (byte == io._CharCode.ZERO) {
              this[_httpVersion] = io._HttpVersion.HTTP10;
              this[_persistentConnection] = false;
              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
            } else {
              dart.throw(new io.HttpException("Invalid response line"));
            }
          } else {
            if (byte == io._CharCode.CR) {
              this[_state] = io._State.REQUEST_LINE_ENDING;
            } else {
              this[_expect](byte, io._CharCode.LF);
              this[_messageType] = io._MessageType.REQUEST;
              this[_state] = io._State.HEADER_START;
            }
          }
          break;
        }
        case io._State.REQUEST_LINE_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_messageType] = io._MessageType.REQUEST;
          this[_state] = io._State.HEADER_START;
          break;
        }
        case io._State.RESPONSE_LINE_STATUS_CODE:
        {
          if (byte == io._CharCode.SP) {
            this[_state] = io._State.RESPONSE_LINE_REASON_PHRASE;
          } else if (byte == io._CharCode.CR) {
            this[_state] = io._State.RESPONSE_LINE_ENDING;
          } else {
            this[_statusCodeLength] = dart.notNull(this[_statusCodeLength]) + 1;
            if (dart.notNull(byte) < 48 && 57 < dart.notNull(byte) || dart.notNull(this[_statusCodeLength]) > 3) {
              dart.throw(new io.HttpException("Invalid response status code"));
            } else {
              this[_statusCode] = dart.notNull(this[_statusCode]) * 10 + dart.notNull(byte) - 48;
            }
          }
          break;
        }
        case io._State.RESPONSE_LINE_REASON_PHRASE:
        {
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.RESPONSE_LINE_ENDING;
          } else {
            if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
              dart.throw(new io.HttpException("Invalid response reason phrase"));
            }
            this[_uri_or_reason_phrase][dartx.add](byte);
          }
          break;
        }
        case io._State.RESPONSE_LINE_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_messageType] == io._MessageType.RESPONSE;
          if (dart.notNull(this[_statusCode]) < 100 || dart.notNull(this[_statusCode]) > 599) {
            dart.throw(new io.HttpException("Invalid response status code"));
          } else {
            if (dart.notNull(this[_statusCode]) <= 199 || this[_statusCode] == 204 || this[_statusCode] == 304) {
              this[_noMessageBody] = true;
            }
          }
          this[_state] = io._State.HEADER_START;
          break;
        }
        case io._State.HEADER_START:
        {
          this[_headers] = new io._HttpHeaders(this.version);
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.HEADER_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state] = io._State.HEADER_ENDING;
            this[_index] = dart.notNull(this[_index]) - 1;
          } else {
            this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
            this[_state] = io._State.HEADER_FIELD;
          }
          break;
        }
        case io._State.HEADER_FIELD:
        {
          if (byte == io._CharCode.COLON) {
            this[_state] = io._State.HEADER_VALUE_START;
          } else {
            if (!dart.test(io._HttpParser._isTokenChar(byte))) {
              dart.throw(new io.HttpException("Invalid header field name"));
            }
            this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
          }
          break;
        }
        case io._State.HEADER_VALUE_START:
        {
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state] = io._State.HEADER_VALUE_FOLD_OR_END;
          } else if (byte != io._CharCode.SP && byte != io._CharCode.HT) {
            this[_headerValue][dartx.add](byte);
            this[_state] = io._State.HEADER_VALUE;
          }
          break;
        }
        case io._State.HEADER_VALUE:
        {
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
          } else if (byte == io._CharCode.LF) {
            this[_state] = io._State.HEADER_VALUE_FOLD_OR_END;
          } else {
            this[_headerValue][dartx.add](byte);
          }
          break;
        }
        case io._State.HEADER_VALUE_FOLDING_OR_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_state] = io._State.HEADER_VALUE_FOLD_OR_END;
          break;
        }
        case io._State.HEADER_VALUE_FOLD_OR_END:
        {
          if (byte == io._CharCode.SP || byte == io._CharCode.HT) {
            this[_state] = io._State.HEADER_VALUE_START;
          } else {
            let headerField = core.String.fromCharCodes(this[_headerField]);
            let headerValue = core.String.fromCharCodes(this[_headerValue]);
            if (headerField == "transfer-encoding" && dart.test(this[_caseInsensitiveCompare]("chunked"[dartx.codeUnits], this[_headerValue]))) {
              this[_chunked] = true;
            }
            if (headerField == "connection") {
              let tokens = io._HttpParser._tokenizeFieldValue(headerValue);
              for (let i = 0; i < dart.notNull(tokens[dartx.length]); i++) {
                if (dart.test(this[_caseInsensitiveCompare]("upgrade"[dartx.codeUnits], tokens[dartx._get](i)[dartx.codeUnits]))) {
                  this[_connectionUpgrade] = true;
                }
                this[_headers][_add](headerField, tokens[dartx._get](i));
              }
            } else {
              this[_headers][_add](headerField, headerValue);
            }
            this[_headerField][dartx.clear]();
            this[_headerValue][dartx.clear]();
            if (byte == io._CharCode.CR) {
              this[_state] = io._State.HEADER_ENDING;
            } else if (byte == io._CharCode.LF) {
              this[_state] = io._State.HEADER_ENDING;
              this[_index] = dart.notNull(this[_index]) - 1;
            } else {
              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
              this[_state] = io._State.HEADER_FIELD;
            }
          }
          break;
        }
        case io._State.HEADER_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          if (dart.test(this[_headersEnd]())) {
            return;
          } else {
            break;
          }
          return;
        }
        case io._State.CHUNK_SIZE_STARTING_CR:
        {
          this[_expect](byte, io._CharCode.CR);
          this[_state] = io._State.CHUNK_SIZE_STARTING_LF;
          break;
        }
        case io._State.CHUNK_SIZE_STARTING_LF:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_state] = io._State.CHUNK_SIZE;
          break;
        }
        case io._State.CHUNK_SIZE:
        {
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.CHUNK_SIZE_ENDING;
          } else if (byte == io._CharCode.SEMI_COLON) {
            this[_state] = io._State.CHUNK_SIZE_EXTENSION;
          } else {
            let value = this[_expectHexDigit](byte);
            this[_remainingContent] = dart.notNull(this[_remainingContent]) * 16 + dart.notNull(value);
          }
          break;
        }
        case io._State.CHUNK_SIZE_EXTENSION:
        {
          if (byte == io._CharCode.CR) {
            this[_state] = io._State.CHUNK_SIZE_ENDING;
          }
          break;
        }
        case io._State.CHUNK_SIZE_ENDING:
        {
          this[_expect](byte, io._CharCode.LF);
          if (dart.notNull(this[_remainingContent]) > 0) {
            this[_state] = io._State.BODY;
          } else {
            this[_state] = io._State.CHUNKED_BODY_DONE_CR;
          }
          break;
        }
        case io._State.CHUNKED_BODY_DONE_CR:
        {
          this[_expect](byte, io._CharCode.CR);
          this[_state] = io._State.CHUNKED_BODY_DONE_LF;
          break;
        }
        case io._State.CHUNKED_BODY_DONE_LF:
        {
          this[_expect](byte, io._CharCode.LF);
          this[_reset]();
          this[_closeIncoming]();
          break;
        }
        case io._State.BODY:
        {
          this[_index] = dart.notNull(this[_index]) - 1;
          let dataAvailable = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_index]);
          if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
            dataAvailable = this[_remainingContent];
          }
          let data = typed_data.Uint8List.view(this[_buffer][dartx.buffer], dart.notNull(this[_buffer][dartx.offsetInBytes]) + dart.notNull(this[_index]), dataAvailable);
          this[_bodyController].add(data);
          if (this[_remainingContent] != -1) {
            this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
          }
          this[_index] = dart.notNull(this[_index]) + dart.notNull(data[dartx.length]);
          if (this[_remainingContent] == 0) {
            if (!dart.test(this[_chunked])) {
              this[_reset]();
              this[_closeIncoming]();
            } else {
              this[_state] = io._State.CHUNK_SIZE_STARTING_CR;
            }
          }
          break;
        }
        case io._State.FAILURE:
        {
          dart.assert(false);
          break;
        }
        default:
        {
          dart.assert(false);
          break;
        }
      }
    }
    this[_parserCalled] = false;
    if (this[_buffer] != null && this[_index] == this[_buffer][dartx.length]) {
      this[_releaseBuffer]();
      if (this[_state] != io._State.UPGRADED && this[_state] != io._State.FAILURE) {
        this[_socketSubscription].resume();
      }
    }
  }
  [_onData](buffer) {
    this[_socketSubscription].pause();
    dart.assert(this[_buffer] == null);
    this[_buffer] = typed_data.Uint8List._check(buffer);
    this[_index] = 0;
    this[_parse]();
  }
  [_onDone]() {
    this[_socketSubscription] = null;
    if (this[_state] == io._State.CLOSED || this[_state] == io._State.FAILURE) return;
    if (this[_incoming] != null) {
      if (this[_state] != io._State.UPGRADED && !(this[_state] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state] == io._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] == -1)) {
        this[_bodyController].addError(new io.HttpException("Connection closed while receiving data"));
      }
      this[_closeIncoming](true);
      this[_controller].close();
      return;
    }
    if (this[_state] == io._State.START) {
      if (!dart.test(this[_requestParser])) {
        this[_reportError](new io.HttpException("Connection closed before full header was received"));
      }
      this[_controller].close();
      return;
    }
    if (this[_state] == io._State.UPGRADED) {
      this[_controller].close();
      return;
    }
    if (dart.notNull(this[_state]) < io._State.FIRST_BODY_STATE) {
      this[_state] = io._State.FAILURE;
      this[_reportError](new io.HttpException("Connection closed before full header was received"));
      this[_controller].close();
      return;
    }
    if (!dart.test(this[_chunked]) && this[_transferLength] == -1) {
      this[_state] = io._State.CLOSED;
    } else {
      this[_state] = io._State.FAILURE;
      this[_reportError](new io.HttpException("Connection closed before full body was received"));
    }
    this[_controller].close();
  }
  get version() {
    switch (this[_httpVersion]) {
      case io._HttpVersion.HTTP10:
      {
        return "1.0";
      }
      case io._HttpVersion.HTTP11:
      {
        return "1.1";
      }
    }
    return null;
  }
  get messageType() {
    return this[_messageType];
  }
  get transferLength() {
    return this[_transferLength];
  }
  get upgrade() {
    return dart.test(this[_connectionUpgrade]) && this[_state] == io._State.UPGRADED;
  }
  get persistentConnection() {
    return this[_persistentConnection];
  }
  set isHead(value) {
    if (dart.test(value)) this[_noMessageBody] = true;
  }
  detachIncoming() {
    this[_state] = io._State.UPGRADED;
    return new io._HttpDetachedIncoming(this[_socketSubscription], this.readUnparsedData());
  }
  readUnparsedData() {
    if (this[_buffer] == null) return null;
    if (this[_index] == this[_buffer][dartx.length]) return null;
    let result = this[_buffer][dartx.sublist](this[_index]);
    this[_releaseBuffer]();
    return result;
  }
  [_reset]() {
    if (this[_state] == io._State.UPGRADED) return;
    this[_state] = io._State.START;
    this[_messageType] = io._MessageType.UNDETERMINED;
    this[_headerField][dartx.clear]();
    this[_headerValue][dartx.clear]();
    this[_method][dartx.clear]();
    this[_uri_or_reason_phrase][dartx.clear]();
    this[_statusCode] = 0;
    this[_statusCodeLength] = 0;
    this[_httpVersion] = io._HttpVersion.UNDETERMINED;
    this[_transferLength] = -1;
    this[_persistentConnection] = false;
    this[_connectionUpgrade] = false;
    this[_chunked] = false;
    this[_noMessageBody] = false;
    this[_remainingContent] = -1;
    this[_headers] = null;
  }
  [_releaseBuffer]() {
    this[_buffer] = null;
    this[_index] = null;
  }
  static _isTokenChar(byte) {
    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
  }
  static _isValueChar(byte) {
    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 || byte == io._CharCode.SP || byte == io._CharCode.HT;
  }
  static _tokenizeFieldValue(headerValue) {
    let tokens = ListOfString().new();
    let start = 0;
    let index = 0;
    while (index < dart.notNull(headerValue[dartx.length])) {
      if (headerValue[dartx._get](index) == ",") {
        tokens[dartx.add](headerValue[dartx.substring](start, index));
        start = index + 1;
      } else if (headerValue[dartx._get](index) == " " || headerValue[dartx._get](index) == "\t") {
        start++;
      }
      index++;
    }
    tokens[dartx.add](headerValue[dartx.substring](start, index));
    return tokens;
  }
  static _toLowerCaseByte(x) {
    return (dart.notNull(x) - 65 & 127) < 26 ? (dart.notNull(x) | 32) >>> 0 : x;
  }
  [_caseInsensitiveCompare](expected, value) {
    if (expected[dartx.length] != value[dartx.length]) return false;
    for (let i = 0; i < dart.notNull(expected[dartx.length]); i++) {
      if (expected[dartx._get](i) != io._HttpParser._toLowerCaseByte(value[dartx._get](i))) return false;
    }
    return true;
  }
  [_expect](val1, val2) {
    if (val1 != val2) {
      dart.throw(new io.HttpException("Failed to parse HTTP"));
    }
  }
  [_expectHexDigit](byte) {
    if (48 <= dart.notNull(byte) && dart.notNull(byte) <= 57) {
      return dart.notNull(byte) - 48;
    } else if (65 <= dart.notNull(byte) && dart.notNull(byte) <= 70) {
      return dart.notNull(byte) - 65 + 10;
    } else if (97 <= dart.notNull(byte) && dart.notNull(byte) <= 102) {
      return dart.notNull(byte) - 97 + 10;
    } else {
      dart.throw(new io.HttpException("Failed to parse HTTP"));
    }
  }
  [_createIncoming](transferLength) {
    dart.assert(this[_incoming] == null);
    dart.assert(this[_bodyController] == null);
    dart.assert(!dart.test(this[_bodyPaused]));
    let incoming = null;
    this[_bodyController] = StreamControllerOfListOfint().new({sync: true, onListen: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        dart.assert(this[_bodyPaused]);
        this[_bodyPaused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onPause: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        dart.assert(!dart.test(this[_bodyPaused]));
        this[_bodyPaused] = true;
        this[_pauseStateChanged]();
      }, VoidToNull()), onResume: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        dart.assert(this[_bodyPaused]);
        this[_bodyPaused] = false;
        this[_pauseStateChanged]();
      }, VoidToNull()), onCancel: dart.fn(() => {
        if (!dart.equals(incoming, this[_incoming])) return;
        if (this[_socketSubscription] != null) {
          this[_socketSubscription].cancel();
        }
        this[_closeIncoming](true);
        this[_controller].close();
      }, VoidToNull())});
    incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
    this[_bodyPaused] = true;
    this[_pauseStateChanged]();
  }
  [_closeIncoming](closing) {
    if (closing === void 0) closing = false;
    if (this[_incoming] == null) return;
    let tmp = this[_incoming];
    tmp.close(closing);
    this[_incoming] = null;
    if (this[_bodyController] != null) {
      this[_bodyController].close();
      this[_bodyController] = null;
    }
    this[_bodyPaused] = false;
    this[_pauseStateChanged]();
  }
  [_pauseStateChanged]() {
    if (this[_incoming] != null) {
      if (!dart.test(this[_bodyPaused]) && !dart.test(this[_parserCalled])) {
        this[_parse]();
      }
    } else {
      if (!dart.test(this[_paused]) && !dart.test(this[_parserCalled])) {
        this[_parse]();
      }
    }
  }
  [_reportError](error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    if (this[_socketSubscription] != null) this[_socketSubscription].cancel();
    this[_state] = io._State.FAILURE;
    this[_controller].addError(error, core.StackTrace._check(stackTrace));
    this[_controller].close();
  }
};
dart.addSimpleTypeTests(io._HttpParser);
dart.defineNamedConstructor(io._HttpParser, '_');
dart.setSignature(io._HttpParser, {
  constructors: () => ({
    requestParser: dart.definiteFunctionType(io._HttpParser, []),
    responseParser: dart.definiteFunctionType(io._HttpParser, []),
    _: dart.definiteFunctionType(io._HttpParser, [core.bool])
  }),
  fields: () => ({
    [_parserCalled]: core.bool,
    [_buffer]: typed_data.Uint8List,
    [_index]: core.int,
    [_requestParser]: core.bool,
    [_state]: core.int,
    [_httpVersionIndex]: core.int,
    [_messageType]: core.int,
    [_statusCode]: core.int,
    [_statusCodeLength]: core.int,
    [_method]: ListOfint(),
    [_uri_or_reason_phrase]: ListOfint(),
    [_headerField]: ListOfint(),
    [_headerValue]: ListOfint(),
    [_httpVersion]: core.int,
    [_transferLength]: core.int,
    [_persistentConnection]: core.bool,
    [_connectionUpgrade]: core.bool,
    [_chunked]: core.bool,
    [_noMessageBody]: core.bool,
    [_remainingContent]: core.int,
    [_headers]: io._HttpHeaders,
    [_incoming]: io._HttpIncoming,
    [_socketSubscription]: async.StreamSubscription,
    [_paused]: core.bool,
    [_bodyPaused]: core.bool,
    [_controller]: StreamControllerOf_HttpIncoming(),
    [_bodyController]: StreamControllerOfListOfint()
  }),
  getters: () => ({
    version: dart.definiteFunctionType(core.String, []),
    messageType: dart.definiteFunctionType(core.int, []),
    transferLength: dart.definiteFunctionType(core.int, []),
    upgrade: dart.definiteFunctionType(core.bool, []),
    persistentConnection: dart.definiteFunctionType(core.bool, [])
  }),
  setters: () => ({isHead: dart.definiteFunctionType(dart.void, [core.bool])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io._HttpIncoming), [_HttpIncomingTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    listenToStream: dart.definiteFunctionType(dart.void, [StreamOfListOfint()]),
    [_parse]: dart.definiteFunctionType(dart.void, []),
    [_headersEnd]: dart.definiteFunctionType(core.bool, []),
    [_doParse]: dart.definiteFunctionType(dart.void, []),
    [_onData]: dart.definiteFunctionType(dart.void, [ListOfint()]),
    [_onDone]: dart.definiteFunctionType(dart.void, []),
    detachIncoming: dart.definiteFunctionType(io._HttpDetachedIncoming, []),
    readUnparsedData: dart.definiteFunctionType(core.List$(core.int), []),
    [_reset]: dart.definiteFunctionType(dart.void, []),
    [_releaseBuffer]: dart.definiteFunctionType(dart.void, []),
    [_caseInsensitiveCompare]: dart.definiteFunctionType(core.bool, [ListOfint(), ListOfint()]),
    [_expect]: dart.definiteFunctionType(core.int, [core.int, core.int]),
    [_expectHexDigit]: dart.definiteFunctionType(core.int, [core.int]),
    [_createIncoming]: dart.definiteFunctionType(dart.void, [core.int]),
    [_closeIncoming]: dart.definiteFunctionType(dart.void, [], [core.bool]),
    [_pauseStateChanged]: dart.definiteFunctionType(dart.void, []),
    [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic])
  }),
  statics: () => ({
    _isTokenChar: dart.definiteFunctionType(core.bool, [core.int]),
    _isValueChar: dart.definiteFunctionType(core.bool, [core.int]),
    _tokenizeFieldValue: dart.definiteFunctionType(core.List$(core.String), [core.String]),
    _toLowerCaseByte: dart.definiteFunctionType(core.int, [core.int])
  }),
  names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
});
io._DART_SESSION_ID = "DARTSESSID";
const _data = Symbol('_data');
const _lastSeen = Symbol('_lastSeen');
const _timeoutCallback = Symbol('_timeoutCallback');
const _prev = Symbol('_prev');
const _next = Symbol('_next');
const _removeFromTimeoutQueue = Symbol('_removeFromTimeoutQueue');
const _sessions = Symbol('_sessions');
const _bumpToEnd = Symbol('_bumpToEnd');
io._HttpSession = class _HttpSession extends core.Object {
  new(sessionManager, id) {
    this[_data] = collection.HashMap.new();
    this[_sessionManager] = sessionManager;
    this.id = id;
    this[_lastSeen] = new core.DateTime.now();
    this[_destroyed] = false;
    this[_isNew] = true;
    this[_timeoutCallback] = null;
    this[_prev] = null;
    this[_next] = null;
  }
  destroy() {
    this[_destroyed] = true;
    this[_sessionManager][_removeFromTimeoutQueue](this);
    this[_sessionManager][_sessions][dartx.remove](this.id);
  }
  [_markSeen]() {
    this[_lastSeen] = new core.DateTime.now();
    this[_sessionManager][_bumpToEnd](this);
  }
  get lastSeen() {
    return this[_lastSeen];
  }
  get isNew() {
    return this[_isNew];
  }
  set onTimeout(callback) {
    this[_timeoutCallback] = callback;
  }
  containsValue(value) {
    return this[_data][dartx.containsValue](value);
  }
  containsKey(key) {
    return this[_data][dartx.containsKey](key);
  }
  _get(key) {
    return this[_data][dartx._get](key);
  }
  _set(key, value) {
    this[_data][dartx._set](key, value);
    return value;
  }
  putIfAbsent(key, ifAbsent) {
    return this[_data][dartx.putIfAbsent](key, ifAbsent);
  }
  addAll(other) {
    return this[_data][dartx.addAll](other);
  }
  remove(key) {
    return this[_data][dartx.remove](key);
  }
  clear() {
    this[_data][dartx.clear]();
  }
  forEach(f) {
    this[_data][dartx.forEach](f);
  }
  get keys() {
    return this[_data][dartx.keys];
  }
  get values() {
    return this[_data][dartx.values];
  }
  get length() {
    return this[_data][dartx.length];
  }
  get isEmpty() {
    return this[_data][dartx.isEmpty];
  }
  get isNotEmpty() {
    return this[_data][dartx.isNotEmpty];
  }
  toString() {
    return dart.str`HttpSession id:${this.id} ${this[_data]}`;
  }
};
io._HttpSession[dart.implements] = () => [io.HttpSession];
dart.setSignature(io._HttpSession, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpSession, [io._HttpSessionManager, core.String])}),
  fields: () => ({
    [_destroyed]: core.bool,
    [_isNew]: core.bool,
    [_lastSeen]: core.DateTime,
    [_timeoutCallback]: core.Function,
    [_sessionManager]: io._HttpSessionManager,
    [_prev]: io._HttpSession,
    [_next]: io._HttpSession,
    id: core.String,
    [_data]: core.Map
  }),
  getters: () => ({
    lastSeen: dart.definiteFunctionType(core.DateTime, []),
    isNew: dart.definiteFunctionType(core.bool, []),
    keys: dart.definiteFunctionType(core.Iterable, []),
    values: dart.definiteFunctionType(core.Iterable, []),
    length: dart.definiteFunctionType(core.int, []),
    isEmpty: dart.definiteFunctionType(core.bool, []),
    isNotEmpty: dart.definiteFunctionType(core.bool, [])
  }),
  setters: () => ({onTimeout: dart.definiteFunctionType(dart.void, [VoidTovoid()])}),
  methods: () => ({
    destroy: dart.definiteFunctionType(dart.void, []),
    [_markSeen]: dart.definiteFunctionType(dart.void, []),
    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
    putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
    addAll: dart.definiteFunctionType(dart.void, [core.Map]),
    remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
    clear: dart.definiteFunctionType(dart.void, []),
    forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()])
  })
});
dart.defineExtensionMembers(io._HttpSession, [
  'containsValue',
  'containsKey',
  '_get',
  '_set',
  'putIfAbsent',
  'addAll',
  'remove',
  'clear',
  'forEach',
  'keys',
  'values',
  'length',
  'isEmpty',
  'isNotEmpty'
]);
const _sessionTimeout = Symbol('_sessionTimeout');
const _head = Symbol('_head');
const _tail = Symbol('_tail');
const _timer = Symbol('_timer');
const _addToTimeoutQueue = Symbol('_addToTimeoutQueue');
const _stopTimer = Symbol('_stopTimer');
const _startTimer = Symbol('_startTimer');
const _timerTimeout = Symbol('_timerTimeout');
io._HttpSessionManager = class _HttpSessionManager extends core.Object {
  new() {
    this[_sessions] = dart.map({}, core.String, io._HttpSession);
    this[_sessionTimeout] = 20 * 60;
    this[_head] = null;
    this[_tail] = null;
    this[_timer] = null;
  }
  createSessionId() {
    let _KEY_LENGTH = 16;
    let data = io._IOCrypto.getRandomBytes(_KEY_LENGTH);
    return io._CryptoUtils.bytesToHex(data);
  }
  getSession(id) {
    return this[_sessions][dartx._get](id);
  }
  createSession() {
    let id = this.createSessionId();
    while (dart.test(this[_sessions][dartx.containsKey](id))) {
      id = this.createSessionId();
    }
    let session = this[_sessions][dartx._set](id, new io._HttpSession(this, id));
    this[_addToTimeoutQueue](session);
    return session;
  }
  set sessionTimeout(timeout) {
    this[_sessionTimeout] = timeout;
    this[_stopTimer]();
    this[_startTimer]();
  }
  close() {
    this[_stopTimer]();
  }
  [_bumpToEnd](session) {
    this[_removeFromTimeoutQueue](session);
    this[_addToTimeoutQueue](session);
  }
  [_addToTimeoutQueue](session) {
    if (this[_head] == null) {
      dart.assert(this[_tail] == null);
      this[_tail] = this[_head] = session;
      this[_startTimer]();
    } else {
      dart.assert(this[_timer] != null);
      dart.assert(this[_tail] != null);
      this[_tail][_next] = session;
      session[_prev] = this[_tail];
      this[_tail] = session;
    }
  }
  [_removeFromTimeoutQueue](session) {
    if (session[_next] != null) {
      session[_next][_prev] = session[_prev];
    }
    if (session[_prev] != null) {
      session[_prev][_next] = session[_next];
    }
    if (dart.equals(this[_head], session)) {
      this[_head] = session[_next];
      this[_stopTimer]();
      this[_startTimer]();
    }
    if (dart.equals(this[_tail], session)) {
      this[_tail] = session[_prev];
    }
    session[_next] = session[_prev] = null;
  }
  [_timerTimeout]() {
    this[_stopTimer]();
    dart.assert(this[_head] != null);
    let session = this[_head];
    session.destroy();
    if (session[_timeoutCallback] != null) {
      dart.dsend(session, _timeoutCallback);
    }
  }
  [_startTimer]() {
    dart.assert(this[_timer] == null);
    if (this[_head] != null) {
      let seconds = new core.DateTime.now().difference(this[_head].lastSeen).inSeconds;
      this[_timer] = async.Timer.new(new core.Duration({seconds: dart.notNull(this[_sessionTimeout]) - dart.notNull(seconds)}), dart.bind(this, _timerTimeout));
    }
  }
  [_stopTimer]() {
    if (this[_timer] != null) {
      this[_timer].cancel();
      this[_timer] = null;
    }
  }
};
dart.setSignature(io._HttpSessionManager, {
  constructors: () => ({new: dart.definiteFunctionType(io._HttpSessionManager, [])}),
  fields: () => ({
    [_sessions]: MapOfString$_HttpSession(),
    [_sessionTimeout]: core.int,
    [_head]: io._HttpSession,
    [_tail]: io._HttpSession,
    [_timer]: async.Timer
  }),
  setters: () => ({sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    createSessionId: dart.definiteFunctionType(core.String, []),
    getSession: dart.definiteFunctionType(io._HttpSession, [core.String]),
    createSession: dart.definiteFunctionType(io._HttpSession, []),
    close: dart.definiteFunctionType(dart.void, []),
    [_bumpToEnd]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
    [_addToTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
    [_removeFromTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
    [_timerTimeout]: dart.definiteFunctionType(dart.void, []),
    [_startTimer]: dart.definiteFunctionType(dart.void, []),
    [_stopTimer]: dart.definiteFunctionType(dart.void, [])
  })
});
io._IOResourceInfo = class _IOResourceInfo extends core.Object {
  static get timestamp() {
    return dart.notNull(io._IOResourceInfo._startTime) + dart.notNull(io._IOResourceInfo._sw.elapsedMicroseconds) / 1000;
  }
  new(type) {
    this.type = type;
    this.id = io._IOResourceInfo.getNextID();
  }
  get referenceValueMap() {
    return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
  }
  static getNextID() {
    return (() => {
      let x = io._IOResourceInfo._count;
      io._IOResourceInfo._count = dart.notNull(x) + 1;
      return x;
    })();
  }
};
dart.setSignature(io._IOResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._IOResourceInfo, [core.String])}),
  fields: () => ({
    type: core.String,
    id: core.int
  }),
  getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  sfields: () => ({
    _count: core.int,
    _sw: core.Stopwatch,
    _startTime: core.int
  }),
  sgetters: () => ({timestamp: dart.definiteFunctionType(core.double, [])}),
  statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
  names: ['getNextID']
});
io._IOResourceInfo._count = 0;
dart.defineLazy(io._IOResourceInfo, {
  get _sw() {
    return (() => {
      let _ = new core.Stopwatch();
      _.start();
      return _;
    })();
  },
  get _startTime() {
    return new core.DateTime.now().millisecondsSinceEpoch;
  }
});
io._ReadWriteResourceInfo = class _ReadWriteResourceInfo extends io._IOResourceInfo {
  addRead(bytes) {
    this.totalRead = dart.notNull(this.totalRead) + dart.notNull(bytes);
    this.readCount = dart.notNull(this.readCount) + 1;
    this.lastRead = io._IOResourceInfo.timestamp;
  }
  didRead() {
    this.addRead(0);
  }
  addWrite(bytes) {
    this.totalWritten = dart.notNull(this.totalWritten) + dart.notNull(bytes);
    this.writeCount = dart.notNull(this.writeCount) + 1;
    this.lastWrite = io._IOResourceInfo.timestamp;
  }
  new(type) {
    this.totalRead = 0;
    this.totalWritten = 0;
    this.readCount = 0;
    this.writeCount = 0;
    this.lastRead = 0.0;
    this.lastWrite = 0.0;
    super.new(type);
  }
  get fullValueMap() {
    return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
  }
};
dart.setSignature(io._ReadWriteResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._ReadWriteResourceInfo, [core.String])}),
  fields: () => ({
    totalRead: core.int,
    totalWritten: core.int,
    readCount: core.int,
    writeCount: core.int,
    lastRead: core.double,
    lastWrite: core.double
  }),
  getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  methods: () => ({
    addRead: dart.definiteFunctionType(dart.void, [core.int]),
    didRead: dart.definiteFunctionType(dart.void, []),
    addWrite: dart.definiteFunctionType(dart.void, [core.int])
  })
});
io._FileResourceInfo = class _FileResourceInfo extends io._ReadWriteResourceInfo {
  new(file) {
    this.file = file;
    super.new(io._FileResourceInfo.TYPE);
    io._FileResourceInfo.FileOpened(this);
  }
  static FileOpened(info) {
    dart.assert(!dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](info.id)));
    io._FileResourceInfo.openFiles[dartx._set](info.id, info);
  }
  static FileClosed(info) {
    dart.assert(io._FileResourceInfo.openFiles[dartx.containsKey](info.id));
    io._FileResourceInfo.openFiles[dartx.remove](info.id);
  }
  static getOpenFilesList() {
    return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
  }
  static getOpenFiles(func, params) {
    dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
    let data = dart.map({type: '_openfiles', data: io._FileResourceInfo.getOpenFilesList()}, core.String, core.Object);
    let json = convert.JSON.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  getFileInfoMap() {
    let result = this.fullValueMap;
    return result;
  }
  static getFileInfoMapByID(func, params) {
    dart.assert(dart.dsend(params, 'containsKey', 'id'));
    let id = core.int.parse(core.String._check(dart.dindex(params, 'id')));
    let result = dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](id)) ? io._FileResourceInfo.openFiles[dartx._get](id).getFileInfoMap() : dart.map();
    let json = convert.JSON.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  get name() {
    return dart.str`${dart.dload(this.file, 'path')}`;
  }
};
dart.setSignature(io._FileResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._FileResourceInfo, [dart.dynamic])}),
  fields: () => ({file: dart.dynamic}),
  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
  methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  sfields: () => ({
    TYPE: core.String,
    openFiles: MapOfint$_FileResourceInfo()
  }),
  statics: () => ({
    FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
    FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
    getOpenFilesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
    getOpenFiles: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
    getFileInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic])
  }),
  names: ['FileOpened', 'FileClosed', 'getOpenFilesList', 'getOpenFiles', 'getFileInfoMapByID']
});
io._FileResourceInfo.TYPE = '_file';
dart.defineLazy(io._FileResourceInfo, {
  get openFiles() {
    return MapOfint$_FileResourceInfo().new();
  },
  set openFiles(_) {}
});
const _arguments = Symbol('_arguments');
const _workingDirectory = Symbol('_workingDirectory');
io._ProcessResourceInfo = class _ProcessResourceInfo extends io._IOResourceInfo {
  new(process) {
    this.process = process;
    this.startedAt = io._IOResourceInfo.timestamp;
    super.new(io._ProcessResourceInfo.TYPE);
    io._ProcessResourceInfo.ProcessStarted(this);
  }
  get name() {
    return core.String._check(dart.dload(this.process, _path));
  }
  stopped() {
    io._ProcessResourceInfo.ProcessStopped(this);
  }
  get fullValueMap() {
    return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
  }
  static ProcessStarted(info) {
    dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
    io._ProcessResourceInfo.startedProcesses[dartx._set](info.id, info);
  }
  static ProcessStopped(info) {
    dart.assert(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id));
    io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
  }
  static getStartedProcessesList() {
    return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
  }
  static getStartedProcesses(func, params) {
    dart.assert(func == 'ext.dart.io.getProcesses');
    let data = dart.map({type: '_startedprocesses', data: io._ProcessResourceInfo.getStartedProcessesList()}, core.String, core.Object);
    let json = convert.JSON.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  static getProcessInfoMapById(func, params) {
    let id = core.int.parse(params[dartx._get]('id'));
    let result = dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](id)) ? io._ProcessResourceInfo.startedProcesses[dartx._get](id).fullValueMap : dart.map();
    let json = convert.JSON.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
};
dart.setSignature(io._ProcessResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._ProcessResourceInfo, [dart.dynamic])}),
  fields: () => ({
    process: dart.dynamic,
    startedAt: core.double
  }),
  getters: () => ({
    name: dart.definiteFunctionType(core.String, []),
    fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
  }),
  methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
  sfields: () => ({
    TYPE: core.String,
    startedProcesses: MapOfint$_ProcessResourceInfo()
  }),
  statics: () => ({
    ProcessStarted: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
    ProcessStopped: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
    getStartedProcessesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
    getStartedProcesses: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
    getProcessInfoMapById: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()])
  }),
  names: ['ProcessStarted', 'ProcessStopped', 'getStartedProcessesList', 'getStartedProcesses', 'getProcessInfoMapById']
});
io._ProcessResourceInfo.TYPE = '_process';
dart.defineLazy(io._ProcessResourceInfo, {
  get startedProcesses() {
    return MapOfint$_ProcessResourceInfo().new();
  },
  set startedProcesses(_) {}
});
io._SocketResourceInfo = class _SocketResourceInfo extends io._ReadWriteResourceInfo {
  new(socket) {
    this.socket = socket;
    super.new(io._SocketResourceInfo.TYPE);
    io._SocketResourceInfo.SocketOpened(this);
  }
  get name() {
    if (dart.test(dart.dload(this.socket, 'isListening'))) {
      return dart.str`listening:${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}`;
    }
    let remote = '';
    try {
      let remoteHost = dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host');
      let remotePort = dart.dload(this.socket, 'remotePort');
      remote = dart.str` -> ${remoteHost}:${remotePort}`;
    } catch (e) {
    }

    return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
  }
  static getOpenSocketsList() {
    return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
  }
  getSocketInfoMap() {
    let result = this.fullValueMap;
    result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
    result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
    result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
    result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
    if (!dart.test(dart.dload(this.socket, 'isListening'))) {
      try {
        result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
        result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
      } catch (e) {
        result[dartx._set]('remotePort', 'NA');
        result[dartx._set]('remoteHost', 'NA');
      }

    } else {
      result[dartx._set]('remotePort', 'NA');
      result[dartx._set]('remoteHost', 'NA');
    }
    result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
    return result;
  }
  static getSocketInfoMapByID(func, params) {
    dart.assert(params[dartx.containsKey]('id'));
    let id = core.int.parse(params[dartx._get]('id'));
    let result = dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](id)) ? io._SocketResourceInfo.openSockets[dartx._get](id).getSocketInfoMap() : dart.map();
    let json = convert.JSON.encode(result);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  static getOpenSockets(func, params) {
    dart.assert(dart.equals(func, 'ext.dart.io.getOpenSockets'));
    let data = dart.map({type: '_opensockets', data: io._SocketResourceInfo.getOpenSocketsList()}, core.String, core.Object);
    let json = convert.JSON.encode(data);
    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
  }
  static SocketOpened(info) {
    dart.assert(!dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id)));
    io._SocketResourceInfo.openSockets[dartx._set](info.id, info);
  }
  static SocketClosed(info) {
    dart.assert(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id));
    io._SocketResourceInfo.openSockets[dartx.remove](info.id);
  }
};
dart.setSignature(io._SocketResourceInfo, {
  constructors: () => ({new: dart.definiteFunctionType(io._SocketResourceInfo, [dart.dynamic])}),
  fields: () => ({socket: dart.dynamic}),
  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
  methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
  sfields: () => ({
    TCP_STRING: core.String,
    UDP_STRING: core.String,
    TYPE: core.String,
    openSockets: MapOfint$_SocketResourceInfo()
  }),
  statics: () => ({
    getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
    getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
    getOpenSockets: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
    SocketOpened: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo]),
    SocketClosed: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo])
  }),
  names: ['getOpenSocketsList', 'getSocketInfoMapByID', 'getOpenSockets', 'SocketOpened', 'SocketClosed']
});
io._SocketResourceInfo.TCP_STRING = 'TCP';
io._SocketResourceInfo.UDP_STRING = 'UDP';
io._SocketResourceInfo.TYPE = '_socket';
dart.defineLazy(io._SocketResourceInfo, {
  get openSockets() {
    return MapOfint$_SocketResourceInfo().new();
  },
  set openSockets(_) {}
});
io.IOSink = class IOSink extends core.Object {
  static new(target, opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
    return new io._IOSinkImpl(target, encoding);
  }
};
io.IOSink[dart.implements] = () => [StreamSinkOfListOfint(), core.StringSink];
dart.setSignature(io.IOSink, {
  constructors: () => ({new: dart.definiteFunctionType(io.IOSink, [StreamConsumerOfListOfint()], {encoding: convert.Encoding})}),
  fields: () => ({encoding: convert.Encoding})
});
io._FILE_EXISTS = 0;
io._FILE_CREATE = 1;
io._FILE_DELETE = 2;
io._FILE_RENAME = 3;
io._FILE_COPY = 4;
io._FILE_OPEN = 5;
io._FILE_RESOLVE_SYMBOLIC_LINKS = 6;
io._FILE_CLOSE = 7;
io._FILE_POSITION = 8;
io._FILE_SET_POSITION = 9;
io._FILE_TRUNCATE = 10;
io._FILE_LENGTH = 11;
io._FILE_LENGTH_FROM_PATH = 12;
io._FILE_LAST_MODIFIED = 13;
io._FILE_FLUSH = 14;
io._FILE_READ_BYTE = 15;
io._FILE_WRITE_BYTE = 16;
io._FILE_READ = 17;
io._FILE_READ_INTO = 18;
io._FILE_WRITE_FROM = 19;
io._FILE_CREATE_LINK = 20;
io._FILE_DELETE_LINK = 21;
io._FILE_RENAME_LINK = 22;
io._FILE_LINK_TARGET = 23;
io._FILE_TYPE = 24;
io._FILE_IDENTICAL = 25;
io._FILE_STAT = 26;
io._FILE_LOCK = 27;
io._SOCKET_LOOKUP = 28;
io._SOCKET_LIST_INTERFACES = 29;
io._SOCKET_REVERSE_LOOKUP = 30;
io._DIRECTORY_CREATE = 31;
io._DIRECTORY_DELETE = 32;
io._DIRECTORY_EXISTS = 33;
io._DIRECTORY_CREATE_TEMP = 34;
io._DIRECTORY_LIST_START = 35;
io._DIRECTORY_LIST_NEXT = 36;
io._DIRECTORY_LIST_STOP = 37;
io._DIRECTORY_RENAME = 38;
io._SSL_PROCESS_FILTER = 39;
io._IOService = class _IOService extends core.Object {
  static _dispatch(request, data) {
    dart.throw(new core.UnsupportedError("_IOService._dispatch"));
  }
};
dart.setSignature(io._IOService, {
  statics: () => ({_dispatch: dart.definiteFunctionType(async.Future, [core.int, core.List])}),
  names: ['_dispatch']
});
io.Link = class Link extends core.Object {
  static new(path) {
    return new io._Link(path);
  }
  static fromUri(uri) {
    return io.Link.new(uri.toFilePath());
  }
};
io.Link[dart.implements] = () => [io.FileSystemEntity];
dart.setSignature(io.Link, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.Link, [core.String]),
    fromUri: dart.definiteFunctionType(io.Link, [core.Uri])
  })
});
const _makeWindowsLinkTarget = Symbol('_makeWindowsLinkTarget');
const _exceptionFromResponse = Symbol('_exceptionFromResponse');
io._Link = class _Link extends io.FileSystemEntity {
  new(path) {
    this.path = path;
    if (!(typeof this.path == 'string')) {
      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
    }
  }
  toString() {
    return dart.str`Link: '${this.path}'`;
  }
  exists() {
    return io.FileSystemEntity.isLink(this.path);
  }
  existsSync() {
    return io.FileSystemEntity.isLinkSync(this.path);
  }
  get absolute() {
    return io.Link.new(this[_absolutePath]);
  }
  stat() {
    return io.FileStat.stat(this.path);
  }
  statSync() {
    return io.FileStat.statSync(this.path);
  }
  create(target, opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(io.Platform.isWindows)) {
      target = this[_makeWindowsLinkTarget](target);
    }
    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
    return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE_LINK, JSArrayOfString().of([this.path, target])), dynamicToFuture())).then(io._Link)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot create link to target '${target}'`, this.path));
      }
      return this;
    }, dynamicTo_Link()));
  }
  createSync(target, opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      this.parent.createSync({recursive: true});
    }
    if (dart.test(io.Platform.isWindows)) {
      target = this[_makeWindowsLinkTarget](target);
    }
    let result = io._File._createLink(this.path, target);
    io._Link.throwIfError(result, "Cannot create link", this.path);
  }
  [_makeWindowsLinkTarget](target) {
    let base = core.Uri.file(dart.str`${io.Directory.current.path}\\`);
    let link = core.Uri.file(this.path);
    let destination = core.Uri.file(target);
    let result = base.resolveUri(link).resolveUri(destination).toFilePath();
    if (dart.notNull(result[dartx.length]) > 3 && result[dartx._get](1) == ':' && result[dartx._get](2) == '\\') {
      return dart.str`\\??\\${result}`;
    } else {
      dart.throw(new io.FileSystemException(dart.str`Target ${result} of Link.create on Windows cannot be converted` + ' to start with a drive letter.  Unexpected error.'));
    }
  }
  updateSync(target) {
    this.deleteSync();
    this.createSync(target);
  }
  update(target) {
    return this.delete().then(io.Link)(dart.fn(_ => this.create(target), FileSystemEntityToFutureOfLink()));
  }
  [_delete](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).delete({recursive: true}).then(io._Link)(dart.fn(_ => this, FileSystemEntityTo_Link()));
    }
    return io._IOService._dispatch(io._FILE_DELETE_LINK, JSArrayOfString().of([this.path])).then(io._Link)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot delete link", this.path));
      }
      return this;
    }, dynamicTo_Link()));
  }
  [_deleteSync](opts) {
    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
    if (dart.test(recursive)) {
      return io.Directory.new(this.path).deleteSync({recursive: true});
    }
    let result = io._File._deleteLinkNative(this.path);
    io._Link.throwIfError(result, "Cannot delete link", this.path);
  }
  rename(newPath) {
    return io._IOService._dispatch(io._FILE_RENAME_LINK, JSArrayOfString().of([this.path, newPath])).then(io.Link)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot rename link to '${newPath}'`, this.path));
      }
      return io.Link.new(newPath);
    }, dynamicToLink()));
  }
  renameSync(newPath) {
    let result = io._File._renameLink(this.path, newPath);
    io._Link.throwIfError(result, dart.str`Cannot rename link '${this.path}' to '${newPath}'`);
    return io.Link.new(newPath);
  }
  target() {
    return io._IOService._dispatch(io._FILE_LINK_TARGET, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
      if (dart.test(this[_isErrorResponse](response))) {
        dart.throw(this[_exceptionFromResponse](response, "Cannot get target of link", this.path));
      }
      return FutureOrOfString()._check(response);
    }, dynamicToFutureOrOfString()));
  }
  targetSync() {
    let result = io._File._linkTarget(this.path);
    io._Link.throwIfError(result, "Cannot read link", this.path);
    return core.String._check(result);
  }
  static throwIfError(result, msg, path) {
    if (path === void 0) path = "";
    if (io.OSError.is(result)) {
      dart.throw(new io.FileSystemException(msg, path, result));
    }
  }
  [_isErrorResponse](response) {
    return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
  }
  [_exceptionFromResponse](response, message, path) {
    dart.assert(this[_isErrorResponse](response));
    switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
      case io._ILLEGAL_ARGUMENT_RESPONSE:
      {
        return new core.ArgumentError();
      }
      case io._OSERROR_RESPONSE:
      {
        let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
        return new io.FileSystemException(message, path, err);
      }
      default:
      {
        return core.Exception.new("Unknown error");
      }
    }
  }
};
io._Link[dart.implements] = () => [io.Link];
dart.setSignature(io._Link, {
  constructors: () => ({new: dart.definiteFunctionType(io._Link, [core.String])}),
  fields: () => ({path: core.String}),
  getters: () => ({absolute: dart.definiteFunctionType(io.Link, [])}),
  methods: () => ({
    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
    existsSync: dart.definiteFunctionType(core.bool, []),
    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
    statSync: dart.definiteFunctionType(io.FileStat, []),
    create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
    createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
    [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
    updateSync: dart.definiteFunctionType(dart.void, [core.String]),
    update: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
    [_delete]: dart.definiteFunctionType(async.Future$(io.Link), [], {recursive: core.bool}),
    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
    rename: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
    renameSync: dart.definiteFunctionType(io.Link, [core.String]),
    target: dart.definiteFunctionType(async.Future$(core.String), []),
    targetSync: dart.definiteFunctionType(core.String, []),
    [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
    [_exceptionFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])
  }),
  statics: () => ({throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String])}),
  names: ['throwIfError']
});
io.Platform = class Platform extends core.Object {
  static get numberOfProcessors() {
    return io.Platform._numberOfProcessors;
  }
  static get pathSeparator() {
    return io.Platform._pathSeparator;
  }
  static get operatingSystem() {
    return io.Platform._operatingSystem;
  }
  static get localHostname() {
    return io.Platform._localHostname;
  }
  static get environment() {
    return io._Platform.environment;
  }
  static get executable() {
    return io._Platform.executable;
  }
  static get resolvedExecutable() {
    return io._Platform.resolvedExecutable;
  }
  static get script() {
    return io._Platform.script;
  }
  static get executableArguments() {
    return io._Platform.executableArguments;
  }
  static get packageRoot() {
    return io._Platform.packageRoot;
  }
  static get packageConfig() {
    return io._Platform.packageConfig;
  }
  static get version() {
    return io.Platform._version;
  }
};
dart.setSignature(io.Platform, {
  sfields: () => ({
    _numberOfProcessors: core.int,
    _pathSeparator: core.String,
    _operatingSystem: core.String,
    _localHostname: core.String,
    _version: core.String,
    isLinux: core.bool,
    isMacOS: core.bool,
    isWindows: core.bool,
    isAndroid: core.bool,
    isIOS: core.bool
  }),
  sgetters: () => ({
    numberOfProcessors: dart.definiteFunctionType(core.int, []),
    pathSeparator: dart.definiteFunctionType(core.String, []),
    operatingSystem: dart.definiteFunctionType(core.String, []),
    localHostname: dart.definiteFunctionType(core.String, []),
    environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    executable: dart.definiteFunctionType(core.String, []),
    resolvedExecutable: dart.definiteFunctionType(core.String, []),
    script: dart.definiteFunctionType(core.Uri, []),
    executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
    packageRoot: dart.definiteFunctionType(core.String, []),
    packageConfig: dart.definiteFunctionType(core.String, []),
    version: dart.definiteFunctionType(core.String, [])
  })
});
dart.defineLazy(io.Platform, {
  get _numberOfProcessors() {
    return io._Platform.numberOfProcessors;
  },
  get _pathSeparator() {
    return io._Platform.pathSeparator;
  },
  get _operatingSystem() {
    return io._Platform.operatingSystem;
  },
  get _localHostname() {
    return io._Platform.localHostname;
  },
  get _version() {
    return io._Platform.version;
  },
  get isLinux() {
    return io.Platform._operatingSystem == "linux";
  },
  get isMacOS() {
    return io.Platform._operatingSystem == "macos";
  },
  get isWindows() {
    return io.Platform._operatingSystem == "windows";
  },
  get isAndroid() {
    return io.Platform._operatingSystem == "android";
  },
  get isIOS() {
    return io.Platform._operatingSystem == "ios";
  }
});
io._Platform = class _Platform extends core.Object {
  static _numberOfProcessors() {
    dart.throw(new core.UnsupportedError("Platform._numberOfProcessors"));
  }
  static _pathSeparator() {
    dart.throw(new core.UnsupportedError("Platform._pathSeparator"));
  }
  static _operatingSystem() {
    dart.throw(new core.UnsupportedError("Platform._operatingSystem"));
  }
  static _localHostname() {
    dart.throw(new core.UnsupportedError("Platform._localHostname"));
  }
  static _executable() {
    dart.throw(new core.UnsupportedError("Platform._executable"));
  }
  static _resolvedExecutable() {
    dart.throw(new core.UnsupportedError("Platform._resolvedExecutable"));
  }
  static _environment() {
    dart.throw(new core.UnsupportedError("Platform._environment"));
  }
  static _executableArguments() {
    dart.throw(new core.UnsupportedError("Platform._executableArguments"));
  }
  static _packageRoot() {
    dart.throw(new core.UnsupportedError("Platform._packageRoot"));
  }
  static _packageConfig() {
    dart.throw(new core.UnsupportedError("Platform._packageConfig"));
  }
  static _version() {
    dart.throw(new core.UnsupportedError("Platform._version"));
  }
  static get numberOfProcessors() {
    return io._Platform._numberOfProcessors();
  }
  static get pathSeparator() {
    return io._Platform._pathSeparator();
  }
  static get operatingSystem() {
    return io._Platform._operatingSystem();
  }
  static get localHostname() {
    let result = io._Platform._localHostname();
    if (io.OSError.is(result)) {
      dart.throw(result);
    } else {
      return core.String._check(result);
    }
  }
  static get executableArguments() {
    return io._Platform._executableArguments();
  }
  static get environment() {
    if (io._Platform._environmentCache == null) {
      let env = io._Platform._environment();
      if (!io.OSError.is(env)) {
        let isWindows = io._Platform.operatingSystem == 'windows';
        let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
        for (let str of core.Iterable._check(env)) {
          let equalsIndex = dart.dsend(str, 'indexOf', '=');
          if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
            result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
          }
        }
        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
      } else {
        io._Platform._environmentCache = env;
      }
    }
    if (io.OSError.is(io._Platform._environmentCache)) {
      dart.throw(io._Platform._environmentCache);
    } else {
      return MapOfString$String()._check(io._Platform._environmentCache);
    }
  }
  static get version() {
    return io._Platform._version();
  }
};
dart.setSignature(io._Platform, {
  sfields: () => ({
    executable: core.String,
    resolvedExecutable: core.String,
    packageRoot: core.String,
    packageConfig: core.String,
    _environmentCache: dart.dynamic,
    script: core.Uri
  }),
  sgetters: () => ({
    numberOfProcessors: dart.definiteFunctionType(core.int, []),
    pathSeparator: dart.definiteFunctionType(core.String, []),
    operatingSystem: dart.definiteFunctionType(core.String, []),
    localHostname: dart.definiteFunctionType(core.String, []),
    executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
    environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
    version: dart.definiteFunctionType(core.String, [])
  }),
  statics: () => ({
    _numberOfProcessors: dart.definiteFunctionType(core.int, []),
    _pathSeparator: dart.definiteFunctionType(core.String, []),
    _operatingSystem: dart.definiteFunctionType(core.String, []),
    _localHostname: dart.definiteFunctionType(dart.dynamic, []),
    _executable: dart.definiteFunctionType(dart.dynamic, []),
    _resolvedExecutable: dart.definiteFunctionType(dart.dynamic, []),
    _environment: dart.definiteFunctionType(dart.dynamic, []),
    _executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
    _packageRoot: dart.definiteFunctionType(core.String, []),
    _packageConfig: dart.definiteFunctionType(core.String, []),
    _version: dart.definiteFunctionType(core.String, [])
  }),
  names: ['_numberOfProcessors', '_pathSeparator', '_operatingSystem', '_localHostname', '_executable', '_resolvedExecutable', '_environment', '_executableArguments', '_packageRoot', '_packageConfig', '_version']
});
io._Platform._environmentCache = null;
io._Platform.script = null;
dart.defineLazy(io._Platform, {
  get executable() {
    return core.String._check(io._Platform._executable());
  },
  set executable(_) {},
  get resolvedExecutable() {
    return core.String._check(io._Platform._resolvedExecutable());
  },
  set resolvedExecutable(_) {},
  get packageRoot() {
    return io._Platform._packageRoot();
  },
  set packageRoot(_) {},
  get packageConfig() {
    return io._Platform._packageConfig();
  },
  set packageConfig(_) {}
});
const _map = Symbol('_map');
io._CaseInsensitiveStringMap$ = dart.generic(V => {
  let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
  let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
  class _CaseInsensitiveStringMap extends core.Object {
    new() {
      this[_map] = MapOfString$V().new();
    }
    containsKey(key) {
      return typeof key == 'string' && dart.test(this[_map][dartx.containsKey](key[dartx.toUpperCase]()));
    }
    containsValue(value) {
      return this[_map][dartx.containsValue](value);
    }
    _get(key) {
      return typeof key == 'string' ? this[_map][dartx._get](key[dartx.toUpperCase]()) : null;
    }
    _set(key, value) {
      V._check(value);
      this[_map][dartx._set](key[dartx.toUpperCase](), value);
      return value;
    }
    putIfAbsent(key, ifAbsent) {
      VoidToV()._check(ifAbsent);
      return this[_map][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
    }
    addAll(other) {
      other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid()));
    }
    remove(key) {
      return typeof key == 'string' ? this[_map][dartx.remove](key[dartx.toUpperCase]()) : null;
    }
    clear() {
      this[_map][dartx.clear]();
    }
    forEach(f) {
      this[_map][dartx.forEach](f);
    }
    get keys() {
      return this[_map][dartx.keys];
    }
    get values() {
      return this[_map][dartx.values];
    }
    get length() {
      return this[_map][dartx.length];
    }
    get isEmpty() {
      return this[_map][dartx.isEmpty];
    }
    get isNotEmpty() {
      return this[_map][dartx.isNotEmpty];
    }
    toString() {
      return dart.toString(this[_map]);
    }
  }
  dart.addTypeTests(_CaseInsensitiveStringMap);
  _CaseInsensitiveStringMap[dart.implements] = () => [MapOfString$V()];
  dart.setSignature(_CaseInsensitiveStringMap, {
    fields: () => ({[_map]: MapOfString$V()}),
    getters: () => ({
      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
      values: dart.definiteFunctionType(core.Iterable$(V), []),
      length: dart.definiteFunctionType(core.int, []),
      isEmpty: dart.definiteFunctionType(core.bool, []),
      isNotEmpty: dart.definiteFunctionType(core.bool, [])
    }),
    methods: () => ({
      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
      _get: dart.definiteFunctionType(V, [core.Object]),
      _set: dart.definiteFunctionType(dart.void, [core.String, V]),
      putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
      remove: dart.definiteFunctionType(V, [core.Object]),
      clear: dart.definiteFunctionType(dart.void, []),
      forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
    })
  });
  dart.defineExtensionMembers(_CaseInsensitiveStringMap, [
    'containsKey',
    'containsValue',
    '_get',
    '_set',
    'putIfAbsent',
    'addAll',
    'remove',
    'clear',
    'forEach',
    'keys',
    'values',
    'length',
    'isEmpty',
    'isNotEmpty'
  ]);
  return _CaseInsensitiveStringMap;
});
io._CaseInsensitiveStringMap = _CaseInsensitiveStringMap();
io._ProcessUtils = class _ProcessUtils extends core.Object {
  static _exit(status) {
    dart.throw(new core.UnsupportedError("ProcessUtils._exit"));
  }
  static _setExitCode(status) {
    dart.throw(new core.UnsupportedError("ProcessUtils._setExitCode"));
  }
  static _getExitCode() {
    dart.throw(new core.UnsupportedError("ProcessUtils._getExitCode"));
  }
  static _sleep(millis) {
    dart.throw(new core.UnsupportedError("ProcessUtils._sleep"));
  }
  static _pid(process) {
    dart.throw(new core.UnsupportedError("ProcessUtils._pid"));
  }
  static _watchSignal(signal) {
    dart.throw(new core.UnsupportedError("ProcessUtils._watchSignal"));
  }
};
dart.setSignature(io._ProcessUtils, {
  statics: () => ({
    _exit: dart.definiteFunctionType(dart.void, [core.int]),
    _setExitCode: dart.definiteFunctionType(dart.void, [core.int]),
    _getExitCode: dart.definiteFunctionType(core.int, []),
    _sleep: dart.definiteFunctionType(dart.void, [core.int]),
    _pid: dart.definiteFunctionType(core.int, [io.Process]),
    _watchSignal: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [io.ProcessSignal])
  }),
  names: ['_exit', '_setExitCode', '_getExitCode', '_sleep', '_pid', '_watchSignal']
});
io.exit = function(code) {
  if (!(typeof code == 'number')) {
    dart.throw(new core.ArgumentError("Integer value for exit code expected"));
  }
  io._ProcessUtils._exit(code);
};
dart.fn(io.exit, intTovoid());
dart.copyProperties(io, {
  set exitCode(code) {
    if (!(typeof code == 'number')) {
      dart.throw(new core.ArgumentError("Integer value for exit code expected"));
    }
    io._ProcessUtils._setExitCode(code);
  },
  get exitCode() {
    return io._ProcessUtils._getExitCode();
  }
});
io.sleep = function(duration) {
  let milliseconds = duration.inMilliseconds;
  if (dart.notNull(milliseconds) < 0) {
    dart.throw(new core.ArgumentError("sleep: duration cannot be negative"));
  }
  io._ProcessUtils._sleep(milliseconds);
};
dart.fn(io.sleep, DurationTovoid());
dart.copyProperties(io, {
  get pid() {
    return io._ProcessUtils._pid(null);
  }
});
io.ProcessStartMode = class ProcessStartMode extends core.Object {
  new(index) {
    this.index = index;
  }
  toString() {
    return {
      0: "ProcessStartMode.NORMAL",
      1: "ProcessStartMode.DETACHED",
      2: "ProcessStartMode.DETACHED_WITH_STDIO"
    }[this.index];
  }
};
dart.setSignature(io.ProcessStartMode, {
  fields: () => ({index: core.int})
});
dart.defineEnumValues(io.ProcessStartMode, [
  'NORMAL',
  'DETACHED',
  'DETACHED_WITH_STDIO'
]);
io.Process = class Process extends core.Object {
  new() {
    this.exitCode = null;
  }
  static start(executable, arguments$, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let mode = opts && 'mode' in opts ? opts.mode : io.ProcessStartMode.NORMAL;
    dart.throw(new core.UnsupportedError("Process.start"));
  }
  static run(executable, arguments$, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
    dart.throw(new core.UnsupportedError("Process.run"));
  }
  static runSync(executable, arguments$, opts) {
    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
    let environment = opts && 'environment' in opts ? opts.environment : null;
    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
    dart.throw(new core.UnsupportedError("Process.runSync"));
  }
  static killPid(pid, signal) {
    if (signal === void 0) signal = io.ProcessSignal.SIGTERM;
    dart.throw(new core.UnsupportedError("Process.killPid"));
  }
};
dart.setSignature(io.Process, {
  fields: () => ({exitCode: FutureOfint()}),
  statics: () => ({
    start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
    run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
    runSync: dart.definiteFunctionType(io.ProcessResult, [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
    killPid: dart.definiteFunctionType(core.bool, [core.int], [io.ProcessSignal])
  }),
  names: ['start', 'run', 'runSync', 'killPid']
});
io.ProcessResult = class ProcessResult extends core.Object {
  new(pid, exitCode, stdout, stderr) {
    this.pid = pid;
    this.exitCode = exitCode;
    this.stdout = stdout;
    this.stderr = stderr;
  }
};
dart.setSignature(io.ProcessResult, {
  constructors: () => ({new: dart.definiteFunctionType(io.ProcessResult, [core.int, core.int, dart.dynamic, dart.dynamic])}),
  fields: () => ({
    exitCode: core.int,
    stdout: dart.dynamic,
    stderr: dart.dynamic,
    pid: core.int
  })
});
const _signalNumber = Symbol('_signalNumber');
const _name = Symbol('_name');
io.ProcessSignal = class ProcessSignal extends core.Object {
  _(signalNumber, name) {
    this[_signalNumber] = signalNumber;
    this[_name] = name;
  }
  toString() {
    return this[_name];
  }
  watch() {
    return io._ProcessUtils._watchSignal(this);
  }
};
dart.defineNamedConstructor(io.ProcessSignal, '_');
dart.setSignature(io.ProcessSignal, {
  constructors: () => ({_: dart.definiteFunctionType(io.ProcessSignal, [core.int, core.String])}),
  fields: () => ({
    [_signalNumber]: core.int,
    [_name]: core.String
  }),
  methods: () => ({watch: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [])}),
  sfields: () => ({
    SIGHUP: io.ProcessSignal,
    SIGINT: io.ProcessSignal,
    SIGQUIT: io.ProcessSignal,
    SIGILL: io.ProcessSignal,
    SIGTRAP: io.ProcessSignal,
    SIGABRT: io.ProcessSignal,
    SIGBUS: io.ProcessSignal,
    SIGFPE: io.ProcessSignal,
    SIGKILL: io.ProcessSignal,
    SIGUSR1: io.ProcessSignal,
    SIGSEGV: io.ProcessSignal,
    SIGUSR2: io.ProcessSignal,
    SIGPIPE: io.ProcessSignal,
    SIGALRM: io.ProcessSignal,
    SIGTERM: io.ProcessSignal,
    SIGCHLD: io.ProcessSignal,
    SIGCONT: io.ProcessSignal,
    SIGSTOP: io.ProcessSignal,
    SIGTSTP: io.ProcessSignal,
    SIGTTIN: io.ProcessSignal,
    SIGTTOU: io.ProcessSignal,
    SIGURG: io.ProcessSignal,
    SIGXCPU: io.ProcessSignal,
    SIGXFSZ: io.ProcessSignal,
    SIGVTALRM: io.ProcessSignal,
    SIGPROF: io.ProcessSignal,
    SIGWINCH: io.ProcessSignal,
    SIGPOLL: io.ProcessSignal,
    SIGSYS: io.ProcessSignal
  })
});
dart.defineLazy(io.ProcessSignal, {
  get SIGHUP() {
    return dart.const(new io.ProcessSignal._(1, "SIGHUP"));
  },
  get SIGINT() {
    return dart.const(new io.ProcessSignal._(2, "SIGINT"));
  },
  get SIGQUIT() {
    return dart.const(new io.ProcessSignal._(3, "SIGQUIT"));
  },
  get SIGILL() {
    return dart.const(new io.ProcessSignal._(4, "SIGILL"));
  },
  get SIGTRAP() {
    return dart.const(new io.ProcessSignal._(5, "SIGTRAP"));
  },
  get SIGABRT() {
    return dart.const(new io.ProcessSignal._(6, "SIGABRT"));
  },
  get SIGBUS() {
    return dart.const(new io.ProcessSignal._(7, "SIGBUS"));
  },
  get SIGFPE() {
    return dart.const(new io.ProcessSignal._(8, "SIGFPE"));
  },
  get SIGKILL() {
    return dart.const(new io.ProcessSignal._(9, "SIGKILL"));
  },
  get SIGUSR1() {
    return dart.const(new io.ProcessSignal._(10, "SIGUSR1"));
  },
  get SIGSEGV() {
    return dart.const(new io.ProcessSignal._(11, "SIGSEGV"));
  },
  get SIGUSR2() {
    return dart.const(new io.ProcessSignal._(12, "SIGUSR2"));
  },
  get SIGPIPE() {
    return dart.const(new io.ProcessSignal._(13, "SIGPIPE"));
  },
  get SIGALRM() {
    return dart.const(new io.ProcessSignal._(14, "SIGALRM"));
  },
  get SIGTERM() {
    return dart.const(new io.ProcessSignal._(15, "SIGTERM"));
  },
  get SIGCHLD() {
    return dart.const(new io.ProcessSignal._(17, "SIGCHLD"));
  },
  get SIGCONT() {
    return dart.const(new io.ProcessSignal._(18, "SIGCONT"));
  },
  get SIGSTOP() {
    return dart.const(new io.ProcessSignal._(19, "SIGSTOP"));
  },
  get SIGTSTP() {
    return dart.const(new io.ProcessSignal._(20, "SIGTSTP"));
  },
  get SIGTTIN() {
    return dart.const(new io.ProcessSignal._(21, "SIGTTIN"));
  },
  get SIGTTOU() {
    return dart.const(new io.ProcessSignal._(22, "SIGTTOU"));
  },
  get SIGURG() {
    return dart.const(new io.ProcessSignal._(23, "SIGURG"));
  },
  get SIGXCPU() {
    return dart.const(new io.ProcessSignal._(24, "SIGXCPU"));
  },
  get SIGXFSZ() {
    return dart.const(new io.ProcessSignal._(25, "SIGXFSZ"));
  },
  get SIGVTALRM() {
    return dart.const(new io.ProcessSignal._(26, "SIGVTALRM"));
  },
  get SIGPROF() {
    return dart.const(new io.ProcessSignal._(27, "SIGPROF"));
  },
  get SIGWINCH() {
    return dart.const(new io.ProcessSignal._(28, "SIGWINCH"));
  },
  get SIGPOLL() {
    return dart.const(new io.ProcessSignal._(29, "SIGPOLL"));
  },
  get SIGSYS() {
    return dart.const(new io.ProcessSignal._(31, "SIGSYS"));
  }
});
io.SignalException = class SignalException extends core.Object {
  new(message, osError) {
    if (osError === void 0) osError = null;
    this.message = message;
    this.osError = osError;
  }
  toString() {
    let msg = "";
    if (this.osError != null) {
      msg = dart.str`, osError: ${this.osError}`;
    }
    return dart.str`SignalException: ${this.message}${msg}`;
  }
};
io.SignalException[dart.implements] = () => [io.IOException];
dart.setSignature(io.SignalException, {
  constructors: () => ({new: dart.definiteFunctionType(io.SignalException, [core.String], [dart.dynamic])}),
  fields: () => ({
    message: core.String,
    osError: dart.dynamic
  })
});
io.ProcessException = class ProcessException extends core.Object {
  new(executable, arguments$, message, errorCode) {
    if (message === void 0) message = "";
    if (errorCode === void 0) errorCode = 0;
    this.executable = executable;
    this.arguments = arguments$;
    this.message = message;
    this.errorCode = errorCode;
  }
  toString() {
    let msg = this.message == null ? dart.str`OS error code: ${this.errorCode}` : this.message;
    let args = this.arguments[dartx.join](' ');
    return dart.str`ProcessException: ${msg}\n  Command: ${this.executable} ${args}`;
  }
};
io.ProcessException[dart.implements] = () => [io.IOException];
dart.setSignature(io.ProcessException, {
  constructors: () => ({new: dart.definiteFunctionType(io.ProcessException, [core.String, ListOfString()], [core.String, core.int])}),
  fields: () => ({
    executable: core.String,
    arguments: ListOfString(),
    message: core.String,
    errorCode: core.int
  })
});
const _detachRaw = Symbol('_detachRaw');
io.SecureSocket = class SecureSocket extends core.Object {
  static _(rawSocket) {
    dart.throw(new core.UnsupportedError("SecureSocket constructor"));
  }
  static connect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    return io.RawSecureSocket.connect(host, port, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}).then(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket()));
  }
  static secure(socket, opts) {
    let host = opts && 'host' in opts ? opts.host : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let completer = async.Completer.new();
    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
    }, dynamicToNull()));
    return FutureOfSecureSocket()._check(completer.future);
  }
  static secureServer(socket, context, opts) {
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let completer = async.Completer.new();
    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
    }, dynamicToNull()));
    return FutureOfSecureSocket()._check(completer.future);
  }
};
io.SecureSocket[dart.implements] = () => [io.Socket];
dart.setSignature(io.SecureSocket, {
  constructors: () => ({_: dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])}),
  statics: () => ({
    connect: dart.definiteFunctionType(async.Future$(io.SecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    secure: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket], {host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool()}),
    secureServer: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket, io.SecurityContext], {bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
  }),
  names: ['connect', 'secure', 'secureServer']
});
io.SecureServerSocket = class SecureServerSocket extends async.Stream$(io.SecureSocket) {
  _(socket) {
    this[_socket] = socket;
    super.new();
  }
  static bind(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io.RawSecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols, shared: shared}).then(io.SecureServerSocket)(dart.fn(serverSocket => new io.SecureServerSocket._(serverSocket), RawSecureServerSocketToSecureServerSocket()));
  }
  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[_socket].map(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  get port() {
    return this[_socket].port;
  }
  get address() {
    return this[_socket].address;
  }
  close() {
    return this[_socket].close().then(io.SecureServerSocket)(dart.fn(_ => this, RawSecureServerSocketToSecureServerSocket()));
  }
  set [_owner](owner) {
    this[_socket][_owner] = owner;
  }
};
dart.addSimpleTypeTests(io.SecureServerSocket);
dart.defineNamedConstructor(io.SecureServerSocket, '_');
dart.setSignature(io.SecureServerSocket, {
  constructors: () => ({_: dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])}),
  fields: () => ({[_socket]: io.RawSecureServerSocket}),
  getters: () => ({
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, [])
  }),
  setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.SecureSocket), [SecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [])
  }),
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
  names: ['bind']
});
const _onSubscriptionStateChange = Symbol('_onSubscriptionStateChange');
const _onPauseStateChange = Symbol('_onPauseStateChange');
io.RawSecureSocket = class RawSecureSocket extends core.Object {
  static connect(host, port, opts) {
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    io._RawSecureSocket._verifyFields(host, port, false, false, false, onBadCertificate);
    return io.RawSocket.connect(host, port).then(io.RawSecureSocket)(dart.fn(socket => io.RawSecureSocket.secure(socket, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}), RawSocketToFutureOfRawSecureSocket()));
  }
  static secure(socket, opts) {
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let host = opts && 'host' in opts ? opts.host : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    socket.readEventsEnabled = false;
    socket.writeEventsEnabled = false;
    return io._RawSecureSocket.connect(host != null ? host : socket.address.host, socket.port, {is_server: false, socket: socket, subscription: subscription, context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols});
  }
  static secureServer(socket, context, opts) {
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    socket.readEventsEnabled = false;
    socket.writeEventsEnabled = false;
    return io._RawSecureSocket.connect(socket.address, socket.remotePort, {context: context, is_server: true, socket: socket, subscription: subscription, bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols});
  }
};
io.RawSecureSocket[dart.implements] = () => [io.RawSocket];
dart.setSignature(io.RawSecureSocket, {
  statics: () => ({
    connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
  }),
  names: ['connect', 'secure', 'secureServer']
});
io.RawSecureServerSocket = class RawSecureServerSocket extends async.Stream$(io.RawSecureSocket) {
  _(socket, context, requestClientCertificate, requireClientCertificate, supportedProtocols) {
    this[_socket] = socket;
    this[_context] = context;
    this.requestClientCertificate = requestClientCertificate;
    this.requireClientCertificate = requireClientCertificate;
    this.supportedProtocols = supportedProtocols;
    this[_controller] = null;
    this[_subscription] = null;
    this[_closed] = false;
    super.new();
    this[_controller] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
  }
  static bind(address, port, context, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    return io.RawServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io.RawSecureServerSocket)(dart.fn(serverSocket => new io.RawSecureServerSocket._(serverSocket, context, requestClientCertificate, requireClientCertificate, supportedProtocols), RawServerSocketToRawSecureServerSocket()));
  }
  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});
  }
  get port() {
    return this[_socket].port;
  }
  get address() {
    return this[_socket].address;
  }
  close() {
    this[_closed] = true;
    return this[_socket].close().then(io.RawSecureServerSocket)(dart.fn(_ => this, RawServerSocketToRawSecureServerSocket()));
  }
  [_onData](connection) {
    let remotePort = null;
    try {
      remotePort = connection.remotePort;
    } catch (e) {
      return;
    }

    io._RawSecureSocket.connect(connection.address, core.int._check(remotePort), {context: this[_context], is_server: true, socket: connection, requestClientCertificate: this.requestClientCertificate, requireClientCertificate: this.requireClientCertificate, supportedProtocols: this.supportedProtocols}).then(dart.dynamic)(dart.fn(secureConnection => {
      if (dart.test(this[_closed])) {
        secureConnection.close();
      } else {
        this[_controller].add(secureConnection);
      }
    }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
      if (!dart.test(this[_closed])) {
        this[_controller].addError(e, core.StackTrace._check(s));
      }
    }, dynamicAnddynamicToNull()));
  }
  [_onPauseStateChange]() {
    if (dart.test(this[_controller].isPaused)) {
      this[_subscription].pause();
    } else {
      this[_subscription].resume();
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller].hasListener)) {
      this[_subscription] = this[_socket].listen(dart.bind(this, _onData), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this[_controller], 'close')});
    } else {
      this.close();
    }
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
};
dart.addSimpleTypeTests(io.RawSecureServerSocket);
dart.defineNamedConstructor(io.RawSecureServerSocket, '_');
dart.setSignature(io.RawSecureServerSocket, {
  constructors: () => ({_: dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket, io.SecurityContext, core.bool, core.bool, ListOfString()])}),
  fields: () => ({
    [_socket]: io.RawServerSocket,
    [_controller]: StreamControllerOfRawSecureSocket(),
    [_subscription]: StreamSubscriptionOfRawSocket(),
    [_context]: io.SecurityContext,
    requestClientCertificate: core.bool,
    requireClientCertificate: core.bool,
    supportedProtocols: ListOfString(),
    [_closed]: core.bool
  }),
  getters: () => ({
    port: dart.definiteFunctionType(core.int, []),
    address: dart.definiteFunctionType(io.InternetAddress, [])
  }),
  setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSecureSocket), [RawSecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    close: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), []),
    [_onData]: dart.definiteFunctionType(dart.void, [io.RawSocket]),
    [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
    [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, [])
  }),
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
  names: ['bind']
});
io.X509Certificate = class X509Certificate extends core.Object {
  static _() {
    dart.throw(new core.UnsupportedError("X509Certificate constructor"));
  }
};
dart.setSignature(io.X509Certificate, {
  constructors: () => ({_: dart.definiteFunctionType(io.X509Certificate, [])})
});
io._FilterStatus = class _FilterStatus extends core.Object {
  new() {
    this.progress = false;
    this.readEmpty = true;
    this.writeEmpty = true;
    this.readPlaintextNoLongerEmpty = false;
    this.writePlaintextNoLongerFull = false;
    this.readEncryptedNoLongerFull = false;
    this.writeEncryptedNoLongerEmpty = false;
  }
};
dart.setSignature(io._FilterStatus, {
  constructors: () => ({new: dart.definiteFunctionType(io._FilterStatus, [])}),
  fields: () => ({
    progress: core.bool,
    readEmpty: core.bool,
    writeEmpty: core.bool,
    readPlaintextNoLongerEmpty: core.bool,
    writePlaintextNoLongerFull: core.bool,
    readEncryptedNoLongerFull: core.bool,
    writeEncryptedNoLongerEmpty: core.bool
  })
});
const _handshakeComplete = Symbol('_handshakeComplete');
const _status = Symbol('_status');
const _filterStatus = Symbol('_filterStatus');
const _secureFilter = Symbol('_secureFilter');
const _bufferedData = Symbol('_bufferedData');
const _bufferedDataIndex = Symbol('_bufferedDataIndex');
const _writeEventsEnabled = Symbol('_writeEventsEnabled');
const _readEventsEnabled = Symbol('_readEventsEnabled');
const _pendingReadEvent = Symbol('_pendingReadEvent');
const _socketClosedRead = Symbol('_socketClosedRead');
const _socketClosedWrite = Symbol('_socketClosedWrite');
const _closedRead = Symbol('_closedRead');
const _closedWrite = Symbol('_closedWrite');
const _connectPending = Symbol('_connectPending');
const _filterPending = Symbol('_filterPending');
const _filterActive = Symbol('_filterActive');
const _selectedProtocol = Symbol('_selectedProtocol');
const _secureHandshakeCompleteHandler = Symbol('_secureHandshakeCompleteHandler');
const _onBadCertificateWrapper = Symbol('_onBadCertificateWrapper');
const _eventDispatcher = Symbol('_eventDispatcher');
const _doneHandler = Symbol('_doneHandler');
const _secureHandshake = Symbol('_secureHandshake');
const _sendWriteEvent = Symbol('_sendWriteEvent');
const _completeCloseCompleter = Symbol('_completeCloseCompleter');
const _close = Symbol('_close');
const _scheduleReadEvent = Symbol('_scheduleReadEvent');
const _scheduleFilter = Symbol('_scheduleFilter');
const _readHandler = Symbol('_readHandler');
const _writeHandler = Symbol('_writeHandler');
const _closeHandler = Symbol('_closeHandler');
const _readSocket = Symbol('_readSocket');
const _writeSocket = Symbol('_writeSocket');
const _tryFilter = Symbol('_tryFilter');
const _pushAllFilterStages = Symbol('_pushAllFilterStages');
const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
const _sendReadEvent = Symbol('_sendReadEvent');
let const;
io.RawSocketEvent = class RawSocketEvent extends core.Object {
  _(value) {
    this[_value] = value;
  }
  toString() {
    return (const || (const = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value]);
  }
};
dart.defineNamedConstructor(io.RawSocketEvent, '_');
dart.setSignature(io.RawSocketEvent, {
  constructors: () => ({_: dart.definiteFunctionType(io.RawSocketEvent, [core.int])}),
  fields: () => ({[_value]: core.int}),
  sfields: () => ({
    READ: io.RawSocketEvent,
    WRITE: io.RawSocketEvent,
    READ_CLOSED: io.RawSocketEvent,
    CLOSED: io.RawSocketEvent
  })
});
dart.defineLazy(io.RawSocketEvent, {
  get READ() {
    return dart.const(new io.RawSocketEvent._(0));
  },
  get WRITE() {
    return dart.const(new io.RawSocketEvent._(1));
  },
  get READ_CLOSED() {
    return dart.const(new io.RawSocketEvent._(2));
  },
  get CLOSED() {
    return dart.const(new io.RawSocketEvent._(3));
  }
});
io._RawSecureSocket = class _RawSecureSocket extends async.Stream$(io.RawSocketEvent) {
  static _isBufferEncrypted(identifier) {
    return dart.notNull(identifier) >= dart.notNull(io._RawSecureSocket.READ_ENCRYPTED);
  }
  static connect(host, requestedPort, opts) {
    let is_server = opts && 'is_server' in opts ? opts.is_server : null;
    let context = opts && 'context' in opts ? opts.context : null;
    let socket = opts && 'socket' in opts ? opts.socket : null;
    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
    io._RawSecureSocket._verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate);
    if (io.InternetAddress.is(host)) host = dart.dload(host, 'host');
    let address = socket.address;
    if (host != null) {
      address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
    }
    return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
  }
  new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
    this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
    this[_status] = io._RawSecureSocket.HANDSHAKE;
    this[_closeCompleter] = async.Completer.new();
    this[_filterStatus] = new io._FilterStatus();
    this[_secureFilter] = io._SecureFilter.new();
    this.address = address;
    this.is_server = is_server;
    this.context = context;
    this[_socket] = socket;
    this[_socketSubscription] = socketSubscription;
    this[_bufferedData] = bufferedData;
    this.requestClientCertificate = requestClientCertificate;
    this.requireClientCertificate = requireClientCertificate;
    this.onBadCertificate = onBadCertificate;
    this[_controller] = null;
    this[_stream] = null;
    this[_bufferedDataIndex] = 0;
    this[_writeEventsEnabled] = true;
    this[_readEventsEnabled] = true;
    this[_pauseCount] = 0;
    this[_pendingReadEvent] = false;
    this[_socketClosedRead] = false;
    this[_socketClosedWrite] = false;
    this[_closedRead] = false;
    this[_closedWrite] = false;
    this[_connectPending] = true;
    this[_filterPending] = false;
    this[_filterActive] = false;
    this[_selectedProtocol] = null;
    super.new();
    if (this.context == null) {
      this.context = io.SecurityContext.defaultContext;
    }
    this[_controller] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
    this[_stream] = this[_controller].stream;
    this[_secureFilter].init();
    this[_secureFilter].registerHandshakeCompleteCallback(dart.bind(this, _secureHandshakeCompleteHandler));
    if (this.onBadCertificate != null) {
      this[_secureFilter].registerBadCertificateCallback(dart.bind(this, _onBadCertificateWrapper));
    }
    this[_socket].readEventsEnabled = true;
    this[_socket].writeEventsEnabled = false;
    if (this[_socketSubscription] == null) {
      this[_socketSubscription] = this[_socket].listen(dart.bind(this, _eventDispatcher), {onError: dart.bind(this, _reportError), onDone: dart.bind(this, _doneHandler)});
    } else {
      if (dart.test(this[_socketSubscription].isPaused)) {
        this[_socket].close();
        dart.throw(new core.ArgumentError("Subscription passed to TLS upgrade is paused"));
      }
      let s = this[_socket];
      if (dart.test(dart.dload(dart.dload(s, _socket), 'closedReadEventSent'))) {
        this[_eventDispatcher](io.RawSocketEvent.READ_CLOSED);
      }
      let _ = this[_socketSubscription];
      _.onData(dart.bind(this, _eventDispatcher));
      _.onError(dart.bind(this, _reportError));
      _.onDone(dart.bind(this, _doneHandler));
    }
    try {
      let encodedProtocols = io.SecurityContext._protocolsToLengthEncoding(supportedProtocols);
      this[_secureFilter].connect(this.address.host, this.context, this.is_server, dart.test(this.requestClientCertificate) || dart.test(this.requireClientCertificate), this.requireClientCertificate, encodedProtocols);
      this[_secureHandshake]();
    } catch (e) {
      let s = dart.stackTrace(e);
      this[_reportError](e, s);
    }

  }
  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;
    this[_sendWriteEvent]();
    return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
  static _verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate) {
    if (!(typeof host == 'string') && !io.InternetAddress.is(host)) {
      dart.throw(new core.ArgumentError("host is not a String or an InternetAddress"));
    }
    if (!(typeof requestedPort == 'number')) {
      dart.throw(new core.ArgumentError("requestedPort is not an int"));
    }
    if (dart.notNull(requestedPort) < 0 || dart.notNull(requestedPort) > 65535) {
      dart.throw(new core.ArgumentError("requestedPort is not in the range 0..65535"));
    }
    if (!(typeof requestClientCertificate == 'boolean')) {
      dart.throw(new core.ArgumentError("requestClientCertificate is not a bool"));
    }
    if (!(typeof requireClientCertificate == 'boolean')) {
      dart.throw(new core.ArgumentError("requireClientCertificate is not a bool"));
    }
    if (onBadCertificate != null && !core.Function.is(onBadCertificate)) {
      dart.throw(new core.ArgumentError("onBadCertificate is not null or a Function"));
    }
  }
  get port() {
    return this[_socket].port;
  }
  get remoteAddress() {
    return this[_socket].remoteAddress;
  }
  get remotePort() {
    return this[_socket].remotePort;
  }
  set [_owner](owner) {
    dart.dput(this[_socket], _owner, owner);
  }
  available() {
    return this[_status] != io._RawSecureSocket.CONNECTED ? 0 : this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).length;
  }
  close() {
    this.shutdown(io.SocketDirection.BOTH);
    return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
  }
  [_completeCloseCompleter](dummy) {
    if (dummy === void 0) dummy = null;
    if (!dart.test(this[_closeCompleter].isCompleted)) this[_closeCompleter].complete(this);
  }
  [_close]() {
    this[_closedWrite] = true;
    this[_closedRead] = true;
    if (this[_socket] != null) {
      this[_socket].close().then(dart.void)(dart.bind(this, _completeCloseCompleter));
    } else {
      this[_completeCloseCompleter]();
    }
    this[_socketClosedWrite] = true;
    this[_socketClosedRead] = true;
    if (!dart.test(this[_filterActive]) && this[_secureFilter] != null) {
      this[_secureFilter].destroy();
      this[_secureFilter] = null;
    }
    if (this[_socketSubscription] != null) {
      this[_socketSubscription].cancel();
    }
    this[_controller].close();
    this[_status] = io._RawSecureSocket.CLOSED;
  }
  shutdown(direction) {
    if (dart.equals(direction, io.SocketDirection.SEND) || dart.equals(direction, io.SocketDirection.BOTH)) {
      this[_closedWrite] = true;
      if (dart.test(this[_filterStatus].writeEmpty)) {
        this[_socket].shutdown(io.SocketDirection.SEND);
        this[_socketClosedWrite] = true;
        if (dart.test(this[_closedRead])) {
          this[_close]();
        }
      }
    }
    if (dart.equals(direction, io.SocketDirection.RECEIVE) || dart.equals(direction, io.SocketDirection.BOTH)) {
      this[_closedRead] = true;
      this[_socketClosedRead] = true;
      this[_socket].shutdown(io.SocketDirection.RECEIVE);
      if (dart.test(this[_socketClosedWrite])) {
        this[_close]();
      }
    }
  }
  get writeEventsEnabled() {
    return this[_writeEventsEnabled];
  }
  set writeEventsEnabled(value) {
    this[_writeEventsEnabled] = value;
    if (dart.test(value)) {
      async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTovoid()));
    }
  }
  get readEventsEnabled() {
    return this[_readEventsEnabled];
  }
  set readEventsEnabled(value) {
    this[_readEventsEnabled] = value;
    this[_scheduleReadEvent]();
  }
  read(length) {
    if (length === void 0) length = null;
    if (length != null && (!(typeof length == 'number') || dart.notNull(length) < 0)) {
      dart.throw(new core.ArgumentError(dart.str`Invalid length parameter in SecureSocket.read (length: ${length})`));
    }
    if (dart.test(this[_closedRead])) {
      dart.throw(new io.SocketException("Reading from a closed socket"));
    }
    if (this[_status] != io._RawSecureSocket.CONNECTED) {
      return null;
    }
    let result = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).read(length);
    this[_scheduleFilter]();
    return result;
  }
  write(data, offset, bytes) {
    if (offset === void 0) offset = null;
    if (bytes === void 0) bytes = null;
    if (bytes != null && (!(typeof bytes == 'number') || dart.notNull(bytes) < 0)) {
      dart.throw(new core.ArgumentError(dart.str`Invalid bytes parameter in SecureSocket.read (bytes: ${bytes})`));
    }
    if (offset != null && (!(typeof offset == 'number') || dart.notNull(offset) < 0)) {
      dart.throw(new core.ArgumentError(dart.str`Invalid offset parameter in SecureSocket.read (offset: ${offset})`));
    }
    if (dart.test(this[_closedWrite])) {
      this[_controller].addError(new io.SocketException("Writing to a closed socket"));
      return 0;
    }
    if (this[_status] != io._RawSecureSocket.CONNECTED) return 0;
    if (offset == null) offset = 0;
    if (bytes == null) bytes = dart.notNull(data[dartx.length]) - dart.notNull(offset);
    let written = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).write(data, offset, bytes);
    if (dart.notNull(written) > 0) {
      this[_filterStatus].writeEmpty = false;
    }
    this[_scheduleFilter]();
    return written;
  }
  get peerCertificate() {
    return this[_secureFilter].peerCertificate;
  }
  get selectedProtocol() {
    return this[_selectedProtocol];
  }
  [_onBadCertificateWrapper](certificate) {
    if (this.onBadCertificate == null) return false;
    let result = dart.dcall(this.onBadCertificate, certificate);
    if (typeof result == 'boolean') return result;
    dart.throw(new io.HandshakeException(dart.str`onBadCertificate callback returned non-boolean ${result}`));
  }
  setOption(option, enabled) {
    if (this[_socket] == null) return false;
    return this[_socket].setOption(option, enabled);
  }
  [_eventDispatcher](event) {
    try {
      if (dart.equals(event, io.RawSocketEvent.READ)) {
        this[_readHandler]();
      } else if (dart.equals(event, io.RawSocketEvent.WRITE)) {
        this[_writeHandler]();
      } else if (dart.equals(event, io.RawSocketEvent.READ_CLOSED)) {
        this[_closeHandler]();
      }
    } catch (e) {
      let stackTrace = dart.stackTrace(e);
      this[_reportError](e, stackTrace);
    }

  }
  [_readHandler]() {
    this[_readSocket]();
    this[_scheduleFilter]();
  }
  [_writeHandler]() {
    this[_writeSocket]();
    this[_scheduleFilter]();
  }
  [_doneHandler]() {
    if (dart.test(this[_filterStatus].readEmpty)) {
      this[_close]();
    }
  }
  [_reportError](e, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    if (this[_status] == io._RawSecureSocket.CLOSED) {
      return;
    } else if (dart.test(this[_connectPending])) {
      this[_handshakeComplete].completeError(e, stackTrace);
    } else {
      this[_controller].addError(e, stackTrace);
    }
    this[_close]();
  }
  [_closeHandler]() {
    if (this[_status] == io._RawSecureSocket.CONNECTED) {
      if (dart.test(this[_closedRead])) return;
      this[_socketClosedRead] = true;
      if (dart.test(this[_filterStatus].readEmpty)) {
        this[_closedRead] = true;
        this[_controller].add(io.RawSocketEvent.READ_CLOSED);
        if (dart.test(this[_socketClosedWrite])) {
          this[_close]();
        }
      } else {
        this[_scheduleFilter]();
      }
    } else if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
      this[_socketClosedRead] = true;
      if (dart.test(this[_filterStatus].readEmpty)) {
        this[_reportError](new io.HandshakeException('Connection terminated during handshake'), null);
      } else {
        this[_secureHandshake]();
      }
    }
  }
  [_secureHandshake]() {
    try {
      this[_secureFilter].handshake();
      this[_filterStatus].writeEmpty = false;
      this[_readSocket]();
      this[_writeSocket]();
      this[_scheduleFilter]();
    } catch (e) {
      let stackTrace = dart.stackTrace(e);
      this[_reportError](e, stackTrace);
    }

  }
  renegotiate(opts) {
    let useSessionCache = opts && 'useSessionCache' in opts ? opts.useSessionCache : true;
    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
    if (this[_status] != io._RawSecureSocket.CONNECTED) {
      dart.throw(new io.HandshakeException("Called renegotiate on a non-connected socket"));
    }
    this[_secureFilter].renegotiate(useSessionCache, requestClientCertificate, requireClientCertificate);
    this[_status] = io._RawSecureSocket.HANDSHAKE;
    this[_filterStatus].writeEmpty = false;
    this[_scheduleFilter]();
  }
  [_secureHandshakeCompleteHandler]() {
    this[_status] = io._RawSecureSocket.CONNECTED;
    if (dart.test(this[_connectPending])) {
      this[_connectPending] = false;
      try {
        this[_selectedProtocol] = this[_secureFilter].selectedProtocol();
        async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid()));
      } catch (error) {
        let stack = dart.stackTrace(error);
        this[_handshakeComplete].completeError(error, stack);
      }

    }
  }
  [_onPauseStateChange]() {
    if (dart.test(this[_controller].isPaused)) {
      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
    } else {
      this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
      if (this[_pauseCount] == 0) {
        this[_scheduleReadEvent]();
        this[_sendWriteEvent]();
      }
    }
    if (!dart.test(this[_socketClosedRead]) || !dart.test(this[_socketClosedWrite])) {
      if (dart.test(this[_controller].isPaused)) {
        this[_socketSubscription].pause();
      } else {
        this[_socketSubscription].resume();
      }
    }
  }
  [_onSubscriptionStateChange]() {
    if (dart.test(this[_controller].hasListener)) {
    }
  }
  [_scheduleFilter]() {
    this[_filterPending] = true;
    this[_tryFilter]();
  }
  [_tryFilter]() {
    if (this[_status] == io._RawSecureSocket.CLOSED) {
      return;
    }
    if (dart.test(this[_filterPending]) && !dart.test(this[_filterActive])) {
      this[_filterActive] = true;
      this[_filterPending] = false;
      this[_pushAllFilterStages]().then(dart.dynamic)(dart.fn(status => {
        this[_filterStatus] = status;
        this[_filterActive] = false;
        if (this[_status] == io._RawSecureSocket.CLOSED) {
          this[_secureFilter].destroy();
          this[_secureFilter] = null;
          return;
        }
        this[_socket].readEventsEnabled = true;
        if (dart.test(this[_filterStatus].writeEmpty) && dart.test(this[_closedWrite]) && !dart.test(this[_socketClosedWrite])) {
          this.shutdown(io.SocketDirection.SEND);
          if (this[_status] == io._RawSecureSocket.CLOSED) {
            return;
          }
        }
        if (dart.test(this[_filterStatus].readEmpty) && dart.test(this[_socketClosedRead]) && !dart.test(this[_closedRead])) {
          if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
            this[_secureFilter].handshake();
            if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
              dart.throw(new io.HandshakeException('Connection terminated during handshake'));
            }
          }
          this[_closeHandler]();
        }
        if (this[_status] == io._RawSecureSocket.CLOSED) {
          return;
        }
        if (dart.test(this[_filterStatus].progress)) {
          this[_filterPending] = true;
          if (dart.test(this[_filterStatus].writeEncryptedNoLongerEmpty)) {
            this[_writeSocket]();
          }
          if (dart.test(this[_filterStatus].writePlaintextNoLongerFull)) {
            this[_sendWriteEvent]();
          }
          if (dart.test(this[_filterStatus].readEncryptedNoLongerFull)) {
            this[_readSocket]();
          }
          if (dart.test(this[_filterStatus].readPlaintextNoLongerEmpty)) {
            this[_scheduleReadEvent]();
          }
          if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
            this[_secureHandshake]();
          }
        }
        this[_tryFilter]();
      }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
    }
  }
  [_readSocketOrBufferedData](bytes) {
    if (this[_bufferedData] != null) {
      if (dart.notNull(bytes) > dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex])) {
        bytes = dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex]);
      }
      let result = this[_bufferedData][dartx.sublist](this[_bufferedDataIndex], dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes));
      this[_bufferedDataIndex] = dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes);
      if (this[_bufferedData][dartx.length] == this[_bufferedDataIndex]) {
        this[_bufferedData] = null;
      }
      return result;
    } else if (!dart.test(this[_socketClosedRead])) {
      return this[_socket].read(bytes);
    } else {
      return null;
    }
  }
  [_readSocket]() {
    if (this[_status] == io._RawSecureSocket.CLOSED) return;
    let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
    if (dart.notNull(buffer.writeFromSource(dart.bind(this, _readSocketOrBufferedData))) > 0) {
      this[_filterStatus].readEmpty = false;
    } else {
      this[_socket].readEventsEnabled = false;
    }
  }
  [_writeSocket]() {
    if (dart.test(this[_socketClosedWrite])) return;
    let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
    if (dart.test(buffer.readToSocket(this[_socket]))) {
      this[_socket].writeEventsEnabled = true;
    }
  }
  [_scheduleReadEvent]() {
    if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
      this[_pendingReadEvent] = true;
      async.Timer.run(dart.bind(this, _sendReadEvent));
    }
  }
  [_sendReadEvent]() {
    this[_pendingReadEvent] = false;
    if (this[_status] != io._RawSecureSocket.CLOSED && dart.test(this[_readEventsEnabled]) && this[_pauseCount] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
      this[_controller].add(io.RawSocketEvent.READ);
      this[_scheduleReadEvent]();
    }
  }
  [_sendWriteEvent]() {
    if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount] == 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).free) > 0) {
      this[_writeEventsEnabled] = false;
      this[_controller].add(io.RawSocketEvent.WRITE);
    }
  }
  [_pushAllFilterStages]() {
    let wasInHandshake = this[_status] != io._RawSecureSocket.CONNECTED;
    let args = core.List.new(2 + dart.notNull(io._RawSecureSocket.NUM_BUFFERS) * 2);
    args[dartx._set](0, this[_secureFilter][_pointer]());
    args[dartx._set](1, wasInHandshake);
    let bufs = this[_secureFilter].buffers;
    for (let i = 0; i < dart.notNull(io._RawSecureSocket.NUM_BUFFERS); ++i) {
      args[dartx._set](2 * i + 2, bufs[dartx._get](i).start);
      args[dartx._set](2 * i + 3, bufs[dartx._get](i).end);
    }
    return io._IOService._dispatch(io._SSL_PROCESS_FILTER, args).then(io._FilterStatus)(dart.fn(response => {
      if (dart.equals(dart.dload(response, 'length'), 2)) {
        if (wasInHandshake) {
          this[_reportError](new io.HandshakeException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
        } else {
          this[_reportError](new io.TlsException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
        }
      }
      function start(index) {
        return core.int._check(dart.dindex(response, 2 * dart.notNull(index)));
      }
      dart.fn(start, intToint());
      function end(index) {
        return core.int._check(dart.dindex(response, 2 * dart.notNull(index) + 1));
      }
      dart.fn(end, intToint());
      let status = new io._FilterStatus();
      status.writeEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).isEmpty) && start(io._RawSecureSocket.WRITE_ENCRYPTED) == end(io._RawSecureSocket.WRITE_ENCRYPTED);
      if (wasInHandshake) status.writeEmpty = false;
      status.readEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED).isEmpty) && start(io._RawSecureSocket.READ_PLAINTEXT) == end(io._RawSecureSocket.READ_PLAINTEXT);
      let buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT);
      let new_start = start(io._RawSecureSocket.WRITE_PLAINTEXT);
      if (new_start != buffer.start) {
        status.progress = true;
        if (buffer.free == 0) {
          status.writePlaintextNoLongerFull = true;
        }
        buffer.start = new_start;
      }
      buffer = bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
      new_start = start(io._RawSecureSocket.READ_ENCRYPTED);
      if (new_start != buffer.start) {
        status.progress = true;
        if (buffer.free == 0) {
          status.readEncryptedNoLongerFull = true;
        }
        buffer.start = new_start;
      }
      buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
      let new_end = end(io._RawSecureSocket.WRITE_ENCRYPTED);
      if (new_end != buffer.end) {
        status.progress = true;
        if (buffer.length == 0) {
          status.writeEncryptedNoLongerEmpty = true;
        }
        buffer.end = new_end;
      }
      buffer = bufs[dartx._get](io._RawSecureSocket.READ_PLAINTEXT);
      new_end = end(io._RawSecureSocket.READ_PLAINTEXT);
      if (new_end != buffer.end) {
        status.progress = true;
        if (buffer.length == 0) {
          status.readPlaintextNoLongerEmpty = true;
        }
        buffer.end = new_end;
      }
      return status;
    }, dynamicTo_FilterStatus()));
  }
};
dart.addSimpleTypeTests(io._RawSecureSocket);
io._RawSecureSocket[dart.implements] = () => [io.RawSecureSocket];
dart.setSignature(io._RawSecureSocket, {
  constructors: () => ({new: dart.definiteFunctionType(io._RawSecureSocket, [io.InternetAddress, core.int, core.bool, io.SecurityContext, io.RawSocket, StreamSubscriptionOfRawSocketEvent(), ListOfint(), core.bool, core.bool, X509CertificateTodynamic(), ListOfString()])}),
  fields: () => ({
    [_socket]: io.RawSocket,
    [_handshakeComplete]: CompleterOf_RawSecureSocket(),
    [_controller]: StreamControllerOfRawSocketEvent(),
    [_stream]: StreamOfRawSocketEvent(),
    [_socketSubscription]: StreamSubscriptionOfRawSocketEvent(),
    [_bufferedData]: ListOfint(),
    [_bufferedDataIndex]: core.int,
    address: io.InternetAddress,
    is_server: core.bool,
    context: io.SecurityContext,
    requestClientCertificate: core.bool,
    requireClientCertificate: core.bool,
    onBadCertificate: core.Function,
    [_status]: core.int,
    [_writeEventsEnabled]: core.bool,
    [_readEventsEnabled]: core.bool,
    [_pauseCount]: core.int,
    [_pendingReadEvent]: core.bool,
    [_socketClosedRead]: core.bool,
    [_socketClosedWrite]: core.bool,
    [_closedRead]: core.bool,
    [_closedWrite]: core.bool,
    [_closeCompleter]: async.Completer,
    [_filterStatus]: io._FilterStatus,
    [_connectPending]: core.bool,
    [_filterPending]: core.bool,
    [_filterActive]: core.bool,
    [_secureFilter]: io._SecureFilter,
    [_selectedProtocol]: core.String
  }),
  getters: () => ({
    port: dart.definiteFunctionType(core.int, []),
    remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
    remotePort: dart.definiteFunctionType(core.int, []),
    writeEventsEnabled: dart.definiteFunctionType(core.bool, []),
    readEventsEnabled: dart.definiteFunctionType(core.bool, []),
    peerCertificate: dart.definiteFunctionType(io.X509Certificate, []),
    selectedProtocol: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({
    [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    writeEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool]),
    readEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool])
  }),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    available: dart.definiteFunctionType(core.int, []),
    close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
    [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
    [_close]: dart.definiteFunctionType(dart.void, []),
    shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
    read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
    write: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
    [_onBadCertificateWrapper]: dart.definiteFunctionType(core.bool, [io.X509Certificate]),
    setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
    [_eventDispatcher]: dart.definiteFunctionType(dart.void, [io.RawSocketEvent]),
    [_readHandler]: dart.definiteFunctionType(dart.void, []),
    [_writeHandler]: dart.definiteFunctionType(dart.void, []),
    [_doneHandler]: dart.definiteFunctionType(dart.void, []),
    [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    [_closeHandler]: dart.definiteFunctionType(dart.void, []),
    [_secureHandshake]: dart.definiteFunctionType(dart.void, []),
    renegotiate: dart.definiteFunctionType(dart.void, [], {useSessionCache: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool}),
    [_secureHandshakeCompleteHandler]: dart.definiteFunctionType(dart.void, []),
    [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
    [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, []),
    [_scheduleFilter]: dart.definiteFunctionType(dart.void, []),
    [_tryFilter]: dart.definiteFunctionType(dart.void, []),
    [_readSocketOrBufferedData]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
    [_readSocket]: dart.definiteFunctionType(dart.void, []),
    [_writeSocket]: dart.definiteFunctionType(dart.void, []),
    [_scheduleReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
    [_sendReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
    [_sendWriteEvent]: dart.definiteFunctionType(dart.dynamic, []),
    [_pushAllFilterStages]: dart.definiteFunctionType(async.Future$(io._FilterStatus), [])
  }),
  sfields: () => ({
    HANDSHAKE: core.int,
    CONNECTED: core.int,
    CLOSED: core.int,
    READ_PLAINTEXT: core.int,
    WRITE_PLAINTEXT: core.int,
    READ_ENCRYPTED: core.int,
    WRITE_ENCRYPTED: core.int,
    NUM_BUFFERS: core.int
  }),
  statics: () => ({
    _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
    connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
    _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
  }),
  names: ['_isBufferEncrypted', 'connect', '_verifyFields']
});
io._RawSecureSocket.HANDSHAKE = 201;
io._RawSecureSocket.CONNECTED = 202;
io._RawSecureSocket.CLOSED = 203;
io._RawSecureSocket.READ_PLAINTEXT = 0;
io._RawSecureSocket.WRITE_PLAINTEXT = 1;
io._RawSecureSocket.READ_ENCRYPTED = 2;
io._RawSecureSocket.WRITE_ENCRYPTED = 3;
io._RawSecureSocket.NUM_BUFFERS = 4;
io._ExternalBuffer = class _ExternalBuffer extends core.Object {
  new(size) {
    this.size = size;
    this.data = null;
    this.start = null;
    this.end = null;
    this.start = core.int._check(this.end = core.int._check(dart.dsend(this.size, '~/', 2)));
  }
  advanceStart(bytes) {
    dart.assert(dart.notNull(this.start) > dart.notNull(this.end) || dart.notNull(this.start) + dart.notNull(bytes) <= dart.notNull(this.end));
    this.start = dart.notNull(this.start) + dart.notNull(bytes);
    if (dart.notNull(this.start) >= dart.notNull(core.num._check(this.size))) {
      this.start = dart.notNull(this.start) - dart.notNull(core.num._check(this.size));
      dart.assert(dart.notNull(this.start) <= dart.notNull(this.end));
      dart.assert(dart.notNull(this.start) < dart.notNull(core.num._check(this.size)));
    }
  }
  advanceEnd(bytes) {
    dart.assert(dart.notNull(this.start) <= dart.notNull(this.end) || dart.notNull(this.start) > dart.notNull(this.end) + dart.notNull(bytes));
    this.end = dart.notNull(this.end) + dart.notNull(bytes);
    if (dart.notNull(this.end) >= dart.notNull(core.num._check(this.size))) {
      this.end = dart.notNull(this.end) - dart.notNull(core.num._check(this.size));
      dart.assert(dart.notNull(this.end) < dart.notNull(this.start));
      dart.assert(dart.notNull(this.end) < dart.notNull(core.num._check(this.size)));
    }
  }
  get isEmpty() {
    return this.end == this.start;
  }
  get length() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(dart.dsend(this.size, '+', this.end), '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
  }
  get linearLength() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(this.size, '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
  }
  get free() {
    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.notNull(this.start) - dart.notNull(this.end) - 1 : dart.dsend(dart.dsend(dart.dsend(this.size, '+', this.start), '-', this.end), '-', 1));
  }
  get linearFree() {
    if (dart.notNull(this.start) > dart.notNull(this.end)) return dart.notNull(this.start) - dart.notNull(this.end) - 1;
    if (this.start == 0) return core.int._check(dart.dsend(dart.dsend(this.size, '-', this.end), '-', 1));
    return core.int._check(dart.dsend(this.size, '-', this.end));
  }
  read(bytes) {
    if (bytes == null) {
      bytes = this.length;
    } else {
      bytes = math.min(core.int)(bytes, this.length);
    }
    if (bytes == 0) return null;
    let result = typed_data.Uint8List.new(bytes);
    let bytesRead = 0;
    while (dart.notNull(bytesRead) < dart.notNull(bytes)) {
      let toRead = math.min(core.int)(dart.notNull(bytes) - dart.notNull(bytesRead), this.linearLength);
      result[dartx.setRange](bytesRead, dart.notNull(bytesRead) + dart.notNull(toRead), this.data, this.start);
      this.advanceStart(toRead);
      bytesRead = dart.notNull(bytesRead) + dart.notNull(toRead);
    }
    return result;
  }
  write(inputData, offset, bytes) {
    if (dart.notNull(bytes) > dart.notNull(this.free)) {
      bytes = this.free;
    }
    let written = 0;
    let toWrite = math.min(core.int)(bytes, this.linearFree);
    while (dart.notNull(toWrite) > 0) {
      this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(toWrite), inputData, offset);
      this.advanceEnd(toWrite);
      offset = dart.notNull(offset) + dart.notNull(toWrite);
      written = dart.notNull(written) + dart.notNull(toWrite);
      toWrite = math.min(core.int)(dart.notNull(bytes) - dart.notNull(written), this.linearFree);
    }
    return written;
  }
  writeFromSource(getData) {
    let written = 0;
    let toWrite = this.linearFree;
    while (dart.notNull(toWrite) > 0) {
      let inputData = getData(toWrite);
      if (inputData == null || inputData[dartx.length] == 0) break;
      let len = inputData[dartx.length];
      this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(len), inputData);
      this.advanceEnd(len);
      written = dart.notNull(written) + dart.notNull(len);
      toWrite = this.linearFree;
    }
    return written;
  }
  readToSocket(socket) {
    while (true) {
      let toWrite = this.linearLength;
      if (toWrite == 0) return false;
      let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
      this.advanceStart(bytes);
      if (dart.notNull(bytes) < dart.notNull(toWrite)) {
        return true;
      }
    }
  }
};
dart.setSignature(io._ExternalBuffer, {
  constructors: () => ({new: dart.definiteFunctionType(io._ExternalBuffer, [dart.dynamic])}),
  fields: () => ({
    data: core.List,
    start: core.int,
    end: core.int,
    size: dart.dynamic
  }),
  getters: () => ({
    isEmpty: dart.definiteFunctionType(core.bool, []),
    length: dart.definiteFunctionType(core.int, []),
    linearLength: dart.definiteFunctionType(core.int, []),
    free: dart.definiteFunctionType(core.int, []),
    linearFree: dart.definiteFunctionType(core.int, [])
  }),
  methods: () => ({
    advanceStart: dart.definiteFunctionType(dart.void, [core.int]),
    advanceEnd: dart.definiteFunctionType(dart.void, [core.int]),
    read: dart.definiteFunctionType(core.List$(core.int), [core.int]),
    write: dart.definiteFunctionType(core.int, [ListOfint(), core.int, core.int]),
    writeFromSource: dart.definiteFunctionType(core.int, [intToListOfint()]),
    readToSocket: dart.definiteFunctionType(core.bool, [io.RawSocket])
  })
});
io._SecureFilter = class _SecureFilter extends core.Object {
  static new() {
    dart.throw(new core.UnsupportedError("_SecureFilter._SecureFilter"));
  }
};
dart.setSignature(io._SecureFilter, {
  constructors: () => ({new: dart.definiteFunctionType(io._SecureFilter, [])})
});
io.TlsException = class TlsException extends core.Object {
  new(message, osError) {
    if (message === void 0) message = "";
    if (osError === void 0) osError = null;
    TlsException.prototype._.call(this, "TlsException", message, osError);
  }
  _(type, message, osError) {
    this.type = type;
    this.message = message;
    this.osError = osError;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write(this.type);
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(dart.str`: ${this.message}`);
      if (this.osError != null) {
        sb.write(dart.str` (${this.osError})`);
      }
    } else if (this.osError != null) {
      sb.write(dart.str`: ${this.osError}`);
    }
    return sb.toString();
  }
};
dart.defineNamedConstructor(io.TlsException, '_');
io.TlsException[dart.implements] = () => [io.IOException];
dart.setSignature(io.TlsException, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.TlsException, [], [core.String, io.OSError]),
    _: dart.definiteFunctionType(io.TlsException, [core.String, core.String, io.OSError])
  }),
  fields: () => ({
    type: core.String,
    message: core.String,
    osError: io.OSError
  })
});
io.HandshakeException = class HandshakeException extends io.TlsException {
  new(message, osError) {
    if (message === void 0) message = "";
    if (osError === void 0) osError = null;
    super._("HandshakeException", message, osError);
  }
};
dart.setSignature(io.HandshakeException, {
  constructors: () => ({new: dart.definiteFunctionType(io.HandshakeException, [], [core.String, io.OSError])})
});
io.CertificateException = class CertificateException extends io.TlsException {
  new(message, osError) {
    if (message === void 0) message = "";
    if (osError === void 0) osError = null;
    super._("CertificateException", message, osError);
  }
};
dart.setSignature(io.CertificateException, {
  constructors: () => ({new: dart.definiteFunctionType(io.CertificateException, [], [core.String, io.OSError])})
});
io.SecurityContext = class SecurityContext extends core.Object {
  static new() {
    dart.throw(new core.UnsupportedError("SecurityContext constructor"));
  }
  static get defaultContext() {
    dart.throw(new core.UnsupportedError("default SecurityContext getter"));
  }
  static get alpnSupported() {
    dart.throw(new core.UnsupportedError("SecurityContext alpnSupported getter"));
  }
  static _protocolsToLengthEncoding(protocols) {
    if (protocols == null || protocols[dartx.length] == 0) {
      return typed_data.Uint8List.new(0);
    }
    let protocolsLength = protocols[dartx.length];
    let expectedLength = protocolsLength;
    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
      let length = protocols[dartx._get](i)[dartx.length];
      if (dart.notNull(length) > 0 && dart.notNull(length) <= 255) {
        expectedLength = dart.notNull(expectedLength) + dart.notNull(length);
      } else {
        dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${length}).`));
      }
    }
    if (dart.notNull(expectedLength) >= 1 << 13) {
      dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
    }
    let bytes = typed_data.Uint8List.new(expectedLength);
    let bytesOffset = 0;
    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
      let proto = protocols[dartx._get](i);
      bytes[dartx._set](bytesOffset++, proto[dartx.length]);
      let bits = 0;
      for (let j = 0; j < dart.notNull(proto[dartx.length]); j++) {
        let char = proto[dartx.codeUnitAt](j);
        bits = (dart.notNull(bits) | dart.notNull(char)) >>> 0;
        bytes[dartx._set](bytesOffset++, dart.notNull(char) & 255);
      }
      if (dart.notNull(bits) > 127) {
        return io.SecurityContext._protocolsToLengthEncodingNonAsciiBailout(protocols);
      }
    }
    return bytes;
  }
  static _protocolsToLengthEncodingNonAsciiBailout(protocols) {
    function addProtocol(outBytes, protocol) {
      let protocolBytes = convert.UTF8.encode(protocol);
      let len = protocolBytes[dartx.length];
      if (dart.notNull(len) > 255) {
        dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${len})`));
      }
      outBytes[dartx.add](len);
      outBytes[dartx.addAll](protocolBytes);
    }
    dart.fn(addProtocol, ListOfintAndStringTovoid());
    let bytes = JSArrayOfint().of([]);
    for (let i = 0; i < dart.notNull(protocols[dartx.length]); i++) {
      addProtocol(bytes, protocols[dartx._get](i));
    }
    if (dart.notNull(bytes[dartx.length]) >= 1 << 13) {
      dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
    }
    return typed_data.Uint8List.fromList(bytes);
  }
};
dart.setSignature(io.SecurityContext, {
  constructors: () => ({new: dart.definiteFunctionType(io.SecurityContext, [])}),
  sgetters: () => ({
    defaultContext: dart.definiteFunctionType(io.SecurityContext, []),
    alpnSupported: dart.definiteFunctionType(core.bool, [])
  }),
  statics: () => ({
    _protocolsToLengthEncoding: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()]),
    _protocolsToLengthEncodingNonAsciiBailout: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()])
  }),
  names: ['_protocolsToLengthEncoding', '_protocolsToLengthEncodingNonAsciiBailout']
});
io._nextServiceId = 1;
io.InternetAddressType = class InternetAddressType extends core.Object {
  _(value) {
    this[_value] = value;
  }
  static _from(value) {
    if (value == 0) return io.InternetAddressType.IP_V4;
    if (value == 1) return io.InternetAddressType.IP_V6;
    dart.throw(new core.ArgumentError(dart.str`Invalid type: ${value}`));
  }
  get name() {
    switch (this[_value]) {
      case -1:
      {
        return "ANY";
      }
      case 0:
      {
        return "IP_V4";
      }
      case 1:
      {
        return "IP_V6";
      }
      default:
      {
        dart.throw(new core.ArgumentError("Invalid InternetAddress"));
      }
    }
  }
  toString() {
    return dart.str`InternetAddressType: ${this.name}`;
  }
};
dart.defineNamedConstructor(io.InternetAddressType, '_');
dart.setSignature(io.InternetAddressType, {
  constructors: () => ({
    _: dart.definiteFunctionType(io.InternetAddressType, [core.int]),
    _from: dart.definiteFunctionType(io.InternetAddressType, [core.int])
  }),
  fields: () => ({[_value]: core.int}),
  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
  sfields: () => ({
    IP_V4: io.InternetAddressType,
    IP_V6: io.InternetAddressType,
    ANY: io.InternetAddressType
  })
});
dart.defineLazy(io.InternetAddressType, {
  get IP_V4() {
    return dart.const(new io.InternetAddressType._(0));
  },
  get IP_V6() {
    return dart.const(new io.InternetAddressType._(1));
  },
  get ANY() {
    return dart.const(new io.InternetAddressType._(-1));
  }
});
io.InternetAddress = class InternetAddress extends core.Object {
  static get LOOPBACK_IP_V4() {
    dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V4"));
  }
  static get LOOPBACK_IP_V6() {
    dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V6"));
  }
  static get ANY_IP_V4() {
    dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V4"));
  }
  static get ANY_IP_V6() {
    dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V6"));
  }
  static new(address) {
    dart.throw(new core.UnsupportedError("InternetAddress"));
  }
  static lookup(host, opts) {
    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
    dart.throw(new core.UnsupportedError("InternetAddress.lookup"));
  }
  static _cloneWithNewHost(address, host) {
    dart.throw(new core.UnsupportedError("InternetAddress._cloneWithNewHost"));
  }
};
dart.setSignature(io.InternetAddress, {
  constructors: () => ({new: dart.definiteFunctionType(io.InternetAddress, [core.String])}),
  fields: () => ({type: io.InternetAddressType}),
  sgetters: () => ({
    LOOPBACK_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
    LOOPBACK_IP_V6: dart.definiteFunctionType(io.InternetAddress, []),
    ANY_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
    ANY_IP_V6: dart.definiteFunctionType(io.InternetAddress, [])
  }),
  statics: () => ({
    lookup: dart.definiteFunctionType(async.Future$(core.List$(io.InternetAddress)), [core.String], {type: io.InternetAddressType}),
    _cloneWithNewHost: dart.definiteFunctionType(io.InternetAddress, [io.InternetAddress, core.String])
  }),
  names: ['lookup', '_cloneWithNewHost']
});
io.NetworkInterface = class NetworkInterface extends core.Object {
  static get listSupported() {
    dart.throw(new core.UnsupportedError("NetworkInterface.listSupported"));
  }
  static list(opts) {
    let includeLoopback = opts && 'includeLoopback' in opts ? opts.includeLoopback : false;
    let includeLinkLocal = opts && 'includeLinkLocal' in opts ? opts.includeLinkLocal : false;
    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
    dart.throw(new core.UnsupportedError("NetworkInterface.list"));
  }
};
dart.setSignature(io.NetworkInterface, {
  sgetters: () => ({listSupported: dart.definiteFunctionType(core.bool, [])}),
  statics: () => ({list: dart.definiteFunctionType(async.Future$(core.List$(io.NetworkInterface)), [], {includeLoopback: core.bool, includeLinkLocal: core.bool, type: io.InternetAddressType})}),
  names: ['list']
});
io.RawServerSocket = class RawServerSocket extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    dart.throw(new core.UnsupportedError("RawServerSocket.bind"));
  }
};
io.RawServerSocket[dart.implements] = () => [StreamOfRawSocket()];
dart.setSignature(io.RawServerSocket, {
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
  names: ['bind']
});
io.ServerSocket = class ServerSocket extends core.Object {
  static bind(address, port, opts) {
    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
    let shared = opts && 'shared' in opts ? opts.shared : false;
    dart.throw(new core.UnsupportedError("ServerSocket.bind"));
  }
};
io.ServerSocket[dart.implements] = () => [StreamOfSocket()];
dart.setSignature(io.ServerSocket, {
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.ServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
  names: ['bind']
});
io.SocketDirection = class SocketDirection extends core.Object {
  _(value) {
    this[_value] = value;
  }
};
dart.defineNamedConstructor(io.SocketDirection, '_');
dart.setSignature(io.SocketDirection, {
  constructors: () => ({_: dart.definiteFunctionType(io.SocketDirection, [dart.dynamic])}),
  fields: () => ({[_value]: dart.dynamic}),
  sfields: () => ({
    RECEIVE: io.SocketDirection,
    SEND: io.SocketDirection,
    BOTH: io.SocketDirection
  })
});
dart.defineLazy(io.SocketDirection, {
  get RECEIVE() {
    return dart.const(new io.SocketDirection._(0));
  },
  get SEND() {
    return dart.const(new io.SocketDirection._(1));
  },
  get BOTH() {
    return dart.const(new io.SocketDirection._(2));
  }
});
io.SocketOption = class SocketOption extends core.Object {
  _(value) {
    this[_value] = value;
  }
};
dart.defineNamedConstructor(io.SocketOption, '_');
dart.setSignature(io.SocketOption, {
  constructors: () => ({_: dart.definiteFunctionType(io.SocketOption, [dart.dynamic])}),
  fields: () => ({[_value]: dart.dynamic}),
  sfields: () => ({
    TCP_NODELAY: io.SocketOption,
    _IP_MULTICAST_LOOP: io.SocketOption,
    _IP_MULTICAST_HOPS: io.SocketOption,
    _IP_MULTICAST_IF: io.SocketOption,
    _IP_BROADCAST: io.SocketOption
  })
});
dart.defineLazy(io.SocketOption, {
  get TCP_NODELAY() {
    return dart.const(new io.SocketOption._(0));
  },
  get _IP_MULTICAST_LOOP() {
    return dart.const(new io.SocketOption._(1));
  },
  get _IP_MULTICAST_HOPS() {
    return dart.const(new io.SocketOption._(2));
  },
  get _IP_MULTICAST_IF() {
    return dart.const(new io.SocketOption._(3));
  },
  get _IP_BROADCAST() {
    return dart.const(new io.SocketOption._(4));
  }
});
io.RawSocket = class RawSocket extends core.Object {
  new() {
    this.readEventsEnabled = null;
    this.writeEventsEnabled = null;
  }
  static connect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    dart.throw(new core.UnsupportedError("RawSocket constructor"));
  }
};
io.RawSocket[dart.implements] = () => [StreamOfRawSocketEvent()];
dart.setSignature(io.RawSocket, {
  fields: () => ({
    readEventsEnabled: core.bool,
    writeEventsEnabled: core.bool
  }),
  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.RawSocket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
  names: ['connect']
});
io.Socket = class Socket extends core.Object {
  static connect(host, port, opts) {
    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
    dart.throw(new core.UnsupportedError("Socket constructor"));
  }
};
io.Socket[dart.implements] = () => [StreamOfListOfint(), io.IOSink];
dart.setSignature(io.Socket, {
  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.Socket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
  names: ['connect']
});
io.Datagram = class Datagram extends core.Object {
  new(data, address, port) {
    this.data = data;
    this.address = address;
    this.port = port;
  }
};
dart.setSignature(io.Datagram, {
  constructors: () => ({new: dart.definiteFunctionType(io.Datagram, [ListOfint(), io.InternetAddress, core.int])}),
  fields: () => ({
    data: ListOfint(),
    address: io.InternetAddress,
    port: core.int
  })
});
io.RawDatagramSocket = class RawDatagramSocket extends async.Stream$(io.RawSocketEvent) {
  new() {
    this.readEventsEnabled = null;
    this.writeEventsEnabled = null;
    this.multicastLoopback = null;
    this.multicastHops = null;
    this.multicastInterface = null;
    this.broadcastEnabled = null;
    super.new();
  }
  static bind(host, port, opts) {
    let reuseAddress = opts && 'reuseAddress' in opts ? opts.reuseAddress : true;
    dart.throw(new core.UnsupportedError("RawDatagramSocket.bind"));
  }
};
dart.addSimpleTypeTests(io.RawDatagramSocket);
dart.setSignature(io.RawDatagramSocket, {
  fields: () => ({
    readEventsEnabled: core.bool,
    writeEventsEnabled: core.bool,
    multicastLoopback: core.bool,
    multicastHops: core.int,
    multicastInterface: io.NetworkInterface,
    broadcastEnabled: core.bool
  }),
  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawDatagramSocket), [dart.dynamic, core.int], {reuseAddress: core.bool})}),
  names: ['bind']
});
io.SocketException = class SocketException extends core.Object {
  new(message, opts) {
    let osError = opts && 'osError' in opts ? opts.osError : null;
    let address = opts && 'address' in opts ? opts.address : null;
    let port = opts && 'port' in opts ? opts.port : null;
    this.message = message;
    this.osError = osError;
    this.address = address;
    this.port = port;
  }
  closed() {
    this.message = 'Socket has been closed';
    this.osError = null;
    this.address = null;
    this.port = null;
  }
  toString() {
    let sb = new core.StringBuffer();
    sb.write("SocketException");
    if (!dart.test(this.message[dartx.isEmpty])) {
      sb.write(dart.str`: ${this.message}`);
      if (this.osError != null) {
        sb.write(dart.str` (${this.osError})`);
      }
    } else if (this.osError != null) {
      sb.write(dart.str`: ${this.osError}`);
    }
    if (this.address != null) {
      sb.write(dart.str`, address = ${this.address.host}`);
    }
    if (this.port != null) {
      sb.write(dart.str`, port = ${this.port}`);
    }
    return sb.toString();
  }
};
dart.defineNamedConstructor(io.SocketException, 'closed');
io.SocketException[dart.implements] = () => [io.IOException];
dart.setSignature(io.SocketException, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.SocketException, [core.String], {osError: io.OSError, address: io.InternetAddress, port: core.int}),
    closed: dart.definiteFunctionType(io.SocketException, [])
  }),
  fields: () => ({
    message: core.String,
    osError: io.OSError,
    address: io.InternetAddress,
    port: core.int
  })
});
io._STDIO_HANDLE_TYPE_TERMINAL = 0;
io._STDIO_HANDLE_TYPE_PIPE = 1;
io._STDIO_HANDLE_TYPE_FILE = 2;
io._STDIO_HANDLE_TYPE_SOCKET = 3;
io._STDIO_HANDLE_TYPE_OTHER = 4;
io._StdStream = class _StdStream extends async.Stream$(core.List$(core.int)) {
  new(stream) {
    this[_stream] = stream;
    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;
    return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
  }
};
dart.addSimpleTypeTests(io._StdStream);
dart.setSignature(io._StdStream, {
  constructors: () => ({new: dart.definiteFunctionType(io._StdStream, [StreamOfListOfint()])}),
  fields: () => ({[_stream]: StreamOfListOfint()}),
  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
});
io.Stdin = class Stdin extends io._StdStream {
  _(stream) {
    super.new(stream);
  }
  readLineSync(opts) {
    let encoding = opts && 'encoding' in opts ? opts.encoding : io.SYSTEM_ENCODING;
    let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
    let CR = 13;
    let LF = 10;
    let line = [];
    let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
    if (dart.test(retainNewlines)) {
      let byte = null;
      do {
        byte = this.readByteSync();
        if (dart.notNull(byte) < 0) {
          break;
        }
        line[dartx.add](byte);
      } while (byte != LF && !(byte == CR && crIsNewline));
      if (dart.test(line[dartx.isEmpty])) {
        return null;
      }
    } else if (crIsNewline) {
      while (true) {
        let byte = this.readByteSync();
        if (dart.notNull(byte) < 0) {
          if (dart.test(line[dartx.isEmpty])) return null;
          break;
        }
        if (byte == LF || byte == CR) break;
        line[dartx.add](byte);
      }
    } else {
      outer:
        while (true) {
          let byte = this.readByteSync();
          if (byte == LF) break;
          if (byte == CR) {
            do {
              byte = this.readByteSync();
              if (byte == LF) break outer;
              line[dartx.add](CR);
            } while (byte == CR);
          }
          if (dart.notNull(byte) < 0) {
            if (dart.test(line[dartx.isEmpty])) return null;
            break;
          }
          line[dartx.add](byte);
        }
    }
    return encoding.decode(ListOfint()._check(line));
  }
  set echoMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.echoMode"));
  }
  set echoMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.echoMode"));
  }
  set lineMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.lineMode"));
  }
  set lineMode(enabled) {
    dart.throw(new core.UnsupportedError("Stdin.lineMode"));
  }
  readByteSync() {
    dart.throw(new core.UnsupportedError("Stdin.readByteSync"));
  }
};
dart.defineNamedConstructor(io.Stdin, '_');
io.Stdin[dart.implements] = () => [StreamOfListOfint()];
dart.setSignature(io.Stdin, {
  constructors: () => ({_: dart.definiteFunctionType(io.Stdin, [StreamOfListOfint()])}),
  setters: () => ({
    echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
    echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
    lineMode: dart.definiteFunctionType(dart.void, [core.bool]),
    lineMode: dart.definiteFunctionType(dart.void, [core.bool])
  }),
  methods: () => ({
    readLineSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding, retainNewlines: core.bool}),
    readByteSync: dart.definiteFunctionType(core.int, [])
  })
});
const _fd = Symbol('_fd');
const _nonBlocking = Symbol('_nonBlocking');
const _hasTerminal = Symbol('_hasTerminal');
const _terminalColumns = Symbol('_terminalColumns');
const _terminalLines = Symbol('_terminalLines');
io._StdSink = class _StdSink extends core.Object {
  new(sink) {
    this[_sink] = sink;
  }
  get encoding() {
    return this[_sink].encoding;
  }
  set encoding(encoding) {
    this[_sink].encoding = encoding;
  }
  write(object) {
    this[_sink].write(object);
  }
  writeln(object) {
    if (object === void 0) object = "";
    this[_sink].writeln(object);
  }
  writeAll(objects, sep) {
    if (sep === void 0) sep = "";
    this[_sink].writeAll(objects, sep);
  }
  add(data) {
    this[_sink].add(data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink].addError(error, stackTrace);
  }
  writeCharCode(charCode) {
    this[_sink].writeCharCode(charCode);
  }
  addStream(stream) {
    return this[_sink].addStream(stream);
  }
  flush() {
    return this[_sink].flush();
  }
  close() {
    return this[_sink].close();
  }
  get done() {
    return this[_sink].done;
  }
};
io._StdSink[dart.implements] = () => [io.IOSink];
dart.setSignature(io._StdSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._StdSink, [io.IOSink])}),
  fields: () => ({[_sink]: io.IOSink}),
  getters: () => ({
    encoding: dart.definiteFunctionType(convert.Encoding, []),
    done: dart.definiteFunctionType(async.Future, [])
  }),
  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
  methods: () => ({
    write: dart.definiteFunctionType(dart.void, [core.Object]),
    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
    flush: dart.definiteFunctionType(async.Future, []),
    close: dart.definiteFunctionType(async.Future, [])
  })
});
io.Stdout = class Stdout extends io._StdSink {
  _(sink, fd) {
    this[_fd] = fd;
    this[_nonBlocking] = null;
    super.new(sink);
  }
  get hasTerminal() {
    return this[_hasTerminal](this[_fd]);
  }
  get terminalColumns() {
    return this[_terminalColumns](this[_fd]);
  }
  get terminalLines() {
    return this[_terminalLines](this[_fd]);
  }
  [_hasTerminal](fd) {
    dart.throw(new core.UnsupportedError("Stdout.hasTerminal"));
  }
  [_terminalColumns](fd) {
    dart.throw(new core.UnsupportedError("Stdout.terminalColumns"));
  }
  [_terminalLines](fd) {
    dart.throw(new core.UnsupportedError("Stdout.terminalLines"));
  }
  get nonBlocking() {
    if (this[_nonBlocking] == null) {
      this[_nonBlocking] = io.IOSink.new(new io._FileStreamConsumer.fromStdio(this[_fd]));
    }
    return this[_nonBlocking];
  }
};
dart.defineNamedConstructor(io.Stdout, '_');
io.Stdout[dart.implements] = () => [io.IOSink];
dart.setSignature(io.Stdout, {
  constructors: () => ({_: dart.definiteFunctionType(io.Stdout, [io.IOSink, core.int])}),
  fields: () => ({
    [_fd]: core.int,
    [_nonBlocking]: io.IOSink
  }),
  getters: () => ({
    hasTerminal: dart.definiteFunctionType(core.bool, []),
    terminalColumns: dart.definiteFunctionType(core.int, []),
    terminalLines: dart.definiteFunctionType(core.int, []),
    nonBlocking: dart.definiteFunctionType(io.IOSink, [])
  }),
  methods: () => ({
    [_hasTerminal]: dart.definiteFunctionType(core.bool, [core.int]),
    [_terminalColumns]: dart.definiteFunctionType(core.int, [core.int]),
    [_terminalLines]: dart.definiteFunctionType(core.int, [core.int])
  })
});
io.StdoutException = class StdoutException extends core.Object {
  new(message, osError) {
    if (osError === void 0) osError = null;
    this.message = message;
    this.osError = osError;
  }
  toString() {
    return dart.str`StdoutException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
  }
};
io.StdoutException[dart.implements] = () => [io.IOException];
dart.setSignature(io.StdoutException, {
  constructors: () => ({new: dart.definiteFunctionType(io.StdoutException, [core.String], [io.OSError])}),
  fields: () => ({
    message: core.String,
    osError: io.OSError
  })
});
io._StdConsumer = class _StdConsumer extends core.Object {
  new(fd) {
    this[_file] = io._File._openStdioSync(fd);
  }
  addStream(stream) {
    let completer = async.Completer.new();
    let sub = null;
    sub = stream.listen(dart.fn(data => {
      try {
        dart.dsend(this[_file], 'writeFromSync', data);
      } catch (e) {
        let s = dart.stackTrace(e);
        dart.dsend(sub, 'cancel');
        completer.completeError(e, s);
      }

    }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
    return completer.future;
  }
  close() {
    dart.dsend(this[_file], 'closeSync');
    return async.Future.value();
  }
};
io._StdConsumer[dart.implements] = () => [StreamConsumerOfListOfint()];
dart.setSignature(io._StdConsumer, {
  constructors: () => ({new: dart.definiteFunctionType(io._StdConsumer, [core.int])}),
  fields: () => ({[_file]: dart.dynamic}),
  methods: () => ({
    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
    close: dart.definiteFunctionType(async.Future, [])
  })
});
io.StdioType = class StdioType extends core.Object {
  _(name) {
    this.name = name;
  }
  toString() {
    return dart.str`StdioType: ${this.name}`;
  }
};
dart.defineNamedConstructor(io.StdioType, '_');
dart.setSignature(io.StdioType, {
  constructors: () => ({_: dart.definiteFunctionType(io.StdioType, [core.String])}),
  fields: () => ({name: core.String}),
  sfields: () => ({
    TERMINAL: io.StdioType,
    PIPE: io.StdioType,
    FILE: io.StdioType,
    OTHER: io.StdioType
  })
});
dart.defineLazy(io.StdioType, {
  get TERMINAL() {
    return dart.const(new io.StdioType._("terminal"));
  },
  get PIPE() {
    return dart.const(new io.StdioType._("pipe"));
  },
  get FILE() {
    return dart.const(new io.StdioType._("file"));
  },
  get OTHER() {
    return dart.const(new io.StdioType._("other"));
  }
});
io._stdin = null;
io._stdout = null;
io._stderr = null;
dart.copyProperties(io, {
  get stdin() {
    if (io._stdin == null) {
      io._stdin = io._StdIOUtils._getStdioInputStream();
    }
    return io._stdin;
  }
});
dart.copyProperties(io, {
  get stdout() {
    if (io._stdout == null) {
      io._stdout = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(1));
    }
    return io._stdout;
  }
});
dart.copyProperties(io, {
  get stderr() {
    if (io._stderr == null) {
      io._stderr = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(2));
    }
    return io._stderr;
  }
});
io.stdioType = function(object) {
  if (io._StdStream.is(object)) {
    object = dart.dload(object, _stream);
  } else if (dart.equals(object, io.stdout) || dart.equals(object, io.stderr)) {
    switch (io._StdIOUtils._getStdioHandleType(dart.equals(object, io.stdout) ? 1 : 2)) {
      case io._STDIO_HANDLE_TYPE_TERMINAL:
      {
        return io.StdioType.TERMINAL;
      }
      case io._STDIO_HANDLE_TYPE_PIPE:
      {
        return io.StdioType.PIPE;
      }
      case io._STDIO_HANDLE_TYPE_FILE:
      {
        return io.StdioType.FILE;
      }
    }
  }
  if (io._FileStream.is(object)) {
    return io.StdioType.FILE;
  }
  if (io.Socket.is(object)) {
    let socketType = io._StdIOUtils._socketType(object);
    if (socketType == null) return io.StdioType.OTHER;
    switch (socketType) {
      case io._STDIO_HANDLE_TYPE_TERMINAL:
      {
        return io.StdioType.TERMINAL;
      }
      case io._STDIO_HANDLE_TYPE_PIPE:
      {
        return io.StdioType.PIPE;
      }
      case io._STDIO_HANDLE_TYPE_FILE:
      {
        return io.StdioType.FILE;
      }
    }
  }
  if (io._IOSinkImpl.is(object)) {
    try {
      if (io._FileStreamConsumer.is(object[_target])) {
        return io.StdioType.FILE;
      }
    } catch (e) {
    }

  }
  return io.StdioType.OTHER;
};
dart.fn(io.stdioType, dynamicToStdioType());
io._StdIOUtils = class _StdIOUtils extends core.Object {
  static _getStdioOutputStream(fd) {
    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioOutputStream"));
  }
  static _getStdioInputStream() {
    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioInputStream"));
  }
  static _socketType(socket) {
    dart.throw(new core.UnsupportedError("StdIOUtils._socketType"));
  }
  static _getStdioHandleType(fd) {
    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioHandleType"));
  }
};
dart.setSignature(io._StdIOUtils, {
  statics: () => ({
    _getStdioOutputStream: dart.definiteFunctionType(dart.dynamic, [core.int]),
    _getStdioInputStream: dart.definiteFunctionType(io.Stdin, []),
    _socketType: dart.definiteFunctionType(core.int, [io.Socket]),
    _getStdioHandleType: dart.definiteFunctionType(dart.dynamic, [core.int])
  }),
  names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
});
let const;
let const;
let const;
let const;
io.SystemEncoding = class SystemEncoding extends convert.Encoding {
  new() {
    super.new();
  }
  get name() {
    return 'system';
  }
  encode(input) {
    return this.encoder.convert(input);
  }
  decode(encoded) {
    return this.decoder.convert(encoded);
  }
  get encoder() {
    if (io.Platform.operatingSystem == "windows") {
      return const || (const = dart.const(new io._WindowsCodePageEncoder()));
    } else {
      return const || (const = dart.const(new convert.Utf8Encoder()));
    }
  }
  get decoder() {
    if (io.Platform.operatingSystem == "windows") {
      return const || (const = dart.const(new io._WindowsCodePageDecoder()));
    } else {
      return const || (const = dart.const(new convert.Utf8Decoder()));
    }
  }
};
dart.setSignature(io.SystemEncoding, {
  constructors: () => ({new: dart.definiteFunctionType(io.SystemEncoding, [])}),
  getters: () => ({
    name: dart.definiteFunctionType(core.String, []),
    encoder: dart.definiteFunctionType(convert.Converter$(core.String, core.List$(core.int)), []),
    decoder: dart.definiteFunctionType(convert.Converter$(core.List$(core.int), core.String), [])
  })
});
io.SYSTEM_ENCODING = dart.const(new io.SystemEncoding());
io._WindowsCodePageEncoder = class _WindowsCodePageEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
  new() {
    super.new();
  }
  convert(input) {
    let encoded = io._WindowsCodePageEncoder._encodeString(input);
    if (encoded == null) {
      dart.throw(new core.FormatException("Invalid character for encoding"));
    }
    return encoded;
  }
  startChunkedConversion(sink) {
    return new io._WindowsCodePageEncoderSink(sink);
  }
  static _encodeString(string) {
    dart.throw(new core.UnsupportedError("_WindowsCodePageEncoder._encodeString"));
  }
};
dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
dart.setSignature(io._WindowsCodePageEncoder, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoder, [])}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
  }),
  statics: () => ({_encodeString: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
  names: ['_encodeString']
});
io._WindowsCodePageEncoderSink = class _WindowsCodePageEncoderSink extends convert.StringConversionSinkBase {
  new(sink) {
    this[_sink] = sink;
  }
  close() {
    this[_sink].close();
  }
  add(string) {
    let encoded = io._WindowsCodePageEncoder._encodeString(string);
    if (encoded == null) {
      dart.throw(new core.FormatException("Invalid character for encoding"));
    }
    this[_sink].add(encoded);
  }
  addSlice(source, start, end, isLast) {
    if (start != 0 || end != source[dartx.length]) {
      source = source[dartx.substring](start, end);
    }
    this.add(source);
    if (dart.test(isLast)) this.close();
  }
};
dart.setSignature(io._WindowsCodePageEncoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoderSink, [SinkOfListOfint()])}),
  fields: () => ({[_sink]: SinkOfListOfint()}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
  })
});
io._WindowsCodePageDecoder = class _WindowsCodePageDecoder extends convert.Converter$(core.List$(core.int), core.String) {
  new() {
    super.new();
  }
  convert(input) {
    return io._WindowsCodePageDecoder._decodeBytes(input);
  }
  startChunkedConversion(sink) {
    return new io._WindowsCodePageDecoderSink(sink);
  }
  static _decodeBytes(bytes) {
    dart.throw(new core.UnsupportedError("_WindowsCodePageDecoder._decodeBytes"));
  }
};
dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
dart.setSignature(io._WindowsCodePageDecoder, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoder, [])}),
  methods: () => ({
    convert: dart.definiteFunctionType(core.String, [ListOfint()]),
    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
  }),
  statics: () => ({_decodeBytes: dart.definiteFunctionType(core.String, [ListOfint()])}),
  names: ['_decodeBytes']
});
io._WindowsCodePageDecoderSink = class _WindowsCodePageDecoderSink extends convert.ByteConversionSinkBase {
  new(sink) {
    this[_sink] = sink;
    super.new();
  }
  close() {
    this[_sink].close();
  }
  add(bytes) {
    this[_sink].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
  }
};
dart.setSignature(io._WindowsCodePageDecoderSink, {
  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoderSink, [SinkOfString()])}),
  fields: () => ({[_sink]: SinkOfString()}),
  methods: () => ({
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()])
  })
});
io.WebSocketStatus = class WebSocketStatus extends core.Object {};
dart.setSignature(io.WebSocketStatus, {
  sfields: () => ({
    NORMAL_CLOSURE: core.int,
    GOING_AWAY: core.int,
    PROTOCOL_ERROR: core.int,
    UNSUPPORTED_DATA: core.int,
    RESERVED_1004: core.int,
    NO_STATUS_RECEIVED: core.int,
    ABNORMAL_CLOSURE: core.int,
    INVALID_FRAME_PAYLOAD_DATA: core.int,
    POLICY_VIOLATION: core.int,
    MESSAGE_TOO_BIG: core.int,
    MISSING_MANDATORY_EXTENSION: core.int,
    INTERNAL_SERVER_ERROR: core.int,
    RESERVED_1015: core.int
  })
});
io.WebSocketStatus.NORMAL_CLOSURE = 1000;
io.WebSocketStatus.GOING_AWAY = 1001;
io.WebSocketStatus.PROTOCOL_ERROR = 1002;
io.WebSocketStatus.UNSUPPORTED_DATA = 1003;
io.WebSocketStatus.RESERVED_1004 = 1004;
io.WebSocketStatus.NO_STATUS_RECEIVED = 1005;
io.WebSocketStatus.ABNORMAL_CLOSURE = 1006;
io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA = 1007;
io.WebSocketStatus.POLICY_VIOLATION = 1008;
io.WebSocketStatus.MESSAGE_TOO_BIG = 1009;
io.WebSocketStatus.MISSING_MANDATORY_EXTENSION = 1010;
io.WebSocketStatus.INTERNAL_SERVER_ERROR = 1011;
io.WebSocketStatus.RESERVED_1015 = 1015;
const _createServerResponseHeader = Symbol('_createServerResponseHeader');
const _createClientRequestHeader = Symbol('_createClientRequestHeader');
const _createHeader = Symbol('_createHeader');
io.CompressionOptions = class CompressionOptions extends core.Object {
  new(opts) {
    let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
    let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
    let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : null;
    let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : null;
    let enabled = opts && 'enabled' in opts ? opts.enabled : true;
    this.clientNoContextTakeover = clientNoContextTakeover;
    this.serverNoContextTakeover = serverNoContextTakeover;
    this.clientMaxWindowBits = clientMaxWindowBits;
    this.serverMaxWindowBits = serverMaxWindowBits;
    this.enabled = enabled;
  }
  [_createServerResponseHeader](requested) {
    let info = new io._CompressionMaxWindowBits();
    let mwb = null;
    let part = null;
    if (dart.nullSafe(requested, _ => _.parameters) != null) {
      part = requested.parameters[dartx._get](io._serverMaxWindowBits);
    }
    if (part != null) {
      if (dart.notNull(part[dartx.length]) >= 2 && dart.test(part[dartx.startsWith]('0'))) {
        dart.throw(new core.ArgumentError("Illegal 0 padding on value."));
      } else {
        mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint())}) : this.serverMaxWindowBits;
        info.headerValue = dart.str`; server_max_window_bits=${mwb}`;
        info.maxWindowBits = mwb;
      }
    } else {
      info.headerValue = "";
      info.maxWindowBits = io._WebSocketImpl.DEFAULT_WINDOW_BITS;
    }
    return info;
  }
  [_createClientRequestHeader](requested, size) {
    let info = "";
    if (requested != null) {
      info = dart.str`; client_max_window_bits=${size}`;
    } else {
      if (this.clientMaxWindowBits == null) {
        info = "; client_max_window_bits";
      } else {
        info = dart.str`; client_max_window_bits=${this.clientMaxWindowBits}`;
      }
      if (this.serverMaxWindowBits != null) {
        info = info + dart.str`; server_max_window_bits=${this.serverMaxWindowBits}`;
      }
    }
    return info;
  }
  [_createHeader](requested) {
    if (requested === void 0) requested = null;
    let info = new io._CompressionMaxWindowBits("", 0);
    if (!dart.test(this.enabled)) {
      return info;
    }
    info.headerValue = io._WebSocketImpl.PER_MESSAGE_DEFLATE;
    if (dart.test(this.clientNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._clientNoContextTakeover)))) {
      info.headerValue = dart.notNull(info.headerValue) + "; client_no_context_takeover";
    }
    if (dart.test(this.serverNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._serverNoContextTakeover)))) {
      info.headerValue = dart.notNull(info.headerValue) + "; server_no_context_takeover";
    }
    let headerList = this[_createServerResponseHeader](requested);
    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(headerList.headerValue);
    info.maxWindowBits = headerList.maxWindowBits;
    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(this[_createClientRequestHeader](requested, info.maxWindowBits));
    return info;
  }
};
dart.setSignature(io.CompressionOptions, {
  constructors: () => ({new: dart.definiteFunctionType(io.CompressionOptions, [], {clientNoContextTakeover: core.bool, serverNoContextTakeover: core.bool, clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, enabled: core.bool})}),
  fields: () => ({
    clientNoContextTakeover: core.bool,
    serverNoContextTakeover: core.bool,
    clientMaxWindowBits: core.int,
    serverMaxWindowBits: core.int,
    enabled: core.bool
  }),
  methods: () => ({
    [_createServerResponseHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [io.HeaderValue]),
    [_createClientRequestHeader]: dart.definiteFunctionType(core.String, [io.HeaderValue, core.int]),
    [_createHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [io.HeaderValue])
  }),
  sfields: () => ({
    DEFAULT: io.CompressionOptions,
    OFF: io.CompressionOptions
  })
});
dart.defineLazy(io.CompressionOptions, {
  get DEFAULT() {
    return dart.const(new io.CompressionOptions());
  },
  get OFF() {
    return dart.const(new io.CompressionOptions({enabled: false}));
  }
});
io.WebSocketTransformer = class WebSocketTransformer extends core.Object {
  static new(opts) {
    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    return new io._WebSocketTransformerImpl(protocolSelector, compression);
  }
  static upgrade(request, opts) {
    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    return io._WebSocketTransformerImpl._upgrade(request, protocolSelector, compression);
  }
  static isUpgradeRequest(request) {
    return io._WebSocketTransformerImpl._isUpgradeRequest(request);
  }
};
io.WebSocketTransformer[dart.implements] = () => [StreamTransformerOfHttpRequest$WebSocket()];
dart.setSignature(io.WebSocketTransformer, {
  constructors: () => ({new: dart.definiteFunctionType(io.WebSocketTransformer, [], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions})}),
  statics: () => ({
    upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions}),
    isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
  }),
  names: ['upgrade', 'isUpgradeRequest']
});
io.WebSocket = class WebSocket extends core.Object {
  static connect(url, opts) {
    let protocols = opts && 'protocols' in opts ? opts.protocols : null;
    let headers = opts && 'headers' in opts ? opts.headers : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    return io._WebSocketImpl.connect(url, protocols, headers, {compression: compression});
  }
  new() {
    this.pingInterval = null;
  }
  static fromUpgradedSocket(socket, opts) {
    let protocol = opts && 'protocol' in opts ? opts.protocol : null;
    let serverSide = opts && 'serverSide' in opts ? opts.serverSide : null;
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    if (serverSide == null) {
      dart.throw(new core.ArgumentError("The serverSide argument must be passed " + "explicitly to WebSocket.fromUpgradedSocket."));
    }
    return new io._WebSocketImpl._fromSocket(socket, protocol, compression, serverSide);
  }
};
io.WebSocket[dart.implements] = () => [async.Stream, async.StreamSink];
dart.setSignature(io.WebSocket, {
  constructors: () => ({
    new: dart.definiteFunctionType(io.WebSocket, []),
    fromUpgradedSocket: dart.definiteFunctionType(io.WebSocket, [io.Socket], {protocol: core.String, serverSide: core.bool, compression: io.CompressionOptions})
  }),
  fields: () => ({pingInterval: core.Duration}),
  sfields: () => ({
    CONNECTING: core.int,
    OPEN: core.int,
    CLOSING: core.int,
    CLOSED: core.int
  }),
  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String], {protocols: IterableOfString(), headers: MapOfString$dynamic(), compression: io.CompressionOptions})}),
  names: ['connect']
});
io.WebSocket.CONNECTING = 0;
io.WebSocket.OPEN = 1;
io.WebSocket.CLOSING = 2;
io.WebSocket.CLOSED = 3;
io.WebSocketException = class WebSocketException extends core.Object {
  new(message) {
    if (message === void 0) message = "";
    this.message = message;
  }
  toString() {
    return dart.str`WebSocketException: ${this.message}`;
  }
};
io.WebSocketException[dart.implements] = () => [io.IOException];
dart.setSignature(io.WebSocketException, {
  constructors: () => ({new: dart.definiteFunctionType(io.WebSocketException, [], [core.String])}),
  fields: () => ({message: core.String})
});
io._webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
io._clientNoContextTakeover = "client_no_context_takeover";
io._serverNoContextTakeover = "server_no_context_takeover";
io._clientMaxWindowBits = "client_max_window_bits";
io._serverMaxWindowBits = "server_max_window_bits";
io._WebSocketMessageType = class _WebSocketMessageType extends core.Object {};
dart.setSignature(io._WebSocketMessageType, {
  sfields: () => ({
    NONE: core.int,
    TEXT: core.int,
    BINARY: core.int
  })
});
io._WebSocketMessageType.NONE = 0;
io._WebSocketMessageType.TEXT = 1;
io._WebSocketMessageType.BINARY = 2;
io._WebSocketOpcode = class _WebSocketOpcode extends core.Object {};
dart.setSignature(io._WebSocketOpcode, {
  sfields: () => ({
    CONTINUATION: core.int,
    TEXT: core.int,
    BINARY: core.int,
    RESERVED_3: core.int,
    RESERVED_4: core.int,
    RESERVED_5: core.int,
    RESERVED_6: core.int,
    RESERVED_7: core.int,
    CLOSE: core.int,
    PING: core.int,
    PONG: core.int,
    RESERVED_B: core.int,
    RESERVED_C: core.int,
    RESERVED_D: core.int,
    RESERVED_E: core.int,
    RESERVED_F: core.int
  })
});
io._WebSocketOpcode.CONTINUATION = 0;
io._WebSocketOpcode.TEXT = 1;
io._WebSocketOpcode.BINARY = 2;
io._WebSocketOpcode.RESERVED_3 = 3;
io._WebSocketOpcode.RESERVED_4 = 4;
io._WebSocketOpcode.RESERVED_5 = 5;
io._WebSocketOpcode.RESERVED_6 = 6;
io._WebSocketOpcode.RESERVED_7 = 7;
io._WebSocketOpcode.CLOSE = 8;
io._WebSocketOpcode.PING = 9;
io._WebSocketOpcode.PONG = 10;
io._WebSocketOpcode.RESERVED_B = 11;
io._WebSocketOpcode.RESERVED_C = 12;
io._WebSocketOpcode.RESERVED_D = 13;
io._WebSocketOpcode.RESERVED_E = 14;
io._WebSocketOpcode.RESERVED_F = 15;
io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
  new(headerValue, maxWindowBits) {
    if (headerValue === void 0) headerValue = null;
    if (maxWindowBits === void 0) maxWindowBits = null;
    this.headerValue = headerValue;
    this.maxWindowBits = maxWindowBits;
  }
  toString() {
    return this.headerValue;
  }
};
dart.setSignature(io._CompressionMaxWindowBits, {
  constructors: () => ({new: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [core.String, core.int])}),
  fields: () => ({
    headerValue: core.String,
    maxWindowBits: core.int
  })
});
const _maskingBytes = Symbol('_maskingBytes');
const _payload = Symbol('_payload');
const _serverSide = Symbol('_serverSide');
const _deflate = Symbol('_deflate');
const _fin = Symbol('_fin');
const _compressed = Symbol('_compressed');
const _opcode = Symbol('_opcode');
const _len = Symbol('_len');
const _masked = Symbol('_masked');
const _remainingLenBytes = Symbol('_remainingLenBytes');
const _remainingMaskingKeyBytes = Symbol('_remainingMaskingKeyBytes');
const _remainingPayloadBytes = Symbol('_remainingPayloadBytes');
const _unmaskingIndex = Symbol('_unmaskingIndex');
const _currentMessageType = Symbol('_currentMessageType');
const _eventSink = Symbol('_eventSink');
const _isControlFrame = Symbol('_isControlFrame');
const _lengthDone = Symbol('_lengthDone');
const _maskDone = Symbol('_maskDone');
const _unmask = Symbol('_unmask');
const _controlFrameEnd = Symbol('_controlFrameEnd');
const _messageFrameEnd = Symbol('_messageFrameEnd');
const _startPayload = Symbol('_startPayload');
const _prepareForNextFrame = Symbol('_prepareForNextFrame');
io._WebSocketProtocolTransformer = class _WebSocketProtocolTransformer extends core.Object {
  new(serverSide, deflate) {
    if (serverSide === void 0) serverSide = false;
    if (deflate === void 0) deflate = null;
    this[_maskingBytes] = core.List.new(4);
    this[_payload] = io.BytesBuilder.new({copy: false});
    this[_serverSide] = serverSide;
    this[_deflate] = deflate;
    this[_state] = io._WebSocketProtocolTransformer.START;
    this[_fin] = false;
    this[_compressed] = false;
    this[_opcode] = -1;
    this[_len] = -1;
    this[_masked] = false;
    this[_remainingLenBytes] = -1;
    this[_remainingMaskingKeyBytes] = 4;
    this[_remainingPayloadBytes] = -1;
    this[_unmaskingIndex] = 0;
    this[_currentMessageType] = io._WebSocketMessageType.NONE;
    this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
    this.closeReason = "";
    this[_eventSink] = null;
  }
  bind(stream) {
    return async.Stream.eventTransformed(stream, dart.fn(eventSink => {
      if (this[_eventSink] != null) {
        dart.throw(new core.StateError("WebSocket transformer already used."));
      }
      this[_eventSink] = eventSink;
      return this;
    }, EventSinkTo_WebSocketProtocolTransformer()));
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink].addError(error, stackTrace);
  }
  close() {
    this[_eventSink].close();
  }
  add(bytes) {
    let buffer = typed_data.Uint8List.is(bytes) ? bytes : typed_data.Uint8List.fromList(bytes);
    let index = 0;
    let lastIndex = buffer[dartx.length];
    if (this[_state] == io._WebSocketProtocolTransformer.CLOSED) {
      dart.throw(new io.WebSocketException("Data on closed connection"));
    }
    if (this[_state] == io._WebSocketProtocolTransformer.FAILURE) {
      dart.throw(new io.WebSocketException("Data on failed connection"));
    }
    while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state] != io._WebSocketProtocolTransformer.CLOSED && this[_state] != io._WebSocketProtocolTransformer.FAILURE) {
      let byte = buffer[dartx._get](index);
      if (dart.notNull(this[_state]) <= io._WebSocketProtocolTransformer.LEN_REST) {
        if (this[_state] == io._WebSocketProtocolTransformer.START) {
          this[_fin] = (dart.notNull(byte) & io._WebSocketProtocolTransformer.FIN) != 0;
          if ((dart.notNull(byte) & (io._WebSocketProtocolTransformer.RSV2 | io._WebSocketProtocolTransformer.RSV3)) != 0) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          this[_opcode] = dart.notNull(byte) & io._WebSocketProtocolTransformer.OPCODE;
          if (this[_opcode] != io._WebSocketOpcode.CONTINUATION) {
            if ((dart.notNull(byte) & io._WebSocketProtocolTransformer.RSV1) != 0) {
              this[_compressed] = true;
            } else {
              this[_compressed] = false;
            }
          }
          if (dart.notNull(this[_opcode]) <= io._WebSocketOpcode.BINARY) {
            if (this[_opcode] == io._WebSocketOpcode.CONTINUATION) {
              if (this[_currentMessageType] == io._WebSocketMessageType.NONE) {
                dart.throw(new io.WebSocketException("Protocol error"));
              }
            } else {
              dart.assert(this[_opcode] == io._WebSocketOpcode.TEXT || this[_opcode] == io._WebSocketOpcode.BINARY);
              if (this[_currentMessageType] != io._WebSocketMessageType.NONE) {
                dart.throw(new io.WebSocketException("Protocol error"));
              }
              this[_currentMessageType] = this[_opcode];
            }
          } else if (dart.notNull(this[_opcode]) >= io._WebSocketOpcode.CLOSE && dart.notNull(this[_opcode]) <= io._WebSocketOpcode.PONG) {
            if (!dart.test(this[_fin])) dart.throw(new io.WebSocketException("Protocol error"));
          } else {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          this[_state] = io._WebSocketProtocolTransformer.LEN_FIRST;
        } else if (this[_state] == io._WebSocketProtocolTransformer.LEN_FIRST) {
          this[_masked] = (dart.notNull(byte) & 128) != 0;
          this[_len] = dart.notNull(byte) & 127;
          if (dart.test(this[_isControlFrame]()) && dart.notNull(this[_len]) > 125) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          if (this[_len] == 126) {
            this[_len] = 0;
            this[_remainingLenBytes] = 2;
            this[_state] = io._WebSocketProtocolTransformer.LEN_REST;
          } else if (this[_len] == 127) {
            this[_len] = 0;
            this[_remainingLenBytes] = 8;
            this[_state] = io._WebSocketProtocolTransformer.LEN_REST;
          } else {
            dart.assert(dart.notNull(this[_len]) < 126);
            this[_lengthDone]();
          }
        } else {
          dart.assert(this[_state] == io._WebSocketProtocolTransformer.LEN_REST);
          this[_len] = (dart.notNull(this[_len]) << 8 | dart.notNull(byte)) >>> 0;
          this[_remainingLenBytes] = dart.notNull(this[_remainingLenBytes]) - 1;
          if (this[_remainingLenBytes] == 0) {
            this[_lengthDone]();
          }
        }
      } else {
        if (this[_state] == io._WebSocketProtocolTransformer.MASK) {
          this[_maskingBytes][dartx._set](4 - (() => {
            let x = this[_remainingMaskingKeyBytes];
            this[_remainingMaskingKeyBytes] = dart.notNull(x) - 1;
            return x;
          })(), byte);
          if (this[_remainingMaskingKeyBytes] == 0) {
            this[_maskDone]();
          }
        } else {
          dart.assert(this[_state] == io._WebSocketProtocolTransformer.PAYLOAD);
          let payloadLength = math.min(core.int)(dart.notNull(lastIndex) - dart.notNull(index), this[_remainingPayloadBytes]);
          this[_remainingPayloadBytes] = dart.notNull(this[_remainingPayloadBytes]) - dart.notNull(payloadLength);
          if (dart.test(this[_masked])) {
            this[_unmask](index, payloadLength, buffer);
          }
          this[_payload].add(typed_data.Uint8List.view(buffer[dartx.buffer], index, payloadLength));
          index = dart.notNull(index) + dart.notNull(payloadLength);
          if (dart.test(this[_isControlFrame]())) {
            if (this[_remainingPayloadBytes] == 0) this[_controlFrameEnd]();
          } else {
            if (this[_currentMessageType] != io._WebSocketMessageType.TEXT && this[_currentMessageType] != io._WebSocketMessageType.BINARY) {
              dart.throw(new io.WebSocketException("Protocol error"));
            }
            if (this[_remainingPayloadBytes] == 0) this[_messageFrameEnd]();
          }
          index = dart.notNull(index) - 1;
        }
      }
      index = dart.notNull(index) + 1;
    }
  }
  [_unmask](index, length, buffer) {
    let BLOCK_SIZE = 16;
    if (dart.notNull(length) >= BLOCK_SIZE) {
      let startOffset = BLOCK_SIZE - (dart.notNull(index) & 15);
      let end = dart.notNull(index) + startOffset;
      for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
        buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
          let x = this[_unmaskingIndex];
          this[_unmaskingIndex] = dart.notNull(x) + 1;
          return x;
        })() & 3)))) >>> 0);
      }
      index = dart.notNull(index) + startOffset;
      length = dart.notNull(length) - startOffset;
      let blockCount = (dart.notNull(length) / BLOCK_SIZE)[dartx.truncate]();
      if (blockCount > 0) {
        let mask = 0;
        for (let i = 3; i >= 0; i--) {
          mask = (mask << 8 | dart.notNull(core.int._check(this[_maskingBytes][dartx._get](dart.notNull(this[_unmaskingIndex]) + i & 3)))) >>> 0;
        }
        let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
        let blockBuffer = typed_data.Int32x4List.view(buffer[dartx.buffer], index, blockCount);
        for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
          blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
        }
        let bytes = blockCount * BLOCK_SIZE;
        index = dart.notNull(index) + bytes;
        length = dart.notNull(length) - bytes;
      }
    }
    let end = dart.notNull(index) + dart.notNull(length);
    for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
      buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
        let x = this[_unmaskingIndex];
        this[_unmaskingIndex] = dart.notNull(x) + 1;
        return x;
      })() & 3)))) >>> 0);
    }
  }
  [_lengthDone]() {
    if (dart.test(this[_masked])) {
      if (!dart.test(this[_serverSide])) {
        dart.throw(new io.WebSocketException("Received masked frame from server"));
      }
      this[_state] = io._WebSocketProtocolTransformer.MASK;
    } else {
      if (dart.test(this[_serverSide])) {
        dart.throw(new io.WebSocketException("Received unmasked frame from client"));
      }
      this[_remainingPayloadBytes] = this[_len];
      this[_startPayload]();
    }
  }
  [_maskDone]() {
    this[_remainingPayloadBytes] = this[_len];
    this[_startPayload]();
  }
  [_startPayload]() {
    if (this[_remainingPayloadBytes] == 0) {
      if (dart.test(this[_isControlFrame]())) {
        switch (this[_opcode]) {
          case io._WebSocketOpcode.CLOSE:
          {
            this[_state] = io._WebSocketProtocolTransformer.CLOSED;
            this[_eventSink].close();
            break;
          }
          case io._WebSocketOpcode.PING:
          {
            this[_eventSink].add(new io._WebSocketPing());
            break;
          }
          case io._WebSocketOpcode.PONG:
          {
            this[_eventSink].add(new io._WebSocketPong());
            break;
          }
        }
        this[_prepareForNextFrame]();
      } else {
        this[_messageFrameEnd]();
      }
    } else {
      this[_state] = io._WebSocketProtocolTransformer.PAYLOAD;
    }
  }
  [_messageFrameEnd]() {
    if (dart.test(this[_fin])) {
      let bytes = this[_payload].takeBytes();
      if (this[_deflate] != null && dart.test(this[_compressed])) {
        bytes = this[_deflate].processIncomingMessage(bytes);
      }
      switch (this[_currentMessageType]) {
        case io._WebSocketMessageType.TEXT:
        {
          this[_eventSink].add(convert.UTF8.decode(bytes));
          break;
        }
        case io._WebSocketMessageType.BINARY:
        {
          this[_eventSink].add(bytes);
          break;
        }
      }
      this[_currentMessageType] = io._WebSocketMessageType.NONE;
    }
    this[_prepareForNextFrame]();
  }
  [_controlFrameEnd]() {
    switch (this[_opcode]) {
      case io._WebSocketOpcode.CLOSE:
      {
        this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
        let payload = this[_payload].takeBytes();
        if (dart.notNull(payload[dartx.length]) > 0) {
          if (payload[dartx.length] == 1) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          this.closeCode = (dart.notNull(payload[dartx._get](0)) << 8 | dart.notNull(payload[dartx._get](1))) >>> 0;
          if (this.closeCode == io.WebSocketStatus.NO_STATUS_RECEIVED) {
            dart.throw(new io.WebSocketException("Protocol error"));
          }
          if (dart.notNull(payload[dartx.length]) > 2) {
            this.closeReason = convert.UTF8.decode(payload[dartx.sublist](2));
          }
        }
        this[_state] = io._WebSocketProtocolTransformer.CLOSED;
        this[_eventSink].close();
        break;
      }
      case io._WebSocketOpcode.PING:
      {
        this[_eventSink].add(new io._WebSocketPing(this[_payload].takeBytes()));
        break;
      }
      case io._WebSocketOpcode.PONG:
      {
        this[_eventSink].add(new io._WebSocketPong(this[_payload].takeBytes()));
        break;
      }
    }
    this[_prepareForNextFrame]();
  }
  [_isControlFrame]() {
    return this[_opcode] == io._WebSocketOpcode.CLOSE || this[_opcode] == io._WebSocketOpcode.PING || this[_opcode] == io._WebSocketOpcode.PONG;
  }
  [_prepareForNextFrame]() {
    if (this[_state] != io._WebSocketProtocolTransformer.CLOSED && this[_state] != io._WebSocketProtocolTransformer.FAILURE) this[_state] = io._WebSocketProtocolTransformer.START;
    this[_fin] = false;
    this[_opcode] = -1;
    this[_len] = -1;
    this[_remainingLenBytes] = -1;
    this[_remainingMaskingKeyBytes] = 4;
    this[_remainingPayloadBytes] = -1;
    this[_unmaskingIndex] = 0;
  }
};
io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
dart.setSignature(io._WebSocketProtocolTransformer, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketProtocolTransformer, [], [core.bool, io._WebSocketPerMessageDeflate])}),
  fields: () => ({
    [_state]: core.int,
    [_fin]: core.bool,
    [_compressed]: core.bool,
    [_opcode]: core.int,
    [_len]: core.int,
    [_masked]: core.bool,
    [_remainingLenBytes]: core.int,
    [_remainingMaskingKeyBytes]: core.int,
    [_remainingPayloadBytes]: core.int,
    [_unmaskingIndex]: core.int,
    [_currentMessageType]: core.int,
    closeCode: core.int,
    closeReason: core.String,
    [_eventSink]: async.EventSink,
    [_serverSide]: core.bool,
    [_maskingBytes]: core.List,
    [_payload]: io.BytesBuilder,
    [_deflate]: io._WebSocketPerMessageDeflate
  }),
  methods: () => ({
    bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
    addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.definiteFunctionType(dart.void, []),
    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
    [_unmask]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.Uint8List]),
    [_lengthDone]: dart.definiteFunctionType(dart.void, []),
    [_maskDone]: dart.definiteFunctionType(dart.void, []),
    [_startPayload]: dart.definiteFunctionType(dart.void, []),
    [_messageFrameEnd]: dart.definiteFunctionType(dart.void, []),
    [_controlFrameEnd]: dart.definiteFunctionType(dart.void, []),
    [_isControlFrame]: dart.definiteFunctionType(core.bool, []),
    [_prepareForNextFrame]: dart.definiteFunctionType(dart.void, [])
  }),
  sfields: () => ({
    START: core.int,
    LEN_FIRST: core.int,
    LEN_REST: core.int,
    MASK: core.int,
    PAYLOAD: core.int,
    CLOSED: core.int,
    FAILURE: core.int,
    FIN: core.int,
    RSV1: core.int,
    RSV2: core.int,
    RSV3: core.int,
    OPCODE: core.int
  })
});
io._WebSocketProtocolTransformer.START = 0;
io._WebSocketProtocolTransformer.LEN_FIRST = 1;
io._WebSocketProtocolTransformer.LEN_REST = 2;
io._WebSocketProtocolTransformer.MASK = 3;
io._WebSocketProtocolTransformer.PAYLOAD = 4;
io._WebSocketProtocolTransformer.CLOSED = 5;
io._WebSocketProtocolTransformer.FAILURE = 6;
io._WebSocketProtocolTransformer.FIN = 128;
io._WebSocketProtocolTransformer.RSV1 = 64;
io._WebSocketProtocolTransformer.RSV2 = 32;
io._WebSocketProtocolTransformer.RSV3 = 16;
io._WebSocketProtocolTransformer.OPCODE = 15;
io._WebSocketPing = class _WebSocketPing extends core.Object {
  new(payload) {
    if (payload === void 0) payload = null;
    this.payload = payload;
  }
};
dart.setSignature(io._WebSocketPing, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPing, [], [ListOfint()])}),
  fields: () => ({payload: ListOfint()})
});
io._WebSocketPong = class _WebSocketPong extends core.Object {
  new(payload) {
    if (payload === void 0) payload = null;
    this.payload = payload;
  }
};
dart.setSignature(io._WebSocketPong, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPong, [], [ListOfint()])}),
  fields: () => ({payload: ListOfint()})
});
const _protocolSelector = Symbol('_protocolSelector');
const _compression = Symbol('_compression');
io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
  new(protocolSelector, compression) {
    this[_controller] = StreamControllerOfWebSocket().new({sync: true});
    this[_protocolSelector] = protocolSelector;
    this[_compression] = compression;
  }
  bind(stream) {
    stream.listen(dart.fn(request => {
      io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller], 'addError'));
    }, HttpRequestToNull()), {onDone: dart.fn(() => {
        this[_controller].close();
      }, VoidToNull())});
    return this[_controller].stream;
  }
  static _upgrade(request, _protocolSelector, compression) {
    let response = request.response;
    if (!dart.test(io._WebSocketTransformerImpl._isUpgradeRequest(request))) {
      response.statusCode = io.HttpStatus.BAD_REQUEST;
      response.close();
      return FutureOfWebSocket().error(new io.WebSocketException("Invalid WebSocket upgrade request"));
    }
    function upgrade(protocol) {
      response.statusCode = io.HttpStatus.SWITCHING_PROTOCOLS;
      response.headers.add(io.HttpHeaders.CONNECTION, "Upgrade");
      response.headers.add(io.HttpHeaders.UPGRADE, "websocket");
      let key = request.headers.value("Sec-WebSocket-Key");
      let sha1 = new io._SHA1();
      sha1.add(dart.str`${key}${io._webSocketGUID}`[dartx.codeUnits]);
      let accept = io._CryptoUtils.bytesToBase64(sha1.close());
      response.headers.add("Sec-WebSocket-Accept", accept);
      if (protocol != null) {
        response.headers.add("Sec-WebSocket-Protocol", protocol);
      }
      let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
      response.headers.contentLength = 0;
      return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
    }
    dart.fn(upgrade, StringToFuture());
    let protocols = request.headers._get('Sec-WebSocket-Protocol');
    if (protocols != null && _protocolSelector != null) {
      protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
      return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic())).then(dart.dynamic)(dart.fn(protocol => {
        if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
          dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
        }
        return protocol;
      }, dynamicTodynamic())).catchError(dart.fn(error => {
        response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
        response.close();
        dart.throw(error);
      }, dynamicToNull())).then(io.WebSocket)(upgrade);
    } else {
      return FutureOfWebSocket()._check(upgrade(null));
    }
  }
  static _negotiateCompression(request, response, compression) {
    let extensionHeader = request.headers.value("Sec-WebSocket-Extensions");
    let t = extensionHeader;
    t == null ? extensionHeader = "" : t;
    let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
    if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
      let info = compression[_createHeader](hv);
      response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
      let serverNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._serverNoContextTakeover)) && dart.test(compression.serverNoContextTakeover);
      let clientNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._clientNoContextTakeover)) && dart.test(compression.clientNoContextTakeover);
      let deflate = new io._WebSocketPerMessageDeflate({serverNoContextTakeover: serverNoContextTakeover, clientNoContextTakeover: clientNoContextTakeover, serverMaxWindowBits: info.maxWindowBits, clientMaxWindowBits: info.maxWindowBits, serverSide: true});
      return deflate;
    }
    return null;
  }
  static _isUpgradeRequest(request) {
    if (request.method != "GET") {
      return false;
    }
    if (request.headers._get(io.HttpHeaders.CONNECTION) == null) {
      return false;
    }
    let isUpgrade = false;
    request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
      if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
    }, StringToNull()));
    if (!isUpgrade) return false;
    let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
    if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
      return false;
    }
    let version = request.headers.value("Sec-WebSocket-Version");
    if (version == null || version != "13") {
      return false;
    }
    let key = request.headers.value("Sec-WebSocket-Key");
    if (key == null) {
      return false;
    }
    return true;
  }
};
io._WebSocketTransformerImpl[dart.implements] = () => [io.WebSocketTransformer];
dart.setSignature(io._WebSocketTransformerImpl, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketTransformerImpl, [core.Function, io.CompressionOptions])}),
  fields: () => ({
    [_controller]: StreamControllerOfWebSocket(),
    [_protocolSelector]: core.Function,
    [_compression]: io.CompressionOptions
  }),
  methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
  statics: () => ({
    _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
    _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
    _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
  }),
  names: ['_upgrade', '_negotiateCompression', '_isUpgradeRequest']
});
const _ensureDecoder = Symbol('_ensureDecoder');
const _ensureEncoder = Symbol('_ensureEncoder');
let const;
io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
  new(opts) {
    let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
    let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
    let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
    let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
    let serverSide = opts && 'serverSide' in opts ? opts.serverSide : false;
    this.clientMaxWindowBits = clientMaxWindowBits;
    this.serverMaxWindowBits = serverMaxWindowBits;
    this.serverNoContextTakeover = serverNoContextTakeover;
    this.clientNoContextTakeover = clientNoContextTakeover;
    this.serverSide = serverSide;
    this.decoder = null;
    this.encoder = null;
  }
  [_ensureDecoder]() {
    if (this.decoder == null) {
      this.decoder = io._Filter._newZLibInflateFilter(dart.test(this.serverSide) ? this.clientMaxWindowBits : this.serverMaxWindowBits, null, true);
    }
  }
  [_ensureEncoder]() {
    if (this.encoder == null) {
      this.encoder = io._Filter._newZLibDeflateFilter(false, io.ZLibOption.DEFAULT_LEVEL, dart.test(this.serverSide) ? this.serverMaxWindowBits : this.clientMaxWindowBits, io.ZLibOption.DEFAULT_MEM_LEVEL, io.ZLibOption.STRATEGY_DEFAULT, null, true);
    }
  }
  processIncomingMessage(msg) {
    this[_ensureDecoder]();
    let data = [];
    data[dartx.addAll](msg);
    data[dartx.addAll](const || (const = dart.constList([0, 0, 255, 255], core.int)));
    this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
    let result = [];
    let out = null;
    while ((out = this.decoder.processed()) != null) {
      result[dartx.addAll](core.Iterable._check(out));
    }
    if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
      this.decoder = null;
    }
    return typed_data.Uint8List.fromList(ListOfint()._check(result));
  }
  processOutgoingMessage(msg) {
    this[_ensureEncoder]();
    let result = [];
    let buffer = null;
    let out = null;
    if (!typed_data.Uint8List.is(msg)) {
      for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
        if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
          dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${msg[dartx._get](i)} at index ${i})`));
        }
      }
      buffer = typed_data.Uint8List.fromList(msg);
    } else {
      buffer = typed_data.Uint8List._check(msg);
    }
    this.encoder.process(buffer, 0, buffer[dartx.length]);
    while ((out = this.encoder.processed()) != null) {
      result[dartx.addAll](core.Iterable._check(out));
    }
    if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
      this.encoder = null;
    }
    if (dart.notNull(result[dartx.length]) > 4) {
      result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
    }
    return ListOfint()._check(result);
  }
};
dart.setSignature(io._WebSocketPerMessageDeflate, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [], {clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, serverNoContextTakeover: core.bool, clientNoContextTakeover: core.bool, serverSide: core.bool})}),
  fields: () => ({
    serverNoContextTakeover: core.bool,
    clientNoContextTakeover: core.bool,
    clientMaxWindowBits: core.int,
    serverMaxWindowBits: core.int,
    serverSide: core.bool,
    decoder: io._Filter,
    encoder: io._Filter
  }),
  methods: () => ({
    [_ensureDecoder]: dart.definiteFunctionType(dart.void, []),
    [_ensureEncoder]: dart.definiteFunctionType(dart.void, []),
    processIncomingMessage: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
    processOutgoingMessage: dart.definiteFunctionType(core.List$(core.int), [ListOfint()])
  })
});
const _deflateHelper = Symbol('_deflateHelper');
const _outCloseCode = Symbol('_outCloseCode');
const _outCloseReason = Symbol('_outCloseReason');
io._WebSocketOutgoingTransformer = class _WebSocketOutgoingTransformer extends core.Object {
  new(webSocket) {
    this.webSocket = webSocket;
    this[_eventSink] = null;
    this[_deflateHelper] = null;
    this[_deflateHelper] = this.webSocket[_deflate];
  }
  bind(stream) {
    return StreamOfListOfint().eventTransformed(stream, dart.fn(eventSink => {
      if (this[_eventSink] != null) {
        dart.throw(new core.StateError("WebSocket transformer already used"));
      }
      this[_eventSink] = eventSink;
      return this;
    }, EventSinkOfListOfintTo_WebSocketOutgoingTransformer()));
  }
  add(message) {
    if (io._WebSocketPong.is(message)) {
      this.addFrame(io._WebSocketOpcode.PONG, message.payload);
      return;
    }
    if (io._WebSocketPing.is(message)) {
      this.addFrame(io._WebSocketOpcode.PING, message.payload);
      return;
    }
    let data = null;
    let opcode = null;
    if (message != null) {
      if (typeof message == 'string') {
        opcode = io._WebSocketOpcode.TEXT;
        data = convert.UTF8.encode(message);
      } else {
        if (ListOfint().is(message)) {
          data = message;
          opcode = io._WebSocketOpcode.BINARY;
        } else {
          dart.throw(new core.ArgumentError(message));
        }
      }
      if (this[_deflateHelper] != null) {
        data = this[_deflateHelper].processOutgoingMessage(data);
      }
    } else {
      opcode = io._WebSocketOpcode.TEXT;
    }
    this.addFrame(opcode, data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_eventSink].addError(error, stackTrace);
  }
  close() {
    let code = this.webSocket[_outCloseCode];
    let reason = this.webSocket[_outCloseReason];
    let data = null;
    if (code != null) {
      data = ListOfint().new();
      data[dartx.add](dart.notNull(code) >> 8 & 255);
      data[dartx.add](dart.notNull(code) & 255);
      if (reason != null) {
        data[dartx.addAll](convert.UTF8.encode(reason));
      }
    }
    this.addFrame(io._WebSocketOpcode.CLOSE, data);
    this[_eventSink].close();
  }
  addFrame(opcode, data) {
    return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
      this[_eventSink].add(e);
    }, ListOfintToNull()));
  }
  static createFrame(opcode, data, serverSide, compressed) {
    let mask = !dart.test(serverSide);
    let dataLength = data == null ? 0 : data[dartx.length];
    let headerSize = mask ? 6 : 2;
    if (dart.notNull(dataLength) > 65535) {
      headerSize = headerSize + 8;
    } else if (dart.notNull(dataLength) > 125) {
      headerSize = headerSize + 2;
    }
    let header = typed_data.Uint8List.new(headerSize);
    let index = 0;
    let hoc = (io._WebSocketProtocolTransformer.FIN | (dart.test(compressed) ? io._WebSocketProtocolTransformer.RSV1 : 0) | dart.notNull(opcode) & io._WebSocketProtocolTransformer.OPCODE) >>> 0;
    header[dartx._set](index++, hoc);
    let lengthBytes = 1;
    if (dart.notNull(dataLength) > 65535) {
      header[dartx._set](index++, 127);
      lengthBytes = 8;
    } else if (dart.notNull(dataLength) > 125) {
      header[dartx._set](index++, 126);
      lengthBytes = 2;
    }
    for (let i = 0; i < lengthBytes; i++) {
      header[dartx._set](index++, dataLength[dartx['>>']]((lengthBytes - 1 - i) * 8) & 255);
    }
    if (mask) {
      let i$ = 1;
      header[dartx._set](i$, (dart.notNull(header[dartx._get](i$)) | 1 << 7) >>> 0);
      let maskBytes = io._IOCrypto.getRandomBytes(4);
      header[dartx.setRange](index, index + 4, maskBytes);
      index = index + 4;
      if (data != null) {
        let list = null;
        if (opcode == io._WebSocketOpcode.TEXT && typed_data.Uint8List.is(data)) {
          list = data;
        } else {
          if (typed_data.Uint8List.is(data)) {
            list = typed_data.Uint8List.fromList(data);
          } else {
            list = typed_data.Uint8List.new(data[dartx.length]);
            for (let i = 0; i < dart.notNull(data[dartx.length]); i++) {
              if (dart.notNull(data[dartx._get](i)) < 0 || 255 < dart.notNull(data[dartx._get](i))) {
                dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${data[dartx._get](i)} at index ${i})`));
              }
              list[dartx._set](i, data[dartx._get](i));
            }
          }
        }
        let BLOCK_SIZE = 16;
        let blockCount = (dart.notNull(list[dartx.length]) / BLOCK_SIZE)[dartx.truncate]();
        if (blockCount > 0) {
          let mask = 0;
          for (let i = 3; i >= 0; i--) {
            mask = (mask << 8 | dart.notNull(maskBytes[dartx._get](i))) >>> 0;
          }
          let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
          let blockBuffer = typed_data.Int32x4List.view(list[dartx.buffer], 0, blockCount);
          for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
            blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
          }
        }
        for (let i = blockCount * BLOCK_SIZE; i < dart.notNull(list[dartx.length]); i++) {
          list[dartx._set](i, (dart.notNull(list[dartx._get](i)) ^ dart.notNull(maskBytes[dartx._get](i & 3))) >>> 0);
        }
        data = list;
      }
    }
    dart.assert(index == headerSize);
    if (data == null) {
      return JSArrayOfUint8List().of([header]);
    } else {
      return JSArrayOfListOfint().of([header, data]);
    }
  }
};
io._WebSocketOutgoingTransformer[dart.implements] = () => [StreamTransformerOfdynamic$ListOfint(), async.EventSink];
dart.setSignature(io._WebSocketOutgoingTransformer, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [io._WebSocketImpl])}),
  fields: () => ({
    webSocket: io._WebSocketImpl,
    [_eventSink]: EventSinkOfListOfint(),
    [_deflateHelper]: io._WebSocketPerMessageDeflate
  }),
  methods: () => ({
    bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [async.Stream]),
    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
    close: dart.definiteFunctionType(dart.void, []),
    addFrame: dart.definiteFunctionType(dart.void, [core.int, ListOfint()])
  }),
  statics: () => ({createFrame: dart.definiteFunctionType(core.Iterable$(core.List$(core.int)), [core.int, ListOfint(), core.bool, core.bool])}),
  names: ['createFrame']
});
const _issuedPause = Symbol('_issuedPause');
const _completer = Symbol('_completer');
const _onListen = Symbol('_onListen');
const _onPause = Symbol('_onPause');
const _onResume = Symbol('_onResume');
const _cancel = Symbol('_cancel');
const _done = Symbol('_done');
const _ensureController = Symbol('_ensureController');
io._WebSocketConsumer = class _WebSocketConsumer extends core.Object {
  new(webSocket, socket) {
    this[_closeCompleter] = async.Completer.new();
    this.webSocket = webSocket;
    this.socket = socket;
    this[_controller] = null;
    this[_subscription] = null;
    this[_issuedPause] = false;
    this[_closed] = false;
    this[_completer] = null;
  }
  [_onListen]() {
    if (this[_subscription] != null) {
      this[_subscription].cancel();
    }
  }
  [_onPause]() {
    if (this[_subscription] != null) {
      this[_subscription].pause();
    } else {
      this[_issuedPause] = true;
    }
  }
  [_onResume]() {
    if (this[_subscription] != null) {
      this[_subscription].resume();
    } else {
      this[_issuedPause] = false;
    }
  }
  [_cancel]() {
    if (this[_subscription] != null) {
      let subscription = this[_subscription];
      this[_subscription] = null;
      subscription.cancel();
    }
  }
  [_ensureController]() {
    if (this[_controller] != null) return;
    this[_controller] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause), onResume: dart.bind(this, _onResume), onCancel: dart.bind(this, _onListen)});
    let stream = this[_controller].stream.transform(ListOfint())(new io._WebSocketOutgoingTransformer(this.webSocket));
    this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
      this[_done]();
      this[_closeCompleter].complete(this.webSocket);
    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
        this[_closed] = true;
        this[_cancel]();
        if (core.ArgumentError.is(error)) {
          if (!dart.test(this[_done](error, stackTrace))) {
            this[_closeCompleter].completeError(error, stackTrace);
          }
        } else {
          this[_done]();
          this[_closeCompleter].complete(this.webSocket);
        }
      }, dynamicAndStackTraceToNull())});
  }
  [_done](error, stackTrace) {
    if (error === void 0) error = null;
    if (stackTrace === void 0) stackTrace = null;
    if (this[_completer] == null) return false;
    if (error != null) {
      this[_completer].completeError(error, stackTrace);
    } else {
      this[_completer].complete(this.webSocket);
    }
    this[_completer] = null;
    return true;
  }
  addStream(stream) {
    if (dart.test(this[_closed])) {
      stream.listen(null).cancel();
      return async.Future.value(this.webSocket);
    }
    this[_ensureController]();
    this[_completer] = async.Completer.new();
    this[_subscription] = stream.listen(dart.fn(data => {
      this[_controller].add(data);
    }, dynamicToNull()), {onDone: dart.bind(this, _done), onError: dart.bind(this, _done), cancelOnError: true});
    if (dart.test(this[_issuedPause])) {
      this[_subscription].pause();
      this[_issuedPause] = false;
    }
    return this[_completer].future;
  }
  close() {
    this[_ensureController]();
    const closeSocket = (function() {
      return this.socket.close().catchError(dart.fn(_ => {
      }, dynamicToNull())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
    }).bind(this);
    dart.fn(closeSocket, VoidToFuture());
    this[_controller].close();
    return this[_closeCompleter].future.then(dart.dynamic)(dart.fn(_ => closeSocket(), dynamicToFuture()));
  }
  add(data) {
    if (dart.test(this[_closed])) return;
    this[_ensureController]();
    this[_controller].add(data);
  }
  closeSocket() {
    this[_closed] = true;
    this[_cancel]();
    this.close();
  }
};
io._WebSocketConsumer[dart.implements] = () => [async.StreamConsumer];
dart.setSignature(io._WebSocketConsumer, {
  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketConsumer, [io._WebSocketImpl, io.Socket])}),
  fields: () => ({
    webSocket: io._WebSocketImpl,
    socket: io.Socket,
    [_controller]: async.StreamController,
    [_subscription]: async.StreamSubscription,
    [_issuedPause]: core.bool,
    [_closed]: core.bool,
    [_closeCompleter]: async.Completer,
    [_completer]: async.Completer
  }),
  methods: () => ({
    [_onListen]: dart.definiteFunctionType(dart.void, []),
    [_onPause]: dart.definiteFunctionType(dart.void, []),
    [_onResume]: dart.definiteFunctionType(dart.void, []),
    [_cancel]: dart.definiteFunctionType(dart.void, []),
    [_ensureController]: dart.definiteFunctionType(dart.dynamic, []),
    [_done]: dart.definiteFunctionType(core.bool, [], [dart.dynamic, core.StackTrace]),
    addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
    close: dart.definiteFunctionType(async.Future, []),
    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    closeSocket: dart.definiteFunctionType(dart.void, [])
  })
});
const _readyState = Symbol('_readyState');
const _writeClosed = Symbol('_writeClosed');
const _closeCode = Symbol('_closeCode');
const _closeReason = Symbol('_closeReason');
const _pingInterval = Symbol('_pingInterval');
const _pingTimer = Symbol('_pingTimer');
const _consumer = Symbol('_consumer');
const _closeTimer = Symbol('_closeTimer');
let const;
io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
  static connect(url, protocols, headers, opts) {
    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
    let uri = core.Uri.parse(url);
    if (uri.scheme != "ws" && uri.scheme != "wss") {
      dart.throw(new io.WebSocketException(dart.str`Unsupported URL scheme '${uri.scheme}'`));
    }
    let random = math.Random.new();
    let nonceData = typed_data.Uint8List.new(16);
    for (let i = 0; i < 16; i++) {
      nonceData[dartx._set](i, random.nextInt(256));
    }
    let nonce = io._CryptoUtils.bytesToBase64(nonceData);
    uri = core.Uri.new({scheme: uri.scheme == "wss" ? "https" : "http", userInfo: uri.userInfo, host: uri.host, port: uri.port, path: uri.path, query: uri.query, fragment: uri.fragment});
    return io._WebSocketImpl._httpClient.openUrl("GET", uri).then(io.HttpClientResponse)(dart.fn(request => {
      if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
        request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
      }
      if (headers != null) {
        headers[dartx.forEach](dart.fn((field, value) => request.headers.add(field, value), StringAnddynamicTovoid()));
      }
      let _ = request.headers;
      _.set(io.HttpHeaders.CONNECTION, "Upgrade");
      _.set(io.HttpHeaders.UPGRADE, "websocket");
      _.set("Sec-WebSocket-Key", nonce);
      _.set("Cache-Control", "no-cache");
      _.set("Sec-WebSocket-Version", "13");
      if (protocols != null) {
        request.headers.add("Sec-WebSocket-Protocol", protocols[dartx.toList]());
      }
      if (dart.test(compression.enabled)) {
        request.headers.add("Sec-WebSocket-Extensions", compression[_createHeader]());
      }
      return request.close();
    }, HttpClientRequestToFutureOfHttpClientResponse())).then(io.WebSocket)(dart.fn(response => {
      function error(message) {
        response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
          socket.destroy();
        }, SocketToNull()));
        dart.throw(new io.WebSocketException(message));
      }
      dart.fn(error, StringTovoid());
      if (response.statusCode != io.HttpStatus.SWITCHING_PROTOCOLS || response.headers._get(io.HttpHeaders.CONNECTION) == null || !dart.test(response.headers._get(io.HttpHeaders.CONNECTION)[dartx.any](dart.fn(value => value[dartx.toLowerCase]() == "upgrade", StringTobool()))) || response.headers.value(io.HttpHeaders.UPGRADE)[dartx.toLowerCase]() != "websocket") {
        error(dart.str`Connection to '${uri}' was not upgraded to websocket`);
      }
      let accept = response.headers.value("Sec-WebSocket-Accept");
      if (accept == null) {
        error("Response did not contain a 'Sec-WebSocket-Accept' header");
      }
      let sha1 = new io._SHA1();
      sha1.add(dart.str`${nonce}${io._webSocketGUID}`[dartx.codeUnits]);
      let expectedAccept = sha1.close();
      let receivedAccept = io._CryptoUtils.base64StringToBytes(accept);
      if (expectedAccept[dartx.length] != receivedAccept[dartx.length]) {
        error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
      }
      for (let i = 0; i < dart.notNull(expectedAccept[dartx.length]); i++) {
        if (expectedAccept[dartx._get](i) != receivedAccept[dartx._get](i)) {
          error("Bad response 'Sec-WebSocket-Accept' header");
        }
      }
      let protocol = response.headers.value('Sec-WebSocket-Protocol');
      let deflate = io._WebSocketImpl.negotiateClientCompression(response, compression);
      return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, false, deflate), SocketTo_WebSocketImpl()));
    }, HttpClientResponseToFutureOfWebSocket()));
  }
  static negotiateClientCompression(response, compression) {
    let extensionHeader = response.headers.value('Sec-WebSocket-Extensions');
    if (extensionHeader == null) {
      extensionHeader = "";
    }
    let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
    if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
      let serverNoContextTakeover = hv.parameters[dartx.containsKey](io._serverNoContextTakeover);
      let clientNoContextTakeover = hv.parameters[dartx.containsKey](io._clientNoContextTakeover);
      function getWindowBits(type) {
        let o = hv.parameters[dartx._get](type);
        if (o == null) {
          return io._WebSocketImpl.DEFAULT_WINDOW_BITS;
        }
        return core.int.parse(o, {onError: dart.fn(s => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint())});
      }
      dart.fn(getWindowBits, StringToint());
      return new io._WebSocketPerMessageDeflate({clientMaxWindowBits: getWindowBits(io._clientMaxWindowBits), serverMaxWindowBits: getWindowBits(io._serverMaxWindowBits), clientNoContextTakeover: clientNoContextTakeover, serverNoContextTakeover: serverNoContextTakeover});
    }
    return null;
  }
  _fromSocket(socket, protocol, compression, serverSide, deflate) {
    if (serverSide === void 0) serverSide = false;
    if (deflate === void 0) deflate = null;
    this[_socket] = socket;
    this.protocol = protocol;
    this[_serverSide] = serverSide;
    this[_controller] = null;
    this[_subscription] = null;
    this[_sink] = null;
    this[_readyState] = io.WebSocket.CONNECTING;
    this[_writeClosed] = false;
    this[_closeCode] = null;
    this[_closeReason] = null;
    this[_pingInterval] = null;
    this[_pingTimer] = null;
    this[_consumer] = null;
    this[_outCloseCode] = null;
    this[_outCloseReason] = null;
    this[_closeTimer] = null;
    this[_deflate] = null;
    super.new();
    this[_consumer] = new io._WebSocketConsumer(this, io.Socket._check(this[_socket]));
    this[_sink] = new io._StreamSinkImpl(this[_consumer]);
    this[_readyState] = io.WebSocket.OPEN;
    this[_deflate] = deflate;
    let transformer = new io._WebSocketProtocolTransformer(this[_serverSide], this[_deflate]);
    this[_subscription] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket], 'transform', transformer), 'listen', dart.fn(data => {
      if (io._WebSocketPing.is(data)) {
        if (!dart.test(this[_writeClosed])) this[_consumer].add(new io._WebSocketPong(data.payload));
      } else if (io._WebSocketPong.is(data)) {
        this.pingInterval = this[_pingInterval];
      } else {
        this[_controller].add(data);
      }
    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
        if (this[_closeTimer] != null) this[_closeTimer].cancel();
        if (core.FormatException.is(error)) {
          this[_close](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
        } else {
          this[_close](io.WebSocketStatus.PROTOCOL_ERROR);
        }
        this[_closeCode] = this[_outCloseCode];
        this[_closeReason] = this[_outCloseReason];
        this[_controller].close();
      }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
        if (this[_closeTimer] != null) this[_closeTimer].cancel();
        if (this[_readyState] == io.WebSocket.OPEN) {
          this[_readyState] = io.WebSocket.CLOSING;
          if (!dart.test(io._WebSocketImpl._isReservedStatusCode(transformer.closeCode))) {
            this[_close](transformer.closeCode, transformer.closeReason);
          } else {
            this[_close]();
          }
          this[_readyState] = io.WebSocket.CLOSED;
        }
        this[_closeCode] = transformer.closeCode;
        this[_closeReason] = transformer.closeReason;
        this[_controller].close();
      }, VoidToNull()), cancelOnError: true}));
    this[_subscription].pause();
    this[_controller] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription], 'resume'), onCancel: dart.fn(() => {
        this[_subscription].cancel();
        this[_subscription] = null;
      }, VoidToNull()), onPause: dart.bind(this[_subscription], 'pause'), onResume: dart.bind(this[_subscription], 'resume')});
    io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
    try {
      dart.dput(this[_socket], _owner, this);
    } catch (_) {
    }

  }
  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});
  }
  get pingInterval() {
    return this[_pingInterval];
  }
  set pingInterval(interval) {
    if (dart.test(this[_writeClosed])) return;
    if (this[_pingTimer] != null) this[_pingTimer].cancel();
    this[_pingInterval] = interval;
    if (this[_pingInterval] == null) return;
    this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
      if (dart.test(this[_writeClosed])) return;
      this[_consumer].add(new io._WebSocketPing());
      this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
        this[_close](io.WebSocketStatus.GOING_AWAY);
      }, VoidToNull()));
    }, VoidToNull()));
  }
  get readyState() {
    return this[_readyState];
  }
  get extensions() {
    return null;
  }
  get closeCode() {
    return this[_closeCode];
  }
  get closeReason() {
    return this[_closeReason];
  }
  add(data) {
    this[_sink].add(data);
  }
  addError(error, stackTrace) {
    if (stackTrace === void 0) stackTrace = null;
    this[_sink].addError(error, stackTrace);
  }
  addStream(stream) {
    return this[_sink].addStream(stream);
  }
  get done() {
    return this[_sink].done;
  }
  close(code, reason) {
    if (code === void 0) code = null;
    if (reason === void 0) reason = null;
    if (dart.test(io._WebSocketImpl._isReservedStatusCode(code))) {
      dart.throw(new io.WebSocketException(dart.str`Reserved status code ${code}`));
    }
    if (this[_outCloseCode] == null) {
      this[_outCloseCode] = code;
      this[_outCloseReason] = reason;
    }
    if (!dart.test(this[_controller].isClosed)) {
      if (!dart.test(this[_controller].hasListener) && this[_subscription] != null) {
        this[_controller].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
      }
      if (this[_closeTimer] == null) {
        this[_closeTimer] = async.Timer.new(const || (const = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
          this[_closeCode] = this[_outCloseCode];
          this[_closeReason] = this[_outCloseReason];
          if (this[_subscription] != null) this[_subscription].cancel();
          this[_controller].close();
          io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
        }, VoidToNull()));
      }
    }
    return this[_sink].close();
  }
  [_close](code, reason) {
    if (code === void 0) code = null;
    if (reason === void 0) reason = null;
    if (dart.test(this[_writeClosed])) return;
    if (this[_outCloseCode] == null) {
      this[_outCloseCode] = code;
      this[_outCloseReason] = reason;
    }
    this[_writeClosed] = true;
    this[_consumer].closeSocket();
    io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
  }
  get [_serviceTypePath]() {
    return 'io/websockets';
  }
  get [_serviceTypeName]() {
    return 'WebSocket';
  }
  [_toJSON](ref) {
    let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')}`;
    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
    if (dart.test(ref)) {
      return r;
    }
    try {
      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON, true));
    } catch (_) {
      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
    }

    return r;
  }
  static _isReservedStatusCode(code) {
    return code != null && (dart.notNull(code) < io.WebSocketStatus.NORMAL_CLOSURE || code == io.WebSocketStatus.RESERVED_1004 || code == io.WebSocketStatus.NO_STATUS_RECEIVED || code == io.WebSocketStatus.ABNORMAL_CLOSURE || dart.notNull(code) > io.WebSocketStatus.INTERNAL_SERVER_ERROR && dart.notNull(code) < io.WebSocketStatus.RESERVED_1015 || dart.notNull(code) >= io.WebSocketStatus.RESERVED_1015 && dart.notNull(code) < 3000);
  }
};
dart.addSimpleTypeTests(io._WebSocketImpl);
dart.defineNamedConstructor(io._WebSocketImpl, '_fromSocket');
io._WebSocketImpl[dart.implements] = () => [io.WebSocket];
dart.setSignature(io._WebSocketImpl, {
  constructors: () => ({_fromSocket: dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic, core.String, io.CompressionOptions], [core.bool, io._WebSocketPerMessageDeflate])}),
  fields: () => ({
    protocol: core.String,
    [_controller]: async.StreamController,
    [_subscription]: async.StreamSubscription,
    [_sink]: async.StreamSink,
    [_socket]: dart.dynamic,
    [_serverSide]: core.bool,
    [_readyState]: core.int,
    [_writeClosed]: core.bool,
    [_closeCode]: core.int,
    [_closeReason]: core.String,
    [_pingInterval]: core.Duration,
    [_pingTimer]: async.Timer,
    [_consumer]: io._WebSocketConsumer,
    [_outCloseCode]: core.int,
    [_outCloseReason]: core.String,
    [_closeTimer]: async.Timer,
    [_deflate]: io._WebSocketPerMessageDeflate
  }),
  getters: () => ({
    pingInterval: dart.definiteFunctionType(core.Duration, []),
    readyState: dart.definiteFunctionType(core.int, []),
    extensions: dart.definiteFunctionType(core.String, []),
    closeCode: dart.definiteFunctionType(core.int, []),
    closeReason: dart.definiteFunctionType(core.String, []),
    done: dart.definiteFunctionType(async.Future, []),
    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
  }),
  setters: () => ({pingInterval: dart.definiteFunctionType(dart.void, [core.Duration])}),
  methods: () => ({
    listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
    addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
    close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
    [_close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
    [_toJSON]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
  }),
  sfields: () => ({
    _webSockets: MapOfint$_WebSocketImpl(),
    DEFAULT_WINDOW_BITS: core.int,
    PER_MESSAGE_DEFLATE: core.String,
    _httpClient: io.HttpClient
  }),
  statics: () => ({
    connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String, IterableOfString(), MapOfString$dynamic()], {compression: io.CompressionOptions}),
    negotiateClientCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpClientResponse, io.CompressionOptions]),
    _isReservedStatusCode: dart.definiteFunctionType(core.bool, [core.int])
  }),
  names: ['connect', 'negotiateClientCompression', '_isReservedStatusCode']
});
io._WebSocketImpl.DEFAULT_WINDOW_BITS = 15;
io._WebSocketImpl.PER_MESSAGE_DEFLATE = "permessage-deflate";
dart.defineLazy(io._WebSocketImpl, {
  get _webSockets() {
    return MapOfint$_WebSocketImpl().new();
  },
  set _webSockets(_) {},
  get _httpClient() {
    return io.HttpClient.new();
  }
});
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);
      }, VoidToNull()), onCancel: dart.fn(() => {
        this.removeErrorListener(port.sendPort);
        port.close();
        port = null;
      }, VoidToNull())});
    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.JsObject._check(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.JsObject._check(js._wrapToDart(new ctor()));
    }
    let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
    return js.JsObject._check(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.JsObject._check(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.JsObject._check(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 (typeof fn !== "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])
    }),
    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 Object && (o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || window.IDBKeyRange && o instanceof IDBKeyRange || o instanceof ImageData || o instanceof Node || window.Int8Array && o instanceof Int8Array.__proto__ || 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._wrapToDart(o);
  }
};
dart.fn(js._convertToDart, dynamicToObject());
js._wrapToDart = function(o) {
  return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
};
dart.fn(js._wrapToDart, dynamicToObject());
js._wrapToDartHelper = 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._wrapToDartHelper, dynamicToObject());
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;
math.Random = class Random extends core.Object {
  static new(seed) {
    if (seed === void 0) seed = null;
    return seed == null ? const || (const = 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);
      }, EventToNull()));
      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);
    }, EventToNull()));
    request[dartx.onError].listen(dart.bind(completer, 'completeError'));
    return completer.future;
  };
};
dart.lazyFn(indexed_db._completeRequest, () => RequestToFutureOfT());
const _count = 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](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](...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]: 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 = Symbol('_add');
const _clear = 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](value, key);
      } else {
        request = this[_add](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]());
    } 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](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](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](...args) {
    return this.clear.apply(this, args);
  }
  [_count](...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]();
          }
        }
      }, EventToNull()));
      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]: 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]: dart.definiteFunctionType(indexed_db.Request, []),
    [_count]: 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]);
    }, EventToNull()));
    this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
      completer.completeError(e);
    }, EventToNull()));
    this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
      if (!dart.test(completer.isCompleted)) {
        completer.completeError(e);
      }
    }, EventToNull()));
    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 self.Blob(parts);
  }
  static _create_2(parts, bag) {
    return new self.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);
    }, FileSystemToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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 = 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 = 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];
  }
  set [dartx.clear](value) {
    this[_clear] = value == null ? '' : value;
  }
  get [_clear]() {
    return this.clear;
  }
  set [_clear](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];
  }
  set [dartx.position](value) {
    this[_position] = value == null ? '' : value;
  }
  get [_position]() {
    return this.position;
  }
  set [_position](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]: 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]: 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);
    }, StringToNull()));
    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);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    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);
    }, MetadataToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    return completer.future;
  }
  [_remove](...args) {
    return this.remove.apply(this, args);
  }
  [dartx.remove]() {
    let completer = async.Completer.new();
    this[_remove](dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    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);
      }, EntryToNull()), errorCallback: dart.fn(error => {
        completer.completeError(error);
      }, FileErrorToNull())});
    return completer.future;
  }
  [_removeRecursively](...args) {
    return this.removeRecursively.apply(this, args);
  }
  [dartx.removeRecursively]() {
    let completer = async.Completer.new();
    this[_removeRecursively](dart.fn(() => {
      completer.complete();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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);
    }, ListOfEntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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, [])}),
  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]),
    [__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, []),
    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]),
    [_filter]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool])
  })
});
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, []),
      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])
    })
  });
  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 = Symbol('_value');
html.ScrollAlignment = class ScrollAlignment extends core.Object {
  _internal(value) {
    this[_value] = value;
  }
  toString() {
    return dart.str`ScrollAlignment.${this[_value]}`;
  }
};
dart.defineNamedConstructor(html.ScrollAlignment, '_internal');
dart.setSignature(html.ScrollAlignment, {
  constructors: () => ({_internal: dart.definiteFunctionType(html.ScrollAlignment, [dart.dynamic])}),
  fields: () => ({[_value]: 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);
    }, FileWriterToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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);
    }, FileToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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, [])}),
  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.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));
      }, GeopositionToNull()), dart.fn(error => {
        completer.completeError(error);
      }, PositionErrorToNull()), 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));
        }, GeopositionToNull()), dart.fn(error => {
          controller.addError(error);
        }, PositionErrorToNull()), options);
      }, VoidToNull()), onCancel: dart.fn(() => {
        dart.assert(watchId != null);
        this[_clearWatch](watchId);
      }, VoidToNull())});
    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, [])}),
  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.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)}`);
    }, StringAndStringToNull()));
    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);
      }, StringAndStringToNull()));
    }
    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);
      }
    }, ProgressEventToNull()));
    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(dynamicToNull())(dart.fn(e => {
      let response = xhr.responseText;
      completer.complete(response);
    }, dynamicToNull()), 1);
    xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
      completer.completeError(e);
    }, dynamicToNull()), 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];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'date'})[dartx.type] == 'date';
  }
};
const valueAsDate = Symbol(html.DateInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.DateInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'month'})[dartx.type] == 'month';
  }
};
const valueAsDate = Symbol(html.MonthInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.MonthInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set valueAsDate(value) {
    this[valueAsDate] = value;
  }
  get readOnly() {
    return this[readOnly];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'week'})[dartx.type] == 'week';
  }
};
const valueAsDate = Symbol(html.WeekInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.WeekInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set valueAsDate(value) {
    this[valueAsDate] = value;
  }
  get readOnly() {
    return this[readOnly];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'time'})[dartx.type] == 'time';
  }
};
const valueAsDate = Symbol(html.TimeInputElement.name + "." + 'valueAsDate'.toString());
const readOnly = Symbol(html.TimeInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set readOnly(value) {
    this[readOnly] = value;
  }
  get required() {
    return this[required];
  }
  set required(value) {
    this[required] = value;
  }
  static get supported() {
    return html.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
  }
};
const readOnly = Symbol(html.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  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;
  }
  static get supported() {
    return html.InputElement.new({type: 'number'})[dartx.type] == 'number';
  }
};
const placeholder = Symbol(html.NumberInputElement.name + "." + 'placeholder'.toString());
const readOnly = Symbol(html.NumberInputElement.name + "." + 'readOnly'.toString());
const required = 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];
  }
  set required(value) {
    this[required] = value;
  }
};
const checked = Symbol(html.CheckboxInputElement.name + "." + 'checked'.toString());
const required = 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];
  }
  set required(value) {
    this[required] = value;
  }
};
const checked = Symbol(html.RadioButtonInputElement.name + "." + 'checked'.toString());
const required = 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];
  }
  set required(value) {
    this[required] = 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 = 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);
    }, ListOfSourceInfoToNull()));
    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, [])}),
  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.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, dynamicAnddynamicToNull());
    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(_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void())(html._wrapBinaryZone(ListOfMutationRecord(), html.MutationObserver, dart.void)(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);
    }, MediaStreamToNull()), dart.fn(error => {
      completer.completeError(error);
    }, NavigatorUserMediaErrorToNull()));
    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: () => ({
    length: dart.definiteFunctionType(core.int, []),
    rawList: dart.definiteFunctionType(core.List$(html.Node), [])
  }),
  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    [_filter]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
    _set: dart.definiteFunctionType(dart.void, [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, [])}),
  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]),
    [_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);
    }, StringToNull()));
    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, [])}),
  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.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);
    }, RtcSessionDescriptionToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()), 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);
    }, RtcSessionDescriptionToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()), mediaConstraints);
    return completer.future;
  }
  [dartx.getStats](selector) {
    let completer = CompleterOfRtcStatsResponse().new();
    this[_getStats](dart.fn(value => {
      completer.complete(value);
    }, RtcStatsResponseToNull()), 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();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()));
    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();
    }, VoidToNull()), dart.fn(error => {
      completer.completeError(error);
    }, StringToNull()));
    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, [])}),
  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.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, [])}),
  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.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 = 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);
    }, StringAndStringToNull()));
  }
  [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]();
  }
  [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];
  }
  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]() {
    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](...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]: 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]: 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, [])}),
  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.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.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.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, [])}),
  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.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);
    }, numToNull()));
    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);
    }, FileSystemToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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);
    }, EntryToNull()), dart.fn(error => {
      completer.completeError(error);
    }, FileErrorToNull()));
    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 (_EventStreamOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
    let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
    stream.listen(dart.fn(event => {
      let wrapped = new html._BeforeUnloadEvent(event);
      controller.add(wrapped);
    }, BeforeUnloadEventToNull()));
    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, [])}),
  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()]),
    [__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, [])}),
  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.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, [])}),
  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.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, [])}),
  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.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, [])}),
  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.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, [])}),
  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]),
    [__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);
    }, StringAndStringToNull()));
  }
  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);
    }, StringAndStringToNull()));
  }
  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);
      }
    }, StringAndStringToNull()));
  }
  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));
      }
    }, StringAndStringToNull()));
    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);
      }
    }, StringAndStringToNull()));
    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] = value;
    this[_unit] = '%';
  }
  px(value) {
    this[_value] = value;
    this[_unit] = 'px';
  }
  pc(value) {
    this[_value] = value;
    this[_unit] = 'pc';
  }
  pt(value) {
    this[_value] = value;
    this[_unit] = 'pt';
  }
  inch(value) {
    this[_value] = value;
    this[_unit] = 'in';
  }
  cm(value) {
    this[_value] = value;
    this[_unit] = 'cm';
  }
  mm(value) {
    this[_value] = value;
    this[_unit] = 'mm';
  }
  em(value) {
    this[_value] = value;
    this[_unit] = 'em';
  }
  ex(value) {
    this[_value] = value;
    this[_unit] = 'ex';
  }
  css(cssValue) {
    this[_value] = 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] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
    } else {
      this[_value] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
    }
  }
  toString() {
    return dart.str`${this[_value]}${this[_unit]}`;
  }
  get value() {
    return this[_value];
  }
};
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]: 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: () => ({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()])
    })
  });
  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] = onData == null ? null : html._wrapZone(html.Event, dart.dynamic)(dart.fn(e => dart.dcall(onData, e), EventTodynamic()));
      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(E) {
      return futureValue => {
        if (futureValue === void 0) futureValue = null;
        let completer = async.Completer$(E).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(E => [async.Future$(E), [], [E]])
    })
  });
  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}),
      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])})
});
const _subscriptions = Symbol('_subscriptions');
const _controller = 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] = null;
      this[_controller] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
    }
    get stream() {
      return this[_controller].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], 'add'), {onError: dart.bind(this[_controller], '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].close();
    }
  }
  dart.addTypeTests(_StreamPool);
  dart.defineNamedConstructor(_StreamPool, 'broadcast');
  dart.setSignature(_StreamPool, {
    constructors: () => ({broadcast: dart.definiteFunctionType(html._StreamPool$(T), [])}),
    fields: () => ({
      [_controller]: 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;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
let const;
html._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
  static allowNavigation(uriPolicy) {
    return new html._SimpleNodeValidator(uriPolicy, {allowedElements: const || (const = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const || (const = 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 || (const = dart.constList(['A::href', 'FORM::action'], core.String))});
  }
  static allowImages(uriPolicy) {
    return new html._SimpleNodeValidator(uriPolicy, {allowedElements: const || (const = dart.constList(['IMG'], core.String)), allowedAttributes: const || (const = 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 || (const = dart.constList(['IMG::src'], core.String))});
  }
  static allowTextElements() {
    return new html._SimpleNodeValidator(null, {allowedElements: const || (const = 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 || (const = dart.constList([], core.String))));
    allowedAttributes = allowedAttributes != null ? allowedAttributes : const || (const = dart.constList([], core.String));
    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const || (const = 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: () => ({
      length: dart.definiteFunctionType(core.int, []),
      rawList: dart.definiteFunctionType(core.List$(html.Node), [])
    }),
    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
    methods: () => ({
      _get: dart.definiteFunctionType(E, [core.int]),
      _set: dart.definiteFunctionType(dart.void, [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 = Symbol('_iterator');
html._WrappedIterator$ = dart.generic(E => {
  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
  class _WrappedIterator extends core.Object {
    new(iterator) {
      this[_iterator] = iterator;
    }
    moveNext() {
      return this[_iterator].moveNext();
    }
    get current() {
      return html._downcast(html.Node, E)(this[_iterator].current);
    }
  }
  dart.addTypeTests(_WrappedIterator);
  _WrappedIterator[dart.implements] = () => [IteratorOfE()];
  dart.setSignature(_WrappedIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html._WrappedIterator$(E), [IteratorOfNode()])}),
    fields: () => ({[_iterator]: 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);
      }
    }, ProgressEventToNull()));
    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 = 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] = -1;
      this[_length] = array[dartx.length];
      this[_current] = null;
    }
    moveNext() {
      let nextPosition = dart.notNull(this[_position]) + 1;
      if (nextPosition < dart.notNull(this[_length])) {
        this[_current] = this[_array][dartx._get](nextPosition);
        this[_position] = nextPosition;
        return true;
      }
      this[_current] = null;
      this[_position] = this[_length];
      return false;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(FixedSizeListIterator);
  FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(FixedSizeListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html.FixedSizeListIterator$(T), [ListOfT()])}),
    fields: () => ({
      [_array]: ListOfT(),
      [_length]: core.int,
      [_position]: core.int,
      [_current]: 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] = -1;
      this[_current] = null;
    }
    moveNext() {
      let nextPosition = dart.notNull(this[_position]) + 1;
      if (nextPosition < dart.notNull(this[_array][dartx.length])) {
        this[_current] = this[_array][dartx._get](nextPosition);
        this[_position] = nextPosition;
        return true;
      }
      this[_current] = null;
      this[_position] = this[_array][dartx.length];
      return false;
    }
    get current() {
      return this[_current];
    }
  }
  dart.addTypeTests(_VariableSizeListIterator);
  _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
  dart.setSignature(_VariableSizeListIterator, {
    constructors: () => ({new: dart.definiteFunctionType(html._VariableSizeListIterator$(T), [ListOfT()])}),
    fields: () => ({
      [_array]: ListOfT(),
      [_position]: core.int,
      [_current]: 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));
      }, dynamicAnddynamicToNull()));
      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;
  }, StringAnddynamicToNull()));
  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 = 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]() {
    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], {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][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][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][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][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][dartx.length];
  }
  _get(index) {
    return this[_iterable][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]: dart.definiteFunctionType(core.Iterable$(html.Element), []),
    [_filtered]: dart.definiteFunctionType(core.List$(html.Element), []),
    length: dart.definiteFunctionType(core.int, []),
    rawList: dart.definiteFunctionType(core.List$(html.Node), [])
  }),
  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
  methods: () => ({
    _set: dart.definiteFunctionType(dart.void, [core.int, html.Element]),
    _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, [])}),
  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]),
    [__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, [])}),
  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]),
    [__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, [])}),
  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]),
    [__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, [])}),
  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]),
    [__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 = Symbol('_element');
svg._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
  new(element) {
    this[_element] = element;
  }
  readClasses() {
    let classname = this[_element][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][dartx.attributes][dartx._set]('class', s.join(' '));
  }
};
dart.setSignature(svg._AttributeClassSet, {
  constructors: () => ({new: dart.definiteFunctionType(svg._AttributeClassSet, [html.Element])}),
  fields: () => ({[_element]: 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, [])}),
  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]),
    [__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];
  }
  set href(value) {
    super.href = value;
  }
};
const href = 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);
    }, AudioBufferToNull()), dart.fn(error => {
      if (error == null) {
        completer.completeError('');
      } else {
        completer.completeError(error);
      }
    }, AudioBufferToNull()));
    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, [])}),
  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.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);
