// START_OF_CACHED_PATCHES
// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// DO NOT EDIT GENERATED FILE.

library cached_patches;

var cached_patches = {"dart:html": ["dart:html", "dart:html_js_interop_patch.dart", """import 'dart:js' as js_library;

/**
 * Placeholder object for cases where we need to determine exactly how many
 * args were passed to a function.
 */
const _UNDEFINED_JS_CONST = const Object();

patch class AbstractWorker {
  static Type get instanceRuntimeType => AbstractWorkerImpl;

}
class AbstractWorkerImpl extends AbstractWorker implements js_library.JSObjectInterfacesDom {
  AbstractWorkerImpl.internal_() : super.internal_();
  get runtimeType => AbstractWorker;
  toString() => super.toString();
}
patch class AnchorElement {
  static Type get instanceRuntimeType => AnchorElementImpl;

}
class AnchorElementImpl extends AnchorElement implements js_library.JSObjectInterfacesDom {
  AnchorElementImpl.internal_() : super.internal_();
  get runtimeType => AnchorElement;
  toString() => super.toString();
}
patch class Animation {
  static Type get instanceRuntimeType => AnimationImpl;

}
class AnimationImpl extends Animation implements js_library.JSObjectInterfacesDom {
  AnimationImpl.internal_() : super.internal_();
  get runtimeType => Animation;
  toString() => super.toString();
}
patch class AnimationEffectReadOnly {
  static Type get instanceRuntimeType => AnimationEffectReadOnlyImpl;

}
class AnimationEffectReadOnlyImpl extends AnimationEffectReadOnly implements js_library.JSObjectInterfacesDom {
  AnimationEffectReadOnlyImpl.internal_() : super.internal_();
  get runtimeType => AnimationEffectReadOnly;
  toString() => super.toString();
}
patch class AnimationEffectTiming {
  static Type get instanceRuntimeType => AnimationEffectTimingImpl;

}
class AnimationEffectTimingImpl extends AnimationEffectTiming implements js_library.JSObjectInterfacesDom {
  AnimationEffectTimingImpl.internal_() : super.internal_();
  get runtimeType => AnimationEffectTiming;
  toString() => super.toString();
}
patch class AnimationEvent {
  static Type get instanceRuntimeType => AnimationEventImpl;

}
class AnimationEventImpl extends AnimationEvent implements js_library.JSObjectInterfacesDom {
  AnimationEventImpl.internal_() : super.internal_();
  get runtimeType => AnimationEvent;
  toString() => super.toString();
}
patch class AnimationPlayerEvent {
  static Type get instanceRuntimeType => AnimationPlayerEventImpl;

}
class AnimationPlayerEventImpl extends AnimationPlayerEvent implements js_library.JSObjectInterfacesDom {
  AnimationPlayerEventImpl.internal_() : super.internal_();
  get runtimeType => AnimationPlayerEvent;
  toString() => super.toString();
}
patch class AnimationTimeline {
  static Type get instanceRuntimeType => AnimationTimelineImpl;

}
class AnimationTimelineImpl extends AnimationTimeline implements js_library.JSObjectInterfacesDom {
  AnimationTimelineImpl.internal_() : super.internal_();
  get runtimeType => AnimationTimeline;
  toString() => super.toString();
}
patch class AppBannerPromptResult {
  static Type get instanceRuntimeType => AppBannerPromptResultImpl;

}
class AppBannerPromptResultImpl extends AppBannerPromptResult implements js_library.JSObjectInterfacesDom {
  AppBannerPromptResultImpl.internal_() : super.internal_();
  get runtimeType => AppBannerPromptResult;
  toString() => super.toString();
}
patch class ApplicationCache {
  static Type get instanceRuntimeType => ApplicationCacheImpl;

}
class ApplicationCacheImpl extends ApplicationCache implements js_library.JSObjectInterfacesDom {
  ApplicationCacheImpl.internal_() : super.internal_();
  get runtimeType => ApplicationCache;
  toString() => super.toString();
}
patch class ApplicationCacheErrorEvent {
  static Type get instanceRuntimeType => ApplicationCacheErrorEventImpl;

}
class ApplicationCacheErrorEventImpl extends ApplicationCacheErrorEvent implements js_library.JSObjectInterfacesDom {
  ApplicationCacheErrorEventImpl.internal_() : super.internal_();
  get runtimeType => ApplicationCacheErrorEvent;
  toString() => super.toString();
}
patch class AreaElement {
  static Type get instanceRuntimeType => AreaElementImpl;

}
class AreaElementImpl extends AreaElement implements js_library.JSObjectInterfacesDom {
  AreaElementImpl.internal_() : super.internal_();
  get runtimeType => AreaElement;
  toString() => super.toString();
}
patch class AudioElement {
  static Type get instanceRuntimeType => AudioElementImpl;

}
class AudioElementImpl extends AudioElement implements js_library.JSObjectInterfacesDom {
  AudioElementImpl.internal_() : super.internal_();
  get runtimeType => AudioElement;
  toString() => super.toString();
}
patch class AudioTrack {
  static Type get instanceRuntimeType => AudioTrackImpl;

}
class AudioTrackImpl extends AudioTrack implements js_library.JSObjectInterfacesDom {
  AudioTrackImpl.internal_() : super.internal_();
  get runtimeType => AudioTrack;
  toString() => super.toString();
}
patch class AudioTrackList {
  static Type get instanceRuntimeType => AudioTrackListImpl;

}
class AudioTrackListImpl extends AudioTrackList implements js_library.JSObjectInterfacesDom {
  AudioTrackListImpl.internal_() : super.internal_();
  get runtimeType => AudioTrackList;
  toString() => super.toString();
}
patch class AutocompleteErrorEvent {
  static Type get instanceRuntimeType => AutocompleteErrorEventImpl;

}
class AutocompleteErrorEventImpl extends AutocompleteErrorEvent implements js_library.JSObjectInterfacesDom {
  AutocompleteErrorEventImpl.internal_() : super.internal_();
  get runtimeType => AutocompleteErrorEvent;
  toString() => super.toString();
}
patch class BRElement {
  static Type get instanceRuntimeType => BRElementImpl;

}
class BRElementImpl extends BRElement implements js_library.JSObjectInterfacesDom {
  BRElementImpl.internal_() : super.internal_();
  get runtimeType => BRElement;
  toString() => super.toString();
}
patch class BarProp {
  static Type get instanceRuntimeType => BarPropImpl;

}
class BarPropImpl extends BarProp implements js_library.JSObjectInterfacesDom {
  BarPropImpl.internal_() : super.internal_();
  get runtimeType => BarProp;
  toString() => super.toString();
}
patch class BaseElement {
  static Type get instanceRuntimeType => BaseElementImpl;

}
class BaseElementImpl extends BaseElement implements js_library.JSObjectInterfacesDom {
  BaseElementImpl.internal_() : super.internal_();
  get runtimeType => BaseElement;
  toString() => super.toString();
}
patch class BatteryManager {
  static Type get instanceRuntimeType => BatteryManagerImpl;

}
class BatteryManagerImpl extends BatteryManager implements js_library.JSObjectInterfacesDom {
  BatteryManagerImpl.internal_() : super.internal_();
  get runtimeType => BatteryManager;
  toString() => super.toString();
}
patch class BeforeInstallPromptEvent {
  static Type get instanceRuntimeType => BeforeInstallPromptEventImpl;

}
class BeforeInstallPromptEventImpl extends BeforeInstallPromptEvent implements js_library.JSObjectInterfacesDom {
  BeforeInstallPromptEventImpl.internal_() : super.internal_();
  get runtimeType => BeforeInstallPromptEvent;
  toString() => super.toString();
}
patch class BeforeUnloadEvent {
  static Type get instanceRuntimeType => BeforeUnloadEventImpl;

}
class BeforeUnloadEventImpl extends BeforeUnloadEvent implements js_library.JSObjectInterfacesDom {
  BeforeUnloadEventImpl.internal_() : super.internal_();
  get runtimeType => BeforeUnloadEvent;
  toString() => super.toString();
}
patch class Blob {
  static Type get instanceRuntimeType => BlobImpl;

}
class BlobImpl extends Blob implements js_library.JSObjectInterfacesDom {
  BlobImpl.internal_() : super.internal_();
  get runtimeType => Blob;
  toString() => super.toString();
}
patch class Bluetooth {
  static Type get instanceRuntimeType => BluetoothImpl;

}
class BluetoothImpl extends Bluetooth implements js_library.JSObjectInterfacesDom {
  BluetoothImpl.internal_() : super.internal_();
  get runtimeType => Bluetooth;
  toString() => super.toString();
}
patch class BluetoothDevice {
  static Type get instanceRuntimeType => BluetoothDeviceImpl;

}
class BluetoothDeviceImpl extends BluetoothDevice implements js_library.JSObjectInterfacesDom {
  BluetoothDeviceImpl.internal_() : super.internal_();
  get runtimeType => BluetoothDevice;
  toString() => super.toString();
}
patch class BluetoothGattCharacteristic {
  static Type get instanceRuntimeType => BluetoothGattCharacteristicImpl;

}
class BluetoothGattCharacteristicImpl extends BluetoothGattCharacteristic implements js_library.JSObjectInterfacesDom {
  BluetoothGattCharacteristicImpl.internal_() : super.internal_();
  get runtimeType => BluetoothGattCharacteristic;
  toString() => super.toString();
}
patch class BluetoothGattRemoteServer {
  static Type get instanceRuntimeType => BluetoothGattRemoteServerImpl;

}
class BluetoothGattRemoteServerImpl extends BluetoothGattRemoteServer implements js_library.JSObjectInterfacesDom {
  BluetoothGattRemoteServerImpl.internal_() : super.internal_();
  get runtimeType => BluetoothGattRemoteServer;
  toString() => super.toString();
}
patch class BluetoothGattService {
  static Type get instanceRuntimeType => BluetoothGattServiceImpl;

}
class BluetoothGattServiceImpl extends BluetoothGattService implements js_library.JSObjectInterfacesDom {
  BluetoothGattServiceImpl.internal_() : super.internal_();
  get runtimeType => BluetoothGattService;
  toString() => super.toString();
}
patch class BluetoothUuid {
  static Type get instanceRuntimeType => BluetoothUuidImpl;

}
class BluetoothUuidImpl extends BluetoothUuid implements js_library.JSObjectInterfacesDom {
  BluetoothUuidImpl.internal_() : super.internal_();
  get runtimeType => BluetoothUuid;
  toString() => super.toString();
}
patch class Body {
  static Type get instanceRuntimeType => BodyImpl;

}
class BodyImpl extends Body implements js_library.JSObjectInterfacesDom {
  BodyImpl.internal_() : super.internal_();
  get runtimeType => Body;
  toString() => super.toString();
}
patch class BodyElement {
  static Type get instanceRuntimeType => BodyElementImpl;

}
class BodyElementImpl extends BodyElement implements js_library.JSObjectInterfacesDom {
  BodyElementImpl.internal_() : super.internal_();
  get runtimeType => BodyElement;
  toString() => super.toString();
}
patch class ButtonElement {
  static Type get instanceRuntimeType => ButtonElementImpl;

}
class ButtonElementImpl extends ButtonElement implements js_library.JSObjectInterfacesDom {
  ButtonElementImpl.internal_() : super.internal_();
  get runtimeType => ButtonElement;
  toString() => super.toString();
}
patch class CDataSection {
  static Type get instanceRuntimeType => CDataSectionImpl;

}
class CDataSectionImpl extends CDataSection implements js_library.JSObjectInterfacesDom {
  CDataSectionImpl.internal_() : super.internal_();
  get runtimeType => CDataSection;
  toString() => super.toString();
}
patch class CacheStorage {
  static Type get instanceRuntimeType => CacheStorageImpl;

}
class CacheStorageImpl extends CacheStorage implements js_library.JSObjectInterfacesDom {
  CacheStorageImpl.internal_() : super.internal_();
  get runtimeType => CacheStorage;
  toString() => super.toString();
}
patch class CanvasElement {
  static Type get instanceRuntimeType => CanvasElementImpl;

}
class CanvasElementImpl extends CanvasElement implements js_library.JSObjectInterfacesDom {
  CanvasElementImpl.internal_() : super.internal_();
  get runtimeType => CanvasElement;
  toString() => super.toString();
}
patch class CanvasGradient {
  static Type get instanceRuntimeType => CanvasGradientImpl;

}
class CanvasGradientImpl extends CanvasGradient implements js_library.JSObjectInterfacesDom {
  CanvasGradientImpl.internal_() : super.internal_();
  get runtimeType => CanvasGradient;
  toString() => super.toString();
}
patch class CanvasPattern {
  static Type get instanceRuntimeType => CanvasPatternImpl;

}
class CanvasPatternImpl extends CanvasPattern implements js_library.JSObjectInterfacesDom {
  CanvasPatternImpl.internal_() : super.internal_();
  get runtimeType => CanvasPattern;
  toString() => super.toString();
}
patch class CanvasRenderingContext2D {
  static Type get instanceRuntimeType => CanvasRenderingContext2DImpl;

}
class CanvasRenderingContext2DImpl extends CanvasRenderingContext2D implements js_library.JSObjectInterfacesDom {
  CanvasRenderingContext2DImpl.internal_() : super.internal_();
  get runtimeType => CanvasRenderingContext2D;
  toString() => super.toString();
}
patch class CharacterData {
  static Type get instanceRuntimeType => CharacterDataImpl;

}
class CharacterDataImpl extends CharacterData implements js_library.JSObjectInterfacesDom {
  CharacterDataImpl.internal_() : super.internal_();
  get runtimeType => CharacterData;
  toString() => super.toString();
}
patch class ChildNode {
  static Type get instanceRuntimeType => ChildNodeImpl;

}
class ChildNodeImpl extends ChildNode implements js_library.JSObjectInterfacesDom {
  ChildNodeImpl.internal_() : super.internal_();
  get runtimeType => ChildNode;
  toString() => super.toString();
}
patch class ChromiumValuebuffer {
  static Type get instanceRuntimeType => ChromiumValuebufferImpl;

}
class ChromiumValuebufferImpl extends ChromiumValuebuffer implements js_library.JSObjectInterfacesDom {
  ChromiumValuebufferImpl.internal_() : super.internal_();
  get runtimeType => ChromiumValuebuffer;
  toString() => super.toString();
}
patch class CircularGeofencingRegion {
  static Type get instanceRuntimeType => CircularGeofencingRegionImpl;

}
class CircularGeofencingRegionImpl extends CircularGeofencingRegion implements js_library.JSObjectInterfacesDom {
  CircularGeofencingRegionImpl.internal_() : super.internal_();
  get runtimeType => CircularGeofencingRegion;
  toString() => super.toString();
}
patch class Client {
  static Type get instanceRuntimeType => ClientImpl;

}
class ClientImpl extends Client implements js_library.JSObjectInterfacesDom {
  ClientImpl.internal_() : super.internal_();
  get runtimeType => Client;
  toString() => super.toString();
}
patch class Clients {
  static Type get instanceRuntimeType => ClientsImpl;

}
class ClientsImpl extends Clients implements js_library.JSObjectInterfacesDom {
  ClientsImpl.internal_() : super.internal_();
  get runtimeType => Clients;
  toString() => super.toString();
}
patch class ClipboardEvent {
  static Type get instanceRuntimeType => ClipboardEventImpl;

}
class ClipboardEventImpl extends ClipboardEvent implements js_library.JSObjectInterfacesDom {
  ClipboardEventImpl.internal_() : super.internal_();
  get runtimeType => ClipboardEvent;
  toString() => super.toString();
}
patch class CloseEvent {
  static Type get instanceRuntimeType => CloseEventImpl;

}
class CloseEventImpl extends CloseEvent implements js_library.JSObjectInterfacesDom {
  CloseEventImpl.internal_() : super.internal_();
  get runtimeType => CloseEvent;
  toString() => super.toString();
}
patch class Comment {
  static Type get instanceRuntimeType => CommentImpl;

}
class CommentImpl extends Comment implements js_library.JSObjectInterfacesDom {
  CommentImpl.internal_() : super.internal_();
  get runtimeType => Comment;
  toString() => super.toString();
}
patch class CompositionEvent {
  static Type get instanceRuntimeType => CompositionEventImpl;

}
class CompositionEventImpl extends CompositionEvent implements js_library.JSObjectInterfacesDom {
  CompositionEventImpl.internal_() : super.internal_();
  get runtimeType => CompositionEvent;
  toString() => super.toString();
}
patch class CompositorProxy {
  static Type get instanceRuntimeType => CompositorProxyImpl;

}
class CompositorProxyImpl extends CompositorProxy implements js_library.JSObjectInterfacesDom {
  CompositorProxyImpl.internal_() : super.internal_();
  get runtimeType => CompositorProxy;
  toString() => super.toString();
}
patch class CompositorWorker {
  static Type get instanceRuntimeType => CompositorWorkerImpl;

}
class CompositorWorkerImpl extends CompositorWorker implements js_library.JSObjectInterfacesDom {
  CompositorWorkerImpl.internal_() : super.internal_();
  get runtimeType => CompositorWorker;
  toString() => super.toString();
}
patch class CompositorWorkerGlobalScope {
  static Type get instanceRuntimeType => CompositorWorkerGlobalScopeImpl;

}
class CompositorWorkerGlobalScopeImpl extends CompositorWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
  CompositorWorkerGlobalScopeImpl.internal_() : super.internal_();
  get runtimeType => CompositorWorkerGlobalScope;
  toString() => super.toString();
}
patch class Console {
  static Type get instanceRuntimeType => ConsoleImpl;

}
class ConsoleImpl extends Console implements js_library.JSObjectInterfacesDom {
  ConsoleImpl.internal_() : super.internal_();
  get runtimeType => Console;
  toString() => super.toString();
}
patch class ConsoleBase {
  static Type get instanceRuntimeType => ConsoleBaseImpl;

}
class ConsoleBaseImpl extends ConsoleBase implements js_library.JSObjectInterfacesDom {
  ConsoleBaseImpl.internal_() : super.internal_();
  get runtimeType => ConsoleBase;
  toString() => super.toString();
}
patch class ContentElement {
  static Type get instanceRuntimeType => ContentElementImpl;

}
class ContentElementImpl extends ContentElement implements js_library.JSObjectInterfacesDom {
  ContentElementImpl.internal_() : super.internal_();
  get runtimeType => ContentElement;
  toString() => super.toString();
}
patch class Coordinates {
  static Type get instanceRuntimeType => CoordinatesImpl;

}
class CoordinatesImpl extends Coordinates implements js_library.JSObjectInterfacesDom {
  CoordinatesImpl.internal_() : super.internal_();
  get runtimeType => Coordinates;
  toString() => super.toString();
}
patch class Credential {
  static Type get instanceRuntimeType => CredentialImpl;

}
class CredentialImpl extends Credential implements js_library.JSObjectInterfacesDom {
  CredentialImpl.internal_() : super.internal_();
  get runtimeType => Credential;
  toString() => super.toString();
}
patch class CredentialsContainer {
  static Type get instanceRuntimeType => CredentialsContainerImpl;

}
class CredentialsContainerImpl extends CredentialsContainer implements js_library.JSObjectInterfacesDom {
  CredentialsContainerImpl.internal_() : super.internal_();
  get runtimeType => CredentialsContainer;
  toString() => super.toString();
}
patch class CrossOriginConnectEvent {
  static Type get instanceRuntimeType => CrossOriginConnectEventImpl;

}
class CrossOriginConnectEventImpl extends CrossOriginConnectEvent implements js_library.JSObjectInterfacesDom {
  CrossOriginConnectEventImpl.internal_() : super.internal_();
  get runtimeType => CrossOriginConnectEvent;
  toString() => super.toString();
}
patch class CrossOriginServiceWorkerClient {
  static Type get instanceRuntimeType => CrossOriginServiceWorkerClientImpl;

}
class CrossOriginServiceWorkerClientImpl extends CrossOriginServiceWorkerClient implements js_library.JSObjectInterfacesDom {
  CrossOriginServiceWorkerClientImpl.internal_() : super.internal_();
  get runtimeType => CrossOriginServiceWorkerClient;
  toString() => super.toString();
}
patch class Crypto {
  static Type get instanceRuntimeType => CryptoImpl;

}
class CryptoImpl extends Crypto implements js_library.JSObjectInterfacesDom {
  CryptoImpl.internal_() : super.internal_();
  get runtimeType => Crypto;
  toString() => super.toString();
}
patch class CryptoKey {
  static Type get instanceRuntimeType => CryptoKeyImpl;

}
class CryptoKeyImpl extends CryptoKey implements js_library.JSObjectInterfacesDom {
  CryptoKeyImpl.internal_() : super.internal_();
  get runtimeType => CryptoKey;
  toString() => super.toString();
}
patch class Css {
  static Type get instanceRuntimeType => CssImpl;

}
class CssImpl extends Css implements js_library.JSObjectInterfacesDom {
  CssImpl.internal_() : super.internal_();
  get runtimeType => Css;
  toString() => super.toString();
}
patch class CssCharsetRule {
  static Type get instanceRuntimeType => CssCharsetRuleImpl;

}
class CssCharsetRuleImpl extends CssCharsetRule implements js_library.JSObjectInterfacesDom {
  CssCharsetRuleImpl.internal_() : super.internal_();
  get runtimeType => CssCharsetRule;
  toString() => super.toString();
}
patch class CssFontFaceRule {
  static Type get instanceRuntimeType => CssFontFaceRuleImpl;

}
class CssFontFaceRuleImpl extends CssFontFaceRule implements js_library.JSObjectInterfacesDom {
  CssFontFaceRuleImpl.internal_() : super.internal_();
  get runtimeType => CssFontFaceRule;
  toString() => super.toString();
}
patch class CssGroupingRule {
  static Type get instanceRuntimeType => CssGroupingRuleImpl;

}
class CssGroupingRuleImpl extends CssGroupingRule implements js_library.JSObjectInterfacesDom {
  CssGroupingRuleImpl.internal_() : super.internal_();
  get runtimeType => CssGroupingRule;
  toString() => super.toString();
}
patch class CssImportRule {
  static Type get instanceRuntimeType => CssImportRuleImpl;

}
class CssImportRuleImpl extends CssImportRule implements js_library.JSObjectInterfacesDom {
  CssImportRuleImpl.internal_() : super.internal_();
  get runtimeType => CssImportRule;
  toString() => super.toString();
}
patch class CssKeyframeRule {
  static Type get instanceRuntimeType => CssKeyframeRuleImpl;

}
class CssKeyframeRuleImpl extends CssKeyframeRule implements js_library.JSObjectInterfacesDom {
  CssKeyframeRuleImpl.internal_() : super.internal_();
  get runtimeType => CssKeyframeRule;
  toString() => super.toString();
}
patch class CssKeyframesRule {
  static Type get instanceRuntimeType => CssKeyframesRuleImpl;

}
class CssKeyframesRuleImpl extends CssKeyframesRule implements js_library.JSObjectInterfacesDom {
  CssKeyframesRuleImpl.internal_() : super.internal_();
  get runtimeType => CssKeyframesRule;
  toString() => super.toString();
}
patch class CssMediaRule {
  static Type get instanceRuntimeType => CssMediaRuleImpl;

}
class CssMediaRuleImpl extends CssMediaRule implements js_library.JSObjectInterfacesDom {
  CssMediaRuleImpl.internal_() : super.internal_();
  get runtimeType => CssMediaRule;
  toString() => super.toString();
}
patch class CssPageRule {
  static Type get instanceRuntimeType => CssPageRuleImpl;

}
class CssPageRuleImpl extends CssPageRule implements js_library.JSObjectInterfacesDom {
  CssPageRuleImpl.internal_() : super.internal_();
  get runtimeType => CssPageRule;
  toString() => super.toString();
}
patch class CssRule {
  static Type get instanceRuntimeType => CssRuleImpl;

}
class CssRuleImpl extends CssRule implements js_library.JSObjectInterfacesDom {
  CssRuleImpl.internal_() : super.internal_();
  get runtimeType => CssRule;
  toString() => super.toString();
}
patch class CssStyleDeclaration {
  static Type get instanceRuntimeType => CssStyleDeclarationImpl;

}
class CssStyleDeclarationImpl extends CssStyleDeclaration implements js_library.JSObjectInterfacesDom {
  CssStyleDeclarationImpl.internal_() : super.internal_();
  get runtimeType => CssStyleDeclaration;
  toString() => super.toString();
}
patch class CssStyleRule {
  static Type get instanceRuntimeType => CssStyleRuleImpl;

}
class CssStyleRuleImpl extends CssStyleRule implements js_library.JSObjectInterfacesDom {
  CssStyleRuleImpl.internal_() : super.internal_();
  get runtimeType => CssStyleRule;
  toString() => super.toString();
}
patch class CssStyleSheet {
  static Type get instanceRuntimeType => CssStyleSheetImpl;

}
class CssStyleSheetImpl extends CssStyleSheet implements js_library.JSObjectInterfacesDom {
  CssStyleSheetImpl.internal_() : super.internal_();
  get runtimeType => CssStyleSheet;
  toString() => super.toString();
}
patch class CssSupportsRule {
  static Type get instanceRuntimeType => CssSupportsRuleImpl;

}
class CssSupportsRuleImpl extends CssSupportsRule implements js_library.JSObjectInterfacesDom {
  CssSupportsRuleImpl.internal_() : super.internal_();
  get runtimeType => CssSupportsRule;
  toString() => super.toString();
}
patch class CssViewportRule {
  static Type get instanceRuntimeType => CssViewportRuleImpl;

}
class CssViewportRuleImpl extends CssViewportRule implements js_library.JSObjectInterfacesDom {
  CssViewportRuleImpl.internal_() : super.internal_();
  get runtimeType => CssViewportRule;
  toString() => super.toString();
}
patch class CustomEvent {
  static Type get instanceRuntimeType => CustomEventImpl;

}
class CustomEventImpl extends CustomEvent implements js_library.JSObjectInterfacesDom {
  CustomEventImpl.internal_() : super.internal_();
  get runtimeType => CustomEvent;
  toString() => super.toString();
}
patch class DListElement {
  static Type get instanceRuntimeType => DListElementImpl;

}
class DListElementImpl extends DListElement implements js_library.JSObjectInterfacesDom {
  DListElementImpl.internal_() : super.internal_();
  get runtimeType => DListElement;
  toString() => super.toString();
}
patch class DataListElement {
  static Type get instanceRuntimeType => DataListElementImpl;

}
class DataListElementImpl extends DataListElement implements js_library.JSObjectInterfacesDom {
  DataListElementImpl.internal_() : super.internal_();
  get runtimeType => DataListElement;
  toString() => super.toString();
}
patch class DataTransfer {
  static Type get instanceRuntimeType => DataTransferImpl;

}
class DataTransferImpl extends DataTransfer implements js_library.JSObjectInterfacesDom {
  DataTransferImpl.internal_() : super.internal_();
  get runtimeType => DataTransfer;
  toString() => super.toString();
}
patch class DataTransferItem {
  static Type get instanceRuntimeType => DataTransferItemImpl;

}
class DataTransferItemImpl extends DataTransferItem implements js_library.JSObjectInterfacesDom {
  DataTransferItemImpl.internal_() : super.internal_();
  get runtimeType => DataTransferItem;
  toString() => super.toString();
}
patch class DataTransferItemList {
  static Type get instanceRuntimeType => DataTransferItemListImpl;

}
class DataTransferItemListImpl extends DataTransferItemList implements js_library.JSObjectInterfacesDom {
  DataTransferItemListImpl.internal_() : super.internal_();
  get runtimeType => DataTransferItemList;
  toString() => super.toString();
}
patch class DedicatedWorkerGlobalScope {
  static Type get instanceRuntimeType => DedicatedWorkerGlobalScopeImpl;

}
class DedicatedWorkerGlobalScopeImpl extends DedicatedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
  DedicatedWorkerGlobalScopeImpl.internal_() : super.internal_();
  get runtimeType => DedicatedWorkerGlobalScope;
  toString() => super.toString();
}
patch class DefaultSessionStartEvent {
  static Type get instanceRuntimeType => DefaultSessionStartEventImpl;

}
class DefaultSessionStartEventImpl extends DefaultSessionStartEvent implements js_library.JSObjectInterfacesDom {
  DefaultSessionStartEventImpl.internal_() : super.internal_();
  get runtimeType => DefaultSessionStartEvent;
  toString() => super.toString();
}
patch class DeprecatedStorageInfo {
  static Type get instanceRuntimeType => DeprecatedStorageInfoImpl;

}
class DeprecatedStorageInfoImpl extends DeprecatedStorageInfo implements js_library.JSObjectInterfacesDom {
  DeprecatedStorageInfoImpl.internal_() : super.internal_();
  get runtimeType => DeprecatedStorageInfo;
  toString() => super.toString();
}
patch class DeprecatedStorageQuota {
  static Type get instanceRuntimeType => DeprecatedStorageQuotaImpl;

}
class DeprecatedStorageQuotaImpl extends DeprecatedStorageQuota implements js_library.JSObjectInterfacesDom {
  DeprecatedStorageQuotaImpl.internal_() : super.internal_();
  get runtimeType => DeprecatedStorageQuota;
  toString() => super.toString();
}
patch class DetailsElement {
  static Type get instanceRuntimeType => DetailsElementImpl;

}
class DetailsElementImpl extends DetailsElement implements js_library.JSObjectInterfacesDom {
  DetailsElementImpl.internal_() : super.internal_();
  get runtimeType => DetailsElement;
  toString() => super.toString();
}
patch class DeviceAcceleration {
  static Type get instanceRuntimeType => DeviceAccelerationImpl;

}
class DeviceAccelerationImpl extends DeviceAcceleration implements js_library.JSObjectInterfacesDom {
  DeviceAccelerationImpl.internal_() : super.internal_();
  get runtimeType => DeviceAcceleration;
  toString() => super.toString();
}
patch class DeviceLightEvent {
  static Type get instanceRuntimeType => DeviceLightEventImpl;

}
class DeviceLightEventImpl extends DeviceLightEvent implements js_library.JSObjectInterfacesDom {
  DeviceLightEventImpl.internal_() : super.internal_();
  get runtimeType => DeviceLightEvent;
  toString() => super.toString();
}
patch class DeviceMotionEvent {
  static Type get instanceRuntimeType => DeviceMotionEventImpl;

}
class DeviceMotionEventImpl extends DeviceMotionEvent implements js_library.JSObjectInterfacesDom {
  DeviceMotionEventImpl.internal_() : super.internal_();
  get runtimeType => DeviceMotionEvent;
  toString() => super.toString();
}
patch class DeviceOrientationEvent {
  static Type get instanceRuntimeType => DeviceOrientationEventImpl;

}
class DeviceOrientationEventImpl extends DeviceOrientationEvent implements js_library.JSObjectInterfacesDom {
  DeviceOrientationEventImpl.internal_() : super.internal_();
  get runtimeType => DeviceOrientationEvent;
  toString() => super.toString();
}
patch class DeviceRotationRate {
  static Type get instanceRuntimeType => DeviceRotationRateImpl;

}
class DeviceRotationRateImpl extends DeviceRotationRate implements js_library.JSObjectInterfacesDom {
  DeviceRotationRateImpl.internal_() : super.internal_();
  get runtimeType => DeviceRotationRate;
  toString() => super.toString();
}
patch class DialogElement {
  static Type get instanceRuntimeType => DialogElementImpl;

}
class DialogElementImpl extends DialogElement implements js_library.JSObjectInterfacesDom {
  DialogElementImpl.internal_() : super.internal_();
  get runtimeType => DialogElement;
  toString() => super.toString();
}
patch class DirectoryEntry {
  static Type get instanceRuntimeType => DirectoryEntryImpl;

}
class DirectoryEntryImpl extends DirectoryEntry implements js_library.JSObjectInterfacesDom {
  DirectoryEntryImpl.internal_() : super.internal_();
  get runtimeType => DirectoryEntry;
  toString() => super.toString();
}
patch class DirectoryReader {
  static Type get instanceRuntimeType => DirectoryReaderImpl;

}
class DirectoryReaderImpl extends DirectoryReader implements js_library.JSObjectInterfacesDom {
  DirectoryReaderImpl.internal_() : super.internal_();
  get runtimeType => DirectoryReader;
  toString() => super.toString();
}
patch class DivElement {
  static Type get instanceRuntimeType => DivElementImpl;

}
class DivElementImpl extends DivElement implements js_library.JSObjectInterfacesDom {
  DivElementImpl.internal_() : super.internal_();
  get runtimeType => DivElement;
  toString() => super.toString();
}
patch class Document {
  static Type get instanceRuntimeType => DocumentImpl;

}
class DocumentImpl extends Document implements js_library.JSObjectInterfacesDom {
  DocumentImpl.internal_() : super.internal_();
  get runtimeType => Document;
  toString() => super.toString();
}
patch class DocumentFragment {
  static Type get instanceRuntimeType => DocumentFragmentImpl;

}
class DocumentFragmentImpl extends DocumentFragment implements js_library.JSObjectInterfacesDom {
  DocumentFragmentImpl.internal_() : super.internal_();
  get runtimeType => DocumentFragment;
  toString() => super.toString();
}
patch class DomError {
  static Type get instanceRuntimeType => DomErrorImpl;

}
class DomErrorImpl extends DomError implements js_library.JSObjectInterfacesDom {
  DomErrorImpl.internal_() : super.internal_();
  get runtimeType => DomError;
  toString() => super.toString();
}
patch class DomException {
  static Type get instanceRuntimeType => DomExceptionImpl;

}
class DomExceptionImpl extends DomException implements js_library.JSObjectInterfacesDom {
  DomExceptionImpl.internal_() : super.internal_();
  get runtimeType => DomException;
  toString() => super.toString();
}
patch class DomImplementation {
  static Type get instanceRuntimeType => DomImplementationImpl;

}
class DomImplementationImpl extends DomImplementation implements js_library.JSObjectInterfacesDom {
  DomImplementationImpl.internal_() : super.internal_();
  get runtimeType => DomImplementation;
  toString() => super.toString();
}
patch class DomIterator {
  static Type get instanceRuntimeType => DomIteratorImpl;

}
class DomIteratorImpl extends DomIterator implements js_library.JSObjectInterfacesDom {
  DomIteratorImpl.internal_() : super.internal_();
  get runtimeType => DomIterator;
  toString() => super.toString();
}
patch class DomMatrix {
  static Type get instanceRuntimeType => DomMatrixImpl;

}
class DomMatrixImpl extends DomMatrix implements js_library.JSObjectInterfacesDom {
  DomMatrixImpl.internal_() : super.internal_();
  get runtimeType => DomMatrix;
  toString() => super.toString();
}
patch class DomMatrixReadOnly {
  static Type get instanceRuntimeType => DomMatrixReadOnlyImpl;

}
class DomMatrixReadOnlyImpl extends DomMatrixReadOnly implements js_library.JSObjectInterfacesDom {
  DomMatrixReadOnlyImpl.internal_() : super.internal_();
  get runtimeType => DomMatrixReadOnly;
  toString() => super.toString();
}
patch class DomParser {
  static Type get instanceRuntimeType => DomParserImpl;

}
class DomParserImpl extends DomParser implements js_library.JSObjectInterfacesDom {
  DomParserImpl.internal_() : super.internal_();
  get runtimeType => DomParser;
  toString() => super.toString();
}
patch class DomPoint {
  static Type get instanceRuntimeType => DomPointImpl;

}
class DomPointImpl extends DomPoint implements js_library.JSObjectInterfacesDom {
  DomPointImpl.internal_() : super.internal_();
  get runtimeType => DomPoint;
  toString() => super.toString();
}
patch class DomPointReadOnly {
  static Type get instanceRuntimeType => DomPointReadOnlyImpl;

}
class DomPointReadOnlyImpl extends DomPointReadOnly implements js_library.JSObjectInterfacesDom {
  DomPointReadOnlyImpl.internal_() : super.internal_();
  get runtimeType => DomPointReadOnly;
  toString() => super.toString();
}
patch class DomRectReadOnly {
  static Type get instanceRuntimeType => DomRectReadOnlyImpl;

}
class DomRectReadOnlyImpl extends DomRectReadOnly implements js_library.JSObjectInterfacesDom {
  DomRectReadOnlyImpl.internal_() : super.internal_();
  get runtimeType => DomRectReadOnly;
  toString() => super.toString();
}
patch class DomSettableTokenList {
  static Type get instanceRuntimeType => DomSettableTokenListImpl;

}
class DomSettableTokenListImpl extends DomSettableTokenList implements js_library.JSObjectInterfacesDom {
  DomSettableTokenListImpl.internal_() : super.internal_();
  get runtimeType => DomSettableTokenList;
  toString() => super.toString();
}
patch class DomStringList {
  static Type get instanceRuntimeType => DomStringListImpl;

}
class DomStringListImpl extends DomStringList implements js_library.JSObjectInterfacesDom {
  DomStringListImpl.internal_() : super.internal_();
  get runtimeType => DomStringList;
  toString() => super.toString();
}
patch class DomStringMap {
  static Type get instanceRuntimeType => DomStringMapImpl;

}
class DomStringMapImpl extends DomStringMap implements js_library.JSObjectInterfacesDom {
  DomStringMapImpl.internal_() : super.internal_();
  get runtimeType => DomStringMap;
  toString() => super.toString();
}
patch class DomTokenList {
  static Type get instanceRuntimeType => DomTokenListImpl;

}
class DomTokenListImpl extends DomTokenList implements js_library.JSObjectInterfacesDom {
  DomTokenListImpl.internal_() : super.internal_();
  get runtimeType => DomTokenList;
  toString() => super.toString();
}
patch class EffectModel {
  static Type get instanceRuntimeType => EffectModelImpl;

}
class EffectModelImpl extends EffectModel implements js_library.JSObjectInterfacesDom {
  EffectModelImpl.internal_() : super.internal_();
  get runtimeType => EffectModel;
  toString() => super.toString();
}
patch class Element {
  static Type get instanceRuntimeType => ElementImpl;

}
class ElementImpl extends Element implements js_library.JSObjectInterfacesDom {
  ElementImpl.internal_() : super.internal_();
  get runtimeType => Element;
  toString() => super.toString();
}
patch class EmbedElement {
  static Type get instanceRuntimeType => EmbedElementImpl;

}
class EmbedElementImpl extends EmbedElement implements js_library.JSObjectInterfacesDom {
  EmbedElementImpl.internal_() : super.internal_();
  get runtimeType => EmbedElement;
  toString() => super.toString();
}
patch class Entry {
  static Type get instanceRuntimeType => EntryImpl;

}
class EntryImpl extends Entry implements js_library.JSObjectInterfacesDom {
  EntryImpl.internal_() : super.internal_();
  get runtimeType => Entry;
  toString() => super.toString();
}
patch class ErrorEvent {
  static Type get instanceRuntimeType => ErrorEventImpl;

}
class ErrorEventImpl extends ErrorEvent implements js_library.JSObjectInterfacesDom {
  ErrorEventImpl.internal_() : super.internal_();
  get runtimeType => ErrorEvent;
  toString() => super.toString();
}
patch class Event {
  static Type get instanceRuntimeType => EventImpl;

}
class EventImpl extends Event implements js_library.JSObjectInterfacesDom {
  EventImpl.internal_() : super.internal_();
  get runtimeType => Event;
  toString() => super.toString();
}
patch class EventSource {
  static Type get instanceRuntimeType => EventSourceImpl;

}
class EventSourceImpl extends EventSource implements js_library.JSObjectInterfacesDom {
  EventSourceImpl.internal_() : super.internal_();
  get runtimeType => EventSource;
  toString() => super.toString();
}
patch class EventTarget {
  static Type get instanceRuntimeType => EventTargetImpl;

}
class EventTargetImpl extends EventTarget implements js_library.JSObjectInterfacesDom {
  EventTargetImpl.internal_() : super.internal_();
  get runtimeType => EventTarget;
  toString() => super.toString();
}
patch class ExtendableEvent {
  static Type get instanceRuntimeType => ExtendableEventImpl;

}
class ExtendableEventImpl extends ExtendableEvent implements js_library.JSObjectInterfacesDom {
  ExtendableEventImpl.internal_() : super.internal_();
  get runtimeType => ExtendableEvent;
  toString() => super.toString();
}
patch class FederatedCredential {
  static Type get instanceRuntimeType => FederatedCredentialImpl;

}
class FederatedCredentialImpl extends FederatedCredential implements js_library.JSObjectInterfacesDom {
  FederatedCredentialImpl.internal_() : super.internal_();
  get runtimeType => FederatedCredential;
  toString() => super.toString();
}
patch class FetchEvent {
  static Type get instanceRuntimeType => FetchEventImpl;

}
class FetchEventImpl extends FetchEvent implements js_library.JSObjectInterfacesDom {
  FetchEventImpl.internal_() : super.internal_();
  get runtimeType => FetchEvent;
  toString() => super.toString();
}
patch class FieldSetElement {
  static Type get instanceRuntimeType => FieldSetElementImpl;

}
class FieldSetElementImpl extends FieldSetElement implements js_library.JSObjectInterfacesDom {
  FieldSetElementImpl.internal_() : super.internal_();
  get runtimeType => FieldSetElement;
  toString() => super.toString();
}
patch class File {
  static Type get instanceRuntimeType => FileImpl;

}
class FileImpl extends File implements js_library.JSObjectInterfacesDom {
  FileImpl.internal_() : super.internal_();
  get runtimeType => File;
  toString() => super.toString();
}
patch class FileEntry {
  static Type get instanceRuntimeType => FileEntryImpl;

}
class FileEntryImpl extends FileEntry implements js_library.JSObjectInterfacesDom {
  FileEntryImpl.internal_() : super.internal_();
  get runtimeType => FileEntry;
  toString() => super.toString();
}
patch class FileError {
  static Type get instanceRuntimeType => FileErrorImpl;

}
class FileErrorImpl extends FileError implements js_library.JSObjectInterfacesDom {
  FileErrorImpl.internal_() : super.internal_();
  get runtimeType => FileError;
  toString() => super.toString();
}
patch class FileList {
  static Type get instanceRuntimeType => FileListImpl;

}
class FileListImpl extends FileList implements js_library.JSObjectInterfacesDom {
  FileListImpl.internal_() : super.internal_();
  get runtimeType => FileList;
  toString() => super.toString();
}
patch class FileReader {
  static Type get instanceRuntimeType => FileReaderImpl;

}
class FileReaderImpl extends FileReader implements js_library.JSObjectInterfacesDom {
  FileReaderImpl.internal_() : super.internal_();
  get runtimeType => FileReader;
  toString() => super.toString();
}
patch class FileStream {
  static Type get instanceRuntimeType => FileStreamImpl;

}
class FileStreamImpl extends FileStream implements js_library.JSObjectInterfacesDom {
  FileStreamImpl.internal_() : super.internal_();
  get runtimeType => FileStream;
  toString() => super.toString();
}
patch class FileSystem {
  static Type get instanceRuntimeType => FileSystemImpl;

}
class FileSystemImpl extends FileSystem implements js_library.JSObjectInterfacesDom {
  FileSystemImpl.internal_() : super.internal_();
  get runtimeType => FileSystem;
  toString() => super.toString();
}
patch class FileWriter {
  static Type get instanceRuntimeType => FileWriterImpl;

}
class FileWriterImpl extends FileWriter implements js_library.JSObjectInterfacesDom {
  FileWriterImpl.internal_() : super.internal_();
  get runtimeType => FileWriter;
  toString() => super.toString();
}
patch class FocusEvent {
  static Type get instanceRuntimeType => FocusEventImpl;

}
class FocusEventImpl extends FocusEvent implements js_library.JSObjectInterfacesDom {
  FocusEventImpl.internal_() : super.internal_();
  get runtimeType => FocusEvent;
  toString() => super.toString();
}
patch class FontFace {
  static Type get instanceRuntimeType => FontFaceImpl;

}
class FontFaceImpl extends FontFace implements js_library.JSObjectInterfacesDom {
  FontFaceImpl.internal_() : super.internal_();
  get runtimeType => FontFace;
  toString() => super.toString();
}
patch class FontFaceSet {
  static Type get instanceRuntimeType => FontFaceSetImpl;

}
class FontFaceSetImpl extends FontFaceSet implements js_library.JSObjectInterfacesDom {
  FontFaceSetImpl.internal_() : super.internal_();
  get runtimeType => FontFaceSet;
  toString() => super.toString();
}
patch class FontFaceSetLoadEvent {
  static Type get instanceRuntimeType => FontFaceSetLoadEventImpl;

}
class FontFaceSetLoadEventImpl extends FontFaceSetLoadEvent implements js_library.JSObjectInterfacesDom {
  FontFaceSetLoadEventImpl.internal_() : super.internal_();
  get runtimeType => FontFaceSetLoadEvent;
  toString() => super.toString();
}
patch class FormData {
  static Type get instanceRuntimeType => FormDataImpl;

}
class FormDataImpl extends FormData implements js_library.JSObjectInterfacesDom {
  FormDataImpl.internal_() : super.internal_();
  get runtimeType => FormData;
  toString() => super.toString();
}
patch class FormElement {
  static Type get instanceRuntimeType => FormElementImpl;

}
class FormElementImpl extends FormElement implements js_library.JSObjectInterfacesDom {
  FormElementImpl.internal_() : super.internal_();
  get runtimeType => FormElement;
  toString() => super.toString();
}
patch class Gamepad {
  static Type get instanceRuntimeType => GamepadImpl;

}
class GamepadImpl extends Gamepad implements js_library.JSObjectInterfacesDom {
  GamepadImpl.internal_() : super.internal_();
  get runtimeType => Gamepad;
  toString() => super.toString();
}
patch class GamepadButton {
  static Type get instanceRuntimeType => GamepadButtonImpl;

}
class GamepadButtonImpl extends GamepadButton implements js_library.JSObjectInterfacesDom {
  GamepadButtonImpl.internal_() : super.internal_();
  get runtimeType => GamepadButton;
  toString() => super.toString();
}
patch class GamepadEvent {
  static Type get instanceRuntimeType => GamepadEventImpl;

}
class GamepadEventImpl extends GamepadEvent implements js_library.JSObjectInterfacesDom {
  GamepadEventImpl.internal_() : super.internal_();
  get runtimeType => GamepadEvent;
  toString() => super.toString();
}
patch class Geofencing {
  static Type get instanceRuntimeType => GeofencingImpl;

}
class GeofencingImpl extends Geofencing implements js_library.JSObjectInterfacesDom {
  GeofencingImpl.internal_() : super.internal_();
  get runtimeType => Geofencing;
  toString() => super.toString();
}
patch class GeofencingEvent {
  static Type get instanceRuntimeType => GeofencingEventImpl;

}
class GeofencingEventImpl extends GeofencingEvent implements js_library.JSObjectInterfacesDom {
  GeofencingEventImpl.internal_() : super.internal_();
  get runtimeType => GeofencingEvent;
  toString() => super.toString();
}
patch class GeofencingRegion {
  static Type get instanceRuntimeType => GeofencingRegionImpl;

}
class GeofencingRegionImpl extends GeofencingRegion implements js_library.JSObjectInterfacesDom {
  GeofencingRegionImpl.internal_() : super.internal_();
  get runtimeType => GeofencingRegion;
  toString() => super.toString();
}
patch class Geolocation {
  static Type get instanceRuntimeType => GeolocationImpl;

}
class GeolocationImpl extends Geolocation implements js_library.JSObjectInterfacesDom {
  GeolocationImpl.internal_() : super.internal_();
  get runtimeType => Geolocation;
  toString() => super.toString();
}
patch class Geoposition {
  static Type get instanceRuntimeType => GeopositionImpl;

}
class GeopositionImpl extends Geoposition implements js_library.JSObjectInterfacesDom {
  GeopositionImpl.internal_() : super.internal_();
  get runtimeType => Geoposition;
  toString() => super.toString();
}
patch class GlobalEventHandlers {
  static Type get instanceRuntimeType => GlobalEventHandlersImpl;

}
class GlobalEventHandlersImpl extends GlobalEventHandlers implements js_library.JSObjectInterfacesDom {
  GlobalEventHandlersImpl.internal_() : super.internal_();
  get runtimeType => GlobalEventHandlers;
  toString() => super.toString();
}
patch class HRElement {
  static Type get instanceRuntimeType => HRElementImpl;

}
class HRElementImpl extends HRElement implements js_library.JSObjectInterfacesDom {
  HRElementImpl.internal_() : super.internal_();
  get runtimeType => HRElement;
  toString() => super.toString();
}
patch class HashChangeEvent {
  static Type get instanceRuntimeType => HashChangeEventImpl;

}
class HashChangeEventImpl extends HashChangeEvent implements js_library.JSObjectInterfacesDom {
  HashChangeEventImpl.internal_() : super.internal_();
  get runtimeType => HashChangeEvent;
  toString() => super.toString();
}
patch class HeadElement {
  static Type get instanceRuntimeType => HeadElementImpl;

}
class HeadElementImpl extends HeadElement implements js_library.JSObjectInterfacesDom {
  HeadElementImpl.internal_() : super.internal_();
  get runtimeType => HeadElement;
  toString() => super.toString();
}
patch class Headers {
  static Type get instanceRuntimeType => HeadersImpl;

}
class HeadersImpl extends Headers implements js_library.JSObjectInterfacesDom {
  HeadersImpl.internal_() : super.internal_();
  get runtimeType => Headers;
  toString() => super.toString();
}
patch class HeadingElement {
  static Type get instanceRuntimeType => HeadingElementImpl;

}
class HeadingElementImpl extends HeadingElement implements js_library.JSObjectInterfacesDom {
  HeadingElementImpl.internal_() : super.internal_();
  get runtimeType => HeadingElement;
  toString() => super.toString();
}
patch class History {
  static Type get instanceRuntimeType => HistoryImpl;

}
class HistoryImpl extends History implements js_library.JSObjectInterfacesDom {
  HistoryImpl.internal_() : super.internal_();
  get runtimeType => History;
  toString() => super.toString();
}
patch class HmdvrDevice {
  static Type get instanceRuntimeType => HmdvrDeviceImpl;

}
class HmdvrDeviceImpl extends HmdvrDevice implements js_library.JSObjectInterfacesDom {
  HmdvrDeviceImpl.internal_() : super.internal_();
  get runtimeType => HmdvrDevice;
  toString() => super.toString();
}
patch class HtmlCollection {
  static Type get instanceRuntimeType => HtmlCollectionImpl;

}
class HtmlCollectionImpl extends HtmlCollection implements js_library.JSObjectInterfacesDom {
  HtmlCollectionImpl.internal_() : super.internal_();
  get runtimeType => HtmlCollection;
  toString() => super.toString();
}
patch class HtmlDocument {
  static Type get instanceRuntimeType => HtmlDocumentImpl;

}
class HtmlDocumentImpl extends HtmlDocument implements js_library.JSObjectInterfacesDom {
  HtmlDocumentImpl.internal_() : super.internal_();
  get runtimeType => HtmlDocument;
  toString() => super.toString();
}
patch class HtmlElement {
  static Type get instanceRuntimeType => HtmlElementImpl;

}
class HtmlElementImpl extends HtmlElement implements js_library.JSObjectInterfacesDom {
  HtmlElementImpl.internal_() : super.internal_();
  get runtimeType => HtmlElement;
  toString() => super.toString();
}
patch class HtmlFormControlsCollection {
  static Type get instanceRuntimeType => HtmlFormControlsCollectionImpl;

}
class HtmlFormControlsCollectionImpl extends HtmlFormControlsCollection implements js_library.JSObjectInterfacesDom {
  HtmlFormControlsCollectionImpl.internal_() : super.internal_();
  get runtimeType => HtmlFormControlsCollection;
  toString() => super.toString();
}
patch class HtmlHtmlElement {
  static Type get instanceRuntimeType => HtmlHtmlElementImpl;

}
class HtmlHtmlElementImpl extends HtmlHtmlElement implements js_library.JSObjectInterfacesDom {
  HtmlHtmlElementImpl.internal_() : super.internal_();
  get runtimeType => HtmlHtmlElement;
  toString() => super.toString();
}
patch class HtmlOptionsCollection {
  static Type get instanceRuntimeType => HtmlOptionsCollectionImpl;

}
class HtmlOptionsCollectionImpl extends HtmlOptionsCollection implements js_library.JSObjectInterfacesDom {
  HtmlOptionsCollectionImpl.internal_() : super.internal_();
  get runtimeType => HtmlOptionsCollection;
  toString() => super.toString();
}
patch class HttpRequest {
  static Type get instanceRuntimeType => HttpRequestImpl;

}
class HttpRequestImpl extends HttpRequest implements js_library.JSObjectInterfacesDom {
  HttpRequestImpl.internal_() : super.internal_();
  get runtimeType => HttpRequest;
  toString() => super.toString();
}
patch class HttpRequestEventTarget {
  static Type get instanceRuntimeType => HttpRequestEventTargetImpl;

}
class HttpRequestEventTargetImpl extends HttpRequestEventTarget implements js_library.JSObjectInterfacesDom {
  HttpRequestEventTargetImpl.internal_() : super.internal_();
  get runtimeType => HttpRequestEventTarget;
  toString() => super.toString();
}
patch class HttpRequestUpload {
  static Type get instanceRuntimeType => HttpRequestUploadImpl;

}
class HttpRequestUploadImpl extends HttpRequestUpload implements js_library.JSObjectInterfacesDom {
  HttpRequestUploadImpl.internal_() : super.internal_();
  get runtimeType => HttpRequestUpload;
  toString() => super.toString();
}
patch class IFrameElement {
  static Type get instanceRuntimeType => IFrameElementImpl;

}
class IFrameElementImpl extends IFrameElement implements js_library.JSObjectInterfacesDom {
  IFrameElementImpl.internal_() : super.internal_();
  get runtimeType => IFrameElement;
  toString() => super.toString();
}
patch class ImageBitmap {
  static Type get instanceRuntimeType => ImageBitmapImpl;

}
class ImageBitmapImpl extends ImageBitmap implements js_library.JSObjectInterfacesDom {
  ImageBitmapImpl.internal_() : super.internal_();
  get runtimeType => ImageBitmap;
  toString() => super.toString();
}
patch class ImageData {
  static Type get instanceRuntimeType => ImageDataImpl;

}
class ImageDataImpl extends ImageData implements js_library.JSObjectInterfacesDom {
  ImageDataImpl.internal_() : super.internal_();
  get runtimeType => ImageData;
  toString() => super.toString();
}
patch class ImageElement {
  static Type get instanceRuntimeType => ImageElementImpl;

}
class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
  ImageElementImpl.internal_() : super.internal_();
  get runtimeType => ImageElement;
  toString() => super.toString();
}
patch class InjectedScriptHost {
  static Type get instanceRuntimeType => InjectedScriptHostImpl;

}
class InjectedScriptHostImpl extends InjectedScriptHost implements js_library.JSObjectInterfacesDom {
  InjectedScriptHostImpl.internal_() : super.internal_();
  get runtimeType => InjectedScriptHost;
  toString() => super.toString();
}
patch class InputDevice {
  static Type get instanceRuntimeType => InputDeviceImpl;

}
class InputDeviceImpl extends InputDevice implements js_library.JSObjectInterfacesDom {
  InputDeviceImpl.internal_() : super.internal_();
  get runtimeType => InputDevice;
  toString() => super.toString();
}
patch class InputElement {
  static Type get instanceRuntimeType => InputElementImpl;

}
class InputElementImpl extends InputElement implements js_library.JSObjectInterfacesDom {
  InputElementImpl.internal_() : super.internal_();
  get runtimeType => InputElement;
  toString() => super.toString();
}
patch class KeyboardEvent {
  static Type get instanceRuntimeType => KeyboardEventImpl;

}
class KeyboardEventImpl extends KeyboardEvent implements js_library.JSObjectInterfacesDom {
  KeyboardEventImpl.internal_() : super.internal_();
  get runtimeType => KeyboardEvent;
  toString() => super.toString();
}
patch class KeyframeEffect {
  static Type get instanceRuntimeType => KeyframeEffectImpl;

}
class KeyframeEffectImpl extends KeyframeEffect implements js_library.JSObjectInterfacesDom {
  KeyframeEffectImpl.internal_() : super.internal_();
  get runtimeType => KeyframeEffect;
  toString() => super.toString();
}
patch class KeygenElement {
  static Type get instanceRuntimeType => KeygenElementImpl;

}
class KeygenElementImpl extends KeygenElement implements js_library.JSObjectInterfacesDom {
  KeygenElementImpl.internal_() : super.internal_();
  get runtimeType => KeygenElement;
  toString() => super.toString();
}
patch class LIElement {
  static Type get instanceRuntimeType => LIElementImpl;

}
class LIElementImpl extends LIElement implements js_library.JSObjectInterfacesDom {
  LIElementImpl.internal_() : super.internal_();
  get runtimeType => LIElement;
  toString() => super.toString();
}
patch class LabelElement {
  static Type get instanceRuntimeType => LabelElementImpl;

}
class LabelElementImpl extends LabelElement implements js_library.JSObjectInterfacesDom {
  LabelElementImpl.internal_() : super.internal_();
  get runtimeType => LabelElement;
  toString() => super.toString();
}
patch class LegendElement {
  static Type get instanceRuntimeType => LegendElementImpl;

}
class LegendElementImpl extends LegendElement implements js_library.JSObjectInterfacesDom {
  LegendElementImpl.internal_() : super.internal_();
  get runtimeType => LegendElement;
  toString() => super.toString();
}
patch class LinkElement {
  static Type get instanceRuntimeType => LinkElementImpl;

}
class LinkElementImpl extends LinkElement implements js_library.JSObjectInterfacesDom {
  LinkElementImpl.internal_() : super.internal_();
  get runtimeType => LinkElement;
  toString() => super.toString();
}
patch class Location {
  static Type get instanceRuntimeType => LocationImpl;

}
class LocationImpl extends Location implements js_library.JSObjectInterfacesDom {
  LocationImpl.internal_() : super.internal_();
  get runtimeType => Location;
  toString() => super.toString();
}
patch class MapElement {
  static Type get instanceRuntimeType => MapElementImpl;

}
class MapElementImpl extends MapElement implements js_library.JSObjectInterfacesDom {
  MapElementImpl.internal_() : super.internal_();
  get runtimeType => MapElement;
  toString() => super.toString();
}
patch class MediaController {
  static Type get instanceRuntimeType => MediaControllerImpl;

}
class MediaControllerImpl extends MediaController implements js_library.JSObjectInterfacesDom {
  MediaControllerImpl.internal_() : super.internal_();
  get runtimeType => MediaController;
  toString() => super.toString();
}
patch class MediaDeviceInfo {
  static Type get instanceRuntimeType => MediaDeviceInfoImpl;

}
class MediaDeviceInfoImpl extends MediaDeviceInfo implements js_library.JSObjectInterfacesDom {
  MediaDeviceInfoImpl.internal_() : super.internal_();
  get runtimeType => MediaDeviceInfo;
  toString() => super.toString();
}
patch class MediaDevices {
  static Type get instanceRuntimeType => MediaDevicesImpl;

}
class MediaDevicesImpl extends MediaDevices implements js_library.JSObjectInterfacesDom {
  MediaDevicesImpl.internal_() : super.internal_();
  get runtimeType => MediaDevices;
  toString() => super.toString();
}
patch class MediaElement {
  static Type get instanceRuntimeType => MediaElementImpl;

}
class MediaElementImpl extends MediaElement implements js_library.JSObjectInterfacesDom {
  MediaElementImpl.internal_() : super.internal_();
  get runtimeType => MediaElement;
  toString() => super.toString();
}
patch class MediaEncryptedEvent {
  static Type get instanceRuntimeType => MediaEncryptedEventImpl;

}
class MediaEncryptedEventImpl extends MediaEncryptedEvent implements js_library.JSObjectInterfacesDom {
  MediaEncryptedEventImpl.internal_() : super.internal_();
  get runtimeType => MediaEncryptedEvent;
  toString() => super.toString();
}
patch class MediaError {
  static Type get instanceRuntimeType => MediaErrorImpl;

}
class MediaErrorImpl extends MediaError implements js_library.JSObjectInterfacesDom {
  MediaErrorImpl.internal_() : super.internal_();
  get runtimeType => MediaError;
  toString() => super.toString();
}
patch class MediaKeyError {
  static Type get instanceRuntimeType => MediaKeyErrorImpl;

}
class MediaKeyErrorImpl extends MediaKeyError implements js_library.JSObjectInterfacesDom {
  MediaKeyErrorImpl.internal_() : super.internal_();
  get runtimeType => MediaKeyError;
  toString() => super.toString();
}
patch class MediaKeyEvent {
  static Type get instanceRuntimeType => MediaKeyEventImpl;

}
class MediaKeyEventImpl extends MediaKeyEvent implements js_library.JSObjectInterfacesDom {
  MediaKeyEventImpl.internal_() : super.internal_();
  get runtimeType => MediaKeyEvent;
  toString() => super.toString();
}
patch class MediaKeyMessageEvent {
  static Type get instanceRuntimeType => MediaKeyMessageEventImpl;

}
class MediaKeyMessageEventImpl extends MediaKeyMessageEvent implements js_library.JSObjectInterfacesDom {
  MediaKeyMessageEventImpl.internal_() : super.internal_();
  get runtimeType => MediaKeyMessageEvent;
  toString() => super.toString();
}
patch class MediaKeySession {
  static Type get instanceRuntimeType => MediaKeySessionImpl;

}
class MediaKeySessionImpl extends MediaKeySession implements js_library.JSObjectInterfacesDom {
  MediaKeySessionImpl.internal_() : super.internal_();
  get runtimeType => MediaKeySession;
  toString() => super.toString();
}
patch class MediaKeyStatusMap {
  static Type get instanceRuntimeType => MediaKeyStatusMapImpl;

}
class MediaKeyStatusMapImpl extends MediaKeyStatusMap implements js_library.JSObjectInterfacesDom {
  MediaKeyStatusMapImpl.internal_() : super.internal_();
  get runtimeType => MediaKeyStatusMap;
  toString() => super.toString();
}
patch class MediaKeySystemAccess {
  static Type get instanceRuntimeType => MediaKeySystemAccessImpl;

}
class MediaKeySystemAccessImpl extends MediaKeySystemAccess implements js_library.JSObjectInterfacesDom {
  MediaKeySystemAccessImpl.internal_() : super.internal_();
  get runtimeType => MediaKeySystemAccess;
  toString() => super.toString();
}
patch class MediaKeys {
  static Type get instanceRuntimeType => MediaKeysImpl;

}
class MediaKeysImpl extends MediaKeys implements js_library.JSObjectInterfacesDom {
  MediaKeysImpl.internal_() : super.internal_();
  get runtimeType => MediaKeys;
  toString() => super.toString();
}
patch class MediaList {
  static Type get instanceRuntimeType => MediaListImpl;

}
class MediaListImpl extends MediaList implements js_library.JSObjectInterfacesDom {
  MediaListImpl.internal_() : super.internal_();
  get runtimeType => MediaList;
  toString() => super.toString();
}
patch class MediaQueryList {
  static Type get instanceRuntimeType => MediaQueryListImpl;

}
class MediaQueryListImpl extends MediaQueryList implements js_library.JSObjectInterfacesDom {
  MediaQueryListImpl.internal_() : super.internal_();
  get runtimeType => MediaQueryList;
  toString() => super.toString();
}
patch class MediaQueryListEvent {
  static Type get instanceRuntimeType => MediaQueryListEventImpl;

}
class MediaQueryListEventImpl extends MediaQueryListEvent implements js_library.JSObjectInterfacesDom {
  MediaQueryListEventImpl.internal_() : super.internal_();
  get runtimeType => MediaQueryListEvent;
  toString() => super.toString();
}
patch class MediaSession {
  static Type get instanceRuntimeType => MediaSessionImpl;

}
class MediaSessionImpl extends MediaSession implements js_library.JSObjectInterfacesDom {
  MediaSessionImpl.internal_() : super.internal_();
  get runtimeType => MediaSession;
  toString() => super.toString();
}
patch class MediaSource {
  static Type get instanceRuntimeType => MediaSourceImpl;

}
class MediaSourceImpl extends MediaSource implements js_library.JSObjectInterfacesDom {
  MediaSourceImpl.internal_() : super.internal_();
  get runtimeType => MediaSource;
  toString() => super.toString();
}
patch class MediaStream {
  static Type get instanceRuntimeType => MediaStreamImpl;

}
class MediaStreamImpl extends MediaStream implements js_library.JSObjectInterfacesDom {
  MediaStreamImpl.internal_() : super.internal_();
  get runtimeType => MediaStream;
  toString() => super.toString();
}
patch class MediaStreamEvent {
  static Type get instanceRuntimeType => MediaStreamEventImpl;

}
class MediaStreamEventImpl extends MediaStreamEvent implements js_library.JSObjectInterfacesDom {
  MediaStreamEventImpl.internal_() : super.internal_();
  get runtimeType => MediaStreamEvent;
  toString() => super.toString();
}
patch class MediaStreamTrack {
  static Type get instanceRuntimeType => MediaStreamTrackImpl;

}
class MediaStreamTrackImpl extends MediaStreamTrack implements js_library.JSObjectInterfacesDom {
  MediaStreamTrackImpl.internal_() : super.internal_();
  get runtimeType => MediaStreamTrack;
  toString() => super.toString();
}
patch class MediaStreamTrackEvent {
  static Type get instanceRuntimeType => MediaStreamTrackEventImpl;

}
class MediaStreamTrackEventImpl extends MediaStreamTrackEvent implements js_library.JSObjectInterfacesDom {
  MediaStreamTrackEventImpl.internal_() : super.internal_();
  get runtimeType => MediaStreamTrackEvent;
  toString() => super.toString();
}
patch class MemoryInfo {
  static Type get instanceRuntimeType => MemoryInfoImpl;

}
class MemoryInfoImpl extends MemoryInfo implements js_library.JSObjectInterfacesDom {
  MemoryInfoImpl.internal_() : super.internal_();
  get runtimeType => MemoryInfo;
  toString() => super.toString();
}
patch class MenuElement {
  static Type get instanceRuntimeType => MenuElementImpl;

}
class MenuElementImpl extends MenuElement implements js_library.JSObjectInterfacesDom {
  MenuElementImpl.internal_() : super.internal_();
  get runtimeType => MenuElement;
  toString() => super.toString();
}
patch class MenuItemElement {
  static Type get instanceRuntimeType => MenuItemElementImpl;

}
class MenuItemElementImpl extends MenuItemElement implements js_library.JSObjectInterfacesDom {
  MenuItemElementImpl.internal_() : super.internal_();
  get runtimeType => MenuItemElement;
  toString() => super.toString();
}
patch class MessageChannel {
  static Type get instanceRuntimeType => MessageChannelImpl;

}
class MessageChannelImpl extends MessageChannel implements js_library.JSObjectInterfacesDom {
  MessageChannelImpl.internal_() : super.internal_();
  get runtimeType => MessageChannel;
  toString() => super.toString();
}
patch class MessageEvent {
  static Type get instanceRuntimeType => MessageEventImpl;

}
class MessageEventImpl extends MessageEvent implements js_library.JSObjectInterfacesDom {
  MessageEventImpl.internal_() : super.internal_();
  get runtimeType => MessageEvent;
  toString() => super.toString();
}
patch class MessagePort {
  static Type get instanceRuntimeType => MessagePortImpl;

}
class MessagePortImpl extends MessagePort implements js_library.JSObjectInterfacesDom {
  MessagePortImpl.internal_() : super.internal_();
  get runtimeType => MessagePort;
  toString() => super.toString();
}
patch class MetaElement {
  static Type get instanceRuntimeType => MetaElementImpl;

}
class MetaElementImpl extends MetaElement implements js_library.JSObjectInterfacesDom {
  MetaElementImpl.internal_() : super.internal_();
  get runtimeType => MetaElement;
  toString() => super.toString();
}
patch class Metadata {
  static Type get instanceRuntimeType => MetadataImpl;

}
class MetadataImpl extends Metadata implements js_library.JSObjectInterfacesDom {
  MetadataImpl.internal_() : super.internal_();
  get runtimeType => Metadata;
  toString() => super.toString();
}
patch class MeterElement {
  static Type get instanceRuntimeType => MeterElementImpl;

}
class MeterElementImpl extends MeterElement implements js_library.JSObjectInterfacesDom {
  MeterElementImpl.internal_() : super.internal_();
  get runtimeType => MeterElement;
  toString() => super.toString();
}
patch class MidiAccess {
  static Type get instanceRuntimeType => MidiAccessImpl;

}
class MidiAccessImpl extends MidiAccess implements js_library.JSObjectInterfacesDom {
  MidiAccessImpl.internal_() : super.internal_();
  get runtimeType => MidiAccess;
  toString() => super.toString();
}
patch class MidiConnectionEvent {
  static Type get instanceRuntimeType => MidiConnectionEventImpl;

}
class MidiConnectionEventImpl extends MidiConnectionEvent implements js_library.JSObjectInterfacesDom {
  MidiConnectionEventImpl.internal_() : super.internal_();
  get runtimeType => MidiConnectionEvent;
  toString() => super.toString();
}
patch class MidiInput {
  static Type get instanceRuntimeType => MidiInputImpl;

}
class MidiInputImpl extends MidiInput implements js_library.JSObjectInterfacesDom {
  MidiInputImpl.internal_() : super.internal_();
  get runtimeType => MidiInput;
  toString() => super.toString();
}
patch class MidiInputMap {
  static Type get instanceRuntimeType => MidiInputMapImpl;

}
class MidiInputMapImpl extends MidiInputMap implements js_library.JSObjectInterfacesDom {
  MidiInputMapImpl.internal_() : super.internal_();
  get runtimeType => MidiInputMap;
  toString() => super.toString();
}
patch class MidiMessageEvent {
  static Type get instanceRuntimeType => MidiMessageEventImpl;

}
class MidiMessageEventImpl extends MidiMessageEvent implements js_library.JSObjectInterfacesDom {
  MidiMessageEventImpl.internal_() : super.internal_();
  get runtimeType => MidiMessageEvent;
  toString() => super.toString();
}
patch class MidiOutput {
  static Type get instanceRuntimeType => MidiOutputImpl;

}
class MidiOutputImpl extends MidiOutput implements js_library.JSObjectInterfacesDom {
  MidiOutputImpl.internal_() : super.internal_();
  get runtimeType => MidiOutput;
  toString() => super.toString();
}
patch class MidiOutputMap {
  static Type get instanceRuntimeType => MidiOutputMapImpl;

}
class MidiOutputMapImpl extends MidiOutputMap implements js_library.JSObjectInterfacesDom {
  MidiOutputMapImpl.internal_() : super.internal_();
  get runtimeType => MidiOutputMap;
  toString() => super.toString();
}
patch class MidiPort {
  static Type get instanceRuntimeType => MidiPortImpl;

}
class MidiPortImpl extends MidiPort implements js_library.JSObjectInterfacesDom {
  MidiPortImpl.internal_() : super.internal_();
  get runtimeType => MidiPort;
  toString() => super.toString();
}
patch class MimeType {
  static Type get instanceRuntimeType => MimeTypeImpl;

}
class MimeTypeImpl extends MimeType implements js_library.JSObjectInterfacesDom {
  MimeTypeImpl.internal_() : super.internal_();
  get runtimeType => MimeType;
  toString() => super.toString();
}
patch class MimeTypeArray {
  static Type get instanceRuntimeType => MimeTypeArrayImpl;

}
class MimeTypeArrayImpl extends MimeTypeArray implements js_library.JSObjectInterfacesDom {
  MimeTypeArrayImpl.internal_() : super.internal_();
  get runtimeType => MimeTypeArray;
  toString() => super.toString();
}
patch class ModElement {
  static Type get instanceRuntimeType => ModElementImpl;

}
class ModElementImpl extends ModElement implements js_library.JSObjectInterfacesDom {
  ModElementImpl.internal_() : super.internal_();
  get runtimeType => ModElement;
  toString() => super.toString();
}
patch class MouseEvent {
  static Type get instanceRuntimeType => MouseEventImpl;

}
class MouseEventImpl extends MouseEvent implements js_library.JSObjectInterfacesDom {
  MouseEventImpl.internal_() : super.internal_();
  get runtimeType => MouseEvent;
  toString() => super.toString();
}
patch class MutationObserver {
  static Type get instanceRuntimeType => MutationObserverImpl;

}
class MutationObserverImpl extends MutationObserver implements js_library.JSObjectInterfacesDom {
  MutationObserverImpl.internal_() : super.internal_();
  get runtimeType => MutationObserver;
  toString() => super.toString();
}
patch class MutationRecord {
  static Type get instanceRuntimeType => MutationRecordImpl;

}
class MutationRecordImpl extends MutationRecord implements js_library.JSObjectInterfacesDom {
  MutationRecordImpl.internal_() : super.internal_();
  get runtimeType => MutationRecord;
  toString() => super.toString();
}
patch class Navigator {
  static Type get instanceRuntimeType => NavigatorImpl;

}
class NavigatorImpl extends Navigator implements js_library.JSObjectInterfacesDom {
  NavigatorImpl.internal_() : super.internal_();
  get runtimeType => Navigator;
  toString() => super.toString();
}
patch class NavigatorCpu {
  static Type get instanceRuntimeType => NavigatorCpuImpl;

}
class NavigatorCpuImpl extends NavigatorCpu implements js_library.JSObjectInterfacesDom {
  NavigatorCpuImpl.internal_() : super.internal_();
  get runtimeType => NavigatorCpu;
  toString() => super.toString();
}
patch class NavigatorID {
  static Type get instanceRuntimeType => NavigatorIDImpl;

}
class NavigatorIDImpl extends NavigatorID implements js_library.JSObjectInterfacesDom {
  NavigatorIDImpl.internal_() : super.internal_();
  get runtimeType => NavigatorID;
  toString() => super.toString();
}
patch class NavigatorLanguage {
  static Type get instanceRuntimeType => NavigatorLanguageImpl;

}
class NavigatorLanguageImpl extends NavigatorLanguage implements js_library.JSObjectInterfacesDom {
  NavigatorLanguageImpl.internal_() : super.internal_();
  get runtimeType => NavigatorLanguage;
  toString() => super.toString();
}
patch class NavigatorOnLine {
  static Type get instanceRuntimeType => NavigatorOnLineImpl;

}
class NavigatorOnLineImpl extends NavigatorOnLine implements js_library.JSObjectInterfacesDom {
  NavigatorOnLineImpl.internal_() : super.internal_();
  get runtimeType => NavigatorOnLine;
  toString() => super.toString();
}
patch class NavigatorStorageUtils {
  static Type get instanceRuntimeType => NavigatorStorageUtilsImpl;

}
class NavigatorStorageUtilsImpl extends NavigatorStorageUtils implements js_library.JSObjectInterfacesDom {
  NavigatorStorageUtilsImpl.internal_() : super.internal_();
  get runtimeType => NavigatorStorageUtils;
  toString() => super.toString();
}
patch class NavigatorUserMediaError {
  static Type get instanceRuntimeType => NavigatorUserMediaErrorImpl;

}
class NavigatorUserMediaErrorImpl extends NavigatorUserMediaError implements js_library.JSObjectInterfacesDom {
  NavigatorUserMediaErrorImpl.internal_() : super.internal_();
  get runtimeType => NavigatorUserMediaError;
  toString() => super.toString();
}
patch class NetworkInformation {
  static Type get instanceRuntimeType => NetworkInformationImpl;

}
class NetworkInformationImpl extends NetworkInformation implements js_library.JSObjectInterfacesDom {
  NetworkInformationImpl.internal_() : super.internal_();
  get runtimeType => NetworkInformation;
  toString() => super.toString();
}
patch class Node {
  static Type get instanceRuntimeType => NodeImpl;

}
class NodeImpl extends Node implements js_library.JSObjectInterfacesDom {
  NodeImpl.internal_() : super.internal_();
  get runtimeType => Node;
  toString() => super.toString();
}
patch class NodeFilter {
  static Type get instanceRuntimeType => NodeFilterImpl;

}
class NodeFilterImpl extends NodeFilter implements js_library.JSObjectInterfacesDom {
  NodeFilterImpl.internal_() : super.internal_();
  get runtimeType => NodeFilter;
  toString() => super.toString();
}
patch class NodeIterator {
  static Type get instanceRuntimeType => NodeIteratorImpl;

}
class NodeIteratorImpl extends NodeIterator implements js_library.JSObjectInterfacesDom {
  NodeIteratorImpl.internal_() : super.internal_();
  get runtimeType => NodeIterator;
  toString() => super.toString();
}
patch class NodeList {
  static Type get instanceRuntimeType => NodeListImpl;

}
class NodeListImpl extends NodeList implements js_library.JSObjectInterfacesDom {
  NodeListImpl.internal_() : super.internal_();
  get runtimeType => NodeList;
  toString() => super.toString();
}
patch class NonDocumentTypeChildNode {
  static Type get instanceRuntimeType => NonDocumentTypeChildNodeImpl;

}
class NonDocumentTypeChildNodeImpl extends NonDocumentTypeChildNode implements js_library.JSObjectInterfacesDom {
  NonDocumentTypeChildNodeImpl.internal_() : super.internal_();
  get runtimeType => NonDocumentTypeChildNode;
  toString() => super.toString();
}
patch class NonElementParentNode {
  static Type get instanceRuntimeType => NonElementParentNodeImpl;

}
class NonElementParentNodeImpl extends NonElementParentNode implements js_library.JSObjectInterfacesDom {
  NonElementParentNodeImpl.internal_() : super.internal_();
  get runtimeType => NonElementParentNode;
  toString() => super.toString();
}
patch class Notification {
  static Type get instanceRuntimeType => NotificationImpl;

}
class NotificationImpl extends Notification implements js_library.JSObjectInterfacesDom {
  NotificationImpl.internal_() : super.internal_();
  get runtimeType => Notification;
  toString() => super.toString();
}
patch class NotificationEvent {
  static Type get instanceRuntimeType => NotificationEventImpl;

}
class NotificationEventImpl extends NotificationEvent implements js_library.JSObjectInterfacesDom {
  NotificationEventImpl.internal_() : super.internal_();
  get runtimeType => NotificationEvent;
  toString() => super.toString();
}
patch class OListElement {
  static Type get instanceRuntimeType => OListElementImpl;

}
class OListElementImpl extends OListElement implements js_library.JSObjectInterfacesDom {
  OListElementImpl.internal_() : super.internal_();
  get runtimeType => OListElement;
  toString() => super.toString();
}
patch class ObjectElement {
  static Type get instanceRuntimeType => ObjectElementImpl;

}
class ObjectElementImpl extends ObjectElement implements js_library.JSObjectInterfacesDom {
  ObjectElementImpl.internal_() : super.internal_();
  get runtimeType => ObjectElement;
  toString() => super.toString();
}
patch class OptGroupElement {
  static Type get instanceRuntimeType => OptGroupElementImpl;

}
class OptGroupElementImpl extends OptGroupElement implements js_library.JSObjectInterfacesDom {
  OptGroupElementImpl.internal_() : super.internal_();
  get runtimeType => OptGroupElement;
  toString() => super.toString();
}
patch class OptionElement {
  static Type get instanceRuntimeType => OptionElementImpl;

}
class OptionElementImpl extends OptionElement implements js_library.JSObjectInterfacesDom {
  OptionElementImpl.internal_() : super.internal_();
  get runtimeType => OptionElement;
  toString() => super.toString();
}
patch class OutputElement {
  static Type get instanceRuntimeType => OutputElementImpl;

}
class OutputElementImpl extends OutputElement implements js_library.JSObjectInterfacesDom {
  OutputElementImpl.internal_() : super.internal_();
  get runtimeType => OutputElement;
  toString() => super.toString();
}
patch class PageTransitionEvent {
  static Type get instanceRuntimeType => PageTransitionEventImpl;

}
class PageTransitionEventImpl extends PageTransitionEvent implements js_library.JSObjectInterfacesDom {
  PageTransitionEventImpl.internal_() : super.internal_();
  get runtimeType => PageTransitionEvent;
  toString() => super.toString();
}
patch class ParagraphElement {
  static Type get instanceRuntimeType => ParagraphElementImpl;

}
class ParagraphElementImpl extends ParagraphElement implements js_library.JSObjectInterfacesDom {
  ParagraphElementImpl.internal_() : super.internal_();
  get runtimeType => ParagraphElement;
  toString() => super.toString();
}
patch class ParamElement {
  static Type get instanceRuntimeType => ParamElementImpl;

}
class ParamElementImpl extends ParamElement implements js_library.JSObjectInterfacesDom {
  ParamElementImpl.internal_() : super.internal_();
  get runtimeType => ParamElement;
  toString() => super.toString();
}
patch class ParentNode {
  static Type get instanceRuntimeType => ParentNodeImpl;

}
class ParentNodeImpl extends ParentNode implements js_library.JSObjectInterfacesDom {
  ParentNodeImpl.internal_() : super.internal_();
  get runtimeType => ParentNode;
  toString() => super.toString();
}
patch class PasswordCredential {
  static Type get instanceRuntimeType => PasswordCredentialImpl;

}
class PasswordCredentialImpl extends PasswordCredential implements js_library.JSObjectInterfacesDom {
  PasswordCredentialImpl.internal_() : super.internal_();
  get runtimeType => PasswordCredential;
  toString() => super.toString();
}
patch class Path2D {
  static Type get instanceRuntimeType => Path2DImpl;

}
class Path2DImpl extends Path2D implements js_library.JSObjectInterfacesDom {
  Path2DImpl.internal_() : super.internal_();
  get runtimeType => Path2D;
  toString() => super.toString();
}
patch class Performance {
  static Type get instanceRuntimeType => PerformanceImpl;

}
class PerformanceImpl extends Performance implements js_library.JSObjectInterfacesDom {
  PerformanceImpl.internal_() : super.internal_();
  get runtimeType => Performance;
  toString() => super.toString();
}
patch class PerformanceCompositeTiming {
  static Type get instanceRuntimeType => PerformanceCompositeTimingImpl;

}
class PerformanceCompositeTimingImpl extends PerformanceCompositeTiming implements js_library.JSObjectInterfacesDom {
  PerformanceCompositeTimingImpl.internal_() : super.internal_();
  get runtimeType => PerformanceCompositeTiming;
  toString() => super.toString();
}
patch class PerformanceEntry {
  static Type get instanceRuntimeType => PerformanceEntryImpl;

}
class PerformanceEntryImpl extends PerformanceEntry implements js_library.JSObjectInterfacesDom {
  PerformanceEntryImpl.internal_() : super.internal_();
  get runtimeType => PerformanceEntry;
  toString() => super.toString();
}
patch class PerformanceMark {
  static Type get instanceRuntimeType => PerformanceMarkImpl;

}
class PerformanceMarkImpl extends PerformanceMark implements js_library.JSObjectInterfacesDom {
  PerformanceMarkImpl.internal_() : super.internal_();
  get runtimeType => PerformanceMark;
  toString() => super.toString();
}
patch class PerformanceMeasure {
  static Type get instanceRuntimeType => PerformanceMeasureImpl;

}
class PerformanceMeasureImpl extends PerformanceMeasure implements js_library.JSObjectInterfacesDom {
  PerformanceMeasureImpl.internal_() : super.internal_();
  get runtimeType => PerformanceMeasure;
  toString() => super.toString();
}
patch class PerformanceNavigation {
  static Type get instanceRuntimeType => PerformanceNavigationImpl;

}
class PerformanceNavigationImpl extends PerformanceNavigation implements js_library.JSObjectInterfacesDom {
  PerformanceNavigationImpl.internal_() : super.internal_();
  get runtimeType => PerformanceNavigation;
  toString() => super.toString();
}
patch class PerformanceRenderTiming {
  static Type get instanceRuntimeType => PerformanceRenderTimingImpl;

}
class PerformanceRenderTimingImpl extends PerformanceRenderTiming implements js_library.JSObjectInterfacesDom {
  PerformanceRenderTimingImpl.internal_() : super.internal_();
  get runtimeType => PerformanceRenderTiming;
  toString() => super.toString();
}
patch class PerformanceResourceTiming {
  static Type get instanceRuntimeType => PerformanceResourceTimingImpl;

}
class PerformanceResourceTimingImpl extends PerformanceResourceTiming implements js_library.JSObjectInterfacesDom {
  PerformanceResourceTimingImpl.internal_() : super.internal_();
  get runtimeType => PerformanceResourceTiming;
  toString() => super.toString();
}
patch class PerformanceTiming {
  static Type get instanceRuntimeType => PerformanceTimingImpl;

}
class PerformanceTimingImpl extends PerformanceTiming implements js_library.JSObjectInterfacesDom {
  PerformanceTimingImpl.internal_() : super.internal_();
  get runtimeType => PerformanceTiming;
  toString() => super.toString();
}
patch class PeriodicSyncEvent {
  static Type get instanceRuntimeType => PeriodicSyncEventImpl;

}
class PeriodicSyncEventImpl extends PeriodicSyncEvent implements js_library.JSObjectInterfacesDom {
  PeriodicSyncEventImpl.internal_() : super.internal_();
  get runtimeType => PeriodicSyncEvent;
  toString() => super.toString();
}
patch class PeriodicSyncManager {
  static Type get instanceRuntimeType => PeriodicSyncManagerImpl;

}
class PeriodicSyncManagerImpl extends PeriodicSyncManager implements js_library.JSObjectInterfacesDom {
  PeriodicSyncManagerImpl.internal_() : super.internal_();
  get runtimeType => PeriodicSyncManager;
  toString() => super.toString();
}
patch class PeriodicSyncRegistration {
  static Type get instanceRuntimeType => PeriodicSyncRegistrationImpl;

}
class PeriodicSyncRegistrationImpl extends PeriodicSyncRegistration implements js_library.JSObjectInterfacesDom {
  PeriodicSyncRegistrationImpl.internal_() : super.internal_();
  get runtimeType => PeriodicSyncRegistration;
  toString() => super.toString();
}
patch class PermissionStatus {
  static Type get instanceRuntimeType => PermissionStatusImpl;

}
class PermissionStatusImpl extends PermissionStatus implements js_library.JSObjectInterfacesDom {
  PermissionStatusImpl.internal_() : super.internal_();
  get runtimeType => PermissionStatus;
  toString() => super.toString();
}
patch class Permissions {
  static Type get instanceRuntimeType => PermissionsImpl;

}
class PermissionsImpl extends Permissions implements js_library.JSObjectInterfacesDom {
  PermissionsImpl.internal_() : super.internal_();
  get runtimeType => Permissions;
  toString() => super.toString();
}
patch class PictureElement {
  static Type get instanceRuntimeType => PictureElementImpl;

}
class PictureElementImpl extends PictureElement implements js_library.JSObjectInterfacesDom {
  PictureElementImpl.internal_() : super.internal_();
  get runtimeType => PictureElement;
  toString() => super.toString();
}
patch class Plugin {
  static Type get instanceRuntimeType => PluginImpl;

}
class PluginImpl extends Plugin implements js_library.JSObjectInterfacesDom {
  PluginImpl.internal_() : super.internal_();
  get runtimeType => Plugin;
  toString() => super.toString();
}
patch class PluginArray {
  static Type get instanceRuntimeType => PluginArrayImpl;

}
class PluginArrayImpl extends PluginArray implements js_library.JSObjectInterfacesDom {
  PluginArrayImpl.internal_() : super.internal_();
  get runtimeType => PluginArray;
  toString() => super.toString();
}
patch class PluginPlaceholderElement {
  static Type get instanceRuntimeType => PluginPlaceholderElementImpl;

}
class PluginPlaceholderElementImpl extends PluginPlaceholderElement implements js_library.JSObjectInterfacesDom {
  PluginPlaceholderElementImpl.internal_() : super.internal_();
  get runtimeType => PluginPlaceholderElement;
  toString() => super.toString();
}
patch class PointerEvent {
  static Type get instanceRuntimeType => PointerEventImpl;

}
class PointerEventImpl extends PointerEvent implements js_library.JSObjectInterfacesDom {
  PointerEventImpl.internal_() : super.internal_();
  get runtimeType => PointerEvent;
  toString() => super.toString();
}
patch class PopStateEvent {
  static Type get instanceRuntimeType => PopStateEventImpl;

}
class PopStateEventImpl extends PopStateEvent implements js_library.JSObjectInterfacesDom {
  PopStateEventImpl.internal_() : super.internal_();
  get runtimeType => PopStateEvent;
  toString() => super.toString();
}
patch class PositionError {
  static Type get instanceRuntimeType => PositionErrorImpl;

}
class PositionErrorImpl extends PositionError implements js_library.JSObjectInterfacesDom {
  PositionErrorImpl.internal_() : super.internal_();
  get runtimeType => PositionError;
  toString() => super.toString();
}
patch class PositionSensorVRDevice {
  static Type get instanceRuntimeType => PositionSensorVRDeviceImpl;

}
class PositionSensorVRDeviceImpl extends PositionSensorVRDevice implements js_library.JSObjectInterfacesDom {
  PositionSensorVRDeviceImpl.internal_() : super.internal_();
  get runtimeType => PositionSensorVRDevice;
  toString() => super.toString();
}
patch class PreElement {
  static Type get instanceRuntimeType => PreElementImpl;

}
class PreElementImpl extends PreElement implements js_library.JSObjectInterfacesDom {
  PreElementImpl.internal_() : super.internal_();
  get runtimeType => PreElement;
  toString() => super.toString();
}
patch class Presentation {
  static Type get instanceRuntimeType => PresentationImpl;

}
class PresentationImpl extends Presentation implements js_library.JSObjectInterfacesDom {
  PresentationImpl.internal_() : super.internal_();
  get runtimeType => Presentation;
  toString() => super.toString();
}
patch class PresentationAvailability {
  static Type get instanceRuntimeType => PresentationAvailabilityImpl;

}
class PresentationAvailabilityImpl extends PresentationAvailability implements js_library.JSObjectInterfacesDom {
  PresentationAvailabilityImpl.internal_() : super.internal_();
  get runtimeType => PresentationAvailability;
  toString() => super.toString();
}
patch class PresentationSession {
  static Type get instanceRuntimeType => PresentationSessionImpl;

}
class PresentationSessionImpl extends PresentationSession implements js_library.JSObjectInterfacesDom {
  PresentationSessionImpl.internal_() : super.internal_();
  get runtimeType => PresentationSession;
  toString() => super.toString();
}
patch class ProcessingInstruction {
  static Type get instanceRuntimeType => ProcessingInstructionImpl;

}
class ProcessingInstructionImpl extends ProcessingInstruction implements js_library.JSObjectInterfacesDom {
  ProcessingInstructionImpl.internal_() : super.internal_();
  get runtimeType => ProcessingInstruction;
  toString() => super.toString();
}
patch class ProgressElement {
  static Type get instanceRuntimeType => ProgressElementImpl;

}
class ProgressElementImpl extends ProgressElement implements js_library.JSObjectInterfacesDom {
  ProgressElementImpl.internal_() : super.internal_();
  get runtimeType => ProgressElement;
  toString() => super.toString();
}
patch class ProgressEvent {
  static Type get instanceRuntimeType => ProgressEventImpl;

}
class ProgressEventImpl extends ProgressEvent implements js_library.JSObjectInterfacesDom {
  ProgressEventImpl.internal_() : super.internal_();
  get runtimeType => ProgressEvent;
  toString() => super.toString();
}
patch class PromiseRejectionEvent {
  static Type get instanceRuntimeType => PromiseRejectionEventImpl;

}
class PromiseRejectionEventImpl extends PromiseRejectionEvent implements js_library.JSObjectInterfacesDom {
  PromiseRejectionEventImpl.internal_() : super.internal_();
  get runtimeType => PromiseRejectionEvent;
  toString() => super.toString();
}
patch class PushEvent {
  static Type get instanceRuntimeType => PushEventImpl;

}
class PushEventImpl extends PushEvent implements js_library.JSObjectInterfacesDom {
  PushEventImpl.internal_() : super.internal_();
  get runtimeType => PushEvent;
  toString() => super.toString();
}
patch class PushManager {
  static Type get instanceRuntimeType => PushManagerImpl;

}
class PushManagerImpl extends PushManager implements js_library.JSObjectInterfacesDom {
  PushManagerImpl.internal_() : super.internal_();
  get runtimeType => PushManager;
  toString() => super.toString();
}
patch class PushMessageData {
  static Type get instanceRuntimeType => PushMessageDataImpl;

}
class PushMessageDataImpl extends PushMessageData implements js_library.JSObjectInterfacesDom {
  PushMessageDataImpl.internal_() : super.internal_();
  get runtimeType => PushMessageData;
  toString() => super.toString();
}
patch class PushSubscription {
  static Type get instanceRuntimeType => PushSubscriptionImpl;

}
class PushSubscriptionImpl extends PushSubscription implements js_library.JSObjectInterfacesDom {
  PushSubscriptionImpl.internal_() : super.internal_();
  get runtimeType => PushSubscription;
  toString() => super.toString();
}
patch class QuoteElement {
  static Type get instanceRuntimeType => QuoteElementImpl;

}
class QuoteElementImpl extends QuoteElement implements js_library.JSObjectInterfacesDom {
  QuoteElementImpl.internal_() : super.internal_();
  get runtimeType => QuoteElement;
  toString() => super.toString();
}
patch class Range {
  static Type get instanceRuntimeType => RangeImpl;

}
class RangeImpl extends Range implements js_library.JSObjectInterfacesDom {
  RangeImpl.internal_() : super.internal_();
  get runtimeType => Range;
  toString() => super.toString();
}
patch class ReadableByteStream {
  static Type get instanceRuntimeType => ReadableByteStreamImpl;

}
class ReadableByteStreamImpl extends ReadableByteStream implements js_library.JSObjectInterfacesDom {
  ReadableByteStreamImpl.internal_() : super.internal_();
  get runtimeType => ReadableByteStream;
  toString() => super.toString();
}
patch class ReadableByteStreamReader {
  static Type get instanceRuntimeType => ReadableByteStreamReaderImpl;

}
class ReadableByteStreamReaderImpl extends ReadableByteStreamReader implements js_library.JSObjectInterfacesDom {
  ReadableByteStreamReaderImpl.internal_() : super.internal_();
  get runtimeType => ReadableByteStreamReader;
  toString() => super.toString();
}
patch class ReadableStream {
  static Type get instanceRuntimeType => ReadableStreamImpl;

}
class ReadableStreamImpl extends ReadableStream implements js_library.JSObjectInterfacesDom {
  ReadableStreamImpl.internal_() : super.internal_();
  get runtimeType => ReadableStream;
  toString() => super.toString();
}
patch class ReadableStreamReader {
  static Type get instanceRuntimeType => ReadableStreamReaderImpl;

}
class ReadableStreamReaderImpl extends ReadableStreamReader implements js_library.JSObjectInterfacesDom {
  ReadableStreamReaderImpl.internal_() : super.internal_();
  get runtimeType => ReadableStreamReader;
  toString() => super.toString();
}
patch class RelatedEvent {
  static Type get instanceRuntimeType => RelatedEventImpl;

}
class RelatedEventImpl extends RelatedEvent implements js_library.JSObjectInterfacesDom {
  RelatedEventImpl.internal_() : super.internal_();
  get runtimeType => RelatedEvent;
  toString() => super.toString();
}
patch class ResourceProgressEvent {
  static Type get instanceRuntimeType => ResourceProgressEventImpl;

}
class ResourceProgressEventImpl extends ResourceProgressEvent implements js_library.JSObjectInterfacesDom {
  ResourceProgressEventImpl.internal_() : super.internal_();
  get runtimeType => ResourceProgressEvent;
  toString() => super.toString();
}
patch class RtcDataChannel {
  static Type get instanceRuntimeType => RtcDataChannelImpl;

}
class RtcDataChannelImpl extends RtcDataChannel implements js_library.JSObjectInterfacesDom {
  RtcDataChannelImpl.internal_() : super.internal_();
  get runtimeType => RtcDataChannel;
  toString() => super.toString();
}
patch class RtcDataChannelEvent {
  static Type get instanceRuntimeType => RtcDataChannelEventImpl;

}
class RtcDataChannelEventImpl extends RtcDataChannelEvent implements js_library.JSObjectInterfacesDom {
  RtcDataChannelEventImpl.internal_() : super.internal_();
  get runtimeType => RtcDataChannelEvent;
  toString() => super.toString();
}
patch class RtcDtmfSender {
  static Type get instanceRuntimeType => RtcDtmfSenderImpl;

}
class RtcDtmfSenderImpl extends RtcDtmfSender implements js_library.JSObjectInterfacesDom {
  RtcDtmfSenderImpl.internal_() : super.internal_();
  get runtimeType => RtcDtmfSender;
  toString() => super.toString();
}
patch class RtcDtmfToneChangeEvent {
  static Type get instanceRuntimeType => RtcDtmfToneChangeEventImpl;

}
class RtcDtmfToneChangeEventImpl extends RtcDtmfToneChangeEvent implements js_library.JSObjectInterfacesDom {
  RtcDtmfToneChangeEventImpl.internal_() : super.internal_();
  get runtimeType => RtcDtmfToneChangeEvent;
  toString() => super.toString();
}
patch class RtcIceCandidate {
  static Type get instanceRuntimeType => RtcIceCandidateImpl;

}
class RtcIceCandidateImpl extends RtcIceCandidate implements js_library.JSObjectInterfacesDom {
  RtcIceCandidateImpl.internal_() : super.internal_();
  get runtimeType => RtcIceCandidate;
  toString() => super.toString();
}
patch class RtcIceCandidateEvent {
  static Type get instanceRuntimeType => RtcIceCandidateEventImpl;

}
class RtcIceCandidateEventImpl extends RtcIceCandidateEvent implements js_library.JSObjectInterfacesDom {
  RtcIceCandidateEventImpl.internal_() : super.internal_();
  get runtimeType => RtcIceCandidateEvent;
  toString() => super.toString();
}
patch class RtcPeerConnection {
  static Type get instanceRuntimeType => RtcPeerConnectionImpl;

}
class RtcPeerConnectionImpl extends RtcPeerConnection implements js_library.JSObjectInterfacesDom {
  RtcPeerConnectionImpl.internal_() : super.internal_();
  get runtimeType => RtcPeerConnection;
  toString() => super.toString();
}
patch class RtcSessionDescription {
  static Type get instanceRuntimeType => RtcSessionDescriptionImpl;

}
class RtcSessionDescriptionImpl extends RtcSessionDescription implements js_library.JSObjectInterfacesDom {
  RtcSessionDescriptionImpl.internal_() : super.internal_();
  get runtimeType => RtcSessionDescription;
  toString() => super.toString();
}
patch class RtcStatsReport {
  static Type get instanceRuntimeType => RtcStatsReportImpl;

}
class RtcStatsReportImpl extends RtcStatsReport implements js_library.JSObjectInterfacesDom {
  RtcStatsReportImpl.internal_() : super.internal_();
  get runtimeType => RtcStatsReport;
  toString() => super.toString();
}
patch class RtcStatsResponse {
  static Type get instanceRuntimeType => RtcStatsResponseImpl;

}
class RtcStatsResponseImpl extends RtcStatsResponse implements js_library.JSObjectInterfacesDom {
  RtcStatsResponseImpl.internal_() : super.internal_();
  get runtimeType => RtcStatsResponse;
  toString() => super.toString();
}
patch class Screen {
  static Type get instanceRuntimeType => ScreenImpl;

}
class ScreenImpl extends Screen implements js_library.JSObjectInterfacesDom {
  ScreenImpl.internal_() : super.internal_();
  get runtimeType => Screen;
  toString() => super.toString();
}
patch class ScreenOrientation {
  static Type get instanceRuntimeType => ScreenOrientationImpl;

}
class ScreenOrientationImpl extends ScreenOrientation implements js_library.JSObjectInterfacesDom {
  ScreenOrientationImpl.internal_() : super.internal_();
  get runtimeType => ScreenOrientation;
  toString() => super.toString();
}
patch class ScriptElement {
  static Type get instanceRuntimeType => ScriptElementImpl;

}
class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
  ScriptElementImpl.internal_() : super.internal_();
  get runtimeType => ScriptElement;
  toString() => super.toString();
}
patch class ScrollState {
  static Type get instanceRuntimeType => ScrollStateImpl;

}
class ScrollStateImpl extends ScrollState implements js_library.JSObjectInterfacesDom {
  ScrollStateImpl.internal_() : super.internal_();
  get runtimeType => ScrollState;
  toString() => super.toString();
}
patch class SecurityPolicyViolationEvent {
  static Type get instanceRuntimeType => SecurityPolicyViolationEventImpl;

}
class SecurityPolicyViolationEventImpl extends SecurityPolicyViolationEvent implements js_library.JSObjectInterfacesDom {
  SecurityPolicyViolationEventImpl.internal_() : super.internal_();
  get runtimeType => SecurityPolicyViolationEvent;
  toString() => super.toString();
}
patch class SelectElement {
  static Type get instanceRuntimeType => SelectElementImpl;

}
class SelectElementImpl extends SelectElement implements js_library.JSObjectInterfacesDom {
  SelectElementImpl.internal_() : super.internal_();
  get runtimeType => SelectElement;
  toString() => super.toString();
}
patch class Selection {
  static Type get instanceRuntimeType => SelectionImpl;

}
class SelectionImpl extends Selection implements js_library.JSObjectInterfacesDom {
  SelectionImpl.internal_() : super.internal_();
  get runtimeType => Selection;
  toString() => super.toString();
}
patch class ServicePort {
  static Type get instanceRuntimeType => ServicePortImpl;

}
class ServicePortImpl extends ServicePort implements js_library.JSObjectInterfacesDom {
  ServicePortImpl.internal_() : super.internal_();
  get runtimeType => ServicePort;
  toString() => super.toString();
}
patch class ServicePortCollection {
  static Type get instanceRuntimeType => ServicePortCollectionImpl;

}
class ServicePortCollectionImpl extends ServicePortCollection implements js_library.JSObjectInterfacesDom {
  ServicePortCollectionImpl.internal_() : super.internal_();
  get runtimeType => ServicePortCollection;
  toString() => super.toString();
}
patch class ServicePortConnectEvent {
  static Type get instanceRuntimeType => ServicePortConnectEventImpl;

}
class ServicePortConnectEventImpl extends ServicePortConnectEvent implements js_library.JSObjectInterfacesDom {
  ServicePortConnectEventImpl.internal_() : super.internal_();
  get runtimeType => ServicePortConnectEvent;
  toString() => super.toString();
}
patch class ServiceWorkerContainer {
  static Type get instanceRuntimeType => ServiceWorkerContainerImpl;

}
class ServiceWorkerContainerImpl extends ServiceWorkerContainer implements js_library.JSObjectInterfacesDom {
  ServiceWorkerContainerImpl.internal_() : super.internal_();
  get runtimeType => ServiceWorkerContainer;
  toString() => super.toString();
}
patch class ServiceWorkerGlobalScope {
  static Type get instanceRuntimeType => ServiceWorkerGlobalScopeImpl;

}
class ServiceWorkerGlobalScopeImpl extends ServiceWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
  ServiceWorkerGlobalScopeImpl.internal_() : super.internal_();
  get runtimeType => ServiceWorkerGlobalScope;
  toString() => super.toString();
}
patch class ServiceWorkerMessageEvent {
  static Type get instanceRuntimeType => ServiceWorkerMessageEventImpl;

}
class ServiceWorkerMessageEventImpl extends ServiceWorkerMessageEvent implements js_library.JSObjectInterfacesDom {
  ServiceWorkerMessageEventImpl.internal_() : super.internal_();
  get runtimeType => ServiceWorkerMessageEvent;
  toString() => super.toString();
}
patch class ServiceWorkerRegistration {
  static Type get instanceRuntimeType => ServiceWorkerRegistrationImpl;

}
class ServiceWorkerRegistrationImpl extends ServiceWorkerRegistration implements js_library.JSObjectInterfacesDom {
  ServiceWorkerRegistrationImpl.internal_() : super.internal_();
  get runtimeType => ServiceWorkerRegistration;
  toString() => super.toString();
}
patch class ShadowElement {
  static Type get instanceRuntimeType => ShadowElementImpl;

}
class ShadowElementImpl extends ShadowElement implements js_library.JSObjectInterfacesDom {
  ShadowElementImpl.internal_() : super.internal_();
  get runtimeType => ShadowElement;
  toString() => super.toString();
}
patch class ShadowRoot {
  static Type get instanceRuntimeType => ShadowRootImpl;

}
class ShadowRootImpl extends ShadowRoot implements js_library.JSObjectInterfacesDom {
  ShadowRootImpl.internal_() : super.internal_();
  get runtimeType => ShadowRoot;
  toString() => super.toString();
}
patch class SharedArrayBuffer {
  static Type get instanceRuntimeType => SharedArrayBufferImpl;

}
class SharedArrayBufferImpl extends SharedArrayBuffer implements js_library.JSObjectInterfacesDom {
  SharedArrayBufferImpl.internal_() : super.internal_();
  get runtimeType => SharedArrayBuffer;
  toString() => super.toString();
}
patch class SharedWorker {
  static Type get instanceRuntimeType => SharedWorkerImpl;

}
class SharedWorkerImpl extends SharedWorker implements js_library.JSObjectInterfacesDom {
  SharedWorkerImpl.internal_() : super.internal_();
  get runtimeType => SharedWorker;
  toString() => super.toString();
}
patch class SharedWorkerGlobalScope {
  static Type get instanceRuntimeType => SharedWorkerGlobalScopeImpl;

}
class SharedWorkerGlobalScopeImpl extends SharedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
  SharedWorkerGlobalScopeImpl.internal_() : super.internal_();
  get runtimeType => SharedWorkerGlobalScope;
  toString() => super.toString();
}
patch class SourceBuffer {
  static Type get instanceRuntimeType => SourceBufferImpl;

}
class SourceBufferImpl extends SourceBuffer implements js_library.JSObjectInterfacesDom {
  SourceBufferImpl.internal_() : super.internal_();
  get runtimeType => SourceBuffer;
  toString() => super.toString();
}
patch class SourceBufferList {
  static Type get instanceRuntimeType => SourceBufferListImpl;

}
class SourceBufferListImpl extends SourceBufferList implements js_library.JSObjectInterfacesDom {
  SourceBufferListImpl.internal_() : super.internal_();
  get runtimeType => SourceBufferList;
  toString() => super.toString();
}
patch class SourceElement {
  static Type get instanceRuntimeType => SourceElementImpl;

}
class SourceElementImpl extends SourceElement implements js_library.JSObjectInterfacesDom {
  SourceElementImpl.internal_() : super.internal_();
  get runtimeType => SourceElement;
  toString() => super.toString();
}
patch class SourceInfo {
  static Type get instanceRuntimeType => SourceInfoImpl;

}
class SourceInfoImpl extends SourceInfo implements js_library.JSObjectInterfacesDom {
  SourceInfoImpl.internal_() : super.internal_();
  get runtimeType => SourceInfo;
  toString() => super.toString();
}
patch class SpanElement {
  static Type get instanceRuntimeType => SpanElementImpl;

}
class SpanElementImpl extends SpanElement implements js_library.JSObjectInterfacesDom {
  SpanElementImpl.internal_() : super.internal_();
  get runtimeType => SpanElement;
  toString() => super.toString();
}
patch class SpeechGrammar {
  static Type get instanceRuntimeType => SpeechGrammarImpl;

}
class SpeechGrammarImpl extends SpeechGrammar implements js_library.JSObjectInterfacesDom {
  SpeechGrammarImpl.internal_() : super.internal_();
  get runtimeType => SpeechGrammar;
  toString() => super.toString();
}
patch class SpeechGrammarList {
  static Type get instanceRuntimeType => SpeechGrammarListImpl;

}
class SpeechGrammarListImpl extends SpeechGrammarList implements js_library.JSObjectInterfacesDom {
  SpeechGrammarListImpl.internal_() : super.internal_();
  get runtimeType => SpeechGrammarList;
  toString() => super.toString();
}
patch class SpeechRecognition {
  static Type get instanceRuntimeType => SpeechRecognitionImpl;

}
class SpeechRecognitionImpl extends SpeechRecognition implements js_library.JSObjectInterfacesDom {
  SpeechRecognitionImpl.internal_() : super.internal_();
  get runtimeType => SpeechRecognition;
  toString() => super.toString();
}
patch class SpeechRecognitionAlternative {
  static Type get instanceRuntimeType => SpeechRecognitionAlternativeImpl;

}
class SpeechRecognitionAlternativeImpl extends SpeechRecognitionAlternative implements js_library.JSObjectInterfacesDom {
  SpeechRecognitionAlternativeImpl.internal_() : super.internal_();
  get runtimeType => SpeechRecognitionAlternative;
  toString() => super.toString();
}
patch class SpeechRecognitionError {
  static Type get instanceRuntimeType => SpeechRecognitionErrorImpl;

}
class SpeechRecognitionErrorImpl extends SpeechRecognitionError implements js_library.JSObjectInterfacesDom {
  SpeechRecognitionErrorImpl.internal_() : super.internal_();
  get runtimeType => SpeechRecognitionError;
  toString() => super.toString();
}
patch class SpeechRecognitionEvent {
  static Type get instanceRuntimeType => SpeechRecognitionEventImpl;

}
class SpeechRecognitionEventImpl extends SpeechRecognitionEvent implements js_library.JSObjectInterfacesDom {
  SpeechRecognitionEventImpl.internal_() : super.internal_();
  get runtimeType => SpeechRecognitionEvent;
  toString() => super.toString();
}
patch class SpeechRecognitionResult {
  static Type get instanceRuntimeType => SpeechRecognitionResultImpl;

}
class SpeechRecognitionResultImpl extends SpeechRecognitionResult implements js_library.JSObjectInterfacesDom {
  SpeechRecognitionResultImpl.internal_() : super.internal_();
  get runtimeType => SpeechRecognitionResult;
  toString() => super.toString();
}
patch class SpeechSynthesis {
  static Type get instanceRuntimeType => SpeechSynthesisImpl;

}
class SpeechSynthesisImpl extends SpeechSynthesis implements js_library.JSObjectInterfacesDom {
  SpeechSynthesisImpl.internal_() : super.internal_();
  get runtimeType => SpeechSynthesis;
  toString() => super.toString();
}
patch class SpeechSynthesisEvent {
  static Type get instanceRuntimeType => SpeechSynthesisEventImpl;

}
class SpeechSynthesisEventImpl extends SpeechSynthesisEvent implements js_library.JSObjectInterfacesDom {
  SpeechSynthesisEventImpl.internal_() : super.internal_();
  get runtimeType => SpeechSynthesisEvent;
  toString() => super.toString();
}
patch class SpeechSynthesisUtterance {
  static Type get instanceRuntimeType => SpeechSynthesisUtteranceImpl;

}
class SpeechSynthesisUtteranceImpl extends SpeechSynthesisUtterance implements js_library.JSObjectInterfacesDom {
  SpeechSynthesisUtteranceImpl.internal_() : super.internal_();
  get runtimeType => SpeechSynthesisUtterance;
  toString() => super.toString();
}
patch class SpeechSynthesisVoice {
  static Type get instanceRuntimeType => SpeechSynthesisVoiceImpl;

}
class SpeechSynthesisVoiceImpl extends SpeechSynthesisVoice implements js_library.JSObjectInterfacesDom {
  SpeechSynthesisVoiceImpl.internal_() : super.internal_();
  get runtimeType => SpeechSynthesisVoice;
  toString() => super.toString();
}
patch class StashedMessagePort {
  static Type get instanceRuntimeType => StashedMessagePortImpl;

}
class StashedMessagePortImpl extends StashedMessagePort implements js_library.JSObjectInterfacesDom {
  StashedMessagePortImpl.internal_() : super.internal_();
  get runtimeType => StashedMessagePort;
  toString() => super.toString();
}
patch class StashedPortCollection {
  static Type get instanceRuntimeType => StashedPortCollectionImpl;

}
class StashedPortCollectionImpl extends StashedPortCollection implements js_library.JSObjectInterfacesDom {
  StashedPortCollectionImpl.internal_() : super.internal_();
  get runtimeType => StashedPortCollection;
  toString() => super.toString();
}
patch class Storage {
  static Type get instanceRuntimeType => StorageImpl;

}
class StorageImpl extends Storage implements js_library.JSObjectInterfacesDom {
  StorageImpl.internal_() : super.internal_();
  get runtimeType => Storage;
  toString() => super.toString();
}
patch class StorageEvent {
  static Type get instanceRuntimeType => StorageEventImpl;

}
class StorageEventImpl extends StorageEvent implements js_library.JSObjectInterfacesDom {
  StorageEventImpl.internal_() : super.internal_();
  get runtimeType => StorageEvent;
  toString() => super.toString();
}
patch class StorageInfo {
  static Type get instanceRuntimeType => StorageInfoImpl;

}
class StorageInfoImpl extends StorageInfo implements js_library.JSObjectInterfacesDom {
  StorageInfoImpl.internal_() : super.internal_();
  get runtimeType => StorageInfo;
  toString() => super.toString();
}
patch class StorageQuota {
  static Type get instanceRuntimeType => StorageQuotaImpl;

}
class StorageQuotaImpl extends StorageQuota implements js_library.JSObjectInterfacesDom {
  StorageQuotaImpl.internal_() : super.internal_();
  get runtimeType => StorageQuota;
  toString() => super.toString();
}
patch class StyleElement {
  static Type get instanceRuntimeType => StyleElementImpl;

}
class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
  StyleElementImpl.internal_() : super.internal_();
  get runtimeType => StyleElement;
  toString() => super.toString();
}
patch class StyleMedia {
  static Type get instanceRuntimeType => StyleMediaImpl;

}
class StyleMediaImpl extends StyleMedia implements js_library.JSObjectInterfacesDom {
  StyleMediaImpl.internal_() : super.internal_();
  get runtimeType => StyleMedia;
  toString() => super.toString();
}
patch class StyleSheet {
  static Type get instanceRuntimeType => StyleSheetImpl;

}
class StyleSheetImpl extends StyleSheet implements js_library.JSObjectInterfacesDom {
  StyleSheetImpl.internal_() : super.internal_();
  get runtimeType => StyleSheet;
  toString() => super.toString();
}
patch class SyncEvent {
  static Type get instanceRuntimeType => SyncEventImpl;

}
class SyncEventImpl extends SyncEvent implements js_library.JSObjectInterfacesDom {
  SyncEventImpl.internal_() : super.internal_();
  get runtimeType => SyncEvent;
  toString() => super.toString();
}
patch class SyncManager {
  static Type get instanceRuntimeType => SyncManagerImpl;

}
class SyncManagerImpl extends SyncManager implements js_library.JSObjectInterfacesDom {
  SyncManagerImpl.internal_() : super.internal_();
  get runtimeType => SyncManager;
  toString() => super.toString();
}
patch class SyncRegistration {
  static Type get instanceRuntimeType => SyncRegistrationImpl;

}
class SyncRegistrationImpl extends SyncRegistration implements js_library.JSObjectInterfacesDom {
  SyncRegistrationImpl.internal_() : super.internal_();
  get runtimeType => SyncRegistration;
  toString() => super.toString();
}
patch class TableCaptionElement {
  static Type get instanceRuntimeType => TableCaptionElementImpl;

}
class TableCaptionElementImpl extends TableCaptionElement implements js_library.JSObjectInterfacesDom {
  TableCaptionElementImpl.internal_() : super.internal_();
  get runtimeType => TableCaptionElement;
  toString() => super.toString();
}
patch class TableCellElement {
  static Type get instanceRuntimeType => TableCellElementImpl;

}
class TableCellElementImpl extends TableCellElement implements js_library.JSObjectInterfacesDom {
  TableCellElementImpl.internal_() : super.internal_();
  get runtimeType => TableCellElement;
  toString() => super.toString();
}
patch class TableColElement {
  static Type get instanceRuntimeType => TableColElementImpl;

}
class TableColElementImpl extends TableColElement implements js_library.JSObjectInterfacesDom {
  TableColElementImpl.internal_() : super.internal_();
  get runtimeType => TableColElement;
  toString() => super.toString();
}
patch class TableElement {
  static Type get instanceRuntimeType => TableElementImpl;

}
class TableElementImpl extends TableElement implements js_library.JSObjectInterfacesDom {
  TableElementImpl.internal_() : super.internal_();
  get runtimeType => TableElement;
  toString() => super.toString();
}
patch class TableRowElement {
  static Type get instanceRuntimeType => TableRowElementImpl;

}
class TableRowElementImpl extends TableRowElement implements js_library.JSObjectInterfacesDom {
  TableRowElementImpl.internal_() : super.internal_();
  get runtimeType => TableRowElement;
  toString() => super.toString();
}
patch class TableSectionElement {
  static Type get instanceRuntimeType => TableSectionElementImpl;

}
class TableSectionElementImpl extends TableSectionElement implements js_library.JSObjectInterfacesDom {
  TableSectionElementImpl.internal_() : super.internal_();
  get runtimeType => TableSectionElement;
  toString() => super.toString();
}
patch class TemplateElement {
  static Type get instanceRuntimeType => TemplateElementImpl;

}
class TemplateElementImpl extends TemplateElement implements js_library.JSObjectInterfacesDom {
  TemplateElementImpl.internal_() : super.internal_();
  get runtimeType => TemplateElement;
  toString() => super.toString();
}
patch class Text {
  static Type get instanceRuntimeType => TextImpl;

}
class TextImpl extends Text implements js_library.JSObjectInterfacesDom {
  TextImpl.internal_() : super.internal_();
  get runtimeType => Text;
  toString() => super.toString();
}
patch class TextAreaElement {
  static Type get instanceRuntimeType => TextAreaElementImpl;

}
class TextAreaElementImpl extends TextAreaElement implements js_library.JSObjectInterfacesDom {
  TextAreaElementImpl.internal_() : super.internal_();
  get runtimeType => TextAreaElement;
  toString() => super.toString();
}
patch class TextEvent {
  static Type get instanceRuntimeType => TextEventImpl;

}
class TextEventImpl extends TextEvent implements js_library.JSObjectInterfacesDom {
  TextEventImpl.internal_() : super.internal_();
  get runtimeType => TextEvent;
  toString() => super.toString();
}
patch class TextMetrics {
  static Type get instanceRuntimeType => TextMetricsImpl;

}
class TextMetricsImpl extends TextMetrics implements js_library.JSObjectInterfacesDom {
  TextMetricsImpl.internal_() : super.internal_();
  get runtimeType => TextMetrics;
  toString() => super.toString();
}
patch class TextTrack {
  static Type get instanceRuntimeType => TextTrackImpl;

}
class TextTrackImpl extends TextTrack implements js_library.JSObjectInterfacesDom {
  TextTrackImpl.internal_() : super.internal_();
  get runtimeType => TextTrack;
  toString() => super.toString();
}
patch class TextTrackCue {
  static Type get instanceRuntimeType => TextTrackCueImpl;

}
class TextTrackCueImpl extends TextTrackCue implements js_library.JSObjectInterfacesDom {
  TextTrackCueImpl.internal_() : super.internal_();
  get runtimeType => TextTrackCue;
  toString() => super.toString();
}
patch class TextTrackCueList {
  static Type get instanceRuntimeType => TextTrackCueListImpl;

}
class TextTrackCueListImpl extends TextTrackCueList implements js_library.JSObjectInterfacesDom {
  TextTrackCueListImpl.internal_() : super.internal_();
  get runtimeType => TextTrackCueList;
  toString() => super.toString();
}
patch class TextTrackList {
  static Type get instanceRuntimeType => TextTrackListImpl;

}
class TextTrackListImpl extends TextTrackList implements js_library.JSObjectInterfacesDom {
  TextTrackListImpl.internal_() : super.internal_();
  get runtimeType => TextTrackList;
  toString() => super.toString();
}
patch class TimeRanges {
  static Type get instanceRuntimeType => TimeRangesImpl;

}
class TimeRangesImpl extends TimeRanges implements js_library.JSObjectInterfacesDom {
  TimeRangesImpl.internal_() : super.internal_();
  get runtimeType => TimeRanges;
  toString() => super.toString();
}
patch class TitleElement {
  static Type get instanceRuntimeType => TitleElementImpl;

}
class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
  TitleElementImpl.internal_() : super.internal_();
  get runtimeType => TitleElement;
  toString() => super.toString();
}
patch class Touch {
  static Type get instanceRuntimeType => TouchImpl;

}
class TouchImpl extends Touch implements js_library.JSObjectInterfacesDom {
  TouchImpl.internal_() : super.internal_();
  get runtimeType => Touch;
  toString() => super.toString();
}
patch class TouchEvent {
  static Type get instanceRuntimeType => TouchEventImpl;

}
class TouchEventImpl extends TouchEvent implements js_library.JSObjectInterfacesDom {
  TouchEventImpl.internal_() : super.internal_();
  get runtimeType => TouchEvent;
  toString() => super.toString();
}
patch class TouchList {
  static Type get instanceRuntimeType => TouchListImpl;

}
class TouchListImpl extends TouchList implements js_library.JSObjectInterfacesDom {
  TouchListImpl.internal_() : super.internal_();
  get runtimeType => TouchList;
  toString() => super.toString();
}
patch class TrackDefault {
  static Type get instanceRuntimeType => TrackDefaultImpl;

}
class TrackDefaultImpl extends TrackDefault implements js_library.JSObjectInterfacesDom {
  TrackDefaultImpl.internal_() : super.internal_();
  get runtimeType => TrackDefault;
  toString() => super.toString();
}
patch class TrackDefaultList {
  static Type get instanceRuntimeType => TrackDefaultListImpl;

}
class TrackDefaultListImpl extends TrackDefaultList implements js_library.JSObjectInterfacesDom {
  TrackDefaultListImpl.internal_() : super.internal_();
  get runtimeType => TrackDefaultList;
  toString() => super.toString();
}
patch class TrackElement {
  static Type get instanceRuntimeType => TrackElementImpl;

}
class TrackElementImpl extends TrackElement implements js_library.JSObjectInterfacesDom {
  TrackElementImpl.internal_() : super.internal_();
  get runtimeType => TrackElement;
  toString() => super.toString();
}
patch class TrackEvent {
  static Type get instanceRuntimeType => TrackEventImpl;

}
class TrackEventImpl extends TrackEvent implements js_library.JSObjectInterfacesDom {
  TrackEventImpl.internal_() : super.internal_();
  get runtimeType => TrackEvent;
  toString() => super.toString();
}
patch class TransitionEvent {
  static Type get instanceRuntimeType => TransitionEventImpl;

}
class TransitionEventImpl extends TransitionEvent implements js_library.JSObjectInterfacesDom {
  TransitionEventImpl.internal_() : super.internal_();
  get runtimeType => TransitionEvent;
  toString() => super.toString();
}
patch class TreeWalker {
  static Type get instanceRuntimeType => TreeWalkerImpl;

}
class TreeWalkerImpl extends TreeWalker implements js_library.JSObjectInterfacesDom {
  TreeWalkerImpl.internal_() : super.internal_();
  get runtimeType => TreeWalker;
  toString() => super.toString();
}
patch class UIEvent {
  static Type get instanceRuntimeType => UIEventImpl;

}
class UIEventImpl extends UIEvent implements js_library.JSObjectInterfacesDom {
  UIEventImpl.internal_() : super.internal_();
  get runtimeType => UIEvent;
  toString() => super.toString();
}
patch class UListElement {
  static Type get instanceRuntimeType => UListElementImpl;

}
class UListElementImpl extends UListElement implements js_library.JSObjectInterfacesDom {
  UListElementImpl.internal_() : super.internal_();
  get runtimeType => UListElement;
  toString() => super.toString();
}
patch class UnknownElement {
  static Type get instanceRuntimeType => UnknownElementImpl;

}
class UnknownElementImpl extends UnknownElement implements js_library.JSObjectInterfacesDom {
  UnknownElementImpl.internal_() : super.internal_();
  get runtimeType => UnknownElement;
  toString() => super.toString();
}
patch class Url {
  static Type get instanceRuntimeType => UrlImpl;

}
class UrlImpl extends Url implements js_library.JSObjectInterfacesDom {
  UrlImpl.internal_() : super.internal_();
  get runtimeType => Url;
  toString() => super.toString();
}
patch class UrlUtils {
  static Type get instanceRuntimeType => UrlUtilsImpl;

}
class UrlUtilsImpl extends UrlUtils implements js_library.JSObjectInterfacesDom {
  UrlUtilsImpl.internal_() : super.internal_();
  get runtimeType => UrlUtils;
  toString() => super.toString();
}
patch class UrlUtilsReadOnly {
  static Type get instanceRuntimeType => UrlUtilsReadOnlyImpl;

}
class UrlUtilsReadOnlyImpl extends UrlUtilsReadOnly implements js_library.JSObjectInterfacesDom {
  UrlUtilsReadOnlyImpl.internal_() : super.internal_();
  get runtimeType => UrlUtilsReadOnly;
  toString() => super.toString();
}
patch class VRDevice {
  static Type get instanceRuntimeType => VRDeviceImpl;

}
class VRDeviceImpl extends VRDevice implements js_library.JSObjectInterfacesDom {
  VRDeviceImpl.internal_() : super.internal_();
  get runtimeType => VRDevice;
  toString() => super.toString();
}
patch class VREyeParameters {
  static Type get instanceRuntimeType => VREyeParametersImpl;

}
class VREyeParametersImpl extends VREyeParameters implements js_library.JSObjectInterfacesDom {
  VREyeParametersImpl.internal_() : super.internal_();
  get runtimeType => VREyeParameters;
  toString() => super.toString();
}
patch class VRFieldOfView {
  static Type get instanceRuntimeType => VRFieldOfViewImpl;

}
class VRFieldOfViewImpl extends VRFieldOfView implements js_library.JSObjectInterfacesDom {
  VRFieldOfViewImpl.internal_() : super.internal_();
  get runtimeType => VRFieldOfView;
  toString() => super.toString();
}
patch class VRPositionState {
  static Type get instanceRuntimeType => VRPositionStateImpl;

}
class VRPositionStateImpl extends VRPositionState implements js_library.JSObjectInterfacesDom {
  VRPositionStateImpl.internal_() : super.internal_();
  get runtimeType => VRPositionState;
  toString() => super.toString();
}
patch class ValidityState {
  static Type get instanceRuntimeType => ValidityStateImpl;

}
class ValidityStateImpl extends ValidityState implements js_library.JSObjectInterfacesDom {
  ValidityStateImpl.internal_() : super.internal_();
  get runtimeType => ValidityState;
  toString() => super.toString();
}
patch class VideoElement {
  static Type get instanceRuntimeType => VideoElementImpl;

}
class VideoElementImpl extends VideoElement implements js_library.JSObjectInterfacesDom {
  VideoElementImpl.internal_() : super.internal_();
  get runtimeType => VideoElement;
  toString() => super.toString();
}
patch class VideoPlaybackQuality {
  static Type get instanceRuntimeType => VideoPlaybackQualityImpl;

}
class VideoPlaybackQualityImpl extends VideoPlaybackQuality implements js_library.JSObjectInterfacesDom {
  VideoPlaybackQualityImpl.internal_() : super.internal_();
  get runtimeType => VideoPlaybackQuality;
  toString() => super.toString();
}
patch class VideoTrack {
  static Type get instanceRuntimeType => VideoTrackImpl;

}
class VideoTrackImpl extends VideoTrack implements js_library.JSObjectInterfacesDom {
  VideoTrackImpl.internal_() : super.internal_();
  get runtimeType => VideoTrack;
  toString() => super.toString();
}
patch class VideoTrackList {
  static Type get instanceRuntimeType => VideoTrackListImpl;

}
class VideoTrackListImpl extends VideoTrackList implements js_library.JSObjectInterfacesDom {
  VideoTrackListImpl.internal_() : super.internal_();
  get runtimeType => VideoTrackList;
  toString() => super.toString();
}
patch class VttCue {
  static Type get instanceRuntimeType => VttCueImpl;

}
class VttCueImpl extends VttCue implements js_library.JSObjectInterfacesDom {
  VttCueImpl.internal_() : super.internal_();
  get runtimeType => VttCue;
  toString() => super.toString();
}
patch class VttRegion {
  static Type get instanceRuntimeType => VttRegionImpl;

}
class VttRegionImpl extends VttRegion implements js_library.JSObjectInterfacesDom {
  VttRegionImpl.internal_() : super.internal_();
  get runtimeType => VttRegion;
  toString() => super.toString();
}
patch class VttRegionList {
  static Type get instanceRuntimeType => VttRegionListImpl;

}
class VttRegionListImpl extends VttRegionList implements js_library.JSObjectInterfacesDom {
  VttRegionListImpl.internal_() : super.internal_();
  get runtimeType => VttRegionList;
  toString() => super.toString();
}
patch class WebSocket {
  static Type get instanceRuntimeType => WebSocketImpl;

}
class WebSocketImpl extends WebSocket implements js_library.JSObjectInterfacesDom {
  WebSocketImpl.internal_() : super.internal_();
  get runtimeType => WebSocket;
  toString() => super.toString();
}
patch class WheelEvent {
  static Type get instanceRuntimeType => WheelEventImpl;

}
class WheelEventImpl extends WheelEvent implements js_library.JSObjectInterfacesDom {
  WheelEventImpl.internal_() : super.internal_();
  get runtimeType => WheelEvent;
  toString() => super.toString();
}
patch class Window {
  static Type get instanceRuntimeType => WindowImpl;

}
class WindowImpl extends Window implements js_library.JSObjectInterfacesDom {
  WindowImpl.internal_() : super.internal_();
  get runtimeType => Window;
  toString() => super.toString();
}
patch class WindowBase64 {
  static Type get instanceRuntimeType => WindowBase64Impl;

}
class WindowBase64Impl extends WindowBase64 implements js_library.JSObjectInterfacesDom {
  WindowBase64Impl.internal_() : super.internal_();
  get runtimeType => WindowBase64;
  toString() => super.toString();
}
patch class WindowClient {
  static Type get instanceRuntimeType => WindowClientImpl;

}
class WindowClientImpl extends WindowClient implements js_library.JSObjectInterfacesDom {
  WindowClientImpl.internal_() : super.internal_();
  get runtimeType => WindowClient;
  toString() => super.toString();
}
patch class WindowEventHandlers {
  static Type get instanceRuntimeType => WindowEventHandlersImpl;

}
class WindowEventHandlersImpl extends WindowEventHandlers implements js_library.JSObjectInterfacesDom {
  WindowEventHandlersImpl.internal_() : super.internal_();
  get runtimeType => WindowEventHandlers;
  toString() => super.toString();
}
patch class Worker {
  static Type get instanceRuntimeType => WorkerImpl;

}
class WorkerImpl extends Worker implements js_library.JSObjectInterfacesDom {
  WorkerImpl.internal_() : super.internal_();
  get runtimeType => Worker;
  toString() => super.toString();
}
patch class WorkerConsole {
  static Type get instanceRuntimeType => WorkerConsoleImpl;

}
class WorkerConsoleImpl extends WorkerConsole implements js_library.JSObjectInterfacesDom {
  WorkerConsoleImpl.internal_() : super.internal_();
  get runtimeType => WorkerConsole;
  toString() => super.toString();
}
patch class WorkerGlobalScope {
  static Type get instanceRuntimeType => WorkerGlobalScopeImpl;

}
class WorkerGlobalScopeImpl extends WorkerGlobalScope implements js_library.JSObjectInterfacesDom {
  WorkerGlobalScopeImpl.internal_() : super.internal_();
  get runtimeType => WorkerGlobalScope;
  toString() => super.toString();
}
patch class WorkerPerformance {
  static Type get instanceRuntimeType => WorkerPerformanceImpl;

}
class WorkerPerformanceImpl extends WorkerPerformance implements js_library.JSObjectInterfacesDom {
  WorkerPerformanceImpl.internal_() : super.internal_();
  get runtimeType => WorkerPerformance;
  toString() => super.toString();
}
patch class XPathEvaluator {
  static Type get instanceRuntimeType => XPathEvaluatorImpl;

}
class XPathEvaluatorImpl extends XPathEvaluator implements js_library.JSObjectInterfacesDom {
  XPathEvaluatorImpl.internal_() : super.internal_();
  get runtimeType => XPathEvaluator;
  toString() => super.toString();
}
patch class XPathExpression {
  static Type get instanceRuntimeType => XPathExpressionImpl;

}
class XPathExpressionImpl extends XPathExpression implements js_library.JSObjectInterfacesDom {
  XPathExpressionImpl.internal_() : super.internal_();
  get runtimeType => XPathExpression;
  toString() => super.toString();
}
patch class XPathNSResolver {
  static Type get instanceRuntimeType => XPathNSResolverImpl;

}
class XPathNSResolverImpl extends XPathNSResolver implements js_library.JSObjectInterfacesDom {
  XPathNSResolverImpl.internal_() : super.internal_();
  get runtimeType => XPathNSResolver;
  toString() => super.toString();
}
patch class XPathResult {
  static Type get instanceRuntimeType => XPathResultImpl;

}
class XPathResultImpl extends XPathResult implements js_library.JSObjectInterfacesDom {
  XPathResultImpl.internal_() : super.internal_();
  get runtimeType => XPathResult;
  toString() => super.toString();
}
patch class XmlDocument {
  static Type get instanceRuntimeType => XmlDocumentImpl;

}
class XmlDocumentImpl extends XmlDocument implements js_library.JSObjectInterfacesDom {
  XmlDocumentImpl.internal_() : super.internal_();
  get runtimeType => XmlDocument;
  toString() => super.toString();
}
patch class XmlSerializer {
  static Type get instanceRuntimeType => XmlSerializerImpl;

}
class XmlSerializerImpl extends XmlSerializer implements js_library.JSObjectInterfacesDom {
  XmlSerializerImpl.internal_() : super.internal_();
  get runtimeType => XmlSerializer;
  toString() => super.toString();
}
patch class XsltProcessor {
  static Type get instanceRuntimeType => XsltProcessorImpl;

}
class XsltProcessorImpl extends XsltProcessor implements js_library.JSObjectInterfacesDom {
  XsltProcessorImpl.internal_() : super.internal_();
  get runtimeType => XsltProcessor;
  toString() => super.toString();
}
patch class _Attr {
  static Type get instanceRuntimeType => _AttrImpl;

}
class _AttrImpl extends _Attr implements js_library.JSObjectInterfacesDom {
  _AttrImpl.internal_() : super.internal_();
  get runtimeType => _Attr;
  toString() => super.toString();
}
patch class _Cache {
  static Type get instanceRuntimeType => _CacheImpl;

}
class _CacheImpl extends _Cache implements js_library.JSObjectInterfacesDom {
  _CacheImpl.internal_() : super.internal_();
  get runtimeType => _Cache;
  toString() => super.toString();
}
patch class _CanvasPathMethods {
  static Type get instanceRuntimeType => _CanvasPathMethodsImpl;

}
class _CanvasPathMethodsImpl extends _CanvasPathMethods implements js_library.JSObjectInterfacesDom {
  _CanvasPathMethodsImpl.internal_() : super.internal_();
  get runtimeType => _CanvasPathMethods;
  toString() => super.toString();
}
patch class _ClientRect {
  static Type get instanceRuntimeType => _ClientRectImpl;

}
class _ClientRectImpl extends _ClientRect implements js_library.JSObjectInterfacesDom {
  _ClientRectImpl.internal_() : super.internal_();
  get runtimeType => _ClientRect;
  toString() => super.toString();
}
patch class _ClientRectList {
  static Type get instanceRuntimeType => _ClientRectListImpl;

}
class _ClientRectListImpl extends _ClientRectList implements js_library.JSObjectInterfacesDom {
  _ClientRectListImpl.internal_() : super.internal_();
  get runtimeType => _ClientRectList;
  toString() => super.toString();
}
patch class _CssRuleList {
  static Type get instanceRuntimeType => _CssRuleListImpl;

}
class _CssRuleListImpl extends _CssRuleList implements js_library.JSObjectInterfacesDom {
  _CssRuleListImpl.internal_() : super.internal_();
  get runtimeType => _CssRuleList;
  toString() => super.toString();
}
patch class _DOMFileSystemSync {
  static Type get instanceRuntimeType => _DOMFileSystemSyncImpl;

}
class _DOMFileSystemSyncImpl extends _DOMFileSystemSync implements js_library.JSObjectInterfacesDom {
  _DOMFileSystemSyncImpl.internal_() : super.internal_();
  get runtimeType => _DOMFileSystemSync;
  toString() => super.toString();
}
patch class _DirectoryEntrySync {
  static Type get instanceRuntimeType => _DirectoryEntrySyncImpl;

}
class _DirectoryEntrySyncImpl extends _DirectoryEntrySync implements js_library.JSObjectInterfacesDom {
  _DirectoryEntrySyncImpl.internal_() : super.internal_();
  get runtimeType => _DirectoryEntrySync;
  toString() => super.toString();
}
patch class _DirectoryReaderSync {
  static Type get instanceRuntimeType => _DirectoryReaderSyncImpl;

}
class _DirectoryReaderSyncImpl extends _DirectoryReaderSync implements js_library.JSObjectInterfacesDom {
  _DirectoryReaderSyncImpl.internal_() : super.internal_();
  get runtimeType => _DirectoryReaderSync;
  toString() => super.toString();
}
patch class _DocumentType {
  static Type get instanceRuntimeType => _DocumentTypeImpl;

}
class _DocumentTypeImpl extends _DocumentType implements js_library.JSObjectInterfacesDom {
  _DocumentTypeImpl.internal_() : super.internal_();
  get runtimeType => _DocumentType;
  toString() => super.toString();
}
patch class _DomRect {
  static Type get instanceRuntimeType => _DomRectImpl;

}
class _DomRectImpl extends _DomRect implements js_library.JSObjectInterfacesDom {
  _DomRectImpl.internal_() : super.internal_();
  get runtimeType => _DomRect;
  toString() => super.toString();
}
patch class _EntrySync {
  static Type get instanceRuntimeType => _EntrySyncImpl;

}
class _EntrySyncImpl extends _EntrySync implements js_library.JSObjectInterfacesDom {
  _EntrySyncImpl.internal_() : super.internal_();
  get runtimeType => _EntrySync;
  toString() => super.toString();
}
patch class _FileEntrySync {
  static Type get instanceRuntimeType => _FileEntrySyncImpl;

}
class _FileEntrySyncImpl extends _FileEntrySync implements js_library.JSObjectInterfacesDom {
  _FileEntrySyncImpl.internal_() : super.internal_();
  get runtimeType => _FileEntrySync;
  toString() => super.toString();
}
patch class _FileReaderSync {
  static Type get instanceRuntimeType => _FileReaderSyncImpl;

}
class _FileReaderSyncImpl extends _FileReaderSync implements js_library.JSObjectInterfacesDom {
  _FileReaderSyncImpl.internal_() : super.internal_();
  get runtimeType => _FileReaderSync;
  toString() => super.toString();
}
patch class _FileWriterSync {
  static Type get instanceRuntimeType => _FileWriterSyncImpl;

}
class _FileWriterSyncImpl extends _FileWriterSync implements js_library.JSObjectInterfacesDom {
  _FileWriterSyncImpl.internal_() : super.internal_();
  get runtimeType => _FileWriterSync;
  toString() => super.toString();
}
patch class _GamepadList {
  static Type get instanceRuntimeType => _GamepadListImpl;

}
class _GamepadListImpl extends _GamepadList implements js_library.JSObjectInterfacesDom {
  _GamepadListImpl.internal_() : super.internal_();
  get runtimeType => _GamepadList;
  toString() => super.toString();
}
patch class _HTMLAllCollection {
  static Type get instanceRuntimeType => _HTMLAllCollectionImpl;

}
class _HTMLAllCollectionImpl extends _HTMLAllCollection implements js_library.JSObjectInterfacesDom {
  _HTMLAllCollectionImpl.internal_() : super.internal_();
  get runtimeType => _HTMLAllCollection;
  toString() => super.toString();
}
patch class _HTMLAppletElement {
  static Type get instanceRuntimeType => _HTMLAppletElementImpl;

}
class _HTMLAppletElementImpl extends _HTMLAppletElement implements js_library.JSObjectInterfacesDom {
  _HTMLAppletElementImpl.internal_() : super.internal_();
  get runtimeType => _HTMLAppletElement;
  toString() => super.toString();
}
patch class _HTMLDirectoryElement {
  static Type get instanceRuntimeType => _HTMLDirectoryElementImpl;

}
class _HTMLDirectoryElementImpl extends _HTMLDirectoryElement implements js_library.JSObjectInterfacesDom {
  _HTMLDirectoryElementImpl.internal_() : super.internal_();
  get runtimeType => _HTMLDirectoryElement;
  toString() => super.toString();
}
patch class _HTMLFontElement {
  static Type get instanceRuntimeType => _HTMLFontElementImpl;

}
class _HTMLFontElementImpl extends _HTMLFontElement implements js_library.JSObjectInterfacesDom {
  _HTMLFontElementImpl.internal_() : super.internal_();
  get runtimeType => _HTMLFontElement;
  toString() => super.toString();
}
patch class _HTMLFrameElement {
  static Type get instanceRuntimeType => _HTMLFrameElementImpl;

}
class _HTMLFrameElementImpl extends _HTMLFrameElement implements js_library.JSObjectInterfacesDom {
  _HTMLFrameElementImpl.internal_() : super.internal_();
  get runtimeType => _HTMLFrameElement;
  toString() => super.toString();
}
patch class _HTMLFrameSetElement {
  static Type get instanceRuntimeType => _HTMLFrameSetElementImpl;

}
class _HTMLFrameSetElementImpl extends _HTMLFrameSetElement implements js_library.JSObjectInterfacesDom {
  _HTMLFrameSetElementImpl.internal_() : super.internal_();
  get runtimeType => _HTMLFrameSetElement;
  toString() => super.toString();
}
patch class _HTMLMarqueeElement {
  static Type get instanceRuntimeType => _HTMLMarqueeElementImpl;

}
class _HTMLMarqueeElementImpl extends _HTMLMarqueeElement implements js_library.JSObjectInterfacesDom {
  _HTMLMarqueeElementImpl.internal_() : super.internal_();
  get runtimeType => _HTMLMarqueeElement;
  toString() => super.toString();
}
patch class _MutationEvent {
  static Type get instanceRuntimeType => _MutationEventImpl;

}
class _MutationEventImpl extends _MutationEvent implements js_library.JSObjectInterfacesDom {
  _MutationEventImpl.internal_() : super.internal_();
  get runtimeType => _MutationEvent;
  toString() => super.toString();
}
patch class _NamedNodeMap {
  static Type get instanceRuntimeType => _NamedNodeMapImpl;

}
class _NamedNodeMapImpl extends _NamedNodeMap implements js_library.JSObjectInterfacesDom {
  _NamedNodeMapImpl.internal_() : super.internal_();
  get runtimeType => _NamedNodeMap;
  toString() => super.toString();
}
patch class _PagePopupController {
  static Type get instanceRuntimeType => _PagePopupControllerImpl;

}
class _PagePopupControllerImpl extends _PagePopupController implements js_library.JSObjectInterfacesDom {
  _PagePopupControllerImpl.internal_() : super.internal_();
  get runtimeType => _PagePopupController;
  toString() => super.toString();
}
patch class _RadioNodeList {
  static Type get instanceRuntimeType => _RadioNodeListImpl;

}
class _RadioNodeListImpl extends _RadioNodeList implements js_library.JSObjectInterfacesDom {
  _RadioNodeListImpl.internal_() : super.internal_();
  get runtimeType => _RadioNodeList;
  toString() => super.toString();
}
patch class _Request {
  static Type get instanceRuntimeType => _RequestImpl;

}
class _RequestImpl extends _Request implements js_library.JSObjectInterfacesDom {
  _RequestImpl.internal_() : super.internal_();
  get runtimeType => _Request;
  toString() => super.toString();
}
patch class _Response {
  static Type get instanceRuntimeType => _ResponseImpl;

}
class _ResponseImpl extends _Response implements js_library.JSObjectInterfacesDom {
  _ResponseImpl.internal_() : super.internal_();
  get runtimeType => _Response;
  toString() => super.toString();
}
patch class _ServiceWorker {
  static Type get instanceRuntimeType => _ServiceWorkerImpl;

}
class _ServiceWorkerImpl extends _ServiceWorker implements js_library.JSObjectInterfacesDom {
  _ServiceWorkerImpl.internal_() : super.internal_();
  get runtimeType => _ServiceWorker;
  toString() => super.toString();
}
patch class _SpeechRecognitionResultList {
  static Type get instanceRuntimeType => _SpeechRecognitionResultListImpl;

}
class _SpeechRecognitionResultListImpl extends _SpeechRecognitionResultList implements js_library.JSObjectInterfacesDom {
  _SpeechRecognitionResultListImpl.internal_() : super.internal_();
  get runtimeType => _SpeechRecognitionResultList;
  toString() => super.toString();
}
patch class _StyleSheetList {
  static Type get instanceRuntimeType => _StyleSheetListImpl;

}
class _StyleSheetListImpl extends _StyleSheetList implements js_library.JSObjectInterfacesDom {
  _StyleSheetListImpl.internal_() : super.internal_();
  get runtimeType => _StyleSheetList;
  toString() => super.toString();
}
patch class _SubtleCrypto {
  static Type get instanceRuntimeType => _SubtleCryptoImpl;

}
class _SubtleCryptoImpl extends _SubtleCrypto implements js_library.JSObjectInterfacesDom {
  _SubtleCryptoImpl.internal_() : super.internal_();
  get runtimeType => _SubtleCrypto;
  toString() => super.toString();
}
patch class _WebKitCSSMatrix {
  static Type get instanceRuntimeType => _WebKitCSSMatrixImpl;

}
class _WebKitCSSMatrixImpl extends _WebKitCSSMatrix implements js_library.JSObjectInterfacesDom {
  _WebKitCSSMatrixImpl.internal_() : super.internal_();
  get runtimeType => _WebKitCSSMatrix;
  toString() => super.toString();
}
patch class _WindowTimers {
  static Type get instanceRuntimeType => _WindowTimersImpl;

}
class _WindowTimersImpl extends _WindowTimers implements js_library.JSObjectInterfacesDom {
  _WindowTimersImpl.internal_() : super.internal_();
  get runtimeType => _WindowTimers;
  toString() => super.toString();
}
patch class _WorkerLocation {
  static Type get instanceRuntimeType => _WorkerLocationImpl;

}
class _WorkerLocationImpl extends _WorkerLocation implements js_library.JSObjectInterfacesDom {
  _WorkerLocationImpl.internal_() : super.internal_();
  get runtimeType => _WorkerLocation;
  toString() => super.toString();
}
patch class _WorkerNavigator {
  static Type get instanceRuntimeType => _WorkerNavigatorImpl;

}
class _WorkerNavigatorImpl extends _WorkerNavigator implements js_library.JSObjectInterfacesDom {
  _WorkerNavigatorImpl.internal_() : super.internal_();
  get runtimeType => _WorkerNavigator;
  toString() => super.toString();
}
patch class _XMLHttpRequestProgressEvent {
  static Type get instanceRuntimeType => _XMLHttpRequestProgressEventImpl;

}
class _XMLHttpRequestProgressEventImpl extends _XMLHttpRequestProgressEvent implements js_library.JSObjectInterfacesDom {
  _XMLHttpRequestProgressEventImpl.internal_() : super.internal_();
  get runtimeType => _XMLHttpRequestProgressEvent;
  toString() => super.toString();
}

"""],"dart:indexed_db": ["dart:indexed_db", "dart:indexed_db_js_interop_patch.dart", """import 'dart:js' as js_library;

/**
 * Placeholder object for cases where we need to determine exactly how many
 * args were passed to a function.
 */
const _UNDEFINED_JS_CONST = const Object();

patch class Cursor {
  static Type get instanceRuntimeType => CursorImpl;

}
class CursorImpl extends Cursor implements js_library.JSObjectInterfacesDom {
  CursorImpl.internal_() : super.internal_();
  get runtimeType => Cursor;
  toString() => super.toString();
}
patch class CursorWithValue {
  static Type get instanceRuntimeType => CursorWithValueImpl;

}
class CursorWithValueImpl extends CursorWithValue implements js_library.JSObjectInterfacesDom {
  CursorWithValueImpl.internal_() : super.internal_();
  get runtimeType => CursorWithValue;
  toString() => super.toString();
}
patch class Database {
  static Type get instanceRuntimeType => DatabaseImpl;

}
class DatabaseImpl extends Database implements js_library.JSObjectInterfacesDom {
  DatabaseImpl.internal_() : super.internal_();
  get runtimeType => Database;
  toString() => super.toString();
}
patch class IdbFactory {
  static Type get instanceRuntimeType => IdbFactoryImpl;

}
class IdbFactoryImpl extends IdbFactory implements js_library.JSObjectInterfacesDom {
  IdbFactoryImpl.internal_() : super.internal_();
  get runtimeType => IdbFactory;
  toString() => super.toString();
}
patch class Index {
  static Type get instanceRuntimeType => IndexImpl;

}
class IndexImpl extends Index implements js_library.JSObjectInterfacesDom {
  IndexImpl.internal_() : super.internal_();
  get runtimeType => Index;
  toString() => super.toString();
}
patch class KeyRange {
  static Type get instanceRuntimeType => KeyRangeImpl;

}
class KeyRangeImpl extends KeyRange implements js_library.JSObjectInterfacesDom {
  KeyRangeImpl.internal_() : super.internal_();
  get runtimeType => KeyRange;
  toString() => super.toString();
}
patch class ObjectStore {
  static Type get instanceRuntimeType => ObjectStoreImpl;

}
class ObjectStoreImpl extends ObjectStore implements js_library.JSObjectInterfacesDom {
  ObjectStoreImpl.internal_() : super.internal_();
  get runtimeType => ObjectStore;
  toString() => super.toString();
}
patch class OpenDBRequest {
  static Type get instanceRuntimeType => OpenDBRequestImpl;

}
class OpenDBRequestImpl extends OpenDBRequest implements js_library.JSObjectInterfacesDom {
  OpenDBRequestImpl.internal_() : super.internal_();
  get runtimeType => OpenDBRequest;
  toString() => super.toString();
}
patch class Request {
  static Type get instanceRuntimeType => RequestImpl;

}
class RequestImpl extends Request implements js_library.JSObjectInterfacesDom {
  RequestImpl.internal_() : super.internal_();
  get runtimeType => Request;
  toString() => super.toString();
}
patch class Transaction {
  static Type get instanceRuntimeType => TransactionImpl;

}
class TransactionImpl extends Transaction implements js_library.JSObjectInterfacesDom {
  TransactionImpl.internal_() : super.internal_();
  get runtimeType => Transaction;
  toString() => super.toString();
}
patch class VersionChangeEvent {
  static Type get instanceRuntimeType => VersionChangeEventImpl;

}
class VersionChangeEventImpl extends VersionChangeEvent implements js_library.JSObjectInterfacesDom {
  VersionChangeEventImpl.internal_() : super.internal_();
  get runtimeType => VersionChangeEvent;
  toString() => super.toString();
}

"""],"dart:web_gl": ["dart:web_gl", "dart:web_gl_js_interop_patch.dart", """import 'dart:js' as js_library;

/**
 * Placeholder object for cases where we need to determine exactly how many
 * args were passed to a function.
 */
const _UNDEFINED_JS_CONST = const Object();

patch class ActiveInfo {
  static Type get instanceRuntimeType => ActiveInfoImpl;

}
class ActiveInfoImpl extends ActiveInfo implements js_library.JSObjectInterfacesDom {
  ActiveInfoImpl.internal_() : super.internal_();
  get runtimeType => ActiveInfo;
  toString() => super.toString();
}
patch class AngleInstancedArrays {
  static Type get instanceRuntimeType => AngleInstancedArraysImpl;

}
class AngleInstancedArraysImpl extends AngleInstancedArrays implements js_library.JSObjectInterfacesDom {
  AngleInstancedArraysImpl.internal_() : super.internal_();
  get runtimeType => AngleInstancedArrays;
  toString() => super.toString();
}
patch class Buffer {
  static Type get instanceRuntimeType => BufferImpl;

}
class BufferImpl extends Buffer implements js_library.JSObjectInterfacesDom {
  BufferImpl.internal_() : super.internal_();
  get runtimeType => Buffer;
  toString() => super.toString();
}
patch class ChromiumSubscribeUniform {
  static Type get instanceRuntimeType => ChromiumSubscribeUniformImpl;

}
class ChromiumSubscribeUniformImpl extends ChromiumSubscribeUniform implements js_library.JSObjectInterfacesDom {
  ChromiumSubscribeUniformImpl.internal_() : super.internal_();
  get runtimeType => ChromiumSubscribeUniform;
  toString() => super.toString();
}
patch class CompressedTextureAtc {
  static Type get instanceRuntimeType => CompressedTextureAtcImpl;

}
class CompressedTextureAtcImpl extends CompressedTextureAtc implements js_library.JSObjectInterfacesDom {
  CompressedTextureAtcImpl.internal_() : super.internal_();
  get runtimeType => CompressedTextureAtc;
  toString() => super.toString();
}
patch class CompressedTextureETC1 {
  static Type get instanceRuntimeType => CompressedTextureETC1Impl;

}
class CompressedTextureETC1Impl extends CompressedTextureETC1 implements js_library.JSObjectInterfacesDom {
  CompressedTextureETC1Impl.internal_() : super.internal_();
  get runtimeType => CompressedTextureETC1;
  toString() => super.toString();
}
patch class CompressedTexturePvrtc {
  static Type get instanceRuntimeType => CompressedTexturePvrtcImpl;

}
class CompressedTexturePvrtcImpl extends CompressedTexturePvrtc implements js_library.JSObjectInterfacesDom {
  CompressedTexturePvrtcImpl.internal_() : super.internal_();
  get runtimeType => CompressedTexturePvrtc;
  toString() => super.toString();
}
patch class CompressedTextureS3TC {
  static Type get instanceRuntimeType => CompressedTextureS3TCImpl;

}
class CompressedTextureS3TCImpl extends CompressedTextureS3TC implements js_library.JSObjectInterfacesDom {
  CompressedTextureS3TCImpl.internal_() : super.internal_();
  get runtimeType => CompressedTextureS3TC;
  toString() => super.toString();
}
patch class ContextEvent {
  static Type get instanceRuntimeType => ContextEventImpl;

}
class ContextEventImpl extends ContextEvent implements js_library.JSObjectInterfacesDom {
  ContextEventImpl.internal_() : super.internal_();
  get runtimeType => ContextEvent;
  toString() => super.toString();
}
patch class DebugRendererInfo {
  static Type get instanceRuntimeType => DebugRendererInfoImpl;

}
class DebugRendererInfoImpl extends DebugRendererInfo implements js_library.JSObjectInterfacesDom {
  DebugRendererInfoImpl.internal_() : super.internal_();
  get runtimeType => DebugRendererInfo;
  toString() => super.toString();
}
patch class DebugShaders {
  static Type get instanceRuntimeType => DebugShadersImpl;

}
class DebugShadersImpl extends DebugShaders implements js_library.JSObjectInterfacesDom {
  DebugShadersImpl.internal_() : super.internal_();
  get runtimeType => DebugShaders;
  toString() => super.toString();
}
patch class DepthTexture {
  static Type get instanceRuntimeType => DepthTextureImpl;

}
class DepthTextureImpl extends DepthTexture implements js_library.JSObjectInterfacesDom {
  DepthTextureImpl.internal_() : super.internal_();
  get runtimeType => DepthTexture;
  toString() => super.toString();
}
patch class DrawBuffers {
  static Type get instanceRuntimeType => DrawBuffersImpl;

}
class DrawBuffersImpl extends DrawBuffers implements js_library.JSObjectInterfacesDom {
  DrawBuffersImpl.internal_() : super.internal_();
  get runtimeType => DrawBuffers;
  toString() => super.toString();
}
patch class EXTsRgb {
  static Type get instanceRuntimeType => EXTsRgbImpl;

}
class EXTsRgbImpl extends EXTsRgb implements js_library.JSObjectInterfacesDom {
  EXTsRgbImpl.internal_() : super.internal_();
  get runtimeType => EXTsRgb;
  toString() => super.toString();
}
patch class ExtBlendMinMax {
  static Type get instanceRuntimeType => ExtBlendMinMaxImpl;

}
class ExtBlendMinMaxImpl extends ExtBlendMinMax implements js_library.JSObjectInterfacesDom {
  ExtBlendMinMaxImpl.internal_() : super.internal_();
  get runtimeType => ExtBlendMinMax;
  toString() => super.toString();
}
patch class ExtFragDepth {
  static Type get instanceRuntimeType => ExtFragDepthImpl;

}
class ExtFragDepthImpl extends ExtFragDepth implements js_library.JSObjectInterfacesDom {
  ExtFragDepthImpl.internal_() : super.internal_();
  get runtimeType => ExtFragDepth;
  toString() => super.toString();
}
patch class ExtShaderTextureLod {
  static Type get instanceRuntimeType => ExtShaderTextureLodImpl;

}
class ExtShaderTextureLodImpl extends ExtShaderTextureLod implements js_library.JSObjectInterfacesDom {
  ExtShaderTextureLodImpl.internal_() : super.internal_();
  get runtimeType => ExtShaderTextureLod;
  toString() => super.toString();
}
patch class ExtTextureFilterAnisotropic {
  static Type get instanceRuntimeType => ExtTextureFilterAnisotropicImpl;

}
class ExtTextureFilterAnisotropicImpl extends ExtTextureFilterAnisotropic implements js_library.JSObjectInterfacesDom {
  ExtTextureFilterAnisotropicImpl.internal_() : super.internal_();
  get runtimeType => ExtTextureFilterAnisotropic;
  toString() => super.toString();
}
patch class Framebuffer {
  static Type get instanceRuntimeType => FramebufferImpl;

}
class FramebufferImpl extends Framebuffer implements js_library.JSObjectInterfacesDom {
  FramebufferImpl.internal_() : super.internal_();
  get runtimeType => Framebuffer;
  toString() => super.toString();
}
patch class LoseContext {
  static Type get instanceRuntimeType => LoseContextImpl;

}
class LoseContextImpl extends LoseContext implements js_library.JSObjectInterfacesDom {
  LoseContextImpl.internal_() : super.internal_();
  get runtimeType => LoseContext;
  toString() => super.toString();
}
patch class OesElementIndexUint {
  static Type get instanceRuntimeType => OesElementIndexUintImpl;

}
class OesElementIndexUintImpl extends OesElementIndexUint implements js_library.JSObjectInterfacesDom {
  OesElementIndexUintImpl.internal_() : super.internal_();
  get runtimeType => OesElementIndexUint;
  toString() => super.toString();
}
patch class OesStandardDerivatives {
  static Type get instanceRuntimeType => OesStandardDerivativesImpl;

}
class OesStandardDerivativesImpl extends OesStandardDerivatives implements js_library.JSObjectInterfacesDom {
  OesStandardDerivativesImpl.internal_() : super.internal_();
  get runtimeType => OesStandardDerivatives;
  toString() => super.toString();
}
patch class OesTextureFloat {
  static Type get instanceRuntimeType => OesTextureFloatImpl;

}
class OesTextureFloatImpl extends OesTextureFloat implements js_library.JSObjectInterfacesDom {
  OesTextureFloatImpl.internal_() : super.internal_();
  get runtimeType => OesTextureFloat;
  toString() => super.toString();
}
patch class OesTextureFloatLinear {
  static Type get instanceRuntimeType => OesTextureFloatLinearImpl;

}
class OesTextureFloatLinearImpl extends OesTextureFloatLinear implements js_library.JSObjectInterfacesDom {
  OesTextureFloatLinearImpl.internal_() : super.internal_();
  get runtimeType => OesTextureFloatLinear;
  toString() => super.toString();
}
patch class OesTextureHalfFloat {
  static Type get instanceRuntimeType => OesTextureHalfFloatImpl;

}
class OesTextureHalfFloatImpl extends OesTextureHalfFloat implements js_library.JSObjectInterfacesDom {
  OesTextureHalfFloatImpl.internal_() : super.internal_();
  get runtimeType => OesTextureHalfFloat;
  toString() => super.toString();
}
patch class OesTextureHalfFloatLinear {
  static Type get instanceRuntimeType => OesTextureHalfFloatLinearImpl;

}
class OesTextureHalfFloatLinearImpl extends OesTextureHalfFloatLinear implements js_library.JSObjectInterfacesDom {
  OesTextureHalfFloatLinearImpl.internal_() : super.internal_();
  get runtimeType => OesTextureHalfFloatLinear;
  toString() => super.toString();
}
patch class OesVertexArrayObject {
  static Type get instanceRuntimeType => OesVertexArrayObjectImpl;

}
class OesVertexArrayObjectImpl extends OesVertexArrayObject implements js_library.JSObjectInterfacesDom {
  OesVertexArrayObjectImpl.internal_() : super.internal_();
  get runtimeType => OesVertexArrayObject;
  toString() => super.toString();
}
patch class Program {
  static Type get instanceRuntimeType => ProgramImpl;

}
class ProgramImpl extends Program implements js_library.JSObjectInterfacesDom {
  ProgramImpl.internal_() : super.internal_();
  get runtimeType => Program;
  toString() => super.toString();
}
patch class Query {
  static Type get instanceRuntimeType => QueryImpl;

}
class QueryImpl extends Query implements js_library.JSObjectInterfacesDom {
  QueryImpl.internal_() : super.internal_();
  get runtimeType => Query;
  toString() => super.toString();
}
patch class Renderbuffer {
  static Type get instanceRuntimeType => RenderbufferImpl;

}
class RenderbufferImpl extends Renderbuffer implements js_library.JSObjectInterfacesDom {
  RenderbufferImpl.internal_() : super.internal_();
  get runtimeType => Renderbuffer;
  toString() => super.toString();
}
patch class RenderingContext {
  static Type get instanceRuntimeType => RenderingContextImpl;

}
class RenderingContextImpl extends RenderingContext implements js_library.JSObjectInterfacesDom {
  RenderingContextImpl.internal_() : super.internal_();
  get runtimeType => RenderingContext;
  toString() => super.toString();
}
patch class RenderingContext2 {
  static Type get instanceRuntimeType => RenderingContext2Impl;

}
class RenderingContext2Impl extends RenderingContext2 implements js_library.JSObjectInterfacesDom {
  RenderingContext2Impl.internal_() : super.internal_();
  get runtimeType => RenderingContext2;
  toString() => super.toString();
}
patch class Sampler {
  static Type get instanceRuntimeType => SamplerImpl;

}
class SamplerImpl extends Sampler implements js_library.JSObjectInterfacesDom {
  SamplerImpl.internal_() : super.internal_();
  get runtimeType => Sampler;
  toString() => super.toString();
}
patch class Shader {
  static Type get instanceRuntimeType => ShaderImpl;

}
class ShaderImpl extends Shader implements js_library.JSObjectInterfacesDom {
  ShaderImpl.internal_() : super.internal_();
  get runtimeType => Shader;
  toString() => super.toString();
}
patch class ShaderPrecisionFormat {
  static Type get instanceRuntimeType => ShaderPrecisionFormatImpl;

}
class ShaderPrecisionFormatImpl extends ShaderPrecisionFormat implements js_library.JSObjectInterfacesDom {
  ShaderPrecisionFormatImpl.internal_() : super.internal_();
  get runtimeType => ShaderPrecisionFormat;
  toString() => super.toString();
}
patch class Sync {
  static Type get instanceRuntimeType => SyncImpl;

}
class SyncImpl extends Sync implements js_library.JSObjectInterfacesDom {
  SyncImpl.internal_() : super.internal_();
  get runtimeType => Sync;
  toString() => super.toString();
}
patch class Texture {
  static Type get instanceRuntimeType => TextureImpl;

}
class TextureImpl extends Texture implements js_library.JSObjectInterfacesDom {
  TextureImpl.internal_() : super.internal_();
  get runtimeType => Texture;
  toString() => super.toString();
}
patch class TransformFeedback {
  static Type get instanceRuntimeType => TransformFeedbackImpl;

}
class TransformFeedbackImpl extends TransformFeedback implements js_library.JSObjectInterfacesDom {
  TransformFeedbackImpl.internal_() : super.internal_();
  get runtimeType => TransformFeedback;
  toString() => super.toString();
}
patch class UniformLocation {
  static Type get instanceRuntimeType => UniformLocationImpl;

}
class UniformLocationImpl extends UniformLocation implements js_library.JSObjectInterfacesDom {
  UniformLocationImpl.internal_() : super.internal_();
  get runtimeType => UniformLocation;
  toString() => super.toString();
}
patch class VertexArrayObject {
  static Type get instanceRuntimeType => VertexArrayObjectImpl;

}
class VertexArrayObjectImpl extends VertexArrayObject implements js_library.JSObjectInterfacesDom {
  VertexArrayObjectImpl.internal_() : super.internal_();
  get runtimeType => VertexArrayObject;
  toString() => super.toString();
}
patch class VertexArrayObjectOes {
  static Type get instanceRuntimeType => VertexArrayObjectOesImpl;

}
class VertexArrayObjectOesImpl extends VertexArrayObjectOes implements js_library.JSObjectInterfacesDom {
  VertexArrayObjectOesImpl.internal_() : super.internal_();
  get runtimeType => VertexArrayObjectOes;
  toString() => super.toString();
}
patch class _WebGL2RenderingContextBase {
  static Type get instanceRuntimeType => _WebGL2RenderingContextBaseImpl;

}
class _WebGL2RenderingContextBaseImpl extends _WebGL2RenderingContextBase implements js_library.JSObjectInterfacesDom {
  _WebGL2RenderingContextBaseImpl.internal_() : super.internal_();
  get runtimeType => _WebGL2RenderingContextBase;
  toString() => super.toString();
}
patch class _WebGLRenderingContextBase {
  static Type get instanceRuntimeType => _WebGLRenderingContextBaseImpl;

}
class _WebGLRenderingContextBaseImpl extends _WebGLRenderingContextBase implements js_library.JSObjectInterfacesDom {
  _WebGLRenderingContextBaseImpl.internal_() : super.internal_();
  get runtimeType => _WebGLRenderingContextBase;
  toString() => super.toString();
}

"""],"dart:web_sql": ["dart:web_sql", "dart:web_sql_js_interop_patch.dart", """import 'dart:js' as js_library;

/**
 * Placeholder object for cases where we need to determine exactly how many
 * args were passed to a function.
 */
const _UNDEFINED_JS_CONST = const Object();

patch class SqlDatabase {
  static Type get instanceRuntimeType => SqlDatabaseImpl;

}
class SqlDatabaseImpl extends SqlDatabase implements js_library.JSObjectInterfacesDom {
  SqlDatabaseImpl.internal_() : super.internal_();
  get runtimeType => SqlDatabase;
  toString() => super.toString();
}
patch class SqlError {
  static Type get instanceRuntimeType => SqlErrorImpl;

}
class SqlErrorImpl extends SqlError implements js_library.JSObjectInterfacesDom {
  SqlErrorImpl.internal_() : super.internal_();
  get runtimeType => SqlError;
  toString() => super.toString();
}
patch class SqlResultSet {
  static Type get instanceRuntimeType => SqlResultSetImpl;

}
class SqlResultSetImpl extends SqlResultSet implements js_library.JSObjectInterfacesDom {
  SqlResultSetImpl.internal_() : super.internal_();
  get runtimeType => SqlResultSet;
  toString() => super.toString();
}
patch class SqlResultSetRowList {
  static Type get instanceRuntimeType => SqlResultSetRowListImpl;

}
class SqlResultSetRowListImpl extends SqlResultSetRowList implements js_library.JSObjectInterfacesDom {
  SqlResultSetRowListImpl.internal_() : super.internal_();
  get runtimeType => SqlResultSetRowList;
  toString() => super.toString();
}
patch class SqlTransaction {
  static Type get instanceRuntimeType => SqlTransactionImpl;

}
class SqlTransactionImpl extends SqlTransaction implements js_library.JSObjectInterfacesDom {
  SqlTransactionImpl.internal_() : super.internal_();
  get runtimeType => SqlTransaction;
  toString() => super.toString();
}

"""],"dart:svg": ["dart:svg", "dart:svg_js_interop_patch.dart", """import 'dart:js' as js_library;

/**
 * Placeholder object for cases where we need to determine exactly how many
 * args were passed to a function.
 */
const _UNDEFINED_JS_CONST = const Object();

patch class AElement {
  static Type get instanceRuntimeType => AElementImpl;

}
class AElementImpl extends AElement implements js_library.JSObjectInterfacesDom {
  AElementImpl.internal_() : super.internal_();
  get runtimeType => AElement;
  toString() => super.toString();
}
patch class Angle {
  static Type get instanceRuntimeType => AngleImpl;

}
class AngleImpl extends Angle implements js_library.JSObjectInterfacesDom {
  AngleImpl.internal_() : super.internal_();
  get runtimeType => Angle;
  toString() => super.toString();
}
patch class AnimateElement {
  static Type get instanceRuntimeType => AnimateElementImpl;

}
class AnimateElementImpl extends AnimateElement implements js_library.JSObjectInterfacesDom {
  AnimateElementImpl.internal_() : super.internal_();
  get runtimeType => AnimateElement;
  toString() => super.toString();
}
patch class AnimateMotionElement {
  static Type get instanceRuntimeType => AnimateMotionElementImpl;

}
class AnimateMotionElementImpl extends AnimateMotionElement implements js_library.JSObjectInterfacesDom {
  AnimateMotionElementImpl.internal_() : super.internal_();
  get runtimeType => AnimateMotionElement;
  toString() => super.toString();
}
patch class AnimateTransformElement {
  static Type get instanceRuntimeType => AnimateTransformElementImpl;

}
class AnimateTransformElementImpl extends AnimateTransformElement implements js_library.JSObjectInterfacesDom {
  AnimateTransformElementImpl.internal_() : super.internal_();
  get runtimeType => AnimateTransformElement;
  toString() => super.toString();
}
patch class AnimatedAngle {
  static Type get instanceRuntimeType => AnimatedAngleImpl;

}
class AnimatedAngleImpl extends AnimatedAngle implements js_library.JSObjectInterfacesDom {
  AnimatedAngleImpl.internal_() : super.internal_();
  get runtimeType => AnimatedAngle;
  toString() => super.toString();
}
patch class AnimatedBoolean {
  static Type get instanceRuntimeType => AnimatedBooleanImpl;

}
class AnimatedBooleanImpl extends AnimatedBoolean implements js_library.JSObjectInterfacesDom {
  AnimatedBooleanImpl.internal_() : super.internal_();
  get runtimeType => AnimatedBoolean;
  toString() => super.toString();
}
patch class AnimatedEnumeration {
  static Type get instanceRuntimeType => AnimatedEnumerationImpl;

}
class AnimatedEnumerationImpl extends AnimatedEnumeration implements js_library.JSObjectInterfacesDom {
  AnimatedEnumerationImpl.internal_() : super.internal_();
  get runtimeType => AnimatedEnumeration;
  toString() => super.toString();
}
patch class AnimatedInteger {
  static Type get instanceRuntimeType => AnimatedIntegerImpl;

}
class AnimatedIntegerImpl extends AnimatedInteger implements js_library.JSObjectInterfacesDom {
  AnimatedIntegerImpl.internal_() : super.internal_();
  get runtimeType => AnimatedInteger;
  toString() => super.toString();
}
patch class AnimatedLength {
  static Type get instanceRuntimeType => AnimatedLengthImpl;

}
class AnimatedLengthImpl extends AnimatedLength implements js_library.JSObjectInterfacesDom {
  AnimatedLengthImpl.internal_() : super.internal_();
  get runtimeType => AnimatedLength;
  toString() => super.toString();
}
patch class AnimatedLengthList {
  static Type get instanceRuntimeType => AnimatedLengthListImpl;

}
class AnimatedLengthListImpl extends AnimatedLengthList implements js_library.JSObjectInterfacesDom {
  AnimatedLengthListImpl.internal_() : super.internal_();
  get runtimeType => AnimatedLengthList;
  toString() => super.toString();
}
patch class AnimatedNumber {
  static Type get instanceRuntimeType => AnimatedNumberImpl;

}
class AnimatedNumberImpl extends AnimatedNumber implements js_library.JSObjectInterfacesDom {
  AnimatedNumberImpl.internal_() : super.internal_();
  get runtimeType => AnimatedNumber;
  toString() => super.toString();
}
patch class AnimatedNumberList {
  static Type get instanceRuntimeType => AnimatedNumberListImpl;

}
class AnimatedNumberListImpl extends AnimatedNumberList implements js_library.JSObjectInterfacesDom {
  AnimatedNumberListImpl.internal_() : super.internal_();
  get runtimeType => AnimatedNumberList;
  toString() => super.toString();
}
patch class AnimatedPreserveAspectRatio {
  static Type get instanceRuntimeType => AnimatedPreserveAspectRatioImpl;

}
class AnimatedPreserveAspectRatioImpl extends AnimatedPreserveAspectRatio implements js_library.JSObjectInterfacesDom {
  AnimatedPreserveAspectRatioImpl.internal_() : super.internal_();
  get runtimeType => AnimatedPreserveAspectRatio;
  toString() => super.toString();
}
patch class AnimatedRect {
  static Type get instanceRuntimeType => AnimatedRectImpl;

}
class AnimatedRectImpl extends AnimatedRect implements js_library.JSObjectInterfacesDom {
  AnimatedRectImpl.internal_() : super.internal_();
  get runtimeType => AnimatedRect;
  toString() => super.toString();
}
patch class AnimatedString {
  static Type get instanceRuntimeType => AnimatedStringImpl;

}
class AnimatedStringImpl extends AnimatedString implements js_library.JSObjectInterfacesDom {
  AnimatedStringImpl.internal_() : super.internal_();
  get runtimeType => AnimatedString;
  toString() => super.toString();
}
patch class AnimatedTransformList {
  static Type get instanceRuntimeType => AnimatedTransformListImpl;

}
class AnimatedTransformListImpl extends AnimatedTransformList implements js_library.JSObjectInterfacesDom {
  AnimatedTransformListImpl.internal_() : super.internal_();
  get runtimeType => AnimatedTransformList;
  toString() => super.toString();
}
patch class AnimationElement {
  static Type get instanceRuntimeType => AnimationElementImpl;

}
class AnimationElementImpl extends AnimationElement implements js_library.JSObjectInterfacesDom {
  AnimationElementImpl.internal_() : super.internal_();
  get runtimeType => AnimationElement;
  toString() => super.toString();
}
patch class CircleElement {
  static Type get instanceRuntimeType => CircleElementImpl;

}
class CircleElementImpl extends CircleElement implements js_library.JSObjectInterfacesDom {
  CircleElementImpl.internal_() : super.internal_();
  get runtimeType => CircleElement;
  toString() => super.toString();
}
patch class ClipPathElement {
  static Type get instanceRuntimeType => ClipPathElementImpl;

}
class ClipPathElementImpl extends ClipPathElement implements js_library.JSObjectInterfacesDom {
  ClipPathElementImpl.internal_() : super.internal_();
  get runtimeType => ClipPathElement;
  toString() => super.toString();
}
patch class DefsElement {
  static Type get instanceRuntimeType => DefsElementImpl;

}
class DefsElementImpl extends DefsElement implements js_library.JSObjectInterfacesDom {
  DefsElementImpl.internal_() : super.internal_();
  get runtimeType => DefsElement;
  toString() => super.toString();
}
patch class DescElement {
  static Type get instanceRuntimeType => DescElementImpl;

}
class DescElementImpl extends DescElement implements js_library.JSObjectInterfacesDom {
  DescElementImpl.internal_() : super.internal_();
  get runtimeType => DescElement;
  toString() => super.toString();
}
patch class DiscardElement {
  static Type get instanceRuntimeType => DiscardElementImpl;

}
class DiscardElementImpl extends DiscardElement implements js_library.JSObjectInterfacesDom {
  DiscardElementImpl.internal_() : super.internal_();
  get runtimeType => DiscardElement;
  toString() => super.toString();
}
patch class EllipseElement {
  static Type get instanceRuntimeType => EllipseElementImpl;

}
class EllipseElementImpl extends EllipseElement implements js_library.JSObjectInterfacesDom {
  EllipseElementImpl.internal_() : super.internal_();
  get runtimeType => EllipseElement;
  toString() => super.toString();
}
patch class FEBlendElement {
  static Type get instanceRuntimeType => FEBlendElementImpl;

}
class FEBlendElementImpl extends FEBlendElement implements js_library.JSObjectInterfacesDom {
  FEBlendElementImpl.internal_() : super.internal_();
  get runtimeType => FEBlendElement;
  toString() => super.toString();
}
patch class FEColorMatrixElement {
  static Type get instanceRuntimeType => FEColorMatrixElementImpl;

}
class FEColorMatrixElementImpl extends FEColorMatrixElement implements js_library.JSObjectInterfacesDom {
  FEColorMatrixElementImpl.internal_() : super.internal_();
  get runtimeType => FEColorMatrixElement;
  toString() => super.toString();
}
patch class FEComponentTransferElement {
  static Type get instanceRuntimeType => FEComponentTransferElementImpl;

}
class FEComponentTransferElementImpl extends FEComponentTransferElement implements js_library.JSObjectInterfacesDom {
  FEComponentTransferElementImpl.internal_() : super.internal_();
  get runtimeType => FEComponentTransferElement;
  toString() => super.toString();
}
patch class FECompositeElement {
  static Type get instanceRuntimeType => FECompositeElementImpl;

}
class FECompositeElementImpl extends FECompositeElement implements js_library.JSObjectInterfacesDom {
  FECompositeElementImpl.internal_() : super.internal_();
  get runtimeType => FECompositeElement;
  toString() => super.toString();
}
patch class FEConvolveMatrixElement {
  static Type get instanceRuntimeType => FEConvolveMatrixElementImpl;

}
class FEConvolveMatrixElementImpl extends FEConvolveMatrixElement implements js_library.JSObjectInterfacesDom {
  FEConvolveMatrixElementImpl.internal_() : super.internal_();
  get runtimeType => FEConvolveMatrixElement;
  toString() => super.toString();
}
patch class FEDiffuseLightingElement {
  static Type get instanceRuntimeType => FEDiffuseLightingElementImpl;

}
class FEDiffuseLightingElementImpl extends FEDiffuseLightingElement implements js_library.JSObjectInterfacesDom {
  FEDiffuseLightingElementImpl.internal_() : super.internal_();
  get runtimeType => FEDiffuseLightingElement;
  toString() => super.toString();
}
patch class FEDisplacementMapElement {
  static Type get instanceRuntimeType => FEDisplacementMapElementImpl;

}
class FEDisplacementMapElementImpl extends FEDisplacementMapElement implements js_library.JSObjectInterfacesDom {
  FEDisplacementMapElementImpl.internal_() : super.internal_();
  get runtimeType => FEDisplacementMapElement;
  toString() => super.toString();
}
patch class FEDistantLightElement {
  static Type get instanceRuntimeType => FEDistantLightElementImpl;

}
class FEDistantLightElementImpl extends FEDistantLightElement implements js_library.JSObjectInterfacesDom {
  FEDistantLightElementImpl.internal_() : super.internal_();
  get runtimeType => FEDistantLightElement;
  toString() => super.toString();
}
patch class FEFloodElement {
  static Type get instanceRuntimeType => FEFloodElementImpl;

}
class FEFloodElementImpl extends FEFloodElement implements js_library.JSObjectInterfacesDom {
  FEFloodElementImpl.internal_() : super.internal_();
  get runtimeType => FEFloodElement;
  toString() => super.toString();
}
patch class FEFuncAElement {
  static Type get instanceRuntimeType => FEFuncAElementImpl;

}
class FEFuncAElementImpl extends FEFuncAElement implements js_library.JSObjectInterfacesDom {
  FEFuncAElementImpl.internal_() : super.internal_();
  get runtimeType => FEFuncAElement;
  toString() => super.toString();
}
patch class FEFuncBElement {
  static Type get instanceRuntimeType => FEFuncBElementImpl;

}
class FEFuncBElementImpl extends FEFuncBElement implements js_library.JSObjectInterfacesDom {
  FEFuncBElementImpl.internal_() : super.internal_();
  get runtimeType => FEFuncBElement;
  toString() => super.toString();
}
patch class FEFuncGElement {
  static Type get instanceRuntimeType => FEFuncGElementImpl;

}
class FEFuncGElementImpl extends FEFuncGElement implements js_library.JSObjectInterfacesDom {
  FEFuncGElementImpl.internal_() : super.internal_();
  get runtimeType => FEFuncGElement;
  toString() => super.toString();
}
patch class FEFuncRElement {
  static Type get instanceRuntimeType => FEFuncRElementImpl;

}
class FEFuncRElementImpl extends FEFuncRElement implements js_library.JSObjectInterfacesDom {
  FEFuncRElementImpl.internal_() : super.internal_();
  get runtimeType => FEFuncRElement;
  toString() => super.toString();
}
patch class FEGaussianBlurElement {
  static Type get instanceRuntimeType => FEGaussianBlurElementImpl;

}
class FEGaussianBlurElementImpl extends FEGaussianBlurElement implements js_library.JSObjectInterfacesDom {
  FEGaussianBlurElementImpl.internal_() : super.internal_();
  get runtimeType => FEGaussianBlurElement;
  toString() => super.toString();
}
patch class FEImageElement {
  static Type get instanceRuntimeType => FEImageElementImpl;

}
class FEImageElementImpl extends FEImageElement implements js_library.JSObjectInterfacesDom {
  FEImageElementImpl.internal_() : super.internal_();
  get runtimeType => FEImageElement;
  toString() => super.toString();
}
patch class FEMergeElement {
  static Type get instanceRuntimeType => FEMergeElementImpl;

}
class FEMergeElementImpl extends FEMergeElement implements js_library.JSObjectInterfacesDom {
  FEMergeElementImpl.internal_() : super.internal_();
  get runtimeType => FEMergeElement;
  toString() => super.toString();
}
patch class FEMergeNodeElement {
  static Type get instanceRuntimeType => FEMergeNodeElementImpl;

}
class FEMergeNodeElementImpl extends FEMergeNodeElement implements js_library.JSObjectInterfacesDom {
  FEMergeNodeElementImpl.internal_() : super.internal_();
  get runtimeType => FEMergeNodeElement;
  toString() => super.toString();
}
patch class FEMorphologyElement {
  static Type get instanceRuntimeType => FEMorphologyElementImpl;

}
class FEMorphologyElementImpl extends FEMorphologyElement implements js_library.JSObjectInterfacesDom {
  FEMorphologyElementImpl.internal_() : super.internal_();
  get runtimeType => FEMorphologyElement;
  toString() => super.toString();
}
patch class FEOffsetElement {
  static Type get instanceRuntimeType => FEOffsetElementImpl;

}
class FEOffsetElementImpl extends FEOffsetElement implements js_library.JSObjectInterfacesDom {
  FEOffsetElementImpl.internal_() : super.internal_();
  get runtimeType => FEOffsetElement;
  toString() => super.toString();
}
patch class FEPointLightElement {
  static Type get instanceRuntimeType => FEPointLightElementImpl;

}
class FEPointLightElementImpl extends FEPointLightElement implements js_library.JSObjectInterfacesDom {
  FEPointLightElementImpl.internal_() : super.internal_();
  get runtimeType => FEPointLightElement;
  toString() => super.toString();
}
patch class FESpecularLightingElement {
  static Type get instanceRuntimeType => FESpecularLightingElementImpl;

}
class FESpecularLightingElementImpl extends FESpecularLightingElement implements js_library.JSObjectInterfacesDom {
  FESpecularLightingElementImpl.internal_() : super.internal_();
  get runtimeType => FESpecularLightingElement;
  toString() => super.toString();
}
patch class FESpotLightElement {
  static Type get instanceRuntimeType => FESpotLightElementImpl;

}
class FESpotLightElementImpl extends FESpotLightElement implements js_library.JSObjectInterfacesDom {
  FESpotLightElementImpl.internal_() : super.internal_();
  get runtimeType => FESpotLightElement;
  toString() => super.toString();
}
patch class FETileElement {
  static Type get instanceRuntimeType => FETileElementImpl;

}
class FETileElementImpl extends FETileElement implements js_library.JSObjectInterfacesDom {
  FETileElementImpl.internal_() : super.internal_();
  get runtimeType => FETileElement;
  toString() => super.toString();
}
patch class FETurbulenceElement {
  static Type get instanceRuntimeType => FETurbulenceElementImpl;

}
class FETurbulenceElementImpl extends FETurbulenceElement implements js_library.JSObjectInterfacesDom {
  FETurbulenceElementImpl.internal_() : super.internal_();
  get runtimeType => FETurbulenceElement;
  toString() => super.toString();
}
patch class FilterElement {
  static Type get instanceRuntimeType => FilterElementImpl;

}
class FilterElementImpl extends FilterElement implements js_library.JSObjectInterfacesDom {
  FilterElementImpl.internal_() : super.internal_();
  get runtimeType => FilterElement;
  toString() => super.toString();
}
patch class FilterPrimitiveStandardAttributes {
  static Type get instanceRuntimeType => FilterPrimitiveStandardAttributesImpl;

}
class FilterPrimitiveStandardAttributesImpl extends FilterPrimitiveStandardAttributes implements js_library.JSObjectInterfacesDom {
  FilterPrimitiveStandardAttributesImpl.internal_() : super.internal_();
  get runtimeType => FilterPrimitiveStandardAttributes;
  toString() => super.toString();
}
patch class FitToViewBox {
  static Type get instanceRuntimeType => FitToViewBoxImpl;

}
class FitToViewBoxImpl extends FitToViewBox implements js_library.JSObjectInterfacesDom {
  FitToViewBoxImpl.internal_() : super.internal_();
  get runtimeType => FitToViewBox;
  toString() => super.toString();
}
patch class ForeignObjectElement {
  static Type get instanceRuntimeType => ForeignObjectElementImpl;

}
class ForeignObjectElementImpl extends ForeignObjectElement implements js_library.JSObjectInterfacesDom {
  ForeignObjectElementImpl.internal_() : super.internal_();
  get runtimeType => ForeignObjectElement;
  toString() => super.toString();
}
patch class GElement {
  static Type get instanceRuntimeType => GElementImpl;

}
class GElementImpl extends GElement implements js_library.JSObjectInterfacesDom {
  GElementImpl.internal_() : super.internal_();
  get runtimeType => GElement;
  toString() => super.toString();
}
patch class GeometryElement {
  static Type get instanceRuntimeType => GeometryElementImpl;

}
class GeometryElementImpl extends GeometryElement implements js_library.JSObjectInterfacesDom {
  GeometryElementImpl.internal_() : super.internal_();
  get runtimeType => GeometryElement;
  toString() => super.toString();
}
patch class GraphicsElement {
  static Type get instanceRuntimeType => GraphicsElementImpl;

}
class GraphicsElementImpl extends GraphicsElement implements js_library.JSObjectInterfacesDom {
  GraphicsElementImpl.internal_() : super.internal_();
  get runtimeType => GraphicsElement;
  toString() => super.toString();
}
patch class ImageElement {
  static Type get instanceRuntimeType => ImageElementImpl;

}
class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
  ImageElementImpl.internal_() : super.internal_();
  get runtimeType => ImageElement;
  toString() => super.toString();
}
patch class Length {
  static Type get instanceRuntimeType => LengthImpl;

}
class LengthImpl extends Length implements js_library.JSObjectInterfacesDom {
  LengthImpl.internal_() : super.internal_();
  get runtimeType => Length;
  toString() => super.toString();
}
patch class LengthList {
  static Type get instanceRuntimeType => LengthListImpl;

}
class LengthListImpl extends LengthList implements js_library.JSObjectInterfacesDom {
  LengthListImpl.internal_() : super.internal_();
  get runtimeType => LengthList;
  toString() => super.toString();
}
patch class LineElement {
  static Type get instanceRuntimeType => LineElementImpl;

}
class LineElementImpl extends LineElement implements js_library.JSObjectInterfacesDom {
  LineElementImpl.internal_() : super.internal_();
  get runtimeType => LineElement;
  toString() => super.toString();
}
patch class LinearGradientElement {
  static Type get instanceRuntimeType => LinearGradientElementImpl;

}
class LinearGradientElementImpl extends LinearGradientElement implements js_library.JSObjectInterfacesDom {
  LinearGradientElementImpl.internal_() : super.internal_();
  get runtimeType => LinearGradientElement;
  toString() => super.toString();
}
patch class MarkerElement {
  static Type get instanceRuntimeType => MarkerElementImpl;

}
class MarkerElementImpl extends MarkerElement implements js_library.JSObjectInterfacesDom {
  MarkerElementImpl.internal_() : super.internal_();
  get runtimeType => MarkerElement;
  toString() => super.toString();
}
patch class MaskElement {
  static Type get instanceRuntimeType => MaskElementImpl;

}
class MaskElementImpl extends MaskElement implements js_library.JSObjectInterfacesDom {
  MaskElementImpl.internal_() : super.internal_();
  get runtimeType => MaskElement;
  toString() => super.toString();
}
patch class Matrix {
  static Type get instanceRuntimeType => MatrixImpl;

}
class MatrixImpl extends Matrix implements js_library.JSObjectInterfacesDom {
  MatrixImpl.internal_() : super.internal_();
  get runtimeType => Matrix;
  toString() => super.toString();
}
patch class MetadataElement {
  static Type get instanceRuntimeType => MetadataElementImpl;

}
class MetadataElementImpl extends MetadataElement implements js_library.JSObjectInterfacesDom {
  MetadataElementImpl.internal_() : super.internal_();
  get runtimeType => MetadataElement;
  toString() => super.toString();
}
patch class Number {
  static Type get instanceRuntimeType => NumberImpl;

}
class NumberImpl extends Number implements js_library.JSObjectInterfacesDom {
  NumberImpl.internal_() : super.internal_();
  get runtimeType => Number;
  toString() => super.toString();
}
patch class NumberList {
  static Type get instanceRuntimeType => NumberListImpl;

}
class NumberListImpl extends NumberList implements js_library.JSObjectInterfacesDom {
  NumberListImpl.internal_() : super.internal_();
  get runtimeType => NumberList;
  toString() => super.toString();
}
patch class PathElement {
  static Type get instanceRuntimeType => PathElementImpl;

}
class PathElementImpl extends PathElement implements js_library.JSObjectInterfacesDom {
  PathElementImpl.internal_() : super.internal_();
  get runtimeType => PathElement;
  toString() => super.toString();
}
patch class PathSeg {
  static Type get instanceRuntimeType => PathSegImpl;

}
class PathSegImpl extends PathSeg implements js_library.JSObjectInterfacesDom {
  PathSegImpl.internal_() : super.internal_();
  get runtimeType => PathSeg;
  toString() => super.toString();
}
patch class PathSegArcAbs {
  static Type get instanceRuntimeType => PathSegArcAbsImpl;

}
class PathSegArcAbsImpl extends PathSegArcAbs implements js_library.JSObjectInterfacesDom {
  PathSegArcAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegArcAbs;
  toString() => super.toString();
}
patch class PathSegArcRel {
  static Type get instanceRuntimeType => PathSegArcRelImpl;

}
class PathSegArcRelImpl extends PathSegArcRel implements js_library.JSObjectInterfacesDom {
  PathSegArcRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegArcRel;
  toString() => super.toString();
}
patch class PathSegClosePath {
  static Type get instanceRuntimeType => PathSegClosePathImpl;

}
class PathSegClosePathImpl extends PathSegClosePath implements js_library.JSObjectInterfacesDom {
  PathSegClosePathImpl.internal_() : super.internal_();
  get runtimeType => PathSegClosePath;
  toString() => super.toString();
}
patch class PathSegCurvetoCubicAbs {
  static Type get instanceRuntimeType => PathSegCurvetoCubicAbsImpl;

}
class PathSegCurvetoCubicAbsImpl extends PathSegCurvetoCubicAbs implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoCubicAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoCubicAbs;
  toString() => super.toString();
}
patch class PathSegCurvetoCubicRel {
  static Type get instanceRuntimeType => PathSegCurvetoCubicRelImpl;

}
class PathSegCurvetoCubicRelImpl extends PathSegCurvetoCubicRel implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoCubicRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoCubicRel;
  toString() => super.toString();
}
patch class PathSegCurvetoCubicSmoothAbs {
  static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothAbsImpl;

}
class PathSegCurvetoCubicSmoothAbsImpl extends PathSegCurvetoCubicSmoothAbs implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoCubicSmoothAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoCubicSmoothAbs;
  toString() => super.toString();
}
patch class PathSegCurvetoCubicSmoothRel {
  static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothRelImpl;

}
class PathSegCurvetoCubicSmoothRelImpl extends PathSegCurvetoCubicSmoothRel implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoCubicSmoothRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoCubicSmoothRel;
  toString() => super.toString();
}
patch class PathSegCurvetoQuadraticAbs {
  static Type get instanceRuntimeType => PathSegCurvetoQuadraticAbsImpl;

}
class PathSegCurvetoQuadraticAbsImpl extends PathSegCurvetoQuadraticAbs implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoQuadraticAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoQuadraticAbs;
  toString() => super.toString();
}
patch class PathSegCurvetoQuadraticRel {
  static Type get instanceRuntimeType => PathSegCurvetoQuadraticRelImpl;

}
class PathSegCurvetoQuadraticRelImpl extends PathSegCurvetoQuadraticRel implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoQuadraticRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoQuadraticRel;
  toString() => super.toString();
}
patch class PathSegCurvetoQuadraticSmoothAbs {
  static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothAbsImpl;

}
class PathSegCurvetoQuadraticSmoothAbsImpl extends PathSegCurvetoQuadraticSmoothAbs implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoQuadraticSmoothAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoQuadraticSmoothAbs;
  toString() => super.toString();
}
patch class PathSegCurvetoQuadraticSmoothRel {
  static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothRelImpl;

}
class PathSegCurvetoQuadraticSmoothRelImpl extends PathSegCurvetoQuadraticSmoothRel implements js_library.JSObjectInterfacesDom {
  PathSegCurvetoQuadraticSmoothRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegCurvetoQuadraticSmoothRel;
  toString() => super.toString();
}
patch class PathSegLinetoAbs {
  static Type get instanceRuntimeType => PathSegLinetoAbsImpl;

}
class PathSegLinetoAbsImpl extends PathSegLinetoAbs implements js_library.JSObjectInterfacesDom {
  PathSegLinetoAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegLinetoAbs;
  toString() => super.toString();
}
patch class PathSegLinetoHorizontalAbs {
  static Type get instanceRuntimeType => PathSegLinetoHorizontalAbsImpl;

}
class PathSegLinetoHorizontalAbsImpl extends PathSegLinetoHorizontalAbs implements js_library.JSObjectInterfacesDom {
  PathSegLinetoHorizontalAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegLinetoHorizontalAbs;
  toString() => super.toString();
}
patch class PathSegLinetoHorizontalRel {
  static Type get instanceRuntimeType => PathSegLinetoHorizontalRelImpl;

}
class PathSegLinetoHorizontalRelImpl extends PathSegLinetoHorizontalRel implements js_library.JSObjectInterfacesDom {
  PathSegLinetoHorizontalRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegLinetoHorizontalRel;
  toString() => super.toString();
}
patch class PathSegLinetoRel {
  static Type get instanceRuntimeType => PathSegLinetoRelImpl;

}
class PathSegLinetoRelImpl extends PathSegLinetoRel implements js_library.JSObjectInterfacesDom {
  PathSegLinetoRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegLinetoRel;
  toString() => super.toString();
}
patch class PathSegLinetoVerticalAbs {
  static Type get instanceRuntimeType => PathSegLinetoVerticalAbsImpl;

}
class PathSegLinetoVerticalAbsImpl extends PathSegLinetoVerticalAbs implements js_library.JSObjectInterfacesDom {
  PathSegLinetoVerticalAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegLinetoVerticalAbs;
  toString() => super.toString();
}
patch class PathSegLinetoVerticalRel {
  static Type get instanceRuntimeType => PathSegLinetoVerticalRelImpl;

}
class PathSegLinetoVerticalRelImpl extends PathSegLinetoVerticalRel implements js_library.JSObjectInterfacesDom {
  PathSegLinetoVerticalRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegLinetoVerticalRel;
  toString() => super.toString();
}
patch class PathSegList {
  static Type get instanceRuntimeType => PathSegListImpl;

}
class PathSegListImpl extends PathSegList implements js_library.JSObjectInterfacesDom {
  PathSegListImpl.internal_() : super.internal_();
  get runtimeType => PathSegList;
  toString() => super.toString();
}
patch class PathSegMovetoAbs {
  static Type get instanceRuntimeType => PathSegMovetoAbsImpl;

}
class PathSegMovetoAbsImpl extends PathSegMovetoAbs implements js_library.JSObjectInterfacesDom {
  PathSegMovetoAbsImpl.internal_() : super.internal_();
  get runtimeType => PathSegMovetoAbs;
  toString() => super.toString();
}
patch class PathSegMovetoRel {
  static Type get instanceRuntimeType => PathSegMovetoRelImpl;

}
class PathSegMovetoRelImpl extends PathSegMovetoRel implements js_library.JSObjectInterfacesDom {
  PathSegMovetoRelImpl.internal_() : super.internal_();
  get runtimeType => PathSegMovetoRel;
  toString() => super.toString();
}
patch class PatternElement {
  static Type get instanceRuntimeType => PatternElementImpl;

}
class PatternElementImpl extends PatternElement implements js_library.JSObjectInterfacesDom {
  PatternElementImpl.internal_() : super.internal_();
  get runtimeType => PatternElement;
  toString() => super.toString();
}
patch class Point {
  static Type get instanceRuntimeType => PointImpl;

}
class PointImpl extends Point implements js_library.JSObjectInterfacesDom {
  PointImpl.internal_() : super.internal_();
  get runtimeType => Point;
  toString() => super.toString();
}
patch class PointList {
  static Type get instanceRuntimeType => PointListImpl;

}
class PointListImpl extends PointList implements js_library.JSObjectInterfacesDom {
  PointListImpl.internal_() : super.internal_();
  get runtimeType => PointList;
  toString() => super.toString();
}
patch class PolygonElement {
  static Type get instanceRuntimeType => PolygonElementImpl;

}
class PolygonElementImpl extends PolygonElement implements js_library.JSObjectInterfacesDom {
  PolygonElementImpl.internal_() : super.internal_();
  get runtimeType => PolygonElement;
  toString() => super.toString();
}
patch class PolylineElement {
  static Type get instanceRuntimeType => PolylineElementImpl;

}
class PolylineElementImpl extends PolylineElement implements js_library.JSObjectInterfacesDom {
  PolylineElementImpl.internal_() : super.internal_();
  get runtimeType => PolylineElement;
  toString() => super.toString();
}
patch class PreserveAspectRatio {
  static Type get instanceRuntimeType => PreserveAspectRatioImpl;

}
class PreserveAspectRatioImpl extends PreserveAspectRatio implements js_library.JSObjectInterfacesDom {
  PreserveAspectRatioImpl.internal_() : super.internal_();
  get runtimeType => PreserveAspectRatio;
  toString() => super.toString();
}
patch class RadialGradientElement {
  static Type get instanceRuntimeType => RadialGradientElementImpl;

}
class RadialGradientElementImpl extends RadialGradientElement implements js_library.JSObjectInterfacesDom {
  RadialGradientElementImpl.internal_() : super.internal_();
  get runtimeType => RadialGradientElement;
  toString() => super.toString();
}
patch class Rect {
  static Type get instanceRuntimeType => RectImpl;

}
class RectImpl extends Rect implements js_library.JSObjectInterfacesDom {
  RectImpl.internal_() : super.internal_();
  get runtimeType => Rect;
  toString() => super.toString();
}
patch class RectElement {
  static Type get instanceRuntimeType => RectElementImpl;

}
class RectElementImpl extends RectElement implements js_library.JSObjectInterfacesDom {
  RectElementImpl.internal_() : super.internal_();
  get runtimeType => RectElement;
  toString() => super.toString();
}
patch class ScriptElement {
  static Type get instanceRuntimeType => ScriptElementImpl;

}
class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
  ScriptElementImpl.internal_() : super.internal_();
  get runtimeType => ScriptElement;
  toString() => super.toString();
}
patch class SetElement {
  static Type get instanceRuntimeType => SetElementImpl;

}
class SetElementImpl extends SetElement implements js_library.JSObjectInterfacesDom {
  SetElementImpl.internal_() : super.internal_();
  get runtimeType => SetElement;
  toString() => super.toString();
}
patch class StopElement {
  static Type get instanceRuntimeType => StopElementImpl;

}
class StopElementImpl extends StopElement implements js_library.JSObjectInterfacesDom {
  StopElementImpl.internal_() : super.internal_();
  get runtimeType => StopElement;
  toString() => super.toString();
}
patch class StringList {
  static Type get instanceRuntimeType => StringListImpl;

}
class StringListImpl extends StringList implements js_library.JSObjectInterfacesDom {
  StringListImpl.internal_() : super.internal_();
  get runtimeType => StringList;
  toString() => super.toString();
}
patch class StyleElement {
  static Type get instanceRuntimeType => StyleElementImpl;

}
class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
  StyleElementImpl.internal_() : super.internal_();
  get runtimeType => StyleElement;
  toString() => super.toString();
}
patch class SvgElement {
  static Type get instanceRuntimeType => SvgElementImpl;

}
class SvgElementImpl extends SvgElement implements js_library.JSObjectInterfacesDom {
  SvgElementImpl.internal_() : super.internal_();
  get runtimeType => SvgElement;
  toString() => super.toString();
}
patch class SvgSvgElement {
  static Type get instanceRuntimeType => SvgSvgElementImpl;

}
class SvgSvgElementImpl extends SvgSvgElement implements js_library.JSObjectInterfacesDom {
  SvgSvgElementImpl.internal_() : super.internal_();
  get runtimeType => SvgSvgElement;
  toString() => super.toString();
}
patch class SwitchElement {
  static Type get instanceRuntimeType => SwitchElementImpl;

}
class SwitchElementImpl extends SwitchElement implements js_library.JSObjectInterfacesDom {
  SwitchElementImpl.internal_() : super.internal_();
  get runtimeType => SwitchElement;
  toString() => super.toString();
}
patch class SymbolElement {
  static Type get instanceRuntimeType => SymbolElementImpl;

}
class SymbolElementImpl extends SymbolElement implements js_library.JSObjectInterfacesDom {
  SymbolElementImpl.internal_() : super.internal_();
  get runtimeType => SymbolElement;
  toString() => super.toString();
}
patch class TSpanElement {
  static Type get instanceRuntimeType => TSpanElementImpl;

}
class TSpanElementImpl extends TSpanElement implements js_library.JSObjectInterfacesDom {
  TSpanElementImpl.internal_() : super.internal_();
  get runtimeType => TSpanElement;
  toString() => super.toString();
}
patch class Tests {
  static Type get instanceRuntimeType => TestsImpl;

}
class TestsImpl extends Tests implements js_library.JSObjectInterfacesDom {
  TestsImpl.internal_() : super.internal_();
  get runtimeType => Tests;
  toString() => super.toString();
}
patch class TextContentElement {
  static Type get instanceRuntimeType => TextContentElementImpl;

}
class TextContentElementImpl extends TextContentElement implements js_library.JSObjectInterfacesDom {
  TextContentElementImpl.internal_() : super.internal_();
  get runtimeType => TextContentElement;
  toString() => super.toString();
}
patch class TextElement {
  static Type get instanceRuntimeType => TextElementImpl;

}
class TextElementImpl extends TextElement implements js_library.JSObjectInterfacesDom {
  TextElementImpl.internal_() : super.internal_();
  get runtimeType => TextElement;
  toString() => super.toString();
}
patch class TextPathElement {
  static Type get instanceRuntimeType => TextPathElementImpl;

}
class TextPathElementImpl extends TextPathElement implements js_library.JSObjectInterfacesDom {
  TextPathElementImpl.internal_() : super.internal_();
  get runtimeType => TextPathElement;
  toString() => super.toString();
}
patch class TextPositioningElement {
  static Type get instanceRuntimeType => TextPositioningElementImpl;

}
class TextPositioningElementImpl extends TextPositioningElement implements js_library.JSObjectInterfacesDom {
  TextPositioningElementImpl.internal_() : super.internal_();
  get runtimeType => TextPositioningElement;
  toString() => super.toString();
}
patch class TitleElement {
  static Type get instanceRuntimeType => TitleElementImpl;

}
class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
  TitleElementImpl.internal_() : super.internal_();
  get runtimeType => TitleElement;
  toString() => super.toString();
}
patch class Transform {
  static Type get instanceRuntimeType => TransformImpl;

}
class TransformImpl extends Transform implements js_library.JSObjectInterfacesDom {
  TransformImpl.internal_() : super.internal_();
  get runtimeType => Transform;
  toString() => super.toString();
}
patch class TransformList {
  static Type get instanceRuntimeType => TransformListImpl;

}
class TransformListImpl extends TransformList implements js_library.JSObjectInterfacesDom {
  TransformListImpl.internal_() : super.internal_();
  get runtimeType => TransformList;
  toString() => super.toString();
}
patch class UnitTypes {
  static Type get instanceRuntimeType => UnitTypesImpl;

}
class UnitTypesImpl extends UnitTypes implements js_library.JSObjectInterfacesDom {
  UnitTypesImpl.internal_() : super.internal_();
  get runtimeType => UnitTypes;
  toString() => super.toString();
}
patch class UriReference {
  static Type get instanceRuntimeType => UriReferenceImpl;

}
class UriReferenceImpl extends UriReference implements js_library.JSObjectInterfacesDom {
  UriReferenceImpl.internal_() : super.internal_();
  get runtimeType => UriReference;
  toString() => super.toString();
}
patch class UseElement {
  static Type get instanceRuntimeType => UseElementImpl;

}
class UseElementImpl extends UseElement implements js_library.JSObjectInterfacesDom {
  UseElementImpl.internal_() : super.internal_();
  get runtimeType => UseElement;
  toString() => super.toString();
}
patch class ViewElement {
  static Type get instanceRuntimeType => ViewElementImpl;

}
class ViewElementImpl extends ViewElement implements js_library.JSObjectInterfacesDom {
  ViewElementImpl.internal_() : super.internal_();
  get runtimeType => ViewElement;
  toString() => super.toString();
}
patch class ViewSpec {
  static Type get instanceRuntimeType => ViewSpecImpl;

}
class ViewSpecImpl extends ViewSpec implements js_library.JSObjectInterfacesDom {
  ViewSpecImpl.internal_() : super.internal_();
  get runtimeType => ViewSpec;
  toString() => super.toString();
}
patch class ZoomAndPan {
  static Type get instanceRuntimeType => ZoomAndPanImpl;

}
class ZoomAndPanImpl extends ZoomAndPan implements js_library.JSObjectInterfacesDom {
  ZoomAndPanImpl.internal_() : super.internal_();
  get runtimeType => ZoomAndPan;
  toString() => super.toString();
}
patch class ZoomEvent {
  static Type get instanceRuntimeType => ZoomEventImpl;

}
class ZoomEventImpl extends ZoomEvent implements js_library.JSObjectInterfacesDom {
  ZoomEventImpl.internal_() : super.internal_();
  get runtimeType => ZoomEvent;
  toString() => super.toString();
}
patch class _GradientElement {
  static Type get instanceRuntimeType => _GradientElementImpl;

}
class _GradientElementImpl extends _GradientElement implements js_library.JSObjectInterfacesDom {
  _GradientElementImpl.internal_() : super.internal_();
  get runtimeType => _GradientElement;
  toString() => super.toString();
}
patch class _SVGComponentTransferFunctionElement {
  static Type get instanceRuntimeType => _SVGComponentTransferFunctionElementImpl;

}
class _SVGComponentTransferFunctionElementImpl extends _SVGComponentTransferFunctionElement implements js_library.JSObjectInterfacesDom {
  _SVGComponentTransferFunctionElementImpl.internal_() : super.internal_();
  get runtimeType => _SVGComponentTransferFunctionElement;
  toString() => super.toString();
}
patch class _SVGCursorElement {
  static Type get instanceRuntimeType => _SVGCursorElementImpl;

}
class _SVGCursorElementImpl extends _SVGCursorElement implements js_library.JSObjectInterfacesDom {
  _SVGCursorElementImpl.internal_() : super.internal_();
  get runtimeType => _SVGCursorElement;
  toString() => super.toString();
}
patch class _SVGFEDropShadowElement {
  static Type get instanceRuntimeType => _SVGFEDropShadowElementImpl;

}
class _SVGFEDropShadowElementImpl extends _SVGFEDropShadowElement implements js_library.JSObjectInterfacesDom {
  _SVGFEDropShadowElementImpl.internal_() : super.internal_();
  get runtimeType => _SVGFEDropShadowElement;
  toString() => super.toString();
}
patch class _SVGMPathElement {
  static Type get instanceRuntimeType => _SVGMPathElementImpl;

}
class _SVGMPathElementImpl extends _SVGMPathElement implements js_library.JSObjectInterfacesDom {
  _SVGMPathElementImpl.internal_() : super.internal_();
  get runtimeType => _SVGMPathElement;
  toString() => super.toString();
}

"""],"dart:web_audio": ["dart:web_audio", "dart:web_audio_js_interop_patch.dart", """import 'dart:js' as js_library;

/**
 * Placeholder object for cases where we need to determine exactly how many
 * args were passed to a function.
 */
const _UNDEFINED_JS_CONST = const Object();

patch class AnalyserNode {
  static Type get instanceRuntimeType => AnalyserNodeImpl;

}
class AnalyserNodeImpl extends AnalyserNode implements js_library.JSObjectInterfacesDom {
  AnalyserNodeImpl.internal_() : super.internal_();
  get runtimeType => AnalyserNode;
  toString() => super.toString();
}
patch class AudioBuffer {
  static Type get instanceRuntimeType => AudioBufferImpl;

}
class AudioBufferImpl extends AudioBuffer implements js_library.JSObjectInterfacesDom {
  AudioBufferImpl.internal_() : super.internal_();
  get runtimeType => AudioBuffer;
  toString() => super.toString();
}
patch class AudioBufferSourceNode {
  static Type get instanceRuntimeType => AudioBufferSourceNodeImpl;

}
class AudioBufferSourceNodeImpl extends AudioBufferSourceNode implements js_library.JSObjectInterfacesDom {
  AudioBufferSourceNodeImpl.internal_() : super.internal_();
  get runtimeType => AudioBufferSourceNode;
  toString() => super.toString();
}
patch class AudioContext {
  static Type get instanceRuntimeType => AudioContextImpl;

}
class AudioContextImpl extends AudioContext implements js_library.JSObjectInterfacesDom {
  AudioContextImpl.internal_() : super.internal_();
  get runtimeType => AudioContext;
  toString() => super.toString();
}
patch class AudioDestinationNode {
  static Type get instanceRuntimeType => AudioDestinationNodeImpl;

}
class AudioDestinationNodeImpl extends AudioDestinationNode implements js_library.JSObjectInterfacesDom {
  AudioDestinationNodeImpl.internal_() : super.internal_();
  get runtimeType => AudioDestinationNode;
  toString() => super.toString();
}
patch class AudioListener {
  static Type get instanceRuntimeType => AudioListenerImpl;

}
class AudioListenerImpl extends AudioListener implements js_library.JSObjectInterfacesDom {
  AudioListenerImpl.internal_() : super.internal_();
  get runtimeType => AudioListener;
  toString() => super.toString();
}
patch class AudioNode {
  static Type get instanceRuntimeType => AudioNodeImpl;

}
class AudioNodeImpl extends AudioNode implements js_library.JSObjectInterfacesDom {
  AudioNodeImpl.internal_() : super.internal_();
  get runtimeType => AudioNode;
  toString() => super.toString();
}
patch class AudioParam {
  static Type get instanceRuntimeType => AudioParamImpl;

}
class AudioParamImpl extends AudioParam implements js_library.JSObjectInterfacesDom {
  AudioParamImpl.internal_() : super.internal_();
  get runtimeType => AudioParam;
  toString() => super.toString();
}
patch class AudioProcessingEvent {
  static Type get instanceRuntimeType => AudioProcessingEventImpl;

}
class AudioProcessingEventImpl extends AudioProcessingEvent implements js_library.JSObjectInterfacesDom {
  AudioProcessingEventImpl.internal_() : super.internal_();
  get runtimeType => AudioProcessingEvent;
  toString() => super.toString();
}
patch class AudioSourceNode {
  static Type get instanceRuntimeType => AudioSourceNodeImpl;

}
class AudioSourceNodeImpl extends AudioSourceNode implements js_library.JSObjectInterfacesDom {
  AudioSourceNodeImpl.internal_() : super.internal_();
  get runtimeType => AudioSourceNode;
  toString() => super.toString();
}
patch class BiquadFilterNode {
  static Type get instanceRuntimeType => BiquadFilterNodeImpl;

}
class BiquadFilterNodeImpl extends BiquadFilterNode implements js_library.JSObjectInterfacesDom {
  BiquadFilterNodeImpl.internal_() : super.internal_();
  get runtimeType => BiquadFilterNode;
  toString() => super.toString();
}
patch class ChannelMergerNode {
  static Type get instanceRuntimeType => ChannelMergerNodeImpl;

}
class ChannelMergerNodeImpl extends ChannelMergerNode implements js_library.JSObjectInterfacesDom {
  ChannelMergerNodeImpl.internal_() : super.internal_();
  get runtimeType => ChannelMergerNode;
  toString() => super.toString();
}
patch class ChannelSplitterNode {
  static Type get instanceRuntimeType => ChannelSplitterNodeImpl;

}
class ChannelSplitterNodeImpl extends ChannelSplitterNode implements js_library.JSObjectInterfacesDom {
  ChannelSplitterNodeImpl.internal_() : super.internal_();
  get runtimeType => ChannelSplitterNode;
  toString() => super.toString();
}
patch class ConvolverNode {
  static Type get instanceRuntimeType => ConvolverNodeImpl;

}
class ConvolverNodeImpl extends ConvolverNode implements js_library.JSObjectInterfacesDom {
  ConvolverNodeImpl.internal_() : super.internal_();
  get runtimeType => ConvolverNode;
  toString() => super.toString();
}
patch class DelayNode {
  static Type get instanceRuntimeType => DelayNodeImpl;

}
class DelayNodeImpl extends DelayNode implements js_library.JSObjectInterfacesDom {
  DelayNodeImpl.internal_() : super.internal_();
  get runtimeType => DelayNode;
  toString() => super.toString();
}
patch class DynamicsCompressorNode {
  static Type get instanceRuntimeType => DynamicsCompressorNodeImpl;

}
class DynamicsCompressorNodeImpl extends DynamicsCompressorNode implements js_library.JSObjectInterfacesDom {
  DynamicsCompressorNodeImpl.internal_() : super.internal_();
  get runtimeType => DynamicsCompressorNode;
  toString() => super.toString();
}
patch class GainNode {
  static Type get instanceRuntimeType => GainNodeImpl;

}
class GainNodeImpl extends GainNode implements js_library.JSObjectInterfacesDom {
  GainNodeImpl.internal_() : super.internal_();
  get runtimeType => GainNode;
  toString() => super.toString();
}
patch class MediaElementAudioSourceNode {
  static Type get instanceRuntimeType => MediaElementAudioSourceNodeImpl;

}
class MediaElementAudioSourceNodeImpl extends MediaElementAudioSourceNode implements js_library.JSObjectInterfacesDom {
  MediaElementAudioSourceNodeImpl.internal_() : super.internal_();
  get runtimeType => MediaElementAudioSourceNode;
  toString() => super.toString();
}
patch class MediaStreamAudioDestinationNode {
  static Type get instanceRuntimeType => MediaStreamAudioDestinationNodeImpl;

}
class MediaStreamAudioDestinationNodeImpl extends MediaStreamAudioDestinationNode implements js_library.JSObjectInterfacesDom {
  MediaStreamAudioDestinationNodeImpl.internal_() : super.internal_();
  get runtimeType => MediaStreamAudioDestinationNode;
  toString() => super.toString();
}
patch class MediaStreamAudioSourceNode {
  static Type get instanceRuntimeType => MediaStreamAudioSourceNodeImpl;

}
class MediaStreamAudioSourceNodeImpl extends MediaStreamAudioSourceNode implements js_library.JSObjectInterfacesDom {
  MediaStreamAudioSourceNodeImpl.internal_() : super.internal_();
  get runtimeType => MediaStreamAudioSourceNode;
  toString() => super.toString();
}
patch class OfflineAudioCompletionEvent {
  static Type get instanceRuntimeType => OfflineAudioCompletionEventImpl;

}
class OfflineAudioCompletionEventImpl extends OfflineAudioCompletionEvent implements js_library.JSObjectInterfacesDom {
  OfflineAudioCompletionEventImpl.internal_() : super.internal_();
  get runtimeType => OfflineAudioCompletionEvent;
  toString() => super.toString();
}
patch class OfflineAudioContext {
  static Type get instanceRuntimeType => OfflineAudioContextImpl;

}
class OfflineAudioContextImpl extends OfflineAudioContext implements js_library.JSObjectInterfacesDom {
  OfflineAudioContextImpl.internal_() : super.internal_();
  get runtimeType => OfflineAudioContext;
  toString() => super.toString();
}
patch class OscillatorNode {
  static Type get instanceRuntimeType => OscillatorNodeImpl;

}
class OscillatorNodeImpl extends OscillatorNode implements js_library.JSObjectInterfacesDom {
  OscillatorNodeImpl.internal_() : super.internal_();
  get runtimeType => OscillatorNode;
  toString() => super.toString();
}
patch class PannerNode {
  static Type get instanceRuntimeType => PannerNodeImpl;

}
class PannerNodeImpl extends PannerNode implements js_library.JSObjectInterfacesDom {
  PannerNodeImpl.internal_() : super.internal_();
  get runtimeType => PannerNode;
  toString() => super.toString();
}
patch class PeriodicWave {
  static Type get instanceRuntimeType => PeriodicWaveImpl;

}
class PeriodicWaveImpl extends PeriodicWave implements js_library.JSObjectInterfacesDom {
  PeriodicWaveImpl.internal_() : super.internal_();
  get runtimeType => PeriodicWave;
  toString() => super.toString();
}
patch class ScriptProcessorNode {
  static Type get instanceRuntimeType => ScriptProcessorNodeImpl;

}
class ScriptProcessorNodeImpl extends ScriptProcessorNode implements js_library.JSObjectInterfacesDom {
  ScriptProcessorNodeImpl.internal_() : super.internal_();
  get runtimeType => ScriptProcessorNode;
  toString() => super.toString();
}
patch class StereoPannerNode {
  static Type get instanceRuntimeType => StereoPannerNodeImpl;

}
class StereoPannerNodeImpl extends StereoPannerNode implements js_library.JSObjectInterfacesDom {
  StereoPannerNodeImpl.internal_() : super.internal_();
  get runtimeType => StereoPannerNode;
  toString() => super.toString();
}
patch class WaveShaperNode {
  static Type get instanceRuntimeType => WaveShaperNodeImpl;

}
class WaveShaperNodeImpl extends WaveShaperNode implements js_library.JSObjectInterfacesDom {
  WaveShaperNodeImpl.internal_() : super.internal_();
  get runtimeType => WaveShaperNode;
  toString() => super.toString();
}

"""],};
// END_OF_CACHED_PATCHES
