// 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 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 _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 _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 _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
