library html;

import 'dart:isolate';
import 'dart:json';
import 'dart:nativewrappers';
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// DO NOT EDIT
// Auto-generated dart:html library.







// FIXME (blois): Rename to _window (ditto __document).
LocalWindow __window;

LocalWindow get window {
  if (__window != null) {
    return __window;
  }
  __window = _Utils.window();
  return __window;
}

Document __document;

Document get document {
  if (__document != null) {
    return __document;
  }
  __document = window.document;
  return __document;
}


Element query(String selector) => document.query(selector);
List<Element> queryAll(String selector) => document.queryAll(selector);

int _getNewIsolateId() => _Utils._getNewIsolateId();

bool _callPortInitialized = false;
var _callPortLastResult = null;

_callPortSync(num id, var message) {
  if (!_callPortInitialized) {
    window.on['js-result'].add((event) {
      _callPortLastResult = JSON.parse(_getPortSyncEventData(event));
    }, false);
    _callPortInitialized = true;
  }
  assert(_callPortLastResult == null);
  _dispatchEvent('js-sync-message', {'id': id, 'message': message});
  var result = _callPortLastResult;
  _callPortLastResult = null;
  return result;
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName AbstractWorker
class AbstractWorker extends EventTarget {
  AbstractWorker.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  AbstractWorkerEvents get on =>
    new AbstractWorkerEvents(this);


  /** @domName AbstractWorker.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_addEventListener_Callback";


  /** @domName AbstractWorker.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "AbstractWorker_dispatchEvent_Callback";


  /** @domName AbstractWorker.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_removeEventListener_Callback";

}

class AbstractWorkerEvents extends Events {
  AbstractWorkerEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get error => this['error'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName AnalyserNode
class AnalyserNode extends AudioNode {
  AnalyserNode.internal(): super.internal();


  /** @domName AnalyserNode.fftSize */
  int get fftSize native "AnalyserNode_fftSize_Getter";


  /** @domName AnalyserNode.fftSize */
  void set fftSize(int value) native "AnalyserNode_fftSize_Setter";


  /** @domName AnalyserNode.frequencyBinCount */
  int get frequencyBinCount native "AnalyserNode_frequencyBinCount_Getter";


  /** @domName AnalyserNode.maxDecibels */
  num get maxDecibels native "AnalyserNode_maxDecibels_Getter";


  /** @domName AnalyserNode.maxDecibels */
  void set maxDecibels(num value) native "AnalyserNode_maxDecibels_Setter";


  /** @domName AnalyserNode.minDecibels */
  num get minDecibels native "AnalyserNode_minDecibels_Getter";


  /** @domName AnalyserNode.minDecibels */
  void set minDecibels(num value) native "AnalyserNode_minDecibels_Setter";


  /** @domName AnalyserNode.smoothingTimeConstant */
  num get smoothingTimeConstant native "AnalyserNode_smoothingTimeConstant_Getter";


  /** @domName AnalyserNode.smoothingTimeConstant */
  void set smoothingTimeConstant(num value) native "AnalyserNode_smoothingTimeConstant_Setter";


  /** @domName AnalyserNode.getByteFrequencyData */
  void getByteFrequencyData(Uint8Array array) native "AnalyserNode_getByteFrequencyData_Callback";


  /** @domName AnalyserNode.getByteTimeDomainData */
  void getByteTimeDomainData(Uint8Array array) native "AnalyserNode_getByteTimeDomainData_Callback";


  /** @domName AnalyserNode.getFloatFrequencyData */
  void getFloatFrequencyData(Float32Array array) native "AnalyserNode_getFloatFrequencyData_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLAnchorElement
class AnchorElement extends _Element_Merged {

  factory AnchorElement({String href}) {
    if (!?href) {
      return _Elements.createAnchorElement();
    }
    return _Elements.createAnchorElement(href);
  }
  AnchorElement.internal(): super.internal();


  /** @domName HTMLAnchorElement.charset */
  String get charset native "HTMLAnchorElement_charset_Getter";


  /** @domName HTMLAnchorElement.charset */
  void set charset(String value) native "HTMLAnchorElement_charset_Setter";


  /** @domName HTMLAnchorElement.coords */
  String get coords native "HTMLAnchorElement_coords_Getter";


  /** @domName HTMLAnchorElement.coords */
  void set coords(String value) native "HTMLAnchorElement_coords_Setter";


  /** @domName HTMLAnchorElement.download */
  String get download native "HTMLAnchorElement_download_Getter";


  /** @domName HTMLAnchorElement.download */
  void set download(String value) native "HTMLAnchorElement_download_Setter";


  /** @domName HTMLAnchorElement.hash */
  String get hash native "HTMLAnchorElement_hash_Getter";


  /** @domName HTMLAnchorElement.hash */
  void set hash(String value) native "HTMLAnchorElement_hash_Setter";


  /** @domName HTMLAnchorElement.host */
  String get host native "HTMLAnchorElement_host_Getter";


  /** @domName HTMLAnchorElement.host */
  void set host(String value) native "HTMLAnchorElement_host_Setter";


  /** @domName HTMLAnchorElement.hostname */
  String get hostname native "HTMLAnchorElement_hostname_Getter";


  /** @domName HTMLAnchorElement.hostname */
  void set hostname(String value) native "HTMLAnchorElement_hostname_Setter";


  /** @domName HTMLAnchorElement.href */
  String get href native "HTMLAnchorElement_href_Getter";


  /** @domName HTMLAnchorElement.href */
  void set href(String value) native "HTMLAnchorElement_href_Setter";


  /** @domName HTMLAnchorElement.hreflang */
  String get hreflang native "HTMLAnchorElement_hreflang_Getter";


  /** @domName HTMLAnchorElement.hreflang */
  void set hreflang(String value) native "HTMLAnchorElement_hreflang_Setter";


  /** @domName HTMLAnchorElement.name */
  String get name native "HTMLAnchorElement_name_Getter";


  /** @domName HTMLAnchorElement.name */
  void set name(String value) native "HTMLAnchorElement_name_Setter";


  /** @domName HTMLAnchorElement.origin */
  String get origin native "HTMLAnchorElement_origin_Getter";


  /** @domName HTMLAnchorElement.pathname */
  String get pathname native "HTMLAnchorElement_pathname_Getter";


  /** @domName HTMLAnchorElement.pathname */
  void set pathname(String value) native "HTMLAnchorElement_pathname_Setter";


  /** @domName HTMLAnchorElement.ping */
  String get ping native "HTMLAnchorElement_ping_Getter";


  /** @domName HTMLAnchorElement.ping */
  void set ping(String value) native "HTMLAnchorElement_ping_Setter";


  /** @domName HTMLAnchorElement.port */
  String get port native "HTMLAnchorElement_port_Getter";


  /** @domName HTMLAnchorElement.port */
  void set port(String value) native "HTMLAnchorElement_port_Setter";


  /** @domName HTMLAnchorElement.protocol */
  String get protocol native "HTMLAnchorElement_protocol_Getter";


  /** @domName HTMLAnchorElement.protocol */
  void set protocol(String value) native "HTMLAnchorElement_protocol_Setter";


  /** @domName HTMLAnchorElement.rel */
  String get rel native "HTMLAnchorElement_rel_Getter";


  /** @domName HTMLAnchorElement.rel */
  void set rel(String value) native "HTMLAnchorElement_rel_Setter";


  /** @domName HTMLAnchorElement.rev */
  String get rev native "HTMLAnchorElement_rev_Getter";


  /** @domName HTMLAnchorElement.rev */
  void set rev(String value) native "HTMLAnchorElement_rev_Setter";


  /** @domName HTMLAnchorElement.search */
  String get search native "HTMLAnchorElement_search_Getter";


  /** @domName HTMLAnchorElement.search */
  void set search(String value) native "HTMLAnchorElement_search_Setter";


  /** @domName HTMLAnchorElement.shape */
  String get shape native "HTMLAnchorElement_shape_Getter";


  /** @domName HTMLAnchorElement.shape */
  void set shape(String value) native "HTMLAnchorElement_shape_Setter";


  /** @domName HTMLAnchorElement.target */
  String get target native "HTMLAnchorElement_target_Getter";


  /** @domName HTMLAnchorElement.target */
  void set target(String value) native "HTMLAnchorElement_target_Setter";


  /** @domName HTMLAnchorElement.type */
  String get type native "HTMLAnchorElement_type_Getter";


  /** @domName HTMLAnchorElement.type */
  void set type(String value) native "HTMLAnchorElement_type_Setter";


  /** @domName HTMLAnchorElement.toString */
  String toString() native "HTMLAnchorElement_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitAnimation
class Animation extends NativeFieldWrapperClass1 {
  Animation.internal();

  static const int DIRECTION_ALTERNATE = 1;

  static const int DIRECTION_NORMAL = 0;

  static const int FILL_BACKWARDS = 1;

  static const int FILL_BOTH = 3;

  static const int FILL_FORWARDS = 2;

  static const int FILL_NONE = 0;


  /** @domName WebKitAnimation.delay */
  num get delay native "WebKitAnimation_delay_Getter";


  /** @domName WebKitAnimation.direction */
  int get direction native "WebKitAnimation_direction_Getter";


  /** @domName WebKitAnimation.duration */
  num get duration native "WebKitAnimation_duration_Getter";


  /** @domName WebKitAnimation.elapsedTime */
  num get elapsedTime native "WebKitAnimation_elapsedTime_Getter";


  /** @domName WebKitAnimation.elapsedTime */
  void set elapsedTime(num value) native "WebKitAnimation_elapsedTime_Setter";


  /** @domName WebKitAnimation.ended */
  bool get ended native "WebKitAnimation_ended_Getter";


  /** @domName WebKitAnimation.fillMode */
  int get fillMode native "WebKitAnimation_fillMode_Getter";


  /** @domName WebKitAnimation.iterationCount */
  int get iterationCount native "WebKitAnimation_iterationCount_Getter";


  /** @domName WebKitAnimation.name */
  String get name native "WebKitAnimation_name_Getter";


  /** @domName WebKitAnimation.paused */
  bool get paused native "WebKitAnimation_paused_Getter";


  /** @domName WebKitAnimation.pause */
  void pause() native "WebKitAnimation_pause_Callback";


  /** @domName WebKitAnimation.play */
  void play() native "WebKitAnimation_play_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitAnimationEvent
class AnimationEvent extends Event {
  AnimationEvent.internal(): super.internal();


  /** @domName WebKitAnimationEvent.animationName */
  String get animationName native "WebKitAnimationEvent_animationName_Getter";


  /** @domName WebKitAnimationEvent.elapsedTime */
  num get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLAppletElement
class AppletElement extends _Element_Merged {
  AppletElement.internal(): super.internal();


  /** @domName HTMLAppletElement.align */
  String get align native "HTMLAppletElement_align_Getter";


  /** @domName HTMLAppletElement.align */
  void set align(String value) native "HTMLAppletElement_align_Setter";


  /** @domName HTMLAppletElement.alt */
  String get alt native "HTMLAppletElement_alt_Getter";


  /** @domName HTMLAppletElement.alt */
  void set alt(String value) native "HTMLAppletElement_alt_Setter";


  /** @domName HTMLAppletElement.archive */
  String get archive native "HTMLAppletElement_archive_Getter";


  /** @domName HTMLAppletElement.archive */
  void set archive(String value) native "HTMLAppletElement_archive_Setter";


  /** @domName HTMLAppletElement.code */
  String get code native "HTMLAppletElement_code_Getter";


  /** @domName HTMLAppletElement.code */
  void set code(String value) native "HTMLAppletElement_code_Setter";


  /** @domName HTMLAppletElement.codeBase */
  String get codeBase native "HTMLAppletElement_codeBase_Getter";


  /** @domName HTMLAppletElement.codeBase */
  void set codeBase(String value) native "HTMLAppletElement_codeBase_Setter";


  /** @domName HTMLAppletElement.height */
  String get height native "HTMLAppletElement_height_Getter";


  /** @domName HTMLAppletElement.height */
  void set height(String value) native "HTMLAppletElement_height_Setter";


  /** @domName HTMLAppletElement.hspace */
  String get hspace native "HTMLAppletElement_hspace_Getter";


  /** @domName HTMLAppletElement.hspace */
  void set hspace(String value) native "HTMLAppletElement_hspace_Setter";


  /** @domName HTMLAppletElement.name */
  String get name native "HTMLAppletElement_name_Getter";


  /** @domName HTMLAppletElement.name */
  void set name(String value) native "HTMLAppletElement_name_Setter";


  /** @domName HTMLAppletElement.object */
  String get object native "HTMLAppletElement_object_Getter";


  /** @domName HTMLAppletElement.object */
  void set object(String value) native "HTMLAppletElement_object_Setter";


  /** @domName HTMLAppletElement.vspace */
  String get vspace native "HTMLAppletElement_vspace_Getter";


  /** @domName HTMLAppletElement.vspace */
  void set vspace(String value) native "HTMLAppletElement_vspace_Setter";


  /** @domName HTMLAppletElement.width */
  String get width native "HTMLAppletElement_width_Getter";


  /** @domName HTMLAppletElement.width */
  void set width(String value) native "HTMLAppletElement_width_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLAreaElement
class AreaElement extends _Element_Merged {

  factory AreaElement() => _Elements.createAreaElement();
  AreaElement.internal(): super.internal();


  /** @domName HTMLAreaElement.alt */
  String get alt native "HTMLAreaElement_alt_Getter";


  /** @domName HTMLAreaElement.alt */
  void set alt(String value) native "HTMLAreaElement_alt_Setter";


  /** @domName HTMLAreaElement.coords */
  String get coords native "HTMLAreaElement_coords_Getter";


  /** @domName HTMLAreaElement.coords */
  void set coords(String value) native "HTMLAreaElement_coords_Setter";


  /** @domName HTMLAreaElement.hash */
  String get hash native "HTMLAreaElement_hash_Getter";


  /** @domName HTMLAreaElement.host */
  String get host native "HTMLAreaElement_host_Getter";


  /** @domName HTMLAreaElement.hostname */
  String get hostname native "HTMLAreaElement_hostname_Getter";


  /** @domName HTMLAreaElement.href */
  String get href native "HTMLAreaElement_href_Getter";


  /** @domName HTMLAreaElement.href */
  void set href(String value) native "HTMLAreaElement_href_Setter";


  /** @domName HTMLAreaElement.noHref */
  bool get noHref native "HTMLAreaElement_noHref_Getter";


  /** @domName HTMLAreaElement.noHref */
  void set noHref(bool value) native "HTMLAreaElement_noHref_Setter";


  /** @domName HTMLAreaElement.pathname */
  String get pathname native "HTMLAreaElement_pathname_Getter";


  /** @domName HTMLAreaElement.ping */
  String get ping native "HTMLAreaElement_ping_Getter";


  /** @domName HTMLAreaElement.ping */
  void set ping(String value) native "HTMLAreaElement_ping_Setter";


  /** @domName HTMLAreaElement.port */
  String get port native "HTMLAreaElement_port_Getter";


  /** @domName HTMLAreaElement.protocol */
  String get protocol native "HTMLAreaElement_protocol_Getter";


  /** @domName HTMLAreaElement.search */
  String get search native "HTMLAreaElement_search_Getter";


  /** @domName HTMLAreaElement.shape */
  String get shape native "HTMLAreaElement_shape_Getter";


  /** @domName HTMLAreaElement.shape */
  void set shape(String value) native "HTMLAreaElement_shape_Setter";


  /** @domName HTMLAreaElement.target */
  String get target native "HTMLAreaElement_target_Getter";


  /** @domName HTMLAreaElement.target */
  void set target(String value) native "HTMLAreaElement_target_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName ArrayBuffer
class ArrayBuffer extends NativeFieldWrapperClass1 {

  factory ArrayBuffer(int length) => _ArrayBufferFactoryProvider.createArrayBuffer(length);
  ArrayBuffer.internal();


  /** @domName ArrayBuffer.byteLength */
  int get byteLength native "ArrayBuffer_byteLength_Getter";

  ArrayBuffer slice(/*long*/ begin, [/*long*/ end]) {
    if (?end) {
      return _slice_1(begin, end);
    }
    return _slice_2(begin);
  }


  /** @domName ArrayBuffer.slice_1 */
  ArrayBuffer _slice_1(begin, end) native "ArrayBuffer_slice_1_Callback";


  /** @domName ArrayBuffer.slice_2 */
  ArrayBuffer _slice_2(begin) native "ArrayBuffer_slice_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName ArrayBufferView
class ArrayBufferView extends NativeFieldWrapperClass1 {
  ArrayBufferView.internal();


  /** @domName ArrayBufferView.buffer */
  ArrayBuffer get buffer native "ArrayBufferView_buffer_Getter";


  /** @domName ArrayBufferView.byteLength */
  int get byteLength native "ArrayBufferView_byteLength_Getter";


  /** @domName ArrayBufferView.byteOffset */
  int get byteOffset native "ArrayBufferView_byteOffset_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Attr
class Attr extends Node {
  Attr.internal(): super.internal();


  /** @domName Attr.isId */
  bool get isId native "Attr_isId_Getter";


  /** @domName Attr.name */
  String get name native "Attr_name_Getter";


  /** @domName Attr.ownerElement */
  Element get ownerElement native "Attr_ownerElement_Getter";


  /** @domName Attr.specified */
  bool get specified native "Attr_specified_Getter";


  /** @domName Attr.value */
  String get value native "Attr_value_Getter";


  /** @domName Attr.value */
  void set value(String value) native "Attr_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName AudioBuffer
class AudioBuffer extends NativeFieldWrapperClass1 {
  AudioBuffer.internal();


  /** @domName AudioBuffer.duration */
  num get duration native "AudioBuffer_duration_Getter";


  /** @domName AudioBuffer.gain */
  num get gain native "AudioBuffer_gain_Getter";


  /** @domName AudioBuffer.gain */
  void set gain(num value) native "AudioBuffer_gain_Setter";


  /** @domName AudioBuffer.length */
  int get length native "AudioBuffer_length_Getter";


  /** @domName AudioBuffer.numberOfChannels */
  int get numberOfChannels native "AudioBuffer_numberOfChannels_Getter";


  /** @domName AudioBuffer.sampleRate */
  num get sampleRate native "AudioBuffer_sampleRate_Getter";


  /** @domName AudioBuffer.getChannelData */
  Float32Array getChannelData(int channelIndex) native "AudioBuffer_getChannelData_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName AudioBufferSourceNode
class AudioBufferSourceNode extends AudioSourceNode {
  AudioBufferSourceNode.internal(): super.internal();

  static const int FINISHED_STATE = 3;

  static const int PLAYING_STATE = 2;

  static const int SCHEDULED_STATE = 1;

  static const int UNSCHEDULED_STATE = 0;


  /** @domName AudioBufferSourceNode.buffer */
  AudioBuffer get buffer native "AudioBufferSourceNode_buffer_Getter";


  /** @domName AudioBufferSourceNode.buffer */
  void set buffer(AudioBuffer value) native "AudioBufferSourceNode_buffer_Setter";


  /** @domName AudioBufferSourceNode.gain */
  AudioGain get gain native "AudioBufferSourceNode_gain_Getter";


  /** @domName AudioBufferSourceNode.loop */
  bool get loop native "AudioBufferSourceNode_loop_Getter";


  /** @domName AudioBufferSourceNode.loop */
  void set loop(bool value) native "AudioBufferSourceNode_loop_Setter";


  /** @domName AudioBufferSourceNode.loopEnd */
  num get loopEnd native "AudioBufferSourceNode_loopEnd_Getter";


  /** @domName AudioBufferSourceNode.loopEnd */
  void set loopEnd(num value) native "AudioBufferSourceNode_loopEnd_Setter";


  /** @domName AudioBufferSourceNode.loopStart */
  num get loopStart native "AudioBufferSourceNode_loopStart_Getter";


  /** @domName AudioBufferSourceNode.loopStart */
  void set loopStart(num value) native "AudioBufferSourceNode_loopStart_Setter";


  /** @domName AudioBufferSourceNode.playbackRate */
  AudioParam get playbackRate native "AudioBufferSourceNode_playbackRate_Getter";


  /** @domName AudioBufferSourceNode.playbackState */
  int get playbackState native "AudioBufferSourceNode_playbackState_Getter";

  void start(/*double*/ when, [/*double*/ grainOffset, /*double*/ grainDuration]) {
    if ((when is num || when == null) && !?grainOffset && !?grainDuration) {
      _start_1(when);
      return;
    }
    if ((when is num || when == null) && (grainOffset is num || grainOffset == null) && (grainDuration is num || grainDuration == null)) {
      _start_2(when, grainOffset, grainDuration);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName AudioBufferSourceNode.start_1 */
  void _start_1(when) native "AudioBufferSourceNode_start_1_Callback";


  /** @domName AudioBufferSourceNode.start_2 */
  void _start_2(when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_2_Callback";


  /** @domName AudioBufferSourceNode.stop */
  void stop(num when) native "AudioBufferSourceNode_stop_Callback";

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

class AudioContext extends EventTarget {
  factory AudioContext() => _AudioContextFactoryProvider.createAudioContext();
  AudioContext.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  AudioContextEvents get on =>
    new AudioContextEvents(this);


  /** @domName AudioContext.activeSourceCount */
  int get activeSourceCount native "AudioContext_activeSourceCount_Getter";


  /** @domName AudioContext.currentTime */
  num get currentTime native "AudioContext_currentTime_Getter";


  /** @domName AudioContext.destination */
  AudioDestinationNode get destination native "AudioContext_destination_Getter";


  /** @domName AudioContext.listener */
  AudioListener get listener native "AudioContext_listener_Getter";


  /** @domName AudioContext.sampleRate */
  num get sampleRate native "AudioContext_sampleRate_Getter";


  /** @domName AudioContext.createAnalyser */
  AnalyserNode createAnalyser() native "AudioContext_createAnalyser_Callback";


  /** @domName AudioContext.createBiquadFilter */
  BiquadFilterNode createBiquadFilter() native "AudioContext_createBiquadFilter_Callback";

  AudioBuffer createBuffer(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, [/*float*/ sampleRate]) {
    if ((buffer_OR_numberOfChannels is int || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is int || mixToMono_OR_numberOfFrames == null) && (sampleRate is num || sampleRate == null)) {
      return _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate);
    }
    if ((buffer_OR_numberOfChannels is ArrayBuffer || buffer_OR_numberOfChannels == null) && (mixToMono_OR_numberOfFrames is bool || mixToMono_OR_numberOfFrames == null) && !?sampleRate) {
      return _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName AudioContext.createBuffer_1 */
  AudioBuffer _createBuffer_1(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames, sampleRate) native "AudioContext_createBuffer_1_Callback";


  /** @domName AudioContext.createBuffer_2 */
  AudioBuffer _createBuffer_2(buffer_OR_numberOfChannels, mixToMono_OR_numberOfFrames) native "AudioContext_createBuffer_2_Callback";


  /** @domName AudioContext.createBufferSource */
  AudioBufferSourceNode createBufferSource() native "AudioContext_createBufferSource_Callback";

  ChannelMergerNode createChannelMerger([/*unsigned long*/ numberOfInputs]) {
    if (?numberOfInputs) {
      return _createChannelMerger_1(numberOfInputs);
    }
    return _createChannelMerger_2();
  }


  /** @domName AudioContext.createChannelMerger_1 */
  ChannelMergerNode _createChannelMerger_1(numberOfInputs) native "AudioContext_createChannelMerger_1_Callback";


  /** @domName AudioContext.createChannelMerger_2 */
  ChannelMergerNode _createChannelMerger_2() native "AudioContext_createChannelMerger_2_Callback";

  ChannelSplitterNode createChannelSplitter([/*unsigned long*/ numberOfOutputs]) {
    if (?numberOfOutputs) {
      return _createChannelSplitter_1(numberOfOutputs);
    }
    return _createChannelSplitter_2();
  }


  /** @domName AudioContext.createChannelSplitter_1 */
  ChannelSplitterNode _createChannelSplitter_1(numberOfOutputs) native "AudioContext_createChannelSplitter_1_Callback";


  /** @domName AudioContext.createChannelSplitter_2 */
  ChannelSplitterNode _createChannelSplitter_2() native "AudioContext_createChannelSplitter_2_Callback";


  /** @domName AudioContext.createConvolver */
  ConvolverNode createConvolver() native "AudioContext_createConvolver_Callback";

  DelayNode createDelay([/*double*/ maxDelayTime]) {
    if (?maxDelayTime) {
      return _createDelay_1(maxDelayTime);
    }
    return _createDelay_2();
  }


  /** @domName AudioContext.createDelay_1 */
  DelayNode _createDelay_1(maxDelayTime) native "AudioContext_createDelay_1_Callback";


  /** @domName AudioContext.createDelay_2 */
  DelayNode _createDelay_2() native "AudioContext_createDelay_2_Callback";


  /** @domName AudioContext.createDynamicsCompressor */
  DynamicsCompressorNode createDynamicsCompressor() native "AudioContext_createDynamicsCompressor_Callback";


  /** @domName AudioContext.createGain */
  GainNode createGain() native "AudioContext_createGain_Callback";


  /** @domName AudioContext.createMediaElementSource */
  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) native "AudioContext_createMediaElementSource_Callback";


  /** @domName AudioContext.createMediaStreamSource */
  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) native "AudioContext_createMediaStreamSource_Callback";


  /** @domName AudioContext.createOscillator */
  OscillatorNode createOscillator() native "AudioContext_createOscillator_Callback";


  /** @domName AudioContext.createPanner */
  PannerNode createPanner() native "AudioContext_createPanner_Callback";

  ScriptProcessorNode createScriptProcessor(/*unsigned long*/ bufferSize, [/*unsigned long*/ numberOfInputChannels, /*unsigned long*/ numberOfOutputChannels]) {
    if (?numberOfOutputChannels) {
      return _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels);
    }
    if (?numberOfInputChannels) {
      return _createScriptProcessor_2(bufferSize, numberOfInputChannels);
    }
    return _createScriptProcessor_3(bufferSize);
  }


  /** @domName AudioContext.createScriptProcessor_1 */
  ScriptProcessorNode _createScriptProcessor_1(bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_1_Callback";


  /** @domName AudioContext.createScriptProcessor_2 */
  ScriptProcessorNode _createScriptProcessor_2(bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_2_Callback";


  /** @domName AudioContext.createScriptProcessor_3 */
  ScriptProcessorNode _createScriptProcessor_3(bufferSize) native "AudioContext_createScriptProcessor_3_Callback";


  /** @domName AudioContext.createWaveShaper */
  WaveShaperNode createWaveShaper() native "AudioContext_createWaveShaper_Callback";


  /** @domName AudioContext.createWaveTable */
  WaveTable createWaveTable(Float32Array real, Float32Array imag) native "AudioContext_createWaveTable_Callback";


  /** @domName AudioContext.decodeAudioData */
  void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) native "AudioContext_decodeAudioData_Callback";


  /** @domName AudioContext.startRendering */
  void startRendering() native "AudioContext_startRendering_Callback";

}

class AudioContextEvents extends Events {
  AudioContextEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get complete => this['complete'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName AudioDestinationNode
class AudioDestinationNode extends AudioNode {
  AudioDestinationNode.internal(): super.internal();


  /** @domName AudioDestinationNode.numberOfChannels */
  int get numberOfChannels native "AudioDestinationNode_numberOfChannels_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLAudioElement
class AudioElement extends MediaElement {

  factory AudioElement([String src]) {
    if (!?src) {
      return _AudioElementFactoryProvider.createAudioElement();
    }
    return _AudioElementFactoryProvider.createAudioElement(src);
  }
  AudioElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName AudioGain
class AudioGain extends AudioParam {
  AudioGain.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName AudioListener
class AudioListener extends NativeFieldWrapperClass1 {
  AudioListener.internal();


  /** @domName AudioListener.dopplerFactor */
  num get dopplerFactor native "AudioListener_dopplerFactor_Getter";


  /** @domName AudioListener.dopplerFactor */
  void set dopplerFactor(num value) native "AudioListener_dopplerFactor_Setter";


  /** @domName AudioListener.speedOfSound */
  num get speedOfSound native "AudioListener_speedOfSound_Getter";


  /** @domName AudioListener.speedOfSound */
  void set speedOfSound(num value) native "AudioListener_speedOfSound_Setter";


  /** @domName AudioListener.setOrientation */
  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) native "AudioListener_setOrientation_Callback";


  /** @domName AudioListener.setPosition */
  void setPosition(num x, num y, num z) native "AudioListener_setPosition_Callback";


  /** @domName AudioListener.setVelocity */
  void setVelocity(num x, num y, num z) native "AudioListener_setVelocity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName AudioNode
class AudioNode extends NativeFieldWrapperClass1 {
  AudioNode.internal();


  /** @domName AudioNode.context */
  AudioContext get context native "AudioNode_context_Getter";


  /** @domName AudioNode.numberOfInputs */
  int get numberOfInputs native "AudioNode_numberOfInputs_Getter";


  /** @domName AudioNode.numberOfOutputs */
  int get numberOfOutputs native "AudioNode_numberOfOutputs_Getter";

  void connect(destination, /*unsigned long*/ output, [/*unsigned long*/ input]) {
    if ((destination is AudioNode || destination == null) && (output is int || output == null) && (input is int || input == null)) {
      _connect_1(destination, output, input);
      return;
    }
    if ((destination is AudioParam || destination == null) && (output is int || output == null) && !?input) {
      _connect_2(destination, output);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName AudioNode.connect_1 */
  void _connect_1(destination, output, input) native "AudioNode_connect_1_Callback";


  /** @domName AudioNode.connect_2 */
  void _connect_2(destination, output) native "AudioNode_connect_2_Callback";


  /** @domName AudioNode.disconnect */
  void disconnect(int output) native "AudioNode_disconnect_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName AudioParam
class AudioParam extends NativeFieldWrapperClass1 {
  AudioParam.internal();


  /** @domName AudioParam.defaultValue */
  num get defaultValue native "AudioParam_defaultValue_Getter";


  /** @domName AudioParam.maxValue */
  num get maxValue native "AudioParam_maxValue_Getter";


  /** @domName AudioParam.minValue */
  num get minValue native "AudioParam_minValue_Getter";


  /** @domName AudioParam.name */
  String get name native "AudioParam_name_Getter";


  /** @domName AudioParam.units */
  int get units native "AudioParam_units_Getter";


  /** @domName AudioParam.value */
  num get value native "AudioParam_value_Getter";


  /** @domName AudioParam.value */
  void set value(num value) native "AudioParam_value_Setter";


  /** @domName AudioParam.cancelScheduledValues */
  void cancelScheduledValues(num startTime) native "AudioParam_cancelScheduledValues_Callback";


  /** @domName AudioParam.exponentialRampToValueAtTime */
  void exponentialRampToValueAtTime(num value, num time) native "AudioParam_exponentialRampToValueAtTime_Callback";


  /** @domName AudioParam.linearRampToValueAtTime */
  void linearRampToValueAtTime(num value, num time) native "AudioParam_linearRampToValueAtTime_Callback";


  /** @domName AudioParam.setTargetAtTime */
  void setTargetAtTime(num target, num time, num timeConstant) native "AudioParam_setTargetAtTime_Callback";


  /** @domName AudioParam.setValueAtTime */
  void setValueAtTime(num value, num time) native "AudioParam_setValueAtTime_Callback";


  /** @domName AudioParam.setValueCurveAtTime */
  void setValueCurveAtTime(Float32Array values, num time, num duration) native "AudioParam_setValueCurveAtTime_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName AudioProcessingEvent
class AudioProcessingEvent extends Event {
  AudioProcessingEvent.internal(): super.internal();


  /** @domName AudioProcessingEvent.inputBuffer */
  AudioBuffer get inputBuffer native "AudioProcessingEvent_inputBuffer_Getter";


  /** @domName AudioProcessingEvent.outputBuffer */
  AudioBuffer get outputBuffer native "AudioProcessingEvent_outputBuffer_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName AudioSourceNode
class AudioSourceNode extends AudioNode {
  AudioSourceNode.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName HTMLBRElement
class BRElement extends _Element_Merged {

  factory BRElement() => _Elements.createBRElement();
  BRElement.internal(): super.internal();


  /** @domName HTMLBRElement.clear */
  String get clear native "HTMLBRElement_clear_Getter";


  /** @domName HTMLBRElement.clear */
  void set clear(String value) native "HTMLBRElement_clear_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName BarInfo
class BarInfo extends NativeFieldWrapperClass1 {
  BarInfo.internal();


  /** @domName BarInfo.visible */
  bool get visible native "BarInfo_visible_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLBaseElement
class BaseElement extends _Element_Merged {

  factory BaseElement() => _Elements.createBaseElement();
  BaseElement.internal(): super.internal();


  /** @domName HTMLBaseElement.href */
  String get href native "HTMLBaseElement_href_Getter";


  /** @domName HTMLBaseElement.href */
  void set href(String value) native "HTMLBaseElement_href_Setter";


  /** @domName HTMLBaseElement.target */
  String get target native "HTMLBaseElement_target_Getter";


  /** @domName HTMLBaseElement.target */
  void set target(String value) native "HTMLBaseElement_target_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLBaseFontElement
class BaseFontElement extends _Element_Merged {
  BaseFontElement.internal(): super.internal();


  /** @domName HTMLBaseFontElement.color */
  String get color native "HTMLBaseFontElement_color_Getter";


  /** @domName HTMLBaseFontElement.color */
  void set color(String value) native "HTMLBaseFontElement_color_Setter";


  /** @domName HTMLBaseFontElement.face */
  String get face native "HTMLBaseFontElement_face_Getter";


  /** @domName HTMLBaseFontElement.face */
  void set face(String value) native "HTMLBaseFontElement_face_Setter";


  /** @domName HTMLBaseFontElement.size */
  int get size native "HTMLBaseFontElement_size_Getter";


  /** @domName HTMLBaseFontElement.size */
  void set size(int value) native "HTMLBaseFontElement_size_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName BatteryManager
class BatteryManager extends EventTarget {
  BatteryManager.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  BatteryManagerEvents get on =>
    new BatteryManagerEvents(this);


  /** @domName BatteryManager.charging */
  bool get charging native "BatteryManager_charging_Getter";


  /** @domName BatteryManager.chargingTime */
  num get chargingTime native "BatteryManager_chargingTime_Getter";


  /** @domName BatteryManager.dischargingTime */
  num get dischargingTime native "BatteryManager_dischargingTime_Getter";


  /** @domName BatteryManager.level */
  num get level native "BatteryManager_level_Getter";


  /** @domName BatteryManager.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_addEventListener_Callback";


  /** @domName BatteryManager.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "BatteryManager_dispatchEvent_Callback";


  /** @domName BatteryManager.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_removeEventListener_Callback";

}

class BatteryManagerEvents extends Events {
  BatteryManagerEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get chargingChange => this['chargingchange'];

  EventListenerList get chargingTimeChange => this['chargingtimechange'];

  EventListenerList get dischargingTimeChange => this['dischargingtimechange'];

  EventListenerList get levelChange => this['levelchange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName BeforeLoadEvent
class BeforeLoadEvent extends Event {
  BeforeLoadEvent.internal(): super.internal();


  /** @domName BeforeLoadEvent.url */
  String get url native "BeforeLoadEvent_url_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName BiquadFilterNode
class BiquadFilterNode extends AudioNode {
  BiquadFilterNode.internal(): super.internal();

  static const int ALLPASS = 7;

  static const int BANDPASS = 2;

  static const int HIGHPASS = 1;

  static const int HIGHSHELF = 4;

  static const int LOWPASS = 0;

  static const int LOWSHELF = 3;

  static const int NOTCH = 6;

  static const int PEAKING = 5;


  /** @domName BiquadFilterNode.Q */
  AudioParam get Q native "BiquadFilterNode_Q_Getter";


  /** @domName BiquadFilterNode.frequency */
  AudioParam get frequency native "BiquadFilterNode_frequency_Getter";


  /** @domName BiquadFilterNode.gain */
  AudioParam get gain native "BiquadFilterNode_gain_Getter";


  /** @domName BiquadFilterNode.type */
  int get type native "BiquadFilterNode_type_Getter";


  /** @domName BiquadFilterNode.type */
  void set type(int value) native "BiquadFilterNode_type_Setter";


  /** @domName BiquadFilterNode.getFrequencyResponse */
  void getFrequencyResponse(Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Blob
class Blob extends NativeFieldWrapperClass1 {

  factory Blob(List blobParts, [String type, String endings]) {
    if (!?type) {
      return _BlobFactoryProvider.createBlob(blobParts);
    }
    if (!?endings) {
      return _BlobFactoryProvider.createBlob(blobParts, type);
    }
    return _BlobFactoryProvider.createBlob(blobParts, type, endings);
  }
  Blob.internal();


  /** @domName Blob.size */
  int get size native "Blob_size_Getter";


  /** @domName Blob.type */
  String get type native "Blob_type_Getter";

  Blob slice([/*long long*/ start, /*long long*/ end, /*DOMString*/ contentType]) {
    if (?contentType) {
      return _slice_1(start, end, contentType);
    }
    if (?end) {
      return _slice_2(start, end);
    }
    if (?start) {
      return _slice_3(start);
    }
    return _slice_4();
  }


  /** @domName Blob.slice_1 */
  Blob _slice_1(start, end, contentType) native "Blob_slice_1_Callback";


  /** @domName Blob.slice_2 */
  Blob _slice_2(start, end) native "Blob_slice_2_Callback";


  /** @domName Blob.slice_3 */
  Blob _slice_3(start) native "Blob_slice_3_Callback";


  /** @domName Blob.slice_4 */
  Blob _slice_4() native "Blob_slice_4_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLBodyElement
class BodyElement extends _Element_Merged {

  factory BodyElement() => _Elements.createBodyElement();
  BodyElement.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  BodyElementEvents get on =>
    new BodyElementEvents(this);


  /** @domName HTMLBodyElement.aLink */
  String get aLink native "HTMLBodyElement_aLink_Getter";


  /** @domName HTMLBodyElement.aLink */
  void set aLink(String value) native "HTMLBodyElement_aLink_Setter";


  /** @domName HTMLBodyElement.background */
  String get background native "HTMLBodyElement_background_Getter";


  /** @domName HTMLBodyElement.background */
  void set background(String value) native "HTMLBodyElement_background_Setter";


  /** @domName HTMLBodyElement.bgColor */
  String get bgColor native "HTMLBodyElement_bgColor_Getter";


  /** @domName HTMLBodyElement.bgColor */
  void set bgColor(String value) native "HTMLBodyElement_bgColor_Setter";


  /** @domName HTMLBodyElement.link */
  String get link native "HTMLBodyElement_link_Getter";


  /** @domName HTMLBodyElement.link */
  void set link(String value) native "HTMLBodyElement_link_Setter";


  /** @domName HTMLBodyElement.vLink */
  String get vLink native "HTMLBodyElement_vLink_Getter";


  /** @domName HTMLBodyElement.vLink */
  void set vLink(String value) native "HTMLBodyElement_vLink_Setter";

}

class BodyElementEvents extends ElementEvents {
  BodyElementEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get beforeUnload => this['beforeunload'];

  EventListenerList get blur => this['blur'];

  EventListenerList get error => this['error'];

  EventListenerList get focus => this['focus'];

  EventListenerList get hashChange => this['hashchange'];

  EventListenerList get load => this['load'];

  EventListenerList get message => this['message'];

  EventListenerList get offline => this['offline'];

  EventListenerList get online => this['online'];

  EventListenerList get popState => this['popstate'];

  EventListenerList get resize => this['resize'];

  EventListenerList get storage => this['storage'];

  EventListenerList get unload => this['unload'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName HTMLButtonElement
class ButtonElement extends _Element_Merged {

  factory ButtonElement() => _Elements.createButtonElement();
  ButtonElement.internal(): super.internal();


  /** @domName HTMLButtonElement.autofocus */
  bool get autofocus native "HTMLButtonElement_autofocus_Getter";


  /** @domName HTMLButtonElement.autofocus */
  void set autofocus(bool value) native "HTMLButtonElement_autofocus_Setter";


  /** @domName HTMLButtonElement.disabled */
  bool get disabled native "HTMLButtonElement_disabled_Getter";


  /** @domName HTMLButtonElement.disabled */
  void set disabled(bool value) native "HTMLButtonElement_disabled_Setter";


  /** @domName HTMLButtonElement.form */
  FormElement get form native "HTMLButtonElement_form_Getter";


  /** @domName HTMLButtonElement.formAction */
  String get formAction native "HTMLButtonElement_formAction_Getter";


  /** @domName HTMLButtonElement.formAction */
  void set formAction(String value) native "HTMLButtonElement_formAction_Setter";


  /** @domName HTMLButtonElement.formEnctype */
  String get formEnctype native "HTMLButtonElement_formEnctype_Getter";


  /** @domName HTMLButtonElement.formEnctype */
  void set formEnctype(String value) native "HTMLButtonElement_formEnctype_Setter";


  /** @domName HTMLButtonElement.formMethod */
  String get formMethod native "HTMLButtonElement_formMethod_Getter";


  /** @domName HTMLButtonElement.formMethod */
  void set formMethod(String value) native "HTMLButtonElement_formMethod_Setter";


  /** @domName HTMLButtonElement.formNoValidate */
  bool get formNoValidate native "HTMLButtonElement_formNoValidate_Getter";


  /** @domName HTMLButtonElement.formNoValidate */
  void set formNoValidate(bool value) native "HTMLButtonElement_formNoValidate_Setter";


  /** @domName HTMLButtonElement.formTarget */
  String get formTarget native "HTMLButtonElement_formTarget_Getter";


  /** @domName HTMLButtonElement.formTarget */
  void set formTarget(String value) native "HTMLButtonElement_formTarget_Setter";


  /** @domName HTMLButtonElement.labels */
  List<Node> get labels native "HTMLButtonElement_labels_Getter";


  /** @domName HTMLButtonElement.name */
  String get name native "HTMLButtonElement_name_Getter";


  /** @domName HTMLButtonElement.name */
  void set name(String value) native "HTMLButtonElement_name_Setter";


  /** @domName HTMLButtonElement.type */
  String get type native "HTMLButtonElement_type_Getter";


  /** @domName HTMLButtonElement.type */
  void set type(String value) native "HTMLButtonElement_type_Setter";


  /** @domName HTMLButtonElement.validationMessage */
  String get validationMessage native "HTMLButtonElement_validationMessage_Getter";


  /** @domName HTMLButtonElement.validity */
  ValidityState get validity native "HTMLButtonElement_validity_Getter";


  /** @domName HTMLButtonElement.value */
  String get value native "HTMLButtonElement_value_Getter";


  /** @domName HTMLButtonElement.value */
  void set value(String value) native "HTMLButtonElement_value_Setter";


  /** @domName HTMLButtonElement.willValidate */
  bool get willValidate native "HTMLButtonElement_willValidate_Getter";


  /** @domName HTMLButtonElement.checkValidity */
  bool checkValidity() native "HTMLButtonElement_checkValidity_Callback";


  /** @domName HTMLButtonElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLButtonElement_setCustomValidity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName CDATASection
class CDATASection extends Text {
  CDATASection.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName CSSCharsetRule
class CSSCharsetRule extends CSSRule {
  CSSCharsetRule.internal(): super.internal();


  /** @domName CSSCharsetRule.encoding */
  String get encoding native "CSSCharsetRule_encoding_Getter";


  /** @domName CSSCharsetRule.encoding */
  void set encoding(String value) native "CSSCharsetRule_encoding_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName CSSFontFaceRule
class CSSFontFaceRule extends CSSRule {
  CSSFontFaceRule.internal(): super.internal();


  /** @domName CSSFontFaceRule.style */
  CSSStyleDeclaration get style native "CSSFontFaceRule_style_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName CSSImportRule
class CSSImportRule extends CSSRule {
  CSSImportRule.internal(): super.internal();


  /** @domName CSSImportRule.href */
  String get href native "CSSImportRule_href_Getter";


  /** @domName CSSImportRule.media */
  MediaList get media native "CSSImportRule_media_Getter";


  /** @domName CSSImportRule.styleSheet */
  CSSStyleSheet get styleSheet native "CSSImportRule_styleSheet_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitCSSKeyframeRule
class CSSKeyframeRule extends CSSRule {
  CSSKeyframeRule.internal(): super.internal();


  /** @domName WebKitCSSKeyframeRule.keyText */
  String get keyText native "WebKitCSSKeyframeRule_keyText_Getter";


  /** @domName WebKitCSSKeyframeRule.keyText */
  void set keyText(String value) native "WebKitCSSKeyframeRule_keyText_Setter";


  /** @domName WebKitCSSKeyframeRule.style */
  CSSStyleDeclaration get style native "WebKitCSSKeyframeRule_style_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitCSSKeyframesRule
class CSSKeyframesRule extends CSSRule {
  CSSKeyframesRule.internal(): super.internal();


  /** @domName WebKitCSSKeyframesRule.cssRules */
  List<CSSRule> get cssRules native "WebKitCSSKeyframesRule_cssRules_Getter";


  /** @domName WebKitCSSKeyframesRule.name */
  String get name native "WebKitCSSKeyframesRule_name_Getter";


  /** @domName WebKitCSSKeyframesRule.name */
  void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";


  /** @domName WebKitCSSKeyframesRule.deleteRule */
  void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";


  /** @domName WebKitCSSKeyframesRule.findRule */
  CSSKeyframeRule findRule(String key) native "WebKitCSSKeyframesRule_findRule_Callback";


  /** @domName WebKitCSSKeyframesRule.insertRule */
  void insertRule(String rule) native "WebKitCSSKeyframesRule_insertRule_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitCSSMatrix
class CSSMatrix extends NativeFieldWrapperClass1 {

  factory CSSMatrix([String cssValue]) {
    if (!?cssValue) {
      return _CSSMatrixFactoryProvider.createCSSMatrix();
    }
    return _CSSMatrixFactoryProvider.createCSSMatrix(cssValue);
  }
  CSSMatrix.internal();


  /** @domName WebKitCSSMatrix.a */
  num get a native "WebKitCSSMatrix_a_Getter";


  /** @domName WebKitCSSMatrix.a */
  void set a(num value) native "WebKitCSSMatrix_a_Setter";


  /** @domName WebKitCSSMatrix.b */
  num get b native "WebKitCSSMatrix_b_Getter";


  /** @domName WebKitCSSMatrix.b */
  void set b(num value) native "WebKitCSSMatrix_b_Setter";


  /** @domName WebKitCSSMatrix.c */
  num get c native "WebKitCSSMatrix_c_Getter";


  /** @domName WebKitCSSMatrix.c */
  void set c(num value) native "WebKitCSSMatrix_c_Setter";


  /** @domName WebKitCSSMatrix.d */
  num get d native "WebKitCSSMatrix_d_Getter";


  /** @domName WebKitCSSMatrix.d */
  void set d(num value) native "WebKitCSSMatrix_d_Setter";


  /** @domName WebKitCSSMatrix.e */
  num get e native "WebKitCSSMatrix_e_Getter";


  /** @domName WebKitCSSMatrix.e */
  void set e(num value) native "WebKitCSSMatrix_e_Setter";


  /** @domName WebKitCSSMatrix.f */
  num get f native "WebKitCSSMatrix_f_Getter";


  /** @domName WebKitCSSMatrix.f */
  void set f(num value) native "WebKitCSSMatrix_f_Setter";


  /** @domName WebKitCSSMatrix.m11 */
  num get m11 native "WebKitCSSMatrix_m11_Getter";


  /** @domName WebKitCSSMatrix.m11 */
  void set m11(num value) native "WebKitCSSMatrix_m11_Setter";


  /** @domName WebKitCSSMatrix.m12 */
  num get m12 native "WebKitCSSMatrix_m12_Getter";


  /** @domName WebKitCSSMatrix.m12 */
  void set m12(num value) native "WebKitCSSMatrix_m12_Setter";


  /** @domName WebKitCSSMatrix.m13 */
  num get m13 native "WebKitCSSMatrix_m13_Getter";


  /** @domName WebKitCSSMatrix.m13 */
  void set m13(num value) native "WebKitCSSMatrix_m13_Setter";


  /** @domName WebKitCSSMatrix.m14 */
  num get m14 native "WebKitCSSMatrix_m14_Getter";


  /** @domName WebKitCSSMatrix.m14 */
  void set m14(num value) native "WebKitCSSMatrix_m14_Setter";


  /** @domName WebKitCSSMatrix.m21 */
  num get m21 native "WebKitCSSMatrix_m21_Getter";


  /** @domName WebKitCSSMatrix.m21 */
  void set m21(num value) native "WebKitCSSMatrix_m21_Setter";


  /** @domName WebKitCSSMatrix.m22 */
  num get m22 native "WebKitCSSMatrix_m22_Getter";


  /** @domName WebKitCSSMatrix.m22 */
  void set m22(num value) native "WebKitCSSMatrix_m22_Setter";


  /** @domName WebKitCSSMatrix.m23 */
  num get m23 native "WebKitCSSMatrix_m23_Getter";


  /** @domName WebKitCSSMatrix.m23 */
  void set m23(num value) native "WebKitCSSMatrix_m23_Setter";


  /** @domName WebKitCSSMatrix.m24 */
  num get m24 native "WebKitCSSMatrix_m24_Getter";


  /** @domName WebKitCSSMatrix.m24 */
  void set m24(num value) native "WebKitCSSMatrix_m24_Setter";


  /** @domName WebKitCSSMatrix.m31 */
  num get m31 native "WebKitCSSMatrix_m31_Getter";


  /** @domName WebKitCSSMatrix.m31 */
  void set m31(num value) native "WebKitCSSMatrix_m31_Setter";


  /** @domName WebKitCSSMatrix.m32 */
  num get m32 native "WebKitCSSMatrix_m32_Getter";


  /** @domName WebKitCSSMatrix.m32 */
  void set m32(num value) native "WebKitCSSMatrix_m32_Setter";


  /** @domName WebKitCSSMatrix.m33 */
  num get m33 native "WebKitCSSMatrix_m33_Getter";


  /** @domName WebKitCSSMatrix.m33 */
  void set m33(num value) native "WebKitCSSMatrix_m33_Setter";


  /** @domName WebKitCSSMatrix.m34 */
  num get m34 native "WebKitCSSMatrix_m34_Getter";


  /** @domName WebKitCSSMatrix.m34 */
  void set m34(num value) native "WebKitCSSMatrix_m34_Setter";


  /** @domName WebKitCSSMatrix.m41 */
  num get m41 native "WebKitCSSMatrix_m41_Getter";


  /** @domName WebKitCSSMatrix.m41 */
  void set m41(num value) native "WebKitCSSMatrix_m41_Setter";


  /** @domName WebKitCSSMatrix.m42 */
  num get m42 native "WebKitCSSMatrix_m42_Getter";


  /** @domName WebKitCSSMatrix.m42 */
  void set m42(num value) native "WebKitCSSMatrix_m42_Setter";


  /** @domName WebKitCSSMatrix.m43 */
  num get m43 native "WebKitCSSMatrix_m43_Getter";


  /** @domName WebKitCSSMatrix.m43 */
  void set m43(num value) native "WebKitCSSMatrix_m43_Setter";


  /** @domName WebKitCSSMatrix.m44 */
  num get m44 native "WebKitCSSMatrix_m44_Getter";


  /** @domName WebKitCSSMatrix.m44 */
  void set m44(num value) native "WebKitCSSMatrix_m44_Setter";


  /** @domName WebKitCSSMatrix.inverse */
  CSSMatrix inverse() native "WebKitCSSMatrix_inverse_Callback";


  /** @domName WebKitCSSMatrix.multiply */
  CSSMatrix multiply(CSSMatrix secondMatrix) native "WebKitCSSMatrix_multiply_Callback";


  /** @domName WebKitCSSMatrix.rotate */
  CSSMatrix rotate(num rotX, num rotY, num rotZ) native "WebKitCSSMatrix_rotate_Callback";


  /** @domName WebKitCSSMatrix.rotateAxisAngle */
  CSSMatrix rotateAxisAngle(num x, num y, num z, num angle) native "WebKitCSSMatrix_rotateAxisAngle_Callback";


  /** @domName WebKitCSSMatrix.scale */
  CSSMatrix scale(num scaleX, num scaleY, num scaleZ) native "WebKitCSSMatrix_scale_Callback";


  /** @domName WebKitCSSMatrix.setMatrixValue */
  void setMatrixValue(String string) native "WebKitCSSMatrix_setMatrixValue_Callback";


  /** @domName WebKitCSSMatrix.skewX */
  CSSMatrix skewX(num angle) native "WebKitCSSMatrix_skewX_Callback";


  /** @domName WebKitCSSMatrix.skewY */
  CSSMatrix skewY(num angle) native "WebKitCSSMatrix_skewY_Callback";


  /** @domName WebKitCSSMatrix.toString */
  String toString() native "WebKitCSSMatrix_toString_Callback";


  /** @domName WebKitCSSMatrix.translate */
  CSSMatrix translate(num x, num y, num z) native "WebKitCSSMatrix_translate_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName CSSMediaRule
class CSSMediaRule extends CSSRule {
  CSSMediaRule.internal(): super.internal();


  /** @domName CSSMediaRule.cssRules */
  List<CSSRule> get cssRules native "CSSMediaRule_cssRules_Getter";


  /** @domName CSSMediaRule.media */
  MediaList get media native "CSSMediaRule_media_Getter";


  /** @domName CSSMediaRule.deleteRule */
  void deleteRule(int index) native "CSSMediaRule_deleteRule_Callback";


  /** @domName CSSMediaRule.insertRule */
  int insertRule(String rule, int index) native "CSSMediaRule_insertRule_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName CSSPageRule
class CSSPageRule extends CSSRule {
  CSSPageRule.internal(): super.internal();


  /** @domName CSSPageRule.selectorText */
  String get selectorText native "CSSPageRule_selectorText_Getter";


  /** @domName CSSPageRule.selectorText */
  void set selectorText(String value) native "CSSPageRule_selectorText_Setter";


  /** @domName CSSPageRule.style */
  CSSStyleDeclaration get style native "CSSPageRule_style_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName CSSPrimitiveValue
class CSSPrimitiveValue extends CSSValue {
  CSSPrimitiveValue.internal(): super.internal();

  static const int CSS_ATTR = 22;

  static const int CSS_CM = 6;

  static const int CSS_COUNTER = 23;

  static const int CSS_DEG = 11;

  static const int CSS_DIMENSION = 18;

  static const int CSS_EMS = 3;

  static const int CSS_EXS = 4;

  static const int CSS_GRAD = 13;

  static const int CSS_HZ = 16;

  static const int CSS_IDENT = 21;

  static const int CSS_IN = 8;

  static const int CSS_KHZ = 17;

  static const int CSS_MM = 7;

  static const int CSS_MS = 14;

  static const int CSS_NUMBER = 1;

  static const int CSS_PC = 10;

  static const int CSS_PERCENTAGE = 2;

  static const int CSS_PT = 9;

  static const int CSS_PX = 5;

  static const int CSS_RAD = 12;

  static const int CSS_RECT = 24;

  static const int CSS_RGBCOLOR = 25;

  static const int CSS_S = 15;

  static const int CSS_STRING = 19;

  static const int CSS_UNKNOWN = 0;

  static const int CSS_URI = 20;

  static const int CSS_VH = 27;

  static const int CSS_VMIN = 28;

  static const int CSS_VW = 26;


  /** @domName CSSPrimitiveValue.primitiveType */
  int get primitiveType native "CSSPrimitiveValue_primitiveType_Getter";


  /** @domName CSSPrimitiveValue.getCounterValue */
  Counter getCounterValue() native "CSSPrimitiveValue_getCounterValue_Callback";


  /** @domName CSSPrimitiveValue.getFloatValue */
  num getFloatValue(int unitType) native "CSSPrimitiveValue_getFloatValue_Callback";


  /** @domName CSSPrimitiveValue.getRGBColorValue */
  RGBColor getRGBColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";


  /** @domName CSSPrimitiveValue.getRectValue */
  Rect getRectValue() native "CSSPrimitiveValue_getRectValue_Callback";


  /** @domName CSSPrimitiveValue.getStringValue */
  String getStringValue() native "CSSPrimitiveValue_getStringValue_Callback";


  /** @domName CSSPrimitiveValue.setFloatValue */
  void setFloatValue(int unitType, num floatValue) native "CSSPrimitiveValue_setFloatValue_Callback";


  /** @domName CSSPrimitiveValue.setStringValue */
  void setStringValue(int stringType, String stringValue) native "CSSPrimitiveValue_setStringValue_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName CSSRule
class CSSRule extends NativeFieldWrapperClass1 {
  CSSRule.internal();

  static const int CHARSET_RULE = 2;

  static const int FONT_FACE_RULE = 5;

  static const int IMPORT_RULE = 3;

  static const int MEDIA_RULE = 4;

  static const int PAGE_RULE = 6;

  static const int STYLE_RULE = 1;

  static const int UNKNOWN_RULE = 0;

  static const int WEBKIT_KEYFRAMES_RULE = 7;

  static const int WEBKIT_KEYFRAME_RULE = 8;


  /** @domName CSSRule.cssText */
  String get cssText native "CSSRule_cssText_Getter";


  /** @domName CSSRule.cssText */
  void set cssText(String value) native "CSSRule_cssText_Setter";


  /** @domName CSSRule.parentRule */
  CSSRule get parentRule native "CSSRule_parentRule_Getter";


  /** @domName CSSRule.parentStyleSheet */
  CSSStyleSheet get parentStyleSheet native "CSSRule_parentStyleSheet_Getter";


  /** @domName CSSRule.type */
  int get type native "CSSRule_type_Getter";

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

String _cachedBrowserPrefix;

String get _browserPrefix {
  if (_cachedBrowserPrefix == null) {
    if (_Device.isFirefox) {
      _cachedBrowserPrefix = '-moz-';
    } else if (_Device.isIE) {
      _cachedBrowserPrefix = '-ms-';
    } else if (_Device.isOpera) {
      _cachedBrowserPrefix = '-o-';
    } else {
      _cachedBrowserPrefix = '-webkit-';
    }
  }
  return _cachedBrowserPrefix;
}

class CSSStyleDeclaration extends NativeFieldWrapperClass1 {
  factory CSSStyleDeclaration() => _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration();
  factory CSSStyleDeclaration.css(String css) =>
      _CSSStyleDeclarationFactoryProvider.createCSSStyleDeclaration_css(css);

  CSSStyleDeclaration.internal();


  /** @domName CSSStyleDeclaration.cssText */
  String get cssText native "CSSStyleDeclaration_cssText_Getter";


  /** @domName CSSStyleDeclaration.cssText */
  void set cssText(String value) native "CSSStyleDeclaration_cssText_Setter";


  /** @domName CSSStyleDeclaration.length */
  int get length native "CSSStyleDeclaration_length_Getter";


  /** @domName CSSStyleDeclaration.parentRule */
  CSSRule get parentRule native "CSSStyleDeclaration_parentRule_Getter";


  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
  CSSValue getPropertyCSSValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";


  /** @domName CSSStyleDeclaration.getPropertyPriority */
  String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";


  /** @domName CSSStyleDeclaration.getPropertyShorthand */
  String getPropertyShorthand(String propertyName) native "CSSStyleDeclaration_getPropertyShorthand_Callback";


  /** @domName CSSStyleDeclaration._getPropertyValue */
  String _getPropertyValue(String propertyName) native "CSSStyleDeclaration__getPropertyValue_Callback";


  /** @domName CSSStyleDeclaration.isPropertyImplicit */
  bool isPropertyImplicit(String propertyName) native "CSSStyleDeclaration_isPropertyImplicit_Callback";


  /** @domName CSSStyleDeclaration.item */
  String item(int index) native "CSSStyleDeclaration_item_Callback";


  /** @domName CSSStyleDeclaration.removeProperty */
  String removeProperty(String propertyName) native "CSSStyleDeclaration_removeProperty_Callback";


  /** @domName CSSStyleDeclaration.setProperty */
  void setProperty(String propertyName, String value, [String priority]) native "CSSStyleDeclaration_setProperty_Callback";


  String getPropertyValue(String propertyName) {
    var propValue = _getPropertyValue(propertyName);
    return propValue != null ? propValue : '';
  }


  // TODO(jacobr): generate this list of properties using the existing script.
    /** Gets the value of "animation" */
  String get animation =>
    getPropertyValue('${_browserPrefix}animation');

  /** Sets the value of "animation" */
  void set animation(var value) {
    setProperty('${_browserPrefix}animation', value, '');
  }

  /** Gets the value of "animation-delay" */
  String get animationDelay =>
    getPropertyValue('${_browserPrefix}animation-delay');

  /** Sets the value of "animation-delay" */
  void set animationDelay(var value) {
    setProperty('${_browserPrefix}animation-delay', value, '');
  }

  /** Gets the value of "animation-direction" */
  String get animationDirection =>
    getPropertyValue('${_browserPrefix}animation-direction');

  /** Sets the value of "animation-direction" */
  void set animationDirection(var value) {
    setProperty('${_browserPrefix}animation-direction', value, '');
  }

  /** Gets the value of "animation-duration" */
  String get animationDuration =>
    getPropertyValue('${_browserPrefix}animation-duration');

  /** Sets the value of "animation-duration" */
  void set animationDuration(var value) {
    setProperty('${_browserPrefix}animation-duration', value, '');
  }

  /** Gets the value of "animation-fill-mode" */
  String get animationFillMode =>
    getPropertyValue('${_browserPrefix}animation-fill-mode');

  /** Sets the value of "animation-fill-mode" */
  void set animationFillMode(var value) {
    setProperty('${_browserPrefix}animation-fill-mode', value, '');
  }

  /** Gets the value of "animation-iteration-count" */
  String get animationIterationCount =>
    getPropertyValue('${_browserPrefix}animation-iteration-count');

  /** Sets the value of "animation-iteration-count" */
  void set animationIterationCount(var value) {
    setProperty('${_browserPrefix}animation-iteration-count', value, '');
  }

  /** Gets the value of "animation-name" */
  String get animationName =>
    getPropertyValue('${_browserPrefix}animation-name');

  /** Sets the value of "animation-name" */
  void set animationName(var value) {
    setProperty('${_browserPrefix}animation-name', value, '');
  }

  /** Gets the value of "animation-play-state" */
  String get animationPlayState =>
    getPropertyValue('${_browserPrefix}animation-play-state');

  /** Sets the value of "animation-play-state" */
  void set animationPlayState(var value) {
    setProperty('${_browserPrefix}animation-play-state', value, '');
  }

  /** Gets the value of "animation-timing-function" */
  String get animationTimingFunction =>
    getPropertyValue('${_browserPrefix}animation-timing-function');

  /** Sets the value of "animation-timing-function" */
  void set animationTimingFunction(var value) {
    setProperty('${_browserPrefix}animation-timing-function', value, '');
  }

  /** Gets the value of "appearance" */
  String get appearance =>
    getPropertyValue('${_browserPrefix}appearance');

  /** Sets the value of "appearance" */
  void set appearance(var value) {
    setProperty('${_browserPrefix}appearance', value, '');
  }

  /** Gets the value of "backface-visibility" */
  String get backfaceVisibility =>
    getPropertyValue('${_browserPrefix}backface-visibility');

  /** Sets the value of "backface-visibility" */
  void set backfaceVisibility(var value) {
    setProperty('${_browserPrefix}backface-visibility', value, '');
  }

  /** Gets the value of "background" */
  String get background =>
    getPropertyValue('background');

  /** Sets the value of "background" */
  void set background(var value) {
    setProperty('background', value, '');
  }

  /** Gets the value of "background-attachment" */
  String get backgroundAttachment =>
    getPropertyValue('background-attachment');

  /** Sets the value of "background-attachment" */
  void set backgroundAttachment(var value) {
    setProperty('background-attachment', value, '');
  }

  /** Gets the value of "background-clip" */
  String get backgroundClip =>
    getPropertyValue('background-clip');

  /** Sets the value of "background-clip" */
  void set backgroundClip(var value) {
    setProperty('background-clip', value, '');
  }

  /** Gets the value of "background-color" */
  String get backgroundColor =>
    getPropertyValue('background-color');

  /** Sets the value of "background-color" */
  void set backgroundColor(var value) {
    setProperty('background-color', value, '');
  }

  /** Gets the value of "background-composite" */
  String get backgroundComposite =>
    getPropertyValue('${_browserPrefix}background-composite');

  /** Sets the value of "background-composite" */
  void set backgroundComposite(var value) {
    setProperty('${_browserPrefix}background-composite', value, '');
  }

  /** Gets the value of "background-image" */
  String get backgroundImage =>
    getPropertyValue('background-image');

  /** Sets the value of "background-image" */
  void set backgroundImage(var value) {
    setProperty('background-image', value, '');
  }

  /** Gets the value of "background-origin" */
  String get backgroundOrigin =>
    getPropertyValue('background-origin');

  /** Sets the value of "background-origin" */
  void set backgroundOrigin(var value) {
    setProperty('background-origin', value, '');
  }

  /** Gets the value of "background-position" */
  String get backgroundPosition =>
    getPropertyValue('background-position');

  /** Sets the value of "background-position" */
  void set backgroundPosition(var value) {
    setProperty('background-position', value, '');
  }

  /** Gets the value of "background-position-x" */
  String get backgroundPositionX =>
    getPropertyValue('background-position-x');

  /** Sets the value of "background-position-x" */
  void set backgroundPositionX(var value) {
    setProperty('background-position-x', value, '');
  }

  /** Gets the value of "background-position-y" */
  String get backgroundPositionY =>
    getPropertyValue('background-position-y');

  /** Sets the value of "background-position-y" */
  void set backgroundPositionY(var value) {
    setProperty('background-position-y', value, '');
  }

  /** Gets the value of "background-repeat" */
  String get backgroundRepeat =>
    getPropertyValue('background-repeat');

  /** Sets the value of "background-repeat" */
  void set backgroundRepeat(var value) {
    setProperty('background-repeat', value, '');
  }

  /** Gets the value of "background-repeat-x" */
  String get backgroundRepeatX =>
    getPropertyValue('background-repeat-x');

  /** Sets the value of "background-repeat-x" */
  void set backgroundRepeatX(var value) {
    setProperty('background-repeat-x', value, '');
  }

  /** Gets the value of "background-repeat-y" */
  String get backgroundRepeatY =>
    getPropertyValue('background-repeat-y');

  /** Sets the value of "background-repeat-y" */
  void set backgroundRepeatY(var value) {
    setProperty('background-repeat-y', value, '');
  }

  /** Gets the value of "background-size" */
  String get backgroundSize =>
    getPropertyValue('background-size');

  /** Sets the value of "background-size" */
  void set backgroundSize(var value) {
    setProperty('background-size', value, '');
  }

  /** Gets the value of "border" */
  String get border =>
    getPropertyValue('border');

  /** Sets the value of "border" */
  void set border(var value) {
    setProperty('border', value, '');
  }

  /** Gets the value of "border-after" */
  String get borderAfter =>
    getPropertyValue('${_browserPrefix}border-after');

  /** Sets the value of "border-after" */
  void set borderAfter(var value) {
    setProperty('${_browserPrefix}border-after', value, '');
  }

  /** Gets the value of "border-after-color" */
  String get borderAfterColor =>
    getPropertyValue('${_browserPrefix}border-after-color');

  /** Sets the value of "border-after-color" */
  void set borderAfterColor(var value) {
    setProperty('${_browserPrefix}border-after-color', value, '');
  }

  /** Gets the value of "border-after-style" */
  String get borderAfterStyle =>
    getPropertyValue('${_browserPrefix}border-after-style');

  /** Sets the value of "border-after-style" */
  void set borderAfterStyle(var value) {
    setProperty('${_browserPrefix}border-after-style', value, '');
  }

  /** Gets the value of "border-after-width" */
  String get borderAfterWidth =>
    getPropertyValue('${_browserPrefix}border-after-width');

  /** Sets the value of "border-after-width" */
  void set borderAfterWidth(var value) {
    setProperty('${_browserPrefix}border-after-width', value, '');
  }

  /** Gets the value of "border-before" */
  String get borderBefore =>
    getPropertyValue('${_browserPrefix}border-before');

  /** Sets the value of "border-before" */
  void set borderBefore(var value) {
    setProperty('${_browserPrefix}border-before', value, '');
  }

  /** Gets the value of "border-before-color" */
  String get borderBeforeColor =>
    getPropertyValue('${_browserPrefix}border-before-color');

  /** Sets the value of "border-before-color" */
  void set borderBeforeColor(var value) {
    setProperty('${_browserPrefix}border-before-color', value, '');
  }

  /** Gets the value of "border-before-style" */
  String get borderBeforeStyle =>
    getPropertyValue('${_browserPrefix}border-before-style');

  /** Sets the value of "border-before-style" */
  void set borderBeforeStyle(var value) {
    setProperty('${_browserPrefix}border-before-style', value, '');
  }

  /** Gets the value of "border-before-width" */
  String get borderBeforeWidth =>
    getPropertyValue('${_browserPrefix}border-before-width');

  /** Sets the value of "border-before-width" */
  void set borderBeforeWidth(var value) {
    setProperty('${_browserPrefix}border-before-width', value, '');
  }

  /** Gets the value of "border-bottom" */
  String get borderBottom =>
    getPropertyValue('border-bottom');

  /** Sets the value of "border-bottom" */
  void set borderBottom(var value) {
    setProperty('border-bottom', value, '');
  }

  /** Gets the value of "border-bottom-color" */
  String get borderBottomColor =>
    getPropertyValue('border-bottom-color');

  /** Sets the value of "border-bottom-color" */
  void set borderBottomColor(var value) {
    setProperty('border-bottom-color', value, '');
  }

  /** Gets the value of "border-bottom-left-radius" */
  String get borderBottomLeftRadius =>
    getPropertyValue('border-bottom-left-radius');

  /** Sets the value of "border-bottom-left-radius" */
  void set borderBottomLeftRadius(var value) {
    setProperty('border-bottom-left-radius', value, '');
  }

  /** Gets the value of "border-bottom-right-radius" */
  String get borderBottomRightRadius =>
    getPropertyValue('border-bottom-right-radius');

  /** Sets the value of "border-bottom-right-radius" */
  void set borderBottomRightRadius(var value) {
    setProperty('border-bottom-right-radius', value, '');
  }

  /** Gets the value of "border-bottom-style" */
  String get borderBottomStyle =>
    getPropertyValue('border-bottom-style');

  /** Sets the value of "border-bottom-style" */
  void set borderBottomStyle(var value) {
    setProperty('border-bottom-style', value, '');
  }

  /** Gets the value of "border-bottom-width" */
  String get borderBottomWidth =>
    getPropertyValue('border-bottom-width');

  /** Sets the value of "border-bottom-width" */
  void set borderBottomWidth(var value) {
    setProperty('border-bottom-width', value, '');
  }

  /** Gets the value of "border-collapse" */
  String get borderCollapse =>
    getPropertyValue('border-collapse');

  /** Sets the value of "border-collapse" */
  void set borderCollapse(var value) {
    setProperty('border-collapse', value, '');
  }

  /** Gets the value of "border-color" */
  String get borderColor =>
    getPropertyValue('border-color');

  /** Sets the value of "border-color" */
  void set borderColor(var value) {
    setProperty('border-color', value, '');
  }

  /** Gets the value of "border-end" */
  String get borderEnd =>
    getPropertyValue('${_browserPrefix}border-end');

  /** Sets the value of "border-end" */
  void set borderEnd(var value) {
    setProperty('${_browserPrefix}border-end', value, '');
  }

  /** Gets the value of "border-end-color" */
  String get borderEndColor =>
    getPropertyValue('${_browserPrefix}border-end-color');

  /** Sets the value of "border-end-color" */
  void set borderEndColor(var value) {
    setProperty('${_browserPrefix}border-end-color', value, '');
  }

  /** Gets the value of "border-end-style" */
  String get borderEndStyle =>
    getPropertyValue('${_browserPrefix}border-end-style');

  /** Sets the value of "border-end-style" */
  void set borderEndStyle(var value) {
    setProperty('${_browserPrefix}border-end-style', value, '');
  }

  /** Gets the value of "border-end-width" */
  String get borderEndWidth =>
    getPropertyValue('${_browserPrefix}border-end-width');

  /** Sets the value of "border-end-width" */
  void set borderEndWidth(var value) {
    setProperty('${_browserPrefix}border-end-width', value, '');
  }

  /** Gets the value of "border-fit" */
  String get borderFit =>
    getPropertyValue('${_browserPrefix}border-fit');

  /** Sets the value of "border-fit" */
  void set borderFit(var value) {
    setProperty('${_browserPrefix}border-fit', value, '');
  }

  /** Gets the value of "border-horizontal-spacing" */
  String get borderHorizontalSpacing =>
    getPropertyValue('${_browserPrefix}border-horizontal-spacing');

  /** Sets the value of "border-horizontal-spacing" */
  void set borderHorizontalSpacing(var value) {
    setProperty('${_browserPrefix}border-horizontal-spacing', value, '');
  }

  /** Gets the value of "border-image" */
  String get borderImage =>
    getPropertyValue('border-image');

  /** Sets the value of "border-image" */
  void set borderImage(var value) {
    setProperty('border-image', value, '');
  }

  /** Gets the value of "border-image-outset" */
  String get borderImageOutset =>
    getPropertyValue('border-image-outset');

  /** Sets the value of "border-image-outset" */
  void set borderImageOutset(var value) {
    setProperty('border-image-outset', value, '');
  }

  /** Gets the value of "border-image-repeat" */
  String get borderImageRepeat =>
    getPropertyValue('border-image-repeat');

  /** Sets the value of "border-image-repeat" */
  void set borderImageRepeat(var value) {
    setProperty('border-image-repeat', value, '');
  }

  /** Gets the value of "border-image-slice" */
  String get borderImageSlice =>
    getPropertyValue('border-image-slice');

  /** Sets the value of "border-image-slice" */
  void set borderImageSlice(var value) {
    setProperty('border-image-slice', value, '');
  }

  /** Gets the value of "border-image-source" */
  String get borderImageSource =>
    getPropertyValue('border-image-source');

  /** Sets the value of "border-image-source" */
  void set borderImageSource(var value) {
    setProperty('border-image-source', value, '');
  }

  /** Gets the value of "border-image-width" */
  String get borderImageWidth =>
    getPropertyValue('border-image-width');

  /** Sets the value of "border-image-width" */
  void set borderImageWidth(var value) {
    setProperty('border-image-width', value, '');
  }

  /** Gets the value of "border-left" */
  String get borderLeft =>
    getPropertyValue('border-left');

  /** Sets the value of "border-left" */
  void set borderLeft(var value) {
    setProperty('border-left', value, '');
  }

  /** Gets the value of "border-left-color" */
  String get borderLeftColor =>
    getPropertyValue('border-left-color');

  /** Sets the value of "border-left-color" */
  void set borderLeftColor(var value) {
    setProperty('border-left-color', value, '');
  }

  /** Gets the value of "border-left-style" */
  String get borderLeftStyle =>
    getPropertyValue('border-left-style');

  /** Sets the value of "border-left-style" */
  void set borderLeftStyle(var value) {
    setProperty('border-left-style', value, '');
  }

  /** Gets the value of "border-left-width" */
  String get borderLeftWidth =>
    getPropertyValue('border-left-width');

  /** Sets the value of "border-left-width" */
  void set borderLeftWidth(var value) {
    setProperty('border-left-width', value, '');
  }

  /** Gets the value of "border-radius" */
  String get borderRadius =>
    getPropertyValue('border-radius');

  /** Sets the value of "border-radius" */
  void set borderRadius(var value) {
    setProperty('border-radius', value, '');
  }

  /** Gets the value of "border-right" */
  String get borderRight =>
    getPropertyValue('border-right');

  /** Sets the value of "border-right" */
  void set borderRight(var value) {
    setProperty('border-right', value, '');
  }

  /** Gets the value of "border-right-color" */
  String get borderRightColor =>
    getPropertyValue('border-right-color');

  /** Sets the value of "border-right-color" */
  void set borderRightColor(var value) {
    setProperty('border-right-color', value, '');
  }

  /** Gets the value of "border-right-style" */
  String get borderRightStyle =>
    getPropertyValue('border-right-style');

  /** Sets the value of "border-right-style" */
  void set borderRightStyle(var value) {
    setProperty('border-right-style', value, '');
  }

  /** Gets the value of "border-right-width" */
  String get borderRightWidth =>
    getPropertyValue('border-right-width');

  /** Sets the value of "border-right-width" */
  void set borderRightWidth(var value) {
    setProperty('border-right-width', value, '');
  }

  /** Gets the value of "border-spacing" */
  String get borderSpacing =>
    getPropertyValue('border-spacing');

  /** Sets the value of "border-spacing" */
  void set borderSpacing(var value) {
    setProperty('border-spacing', value, '');
  }

  /** Gets the value of "border-start" */
  String get borderStart =>
    getPropertyValue('${_browserPrefix}border-start');

  /** Sets the value of "border-start" */
  void set borderStart(var value) {
    setProperty('${_browserPrefix}border-start', value, '');
  }

  /** Gets the value of "border-start-color" */
  String get borderStartColor =>
    getPropertyValue('${_browserPrefix}border-start-color');

  /** Sets the value of "border-start-color" */
  void set borderStartColor(var value) {
    setProperty('${_browserPrefix}border-start-color', value, '');
  }

  /** Gets the value of "border-start-style" */
  String get borderStartStyle =>
    getPropertyValue('${_browserPrefix}border-start-style');

  /** Sets the value of "border-start-style" */
  void set borderStartStyle(var value) {
    setProperty('${_browserPrefix}border-start-style', value, '');
  }

  /** Gets the value of "border-start-width" */
  String get borderStartWidth =>
    getPropertyValue('${_browserPrefix}border-start-width');

  /** Sets the value of "border-start-width" */
  void set borderStartWidth(var value) {
    setProperty('${_browserPrefix}border-start-width', value, '');
  }

  /** Gets the value of "border-style" */
  String get borderStyle =>
    getPropertyValue('border-style');

  /** Sets the value of "border-style" */
  void set borderStyle(var value) {
    setProperty('border-style', value, '');
  }

  /** Gets the value of "border-top" */
  String get borderTop =>
    getPropertyValue('border-top');

  /** Sets the value of "border-top" */
  void set borderTop(var value) {
    setProperty('border-top', value, '');
  }

  /** Gets the value of "border-top-color" */
  String get borderTopColor =>
    getPropertyValue('border-top-color');

  /** Sets the value of "border-top-color" */
  void set borderTopColor(var value) {
    setProperty('border-top-color', value, '');
  }

  /** Gets the value of "border-top-left-radius" */
  String get borderTopLeftRadius =>
    getPropertyValue('border-top-left-radius');

  /** Sets the value of "border-top-left-radius" */
  void set borderTopLeftRadius(var value) {
    setProperty('border-top-left-radius', value, '');
  }

  /** Gets the value of "border-top-right-radius" */
  String get borderTopRightRadius =>
    getPropertyValue('border-top-right-radius');

  /** Sets the value of "border-top-right-radius" */
  void set borderTopRightRadius(var value) {
    setProperty('border-top-right-radius', value, '');
  }

  /** Gets the value of "border-top-style" */
  String get borderTopStyle =>
    getPropertyValue('border-top-style');

  /** Sets the value of "border-top-style" */
  void set borderTopStyle(var value) {
    setProperty('border-top-style', value, '');
  }

  /** Gets the value of "border-top-width" */
  String get borderTopWidth =>
    getPropertyValue('border-top-width');

  /** Sets the value of "border-top-width" */
  void set borderTopWidth(var value) {
    setProperty('border-top-width', value, '');
  }

  /** Gets the value of "border-vertical-spacing" */
  String get borderVerticalSpacing =>
    getPropertyValue('${_browserPrefix}border-vertical-spacing');

  /** Sets the value of "border-vertical-spacing" */
  void set borderVerticalSpacing(var value) {
    setProperty('${_browserPrefix}border-vertical-spacing', value, '');
  }

  /** Gets the value of "border-width" */
  String get borderWidth =>
    getPropertyValue('border-width');

  /** Sets the value of "border-width" */
  void set borderWidth(var value) {
    setProperty('border-width', value, '');
  }

  /** Gets the value of "bottom" */
  String get bottom =>
    getPropertyValue('bottom');

  /** Sets the value of "bottom" */
  void set bottom(var value) {
    setProperty('bottom', value, '');
  }

  /** Gets the value of "box-align" */
  String get boxAlign =>
    getPropertyValue('${_browserPrefix}box-align');

  /** Sets the value of "box-align" */
  void set boxAlign(var value) {
    setProperty('${_browserPrefix}box-align', value, '');
  }

  /** Gets the value of "box-direction" */
  String get boxDirection =>
    getPropertyValue('${_browserPrefix}box-direction');

  /** Sets the value of "box-direction" */
  void set boxDirection(var value) {
    setProperty('${_browserPrefix}box-direction', value, '');
  }

  /** Gets the value of "box-flex" */
  String get boxFlex =>
    getPropertyValue('${_browserPrefix}box-flex');

  /** Sets the value of "box-flex" */
  void set boxFlex(var value) {
    setProperty('${_browserPrefix}box-flex', value, '');
  }

  /** Gets the value of "box-flex-group" */
  String get boxFlexGroup =>
    getPropertyValue('${_browserPrefix}box-flex-group');

  /** Sets the value of "box-flex-group" */
  void set boxFlexGroup(var value) {
    setProperty('${_browserPrefix}box-flex-group', value, '');
  }

  /** Gets the value of "box-lines" */
  String get boxLines =>
    getPropertyValue('${_browserPrefix}box-lines');

  /** Sets the value of "box-lines" */
  void set boxLines(var value) {
    setProperty('${_browserPrefix}box-lines', value, '');
  }

  /** Gets the value of "box-ordinal-group" */
  String get boxOrdinalGroup =>
    getPropertyValue('${_browserPrefix}box-ordinal-group');

  /** Sets the value of "box-ordinal-group" */
  void set boxOrdinalGroup(var value) {
    setProperty('${_browserPrefix}box-ordinal-group', value, '');
  }

  /** Gets the value of "box-orient" */
  String get boxOrient =>
    getPropertyValue('${_browserPrefix}box-orient');

  /** Sets the value of "box-orient" */
  void set boxOrient(var value) {
    setProperty('${_browserPrefix}box-orient', value, '');
  }

  /** Gets the value of "box-pack" */
  String get boxPack =>
    getPropertyValue('${_browserPrefix}box-pack');

  /** Sets the value of "box-pack" */
  void set boxPack(var value) {
    setProperty('${_browserPrefix}box-pack', value, '');
  }

  /** Gets the value of "box-reflect" */
  String get boxReflect =>
    getPropertyValue('${_browserPrefix}box-reflect');

  /** Sets the value of "box-reflect" */
  void set boxReflect(var value) {
    setProperty('${_browserPrefix}box-reflect', value, '');
  }

  /** Gets the value of "box-shadow" */
  String get boxShadow =>
    getPropertyValue('box-shadow');

  /** Sets the value of "box-shadow" */
  void set boxShadow(var value) {
    setProperty('box-shadow', value, '');
  }

  /** Gets the value of "box-sizing" */
  String get boxSizing =>
    getPropertyValue('box-sizing');

  /** Sets the value of "box-sizing" */
  void set boxSizing(var value) {
    setProperty('box-sizing', value, '');
  }

  /** Gets the value of "caption-side" */
  String get captionSide =>
    getPropertyValue('caption-side');

  /** Sets the value of "caption-side" */
  void set captionSide(var value) {
    setProperty('caption-side', value, '');
  }

  /** Gets the value of "clear" */
  String get clear =>
    getPropertyValue('clear');

  /** Sets the value of "clear" */
  void set clear(var value) {
    setProperty('clear', value, '');
  }

  /** Gets the value of "clip" */
  String get clip =>
    getPropertyValue('clip');

  /** Sets the value of "clip" */
  void set clip(var value) {
    setProperty('clip', value, '');
  }

  /** Gets the value of "color" */
  String get color =>
    getPropertyValue('color');

  /** Sets the value of "color" */
  void set color(var value) {
    setProperty('color', value, '');
  }

  /** Gets the value of "color-correction" */
  String get colorCorrection =>
    getPropertyValue('${_browserPrefix}color-correction');

  /** Sets the value of "color-correction" */
  void set colorCorrection(var value) {
    setProperty('${_browserPrefix}color-correction', value, '');
  }

  /** Gets the value of "column-break-after" */
  String get columnBreakAfter =>
    getPropertyValue('${_browserPrefix}column-break-after');

  /** Sets the value of "column-break-after" */
  void set columnBreakAfter(var value) {
    setProperty('${_browserPrefix}column-break-after', value, '');
  }

  /** Gets the value of "column-break-before" */
  String get columnBreakBefore =>
    getPropertyValue('${_browserPrefix}column-break-before');

  /** Sets the value of "column-break-before" */
  void set columnBreakBefore(var value) {
    setProperty('${_browserPrefix}column-break-before', value, '');
  }

  /** Gets the value of "column-break-inside" */
  String get columnBreakInside =>
    getPropertyValue('${_browserPrefix}column-break-inside');

  /** Sets the value of "column-break-inside" */
  void set columnBreakInside(var value) {
    setProperty('${_browserPrefix}column-break-inside', value, '');
  }

  /** Gets the value of "column-count" */
  String get columnCount =>
    getPropertyValue('${_browserPrefix}column-count');

  /** Sets the value of "column-count" */
  void set columnCount(var value) {
    setProperty('${_browserPrefix}column-count', value, '');
  }

  /** Gets the value of "column-gap" */
  String get columnGap =>
    getPropertyValue('${_browserPrefix}column-gap');

  /** Sets the value of "column-gap" */
  void set columnGap(var value) {
    setProperty('${_browserPrefix}column-gap', value, '');
  }

  /** Gets the value of "column-rule" */
  String get columnRule =>
    getPropertyValue('${_browserPrefix}column-rule');

  /** Sets the value of "column-rule" */
  void set columnRule(var value) {
    setProperty('${_browserPrefix}column-rule', value, '');
  }

  /** Gets the value of "column-rule-color" */
  String get columnRuleColor =>
    getPropertyValue('${_browserPrefix}column-rule-color');

  /** Sets the value of "column-rule-color" */
  void set columnRuleColor(var value) {
    setProperty('${_browserPrefix}column-rule-color', value, '');
  }

  /** Gets the value of "column-rule-style" */
  String get columnRuleStyle =>
    getPropertyValue('${_browserPrefix}column-rule-style');

  /** Sets the value of "column-rule-style" */
  void set columnRuleStyle(var value) {
    setProperty('${_browserPrefix}column-rule-style', value, '');
  }

  /** Gets the value of "column-rule-width" */
  String get columnRuleWidth =>
    getPropertyValue('${_browserPrefix}column-rule-width');

  /** Sets the value of "column-rule-width" */
  void set columnRuleWidth(var value) {
    setProperty('${_browserPrefix}column-rule-width', value, '');
  }

  /** Gets the value of "column-span" */
  String get columnSpan =>
    getPropertyValue('${_browserPrefix}column-span');

  /** Sets the value of "column-span" */
  void set columnSpan(var value) {
    setProperty('${_browserPrefix}column-span', value, '');
  }

  /** Gets the value of "column-width" */
  String get columnWidth =>
    getPropertyValue('${_browserPrefix}column-width');

  /** Sets the value of "column-width" */
  void set columnWidth(var value) {
    setProperty('${_browserPrefix}column-width', value, '');
  }

  /** Gets the value of "columns" */
  String get columns =>
    getPropertyValue('${_browserPrefix}columns');

  /** Sets the value of "columns" */
  void set columns(var value) {
    setProperty('${_browserPrefix}columns', value, '');
  }

  /** Gets the value of "content" */
  String get content =>
    getPropertyValue('content');

  /** Sets the value of "content" */
  void set content(var value) {
    setProperty('content', value, '');
  }

  /** Gets the value of "counter-increment" */
  String get counterIncrement =>
    getPropertyValue('counter-increment');

  /** Sets the value of "counter-increment" */
  void set counterIncrement(var value) {
    setProperty('counter-increment', value, '');
  }

  /** Gets the value of "counter-reset" */
  String get counterReset =>
    getPropertyValue('counter-reset');

  /** Sets the value of "counter-reset" */
  void set counterReset(var value) {
    setProperty('counter-reset', value, '');
  }

  /** Gets the value of "cursor" */
  String get cursor =>
    getPropertyValue('cursor');

  /** Sets the value of "cursor" */
  void set cursor(var value) {
    setProperty('cursor', value, '');
  }

  /** Gets the value of "direction" */
  String get direction =>
    getPropertyValue('direction');

  /** Sets the value of "direction" */
  void set direction(var value) {
    setProperty('direction', value, '');
  }

  /** Gets the value of "display" */
  String get display =>
    getPropertyValue('display');

  /** Sets the value of "display" */
  void set display(var value) {
    setProperty('display', value, '');
  }

  /** Gets the value of "empty-cells" */
  String get emptyCells =>
    getPropertyValue('empty-cells');

  /** Sets the value of "empty-cells" */
  void set emptyCells(var value) {
    setProperty('empty-cells', value, '');
  }

  /** Gets the value of "filter" */
  String get filter =>
    getPropertyValue('${_browserPrefix}filter');

  /** Sets the value of "filter" */
  void set filter(var value) {
    setProperty('${_browserPrefix}filter', value, '');
  }

  /** Gets the value of "flex-align" */
  String get flexAlign =>
    getPropertyValue('${_browserPrefix}flex-align');

  /** Sets the value of "flex-align" */
  void set flexAlign(var value) {
    setProperty('${_browserPrefix}flex-align', value, '');
  }

  /** Gets the value of "flex-flow" */
  String get flexFlow =>
    getPropertyValue('${_browserPrefix}flex-flow');

  /** Sets the value of "flex-flow" */
  void set flexFlow(var value) {
    setProperty('${_browserPrefix}flex-flow', value, '');
  }

  /** Gets the value of "flex-order" */
  String get flexOrder =>
    getPropertyValue('${_browserPrefix}flex-order');

  /** Sets the value of "flex-order" */
  void set flexOrder(var value) {
    setProperty('${_browserPrefix}flex-order', value, '');
  }

  /** Gets the value of "flex-pack" */
  String get flexPack =>
    getPropertyValue('${_browserPrefix}flex-pack');

  /** Sets the value of "flex-pack" */
  void set flexPack(var value) {
    setProperty('${_browserPrefix}flex-pack', value, '');
  }

  /** Gets the value of "float" */
  String get float =>
    getPropertyValue('float');

  /** Sets the value of "float" */
  void set float(var value) {
    setProperty('float', value, '');
  }

  /** Gets the value of "flow-from" */
  String get flowFrom =>
    getPropertyValue('${_browserPrefix}flow-from');

  /** Sets the value of "flow-from" */
  void set flowFrom(var value) {
    setProperty('${_browserPrefix}flow-from', value, '');
  }

  /** Gets the value of "flow-into" */
  String get flowInto =>
    getPropertyValue('${_browserPrefix}flow-into');

  /** Sets the value of "flow-into" */
  void set flowInto(var value) {
    setProperty('${_browserPrefix}flow-into', value, '');
  }

  /** Gets the value of "font" */
  String get font =>
    getPropertyValue('font');

  /** Sets the value of "font" */
  void set font(var value) {
    setProperty('font', value, '');
  }

  /** Gets the value of "font-family" */
  String get fontFamily =>
    getPropertyValue('font-family');

  /** Sets the value of "font-family" */
  void set fontFamily(var value) {
    setProperty('font-family', value, '');
  }

  /** Gets the value of "font-feature-settings" */
  String get fontFeatureSettings =>
    getPropertyValue('${_browserPrefix}font-feature-settings');

  /** Sets the value of "font-feature-settings" */
  void set fontFeatureSettings(var value) {
    setProperty('${_browserPrefix}font-feature-settings', value, '');
  }

  /** Gets the value of "font-size" */
  String get fontSize =>
    getPropertyValue('font-size');

  /** Sets the value of "font-size" */
  void set fontSize(var value) {
    setProperty('font-size', value, '');
  }

  /** Gets the value of "font-size-delta" */
  String get fontSizeDelta =>
    getPropertyValue('${_browserPrefix}font-size-delta');

  /** Sets the value of "font-size-delta" */
  void set fontSizeDelta(var value) {
    setProperty('${_browserPrefix}font-size-delta', value, '');
  }

  /** Gets the value of "font-smoothing" */
  String get fontSmoothing =>
    getPropertyValue('${_browserPrefix}font-smoothing');

  /** Sets the value of "font-smoothing" */
  void set fontSmoothing(var value) {
    setProperty('${_browserPrefix}font-smoothing', value, '');
  }

  /** Gets the value of "font-stretch" */
  String get fontStretch =>
    getPropertyValue('font-stretch');

  /** Sets the value of "font-stretch" */
  void set fontStretch(var value) {
    setProperty('font-stretch', value, '');
  }

  /** Gets the value of "font-style" */
  String get fontStyle =>
    getPropertyValue('font-style');

  /** Sets the value of "font-style" */
  void set fontStyle(var value) {
    setProperty('font-style', value, '');
  }

  /** Gets the value of "font-variant" */
  String get fontVariant =>
    getPropertyValue('font-variant');

  /** Sets the value of "font-variant" */
  void set fontVariant(var value) {
    setProperty('font-variant', value, '');
  }

  /** Gets the value of "font-weight" */
  String get fontWeight =>
    getPropertyValue('font-weight');

  /** Sets the value of "font-weight" */
  void set fontWeight(var value) {
    setProperty('font-weight', value, '');
  }

  /** Gets the value of "height" */
  String get height =>
    getPropertyValue('height');

  /** Sets the value of "height" */
  void set height(var value) {
    setProperty('height', value, '');
  }

  /** Gets the value of "highlight" */
  String get highlight =>
    getPropertyValue('${_browserPrefix}highlight');

  /** Sets the value of "highlight" */
  void set highlight(var value) {
    setProperty('${_browserPrefix}highlight', value, '');
  }

  /** Gets the value of "hyphenate-character" */
  String get hyphenateCharacter =>
    getPropertyValue('${_browserPrefix}hyphenate-character');

  /** Sets the value of "hyphenate-character" */
  void set hyphenateCharacter(var value) {
    setProperty('${_browserPrefix}hyphenate-character', value, '');
  }

  /** Gets the value of "hyphenate-limit-after" */
  String get hyphenateLimitAfter =>
    getPropertyValue('${_browserPrefix}hyphenate-limit-after');

  /** Sets the value of "hyphenate-limit-after" */
  void set hyphenateLimitAfter(var value) {
    setProperty('${_browserPrefix}hyphenate-limit-after', value, '');
  }

  /** Gets the value of "hyphenate-limit-before" */
  String get hyphenateLimitBefore =>
    getPropertyValue('${_browserPrefix}hyphenate-limit-before');

  /** Sets the value of "hyphenate-limit-before" */
  void set hyphenateLimitBefore(var value) {
    setProperty('${_browserPrefix}hyphenate-limit-before', value, '');
  }

  /** Gets the value of "hyphenate-limit-lines" */
  String get hyphenateLimitLines =>
    getPropertyValue('${_browserPrefix}hyphenate-limit-lines');

  /** Sets the value of "hyphenate-limit-lines" */
  void set hyphenateLimitLines(var value) {
    setProperty('${_browserPrefix}hyphenate-limit-lines', value, '');
  }

  /** Gets the value of "hyphens" */
  String get hyphens =>
    getPropertyValue('${_browserPrefix}hyphens');

  /** Sets the value of "hyphens" */
  void set hyphens(var value) {
    setProperty('${_browserPrefix}hyphens', value, '');
  }

  /** Gets the value of "image-rendering" */
  String get imageRendering =>
    getPropertyValue('image-rendering');

  /** Sets the value of "image-rendering" */
  void set imageRendering(var value) {
    setProperty('image-rendering', value, '');
  }

  /** Gets the value of "left" */
  String get left =>
    getPropertyValue('left');

  /** Sets the value of "left" */
  void set left(var value) {
    setProperty('left', value, '');
  }

  /** Gets the value of "letter-spacing" */
  String get letterSpacing =>
    getPropertyValue('letter-spacing');

  /** Sets the value of "letter-spacing" */
  void set letterSpacing(var value) {
    setProperty('letter-spacing', value, '');
  }

  /** Gets the value of "line-box-contain" */
  String get lineBoxContain =>
    getPropertyValue('${_browserPrefix}line-box-contain');

  /** Sets the value of "line-box-contain" */
  void set lineBoxContain(var value) {
    setProperty('${_browserPrefix}line-box-contain', value, '');
  }

  /** Gets the value of "line-break" */
  String get lineBreak =>
    getPropertyValue('${_browserPrefix}line-break');

  /** Sets the value of "line-break" */
  void set lineBreak(var value) {
    setProperty('${_browserPrefix}line-break', value, '');
  }

  /** Gets the value of "line-clamp" */
  String get lineClamp =>
    getPropertyValue('${_browserPrefix}line-clamp');

  /** Sets the value of "line-clamp" */
  void set lineClamp(var value) {
    setProperty('${_browserPrefix}line-clamp', value, '');
  }

  /** Gets the value of "line-height" */
  String get lineHeight =>
    getPropertyValue('line-height');

  /** Sets the value of "line-height" */
  void set lineHeight(var value) {
    setProperty('line-height', value, '');
  }

  /** Gets the value of "list-style" */
  String get listStyle =>
    getPropertyValue('list-style');

  /** Sets the value of "list-style" */
  void set listStyle(var value) {
    setProperty('list-style', value, '');
  }

  /** Gets the value of "list-style-image" */
  String get listStyleImage =>
    getPropertyValue('list-style-image');

  /** Sets the value of "list-style-image" */
  void set listStyleImage(var value) {
    setProperty('list-style-image', value, '');
  }

  /** Gets the value of "list-style-position" */
  String get listStylePosition =>
    getPropertyValue('list-style-position');

  /** Sets the value of "list-style-position" */
  void set listStylePosition(var value) {
    setProperty('list-style-position', value, '');
  }

  /** Gets the value of "list-style-type" */
  String get listStyleType =>
    getPropertyValue('list-style-type');

  /** Sets the value of "list-style-type" */
  void set listStyleType(var value) {
    setProperty('list-style-type', value, '');
  }

  /** Gets the value of "locale" */
  String get locale =>
    getPropertyValue('${_browserPrefix}locale');

  /** Sets the value of "locale" */
  void set locale(var value) {
    setProperty('${_browserPrefix}locale', value, '');
  }

  /** Gets the value of "logical-height" */
  String get logicalHeight =>
    getPropertyValue('${_browserPrefix}logical-height');

  /** Sets the value of "logical-height" */
  void set logicalHeight(var value) {
    setProperty('${_browserPrefix}logical-height', value, '');
  }

  /** Gets the value of "logical-width" */
  String get logicalWidth =>
    getPropertyValue('${_browserPrefix}logical-width');

  /** Sets the value of "logical-width" */
  void set logicalWidth(var value) {
    setProperty('${_browserPrefix}logical-width', value, '');
  }

  /** Gets the value of "margin" */
  String get margin =>
    getPropertyValue('margin');

  /** Sets the value of "margin" */
  void set margin(var value) {
    setProperty('margin', value, '');
  }

  /** Gets the value of "margin-after" */
  String get marginAfter =>
    getPropertyValue('${_browserPrefix}margin-after');

  /** Sets the value of "margin-after" */
  void set marginAfter(var value) {
    setProperty('${_browserPrefix}margin-after', value, '');
  }

  /** Gets the value of "margin-after-collapse" */
  String get marginAfterCollapse =>
    getPropertyValue('${_browserPrefix}margin-after-collapse');

  /** Sets the value of "margin-after-collapse" */
  void set marginAfterCollapse(var value) {
    setProperty('${_browserPrefix}margin-after-collapse', value, '');
  }

  /** Gets the value of "margin-before" */
  String get marginBefore =>
    getPropertyValue('${_browserPrefix}margin-before');

  /** Sets the value of "margin-before" */
  void set marginBefore(var value) {
    setProperty('${_browserPrefix}margin-before', value, '');
  }

  /** Gets the value of "margin-before-collapse" */
  String get marginBeforeCollapse =>
    getPropertyValue('${_browserPrefix}margin-before-collapse');

  /** Sets the value of "margin-before-collapse" */
  void set marginBeforeCollapse(var value) {
    setProperty('${_browserPrefix}margin-before-collapse', value, '');
  }

  /** Gets the value of "margin-bottom" */
  String get marginBottom =>
    getPropertyValue('margin-bottom');

  /** Sets the value of "margin-bottom" */
  void set marginBottom(var value) {
    setProperty('margin-bottom', value, '');
  }

  /** Gets the value of "margin-bottom-collapse" */
  String get marginBottomCollapse =>
    getPropertyValue('${_browserPrefix}margin-bottom-collapse');

  /** Sets the value of "margin-bottom-collapse" */
  void set marginBottomCollapse(var value) {
    setProperty('${_browserPrefix}margin-bottom-collapse', value, '');
  }

  /** Gets the value of "margin-collapse" */
  String get marginCollapse =>
    getPropertyValue('${_browserPrefix}margin-collapse');

  /** Sets the value of "margin-collapse" */
  void set marginCollapse(var value) {
    setProperty('${_browserPrefix}margin-collapse', value, '');
  }

  /** Gets the value of "margin-end" */
  String get marginEnd =>
    getPropertyValue('${_browserPrefix}margin-end');

  /** Sets the value of "margin-end" */
  void set marginEnd(var value) {
    setProperty('${_browserPrefix}margin-end', value, '');
  }

  /** Gets the value of "margin-left" */
  String get marginLeft =>
    getPropertyValue('margin-left');

  /** Sets the value of "margin-left" */
  void set marginLeft(var value) {
    setProperty('margin-left', value, '');
  }

  /** Gets the value of "margin-right" */
  String get marginRight =>
    getPropertyValue('margin-right');

  /** Sets the value of "margin-right" */
  void set marginRight(var value) {
    setProperty('margin-right', value, '');
  }

  /** Gets the value of "margin-start" */
  String get marginStart =>
    getPropertyValue('${_browserPrefix}margin-start');

  /** Sets the value of "margin-start" */
  void set marginStart(var value) {
    setProperty('${_browserPrefix}margin-start', value, '');
  }

  /** Gets the value of "margin-top" */
  String get marginTop =>
    getPropertyValue('margin-top');

  /** Sets the value of "margin-top" */
  void set marginTop(var value) {
    setProperty('margin-top', value, '');
  }

  /** Gets the value of "margin-top-collapse" */
  String get marginTopCollapse =>
    getPropertyValue('${_browserPrefix}margin-top-collapse');

  /** Sets the value of "margin-top-collapse" */
  void set marginTopCollapse(var value) {
    setProperty('${_browserPrefix}margin-top-collapse', value, '');
  }

  /** Gets the value of "marquee" */
  String get marquee =>
    getPropertyValue('${_browserPrefix}marquee');

  /** Sets the value of "marquee" */
  void set marquee(var value) {
    setProperty('${_browserPrefix}marquee', value, '');
  }

  /** Gets the value of "marquee-direction" */
  String get marqueeDirection =>
    getPropertyValue('${_browserPrefix}marquee-direction');

  /** Sets the value of "marquee-direction" */
  void set marqueeDirection(var value) {
    setProperty('${_browserPrefix}marquee-direction', value, '');
  }

  /** Gets the value of "marquee-increment" */
  String get marqueeIncrement =>
    getPropertyValue('${_browserPrefix}marquee-increment');

  /** Sets the value of "marquee-increment" */
  void set marqueeIncrement(var value) {
    setProperty('${_browserPrefix}marquee-increment', value, '');
  }

  /** Gets the value of "marquee-repetition" */
  String get marqueeRepetition =>
    getPropertyValue('${_browserPrefix}marquee-repetition');

  /** Sets the value of "marquee-repetition" */
  void set marqueeRepetition(var value) {
    setProperty('${_browserPrefix}marquee-repetition', value, '');
  }

  /** Gets the value of "marquee-speed" */
  String get marqueeSpeed =>
    getPropertyValue('${_browserPrefix}marquee-speed');

  /** Sets the value of "marquee-speed" */
  void set marqueeSpeed(var value) {
    setProperty('${_browserPrefix}marquee-speed', value, '');
  }

  /** Gets the value of "marquee-style" */
  String get marqueeStyle =>
    getPropertyValue('${_browserPrefix}marquee-style');

  /** Sets the value of "marquee-style" */
  void set marqueeStyle(var value) {
    setProperty('${_browserPrefix}marquee-style', value, '');
  }

  /** Gets the value of "mask" */
  String get mask =>
    getPropertyValue('${_browserPrefix}mask');

  /** Sets the value of "mask" */
  void set mask(var value) {
    setProperty('${_browserPrefix}mask', value, '');
  }

  /** Gets the value of "mask-attachment" */
  String get maskAttachment =>
    getPropertyValue('${_browserPrefix}mask-attachment');

  /** Sets the value of "mask-attachment" */
  void set maskAttachment(var value) {
    setProperty('${_browserPrefix}mask-attachment', value, '');
  }

  /** Gets the value of "mask-box-image" */
  String get maskBoxImage =>
    getPropertyValue('${_browserPrefix}mask-box-image');

  /** Sets the value of "mask-box-image" */
  void set maskBoxImage(var value) {
    setProperty('${_browserPrefix}mask-box-image', value, '');
  }

  /** Gets the value of "mask-box-image-outset" */
  String get maskBoxImageOutset =>
    getPropertyValue('${_browserPrefix}mask-box-image-outset');

  /** Sets the value of "mask-box-image-outset" */
  void set maskBoxImageOutset(var value) {
    setProperty('${_browserPrefix}mask-box-image-outset', value, '');
  }

  /** Gets the value of "mask-box-image-repeat" */
  String get maskBoxImageRepeat =>
    getPropertyValue('${_browserPrefix}mask-box-image-repeat');

  /** Sets the value of "mask-box-image-repeat" */
  void set maskBoxImageRepeat(var value) {
    setProperty('${_browserPrefix}mask-box-image-repeat', value, '');
  }

  /** Gets the value of "mask-box-image-slice" */
  String get maskBoxImageSlice =>
    getPropertyValue('${_browserPrefix}mask-box-image-slice');

  /** Sets the value of "mask-box-image-slice" */
  void set maskBoxImageSlice(var value) {
    setProperty('${_browserPrefix}mask-box-image-slice', value, '');
  }

  /** Gets the value of "mask-box-image-source" */
  String get maskBoxImageSource =>
    getPropertyValue('${_browserPrefix}mask-box-image-source');

  /** Sets the value of "mask-box-image-source" */
  void set maskBoxImageSource(var value) {
    setProperty('${_browserPrefix}mask-box-image-source', value, '');
  }

  /** Gets the value of "mask-box-image-width" */
  String get maskBoxImageWidth =>
    getPropertyValue('${_browserPrefix}mask-box-image-width');

  /** Sets the value of "mask-box-image-width" */
  void set maskBoxImageWidth(var value) {
    setProperty('${_browserPrefix}mask-box-image-width', value, '');
  }

  /** Gets the value of "mask-clip" */
  String get maskClip =>
    getPropertyValue('${_browserPrefix}mask-clip');

  /** Sets the value of "mask-clip" */
  void set maskClip(var value) {
    setProperty('${_browserPrefix}mask-clip', value, '');
  }

  /** Gets the value of "mask-composite" */
  String get maskComposite =>
    getPropertyValue('${_browserPrefix}mask-composite');

  /** Sets the value of "mask-composite" */
  void set maskComposite(var value) {
    setProperty('${_browserPrefix}mask-composite', value, '');
  }

  /** Gets the value of "mask-image" */
  String get maskImage =>
    getPropertyValue('${_browserPrefix}mask-image');

  /** Sets the value of "mask-image" */
  void set maskImage(var value) {
    setProperty('${_browserPrefix}mask-image', value, '');
  }

  /** Gets the value of "mask-origin" */
  String get maskOrigin =>
    getPropertyValue('${_browserPrefix}mask-origin');

  /** Sets the value of "mask-origin" */
  void set maskOrigin(var value) {
    setProperty('${_browserPrefix}mask-origin', value, '');
  }

  /** Gets the value of "mask-position" */
  String get maskPosition =>
    getPropertyValue('${_browserPrefix}mask-position');

  /** Sets the value of "mask-position" */
  void set maskPosition(var value) {
    setProperty('${_browserPrefix}mask-position', value, '');
  }

  /** Gets the value of "mask-position-x" */
  String get maskPositionX =>
    getPropertyValue('${_browserPrefix}mask-position-x');

  /** Sets the value of "mask-position-x" */
  void set maskPositionX(var value) {
    setProperty('${_browserPrefix}mask-position-x', value, '');
  }

  /** Gets the value of "mask-position-y" */
  String get maskPositionY =>
    getPropertyValue('${_browserPrefix}mask-position-y');

  /** Sets the value of "mask-position-y" */
  void set maskPositionY(var value) {
    setProperty('${_browserPrefix}mask-position-y', value, '');
  }

  /** Gets the value of "mask-repeat" */
  String get maskRepeat =>
    getPropertyValue('${_browserPrefix}mask-repeat');

  /** Sets the value of "mask-repeat" */
  void set maskRepeat(var value) {
    setProperty('${_browserPrefix}mask-repeat', value, '');
  }

  /** Gets the value of "mask-repeat-x" */
  String get maskRepeatX =>
    getPropertyValue('${_browserPrefix}mask-repeat-x');

  /** Sets the value of "mask-repeat-x" */
  void set maskRepeatX(var value) {
    setProperty('${_browserPrefix}mask-repeat-x', value, '');
  }

  /** Gets the value of "mask-repeat-y" */
  String get maskRepeatY =>
    getPropertyValue('${_browserPrefix}mask-repeat-y');

  /** Sets the value of "mask-repeat-y" */
  void set maskRepeatY(var value) {
    setProperty('${_browserPrefix}mask-repeat-y', value, '');
  }

  /** Gets the value of "mask-size" */
  String get maskSize =>
    getPropertyValue('${_browserPrefix}mask-size');

  /** Sets the value of "mask-size" */
  void set maskSize(var value) {
    setProperty('${_browserPrefix}mask-size', value, '');
  }

  /** Gets the value of "match-nearest-mail-blockquote-color" */
  String get matchNearestMailBlockquoteColor =>
    getPropertyValue('${_browserPrefix}match-nearest-mail-blockquote-color');

  /** Sets the value of "match-nearest-mail-blockquote-color" */
  void set matchNearestMailBlockquoteColor(var value) {
    setProperty('${_browserPrefix}match-nearest-mail-blockquote-color', value, '');
  }

  /** Gets the value of "max-height" */
  String get maxHeight =>
    getPropertyValue('max-height');

  /** Sets the value of "max-height" */
  void set maxHeight(var value) {
    setProperty('max-height', value, '');
  }

  /** Gets the value of "max-logical-height" */
  String get maxLogicalHeight =>
    getPropertyValue('${_browserPrefix}max-logical-height');

  /** Sets the value of "max-logical-height" */
  void set maxLogicalHeight(var value) {
    setProperty('${_browserPrefix}max-logical-height', value, '');
  }

  /** Gets the value of "max-logical-width" */
  String get maxLogicalWidth =>
    getPropertyValue('${_browserPrefix}max-logical-width');

  /** Sets the value of "max-logical-width" */
  void set maxLogicalWidth(var value) {
    setProperty('${_browserPrefix}max-logical-width', value, '');
  }

  /** Gets the value of "max-width" */
  String get maxWidth =>
    getPropertyValue('max-width');

  /** Sets the value of "max-width" */
  void set maxWidth(var value) {
    setProperty('max-width', value, '');
  }

  /** Gets the value of "min-height" */
  String get minHeight =>
    getPropertyValue('min-height');

  /** Sets the value of "min-height" */
  void set minHeight(var value) {
    setProperty('min-height', value, '');
  }

  /** Gets the value of "min-logical-height" */
  String get minLogicalHeight =>
    getPropertyValue('${_browserPrefix}min-logical-height');

  /** Sets the value of "min-logical-height" */
  void set minLogicalHeight(var value) {
    setProperty('${_browserPrefix}min-logical-height', value, '');
  }

  /** Gets the value of "min-logical-width" */
  String get minLogicalWidth =>
    getPropertyValue('${_browserPrefix}min-logical-width');

  /** Sets the value of "min-logical-width" */
  void set minLogicalWidth(var value) {
    setProperty('${_browserPrefix}min-logical-width', value, '');
  }

  /** Gets the value of "min-width" */
  String get minWidth =>
    getPropertyValue('min-width');

  /** Sets the value of "min-width" */
  void set minWidth(var value) {
    setProperty('min-width', value, '');
  }

  /** Gets the value of "nbsp-mode" */
  String get nbspMode =>
    getPropertyValue('${_browserPrefix}nbsp-mode');

  /** Sets the value of "nbsp-mode" */
  void set nbspMode(var value) {
    setProperty('${_browserPrefix}nbsp-mode', value, '');
  }

  /** Gets the value of "opacity" */
  String get opacity =>
    getPropertyValue('opacity');

  /** Sets the value of "opacity" */
  void set opacity(var value) {
    setProperty('opacity', value, '');
  }

  /** Gets the value of "orphans" */
  String get orphans =>
    getPropertyValue('orphans');

  /** Sets the value of "orphans" */
  void set orphans(var value) {
    setProperty('orphans', value, '');
  }

  /** Gets the value of "outline" */
  String get outline =>
    getPropertyValue('outline');

  /** Sets the value of "outline" */
  void set outline(var value) {
    setProperty('outline', value, '');
  }

  /** Gets the value of "outline-color" */
  String get outlineColor =>
    getPropertyValue('outline-color');

  /** Sets the value of "outline-color" */
  void set outlineColor(var value) {
    setProperty('outline-color', value, '');
  }

  /** Gets the value of "outline-offset" */
  String get outlineOffset =>
    getPropertyValue('outline-offset');

  /** Sets the value of "outline-offset" */
  void set outlineOffset(var value) {
    setProperty('outline-offset', value, '');
  }

  /** Gets the value of "outline-style" */
  String get outlineStyle =>
    getPropertyValue('outline-style');

  /** Sets the value of "outline-style" */
  void set outlineStyle(var value) {
    setProperty('outline-style', value, '');
  }

  /** Gets the value of "outline-width" */
  String get outlineWidth =>
    getPropertyValue('outline-width');

  /** Sets the value of "outline-width" */
  void set outlineWidth(var value) {
    setProperty('outline-width', value, '');
  }

  /** Gets the value of "overflow" */
  String get overflow =>
    getPropertyValue('overflow');

  /** Sets the value of "overflow" */
  void set overflow(var value) {
    setProperty('overflow', value, '');
  }

  /** Gets the value of "overflow-x" */
  String get overflowX =>
    getPropertyValue('overflow-x');

  /** Sets the value of "overflow-x" */
  void set overflowX(var value) {
    setProperty('overflow-x', value, '');
  }

  /** Gets the value of "overflow-y" */
  String get overflowY =>
    getPropertyValue('overflow-y');

  /** Sets the value of "overflow-y" */
  void set overflowY(var value) {
    setProperty('overflow-y', value, '');
  }

  /** Gets the value of "padding" */
  String get padding =>
    getPropertyValue('padding');

  /** Sets the value of "padding" */
  void set padding(var value) {
    setProperty('padding', value, '');
  }

  /** Gets the value of "padding-after" */
  String get paddingAfter =>
    getPropertyValue('${_browserPrefix}padding-after');

  /** Sets the value of "padding-after" */
  void set paddingAfter(var value) {
    setProperty('${_browserPrefix}padding-after', value, '');
  }

  /** Gets the value of "padding-before" */
  String get paddingBefore =>
    getPropertyValue('${_browserPrefix}padding-before');

  /** Sets the value of "padding-before" */
  void set paddingBefore(var value) {
    setProperty('${_browserPrefix}padding-before', value, '');
  }

  /** Gets the value of "padding-bottom" */
  String get paddingBottom =>
    getPropertyValue('padding-bottom');

  /** Sets the value of "padding-bottom" */
  void set paddingBottom(var value) {
    setProperty('padding-bottom', value, '');
  }

  /** Gets the value of "padding-end" */
  String get paddingEnd =>
    getPropertyValue('${_browserPrefix}padding-end');

  /** Sets the value of "padding-end" */
  void set paddingEnd(var value) {
    setProperty('${_browserPrefix}padding-end', value, '');
  }

  /** Gets the value of "padding-left" */
  String get paddingLeft =>
    getPropertyValue('padding-left');

  /** Sets the value of "padding-left" */
  void set paddingLeft(var value) {
    setProperty('padding-left', value, '');
  }

  /** Gets the value of "padding-right" */
  String get paddingRight =>
    getPropertyValue('padding-right');

  /** Sets the value of "padding-right" */
  void set paddingRight(var value) {
    setProperty('padding-right', value, '');
  }

  /** Gets the value of "padding-start" */
  String get paddingStart =>
    getPropertyValue('${_browserPrefix}padding-start');

  /** Sets the value of "padding-start" */
  void set paddingStart(var value) {
    setProperty('${_browserPrefix}padding-start', value, '');
  }

  /** Gets the value of "padding-top" */
  String get paddingTop =>
    getPropertyValue('padding-top');

  /** Sets the value of "padding-top" */
  void set paddingTop(var value) {
    setProperty('padding-top', value, '');
  }

  /** Gets the value of "page" */
  String get page =>
    getPropertyValue('page');

  /** Sets the value of "page" */
  void set page(var value) {
    setProperty('page', value, '');
  }

  /** Gets the value of "page-break-after" */
  String get pageBreakAfter =>
    getPropertyValue('page-break-after');

  /** Sets the value of "page-break-after" */
  void set pageBreakAfter(var value) {
    setProperty('page-break-after', value, '');
  }

  /** Gets the value of "page-break-before" */
  String get pageBreakBefore =>
    getPropertyValue('page-break-before');

  /** Sets the value of "page-break-before" */
  void set pageBreakBefore(var value) {
    setProperty('page-break-before', value, '');
  }

  /** Gets the value of "page-break-inside" */
  String get pageBreakInside =>
    getPropertyValue('page-break-inside');

  /** Sets the value of "page-break-inside" */
  void set pageBreakInside(var value) {
    setProperty('page-break-inside', value, '');
  }

  /** Gets the value of "perspective" */
  String get perspective =>
    getPropertyValue('${_browserPrefix}perspective');

  /** Sets the value of "perspective" */
  void set perspective(var value) {
    setProperty('${_browserPrefix}perspective', value, '');
  }

  /** Gets the value of "perspective-origin" */
  String get perspectiveOrigin =>
    getPropertyValue('${_browserPrefix}perspective-origin');

  /** Sets the value of "perspective-origin" */
  void set perspectiveOrigin(var value) {
    setProperty('${_browserPrefix}perspective-origin', value, '');
  }

  /** Gets the value of "perspective-origin-x" */
  String get perspectiveOriginX =>
    getPropertyValue('${_browserPrefix}perspective-origin-x');

  /** Sets the value of "perspective-origin-x" */
  void set perspectiveOriginX(var value) {
    setProperty('${_browserPrefix}perspective-origin-x', value, '');
  }

  /** Gets the value of "perspective-origin-y" */
  String get perspectiveOriginY =>
    getPropertyValue('${_browserPrefix}perspective-origin-y');

  /** Sets the value of "perspective-origin-y" */
  void set perspectiveOriginY(var value) {
    setProperty('${_browserPrefix}perspective-origin-y', value, '');
  }

  /** Gets the value of "pointer-events" */
  String get pointerEvents =>
    getPropertyValue('pointer-events');

  /** Sets the value of "pointer-events" */
  void set pointerEvents(var value) {
    setProperty('pointer-events', value, '');
  }

  /** Gets the value of "position" */
  String get position =>
    getPropertyValue('position');

  /** Sets the value of "position" */
  void set position(var value) {
    setProperty('position', value, '');
  }

  /** Gets the value of "quotes" */
  String get quotes =>
    getPropertyValue('quotes');

  /** Sets the value of "quotes" */
  void set quotes(var value) {
    setProperty('quotes', value, '');
  }

  /** Gets the value of "region-break-after" */
  String get regionBreakAfter =>
    getPropertyValue('${_browserPrefix}region-break-after');

  /** Sets the value of "region-break-after" */
  void set regionBreakAfter(var value) {
    setProperty('${_browserPrefix}region-break-after', value, '');
  }

  /** Gets the value of "region-break-before" */
  String get regionBreakBefore =>
    getPropertyValue('${_browserPrefix}region-break-before');

  /** Sets the value of "region-break-before" */
  void set regionBreakBefore(var value) {
    setProperty('${_browserPrefix}region-break-before', value, '');
  }

  /** Gets the value of "region-break-inside" */
  String get regionBreakInside =>
    getPropertyValue('${_browserPrefix}region-break-inside');

  /** Sets the value of "region-break-inside" */
  void set regionBreakInside(var value) {
    setProperty('${_browserPrefix}region-break-inside', value, '');
  }

  /** Gets the value of "region-overflow" */
  String get regionOverflow =>
    getPropertyValue('${_browserPrefix}region-overflow');

  /** Sets the value of "region-overflow" */
  void set regionOverflow(var value) {
    setProperty('${_browserPrefix}region-overflow', value, '');
  }

  /** Gets the value of "resize" */
  String get resize =>
    getPropertyValue('resize');

  /** Sets the value of "resize" */
  void set resize(var value) {
    setProperty('resize', value, '');
  }

  /** Gets the value of "right" */
  String get right =>
    getPropertyValue('right');

  /** Sets the value of "right" */
  void set right(var value) {
    setProperty('right', value, '');
  }

  /** Gets the value of "rtl-ordering" */
  String get rtlOrdering =>
    getPropertyValue('${_browserPrefix}rtl-ordering');

  /** Sets the value of "rtl-ordering" */
  void set rtlOrdering(var value) {
    setProperty('${_browserPrefix}rtl-ordering', value, '');
  }

  /** Gets the value of "size" */
  String get size =>
    getPropertyValue('size');

  /** Sets the value of "size" */
  void set size(var value) {
    setProperty('size', value, '');
  }

  /** Gets the value of "speak" */
  String get speak =>
    getPropertyValue('speak');

  /** Sets the value of "speak" */
  void set speak(var value) {
    setProperty('speak', value, '');
  }

  /** Gets the value of "src" */
  String get src =>
    getPropertyValue('src');

  /** Sets the value of "src" */
  void set src(var value) {
    setProperty('src', value, '');
  }

  /** Gets the value of "table-layout" */
  String get tableLayout =>
    getPropertyValue('table-layout');

  /** Sets the value of "table-layout" */
  void set tableLayout(var value) {
    setProperty('table-layout', value, '');
  }

  /** Gets the value of "tap-highlight-color" */
  String get tapHighlightColor =>
    getPropertyValue('${_browserPrefix}tap-highlight-color');

  /** Sets the value of "tap-highlight-color" */
  void set tapHighlightColor(var value) {
    setProperty('${_browserPrefix}tap-highlight-color', value, '');
  }

  /** Gets the value of "text-align" */
  String get textAlign =>
    getPropertyValue('text-align');

  /** Sets the value of "text-align" */
  void set textAlign(var value) {
    setProperty('text-align', value, '');
  }

  /** Gets the value of "text-combine" */
  String get textCombine =>
    getPropertyValue('${_browserPrefix}text-combine');

  /** Sets the value of "text-combine" */
  void set textCombine(var value) {
    setProperty('${_browserPrefix}text-combine', value, '');
  }

  /** Gets the value of "text-decoration" */
  String get textDecoration =>
    getPropertyValue('text-decoration');

  /** Sets the value of "text-decoration" */
  void set textDecoration(var value) {
    setProperty('text-decoration', value, '');
  }

  /** Gets the value of "text-decorations-in-effect" */
  String get textDecorationsInEffect =>
    getPropertyValue('${_browserPrefix}text-decorations-in-effect');

  /** Sets the value of "text-decorations-in-effect" */
  void set textDecorationsInEffect(var value) {
    setProperty('${_browserPrefix}text-decorations-in-effect', value, '');
  }

  /** Gets the value of "text-emphasis" */
  String get textEmphasis =>
    getPropertyValue('${_browserPrefix}text-emphasis');

  /** Sets the value of "text-emphasis" */
  void set textEmphasis(var value) {
    setProperty('${_browserPrefix}text-emphasis', value, '');
  }

  /** Gets the value of "text-emphasis-color" */
  String get textEmphasisColor =>
    getPropertyValue('${_browserPrefix}text-emphasis-color');

  /** Sets the value of "text-emphasis-color" */
  void set textEmphasisColor(var value) {
    setProperty('${_browserPrefix}text-emphasis-color', value, '');
  }

  /** Gets the value of "text-emphasis-position" */
  String get textEmphasisPosition =>
    getPropertyValue('${_browserPrefix}text-emphasis-position');

  /** Sets the value of "text-emphasis-position" */
  void set textEmphasisPosition(var value) {
    setProperty('${_browserPrefix}text-emphasis-position', value, '');
  }

  /** Gets the value of "text-emphasis-style" */
  String get textEmphasisStyle =>
    getPropertyValue('${_browserPrefix}text-emphasis-style');

  /** Sets the value of "text-emphasis-style" */
  void set textEmphasisStyle(var value) {
    setProperty('${_browserPrefix}text-emphasis-style', value, '');
  }

  /** Gets the value of "text-fill-color" */
  String get textFillColor =>
    getPropertyValue('${_browserPrefix}text-fill-color');

  /** Sets the value of "text-fill-color" */
  void set textFillColor(var value) {
    setProperty('${_browserPrefix}text-fill-color', value, '');
  }

  /** Gets the value of "text-indent" */
  String get textIndent =>
    getPropertyValue('text-indent');

  /** Sets the value of "text-indent" */
  void set textIndent(var value) {
    setProperty('text-indent', value, '');
  }

  /** Gets the value of "text-line-through" */
  String get textLineThrough =>
    getPropertyValue('text-line-through');

  /** Sets the value of "text-line-through" */
  void set textLineThrough(var value) {
    setProperty('text-line-through', value, '');
  }

  /** Gets the value of "text-line-through-color" */
  String get textLineThroughColor =>
    getPropertyValue('text-line-through-color');

  /** Sets the value of "text-line-through-color" */
  void set textLineThroughColor(var value) {
    setProperty('text-line-through-color', value, '');
  }

  /** Gets the value of "text-line-through-mode" */
  String get textLineThroughMode =>
    getPropertyValue('text-line-through-mode');

  /** Sets the value of "text-line-through-mode" */
  void set textLineThroughMode(var value) {
    setProperty('text-line-through-mode', value, '');
  }

  /** Gets the value of "text-line-through-style" */
  String get textLineThroughStyle =>
    getPropertyValue('text-line-through-style');

  /** Sets the value of "text-line-through-style" */
  void set textLineThroughStyle(var value) {
    setProperty('text-line-through-style', value, '');
  }

  /** Gets the value of "text-line-through-width" */
  String get textLineThroughWidth =>
    getPropertyValue('text-line-through-width');

  /** Sets the value of "text-line-through-width" */
  void set textLineThroughWidth(var value) {
    setProperty('text-line-through-width', value, '');
  }

  /** Gets the value of "text-orientation" */
  String get textOrientation =>
    getPropertyValue('${_browserPrefix}text-orientation');

  /** Sets the value of "text-orientation" */
  void set textOrientation(var value) {
    setProperty('${_browserPrefix}text-orientation', value, '');
  }

  /** Gets the value of "text-overflow" */
  String get textOverflow =>
    getPropertyValue('text-overflow');

  /** Sets the value of "text-overflow" */
  void set textOverflow(var value) {
    setProperty('text-overflow', value, '');
  }

  /** Gets the value of "text-overline" */
  String get textOverline =>
    getPropertyValue('text-overline');

  /** Sets the value of "text-overline" */
  void set textOverline(var value) {
    setProperty('text-overline', value, '');
  }

  /** Gets the value of "text-overline-color" */
  String get textOverlineColor =>
    getPropertyValue('text-overline-color');

  /** Sets the value of "text-overline-color" */
  void set textOverlineColor(var value) {
    setProperty('text-overline-color', value, '');
  }

  /** Gets the value of "text-overline-mode" */
  String get textOverlineMode =>
    getPropertyValue('text-overline-mode');

  /** Sets the value of "text-overline-mode" */
  void set textOverlineMode(var value) {
    setProperty('text-overline-mode', value, '');
  }

  /** Gets the value of "text-overline-style" */
  String get textOverlineStyle =>
    getPropertyValue('text-overline-style');

  /** Sets the value of "text-overline-style" */
  void set textOverlineStyle(var value) {
    setProperty('text-overline-style', value, '');
  }

  /** Gets the value of "text-overline-width" */
  String get textOverlineWidth =>
    getPropertyValue('text-overline-width');

  /** Sets the value of "text-overline-width" */
  void set textOverlineWidth(var value) {
    setProperty('text-overline-width', value, '');
  }

  /** Gets the value of "text-rendering" */
  String get textRendering =>
    getPropertyValue('text-rendering');

  /** Sets the value of "text-rendering" */
  void set textRendering(var value) {
    setProperty('text-rendering', value, '');
  }

  /** Gets the value of "text-security" */
  String get textSecurity =>
    getPropertyValue('${_browserPrefix}text-security');

  /** Sets the value of "text-security" */
  void set textSecurity(var value) {
    setProperty('${_browserPrefix}text-security', value, '');
  }

  /** Gets the value of "text-shadow" */
  String get textShadow =>
    getPropertyValue('text-shadow');

  /** Sets the value of "text-shadow" */
  void set textShadow(var value) {
    setProperty('text-shadow', value, '');
  }

  /** Gets the value of "text-size-adjust" */
  String get textSizeAdjust =>
    getPropertyValue('${_browserPrefix}text-size-adjust');

  /** Sets the value of "text-size-adjust" */
  void set textSizeAdjust(var value) {
    setProperty('${_browserPrefix}text-size-adjust', value, '');
  }

  /** Gets the value of "text-stroke" */
  String get textStroke =>
    getPropertyValue('${_browserPrefix}text-stroke');

  /** Sets the value of "text-stroke" */
  void set textStroke(var value) {
    setProperty('${_browserPrefix}text-stroke', value, '');
  }

  /** Gets the value of "text-stroke-color" */
  String get textStrokeColor =>
    getPropertyValue('${_browserPrefix}text-stroke-color');

  /** Sets the value of "text-stroke-color" */
  void set textStrokeColor(var value) {
    setProperty('${_browserPrefix}text-stroke-color', value, '');
  }

  /** Gets the value of "text-stroke-width" */
  String get textStrokeWidth =>
    getPropertyValue('${_browserPrefix}text-stroke-width');

  /** Sets the value of "text-stroke-width" */
  void set textStrokeWidth(var value) {
    setProperty('${_browserPrefix}text-stroke-width', value, '');
  }

  /** Gets the value of "text-transform" */
  String get textTransform =>
    getPropertyValue('text-transform');

  /** Sets the value of "text-transform" */
  void set textTransform(var value) {
    setProperty('text-transform', value, '');
  }

  /** Gets the value of "text-underline" */
  String get textUnderline =>
    getPropertyValue('text-underline');

  /** Sets the value of "text-underline" */
  void set textUnderline(var value) {
    setProperty('text-underline', value, '');
  }

  /** Gets the value of "text-underline-color" */
  String get textUnderlineColor =>
    getPropertyValue('text-underline-color');

  /** Sets the value of "text-underline-color" */
  void set textUnderlineColor(var value) {
    setProperty('text-underline-color', value, '');
  }

  /** Gets the value of "text-underline-mode" */
  String get textUnderlineMode =>
    getPropertyValue('text-underline-mode');

  /** Sets the value of "text-underline-mode" */
  void set textUnderlineMode(var value) {
    setProperty('text-underline-mode', value, '');
  }

  /** Gets the value of "text-underline-style" */
  String get textUnderlineStyle =>
    getPropertyValue('text-underline-style');

  /** Sets the value of "text-underline-style" */
  void set textUnderlineStyle(var value) {
    setProperty('text-underline-style', value, '');
  }

  /** Gets the value of "text-underline-width" */
  String get textUnderlineWidth =>
    getPropertyValue('text-underline-width');

  /** Sets the value of "text-underline-width" */
  void set textUnderlineWidth(var value) {
    setProperty('text-underline-width', value, '');
  }

  /** Gets the value of "top" */
  String get top =>
    getPropertyValue('top');

  /** Sets the value of "top" */
  void set top(var value) {
    setProperty('top', value, '');
  }

  /** Gets the value of "transform" */
  String get transform =>
    getPropertyValue('${_browserPrefix}transform');

  /** Sets the value of "transform" */
  void set transform(var value) {
    setProperty('${_browserPrefix}transform', value, '');
  }

  /** Gets the value of "transform-origin" */
  String get transformOrigin =>
    getPropertyValue('${_browserPrefix}transform-origin');

  /** Sets the value of "transform-origin" */
  void set transformOrigin(var value) {
    setProperty('${_browserPrefix}transform-origin', value, '');
  }

  /** Gets the value of "transform-origin-x" */
  String get transformOriginX =>
    getPropertyValue('${_browserPrefix}transform-origin-x');

  /** Sets the value of "transform-origin-x" */
  void set transformOriginX(var value) {
    setProperty('${_browserPrefix}transform-origin-x', value, '');
  }

  /** Gets the value of "transform-origin-y" */
  String get transformOriginY =>
    getPropertyValue('${_browserPrefix}transform-origin-y');

  /** Sets the value of "transform-origin-y" */
  void set transformOriginY(var value) {
    setProperty('${_browserPrefix}transform-origin-y', value, '');
  }

  /** Gets the value of "transform-origin-z" */
  String get transformOriginZ =>
    getPropertyValue('${_browserPrefix}transform-origin-z');

  /** Sets the value of "transform-origin-z" */
  void set transformOriginZ(var value) {
    setProperty('${_browserPrefix}transform-origin-z', value, '');
  }

  /** Gets the value of "transform-style" */
  String get transformStyle =>
    getPropertyValue('${_browserPrefix}transform-style');

  /** Sets the value of "transform-style" */
  void set transformStyle(var value) {
    setProperty('${_browserPrefix}transform-style', value, '');
  }

  /** Gets the value of "transition" */
  String get transition =>
    getPropertyValue('${_browserPrefix}transition');

  /** Sets the value of "transition" */
  void set transition(var value) {
    setProperty('${_browserPrefix}transition', value, '');
  }

  /** Gets the value of "transition-delay" */
  String get transitionDelay =>
    getPropertyValue('${_browserPrefix}transition-delay');

  /** Sets the value of "transition-delay" */
  void set transitionDelay(var value) {
    setProperty('${_browserPrefix}transition-delay', value, '');
  }

  /** Gets the value of "transition-duration" */
  String get transitionDuration =>
    getPropertyValue('${_browserPrefix}transition-duration');

  /** Sets the value of "transition-duration" */
  void set transitionDuration(var value) {
    setProperty('${_browserPrefix}transition-duration', value, '');
  }

  /** Gets the value of "transition-property" */
  String get transitionProperty =>
    getPropertyValue('${_browserPrefix}transition-property');

  /** Sets the value of "transition-property" */
  void set transitionProperty(var value) {
    setProperty('${_browserPrefix}transition-property', value, '');
  }

  /** Gets the value of "transition-timing-function" */
  String get transitionTimingFunction =>
    getPropertyValue('${_browserPrefix}transition-timing-function');

  /** Sets the value of "transition-timing-function" */
  void set transitionTimingFunction(var value) {
    setProperty('${_browserPrefix}transition-timing-function', value, '');
  }

  /** Gets the value of "unicode-bidi" */
  String get unicodeBidi =>
    getPropertyValue('unicode-bidi');

  /** Sets the value of "unicode-bidi" */
  void set unicodeBidi(var value) {
    setProperty('unicode-bidi', value, '');
  }

  /** Gets the value of "unicode-range" */
  String get unicodeRange =>
    getPropertyValue('unicode-range');

  /** Sets the value of "unicode-range" */
  void set unicodeRange(var value) {
    setProperty('unicode-range', value, '');
  }

  /** Gets the value of "user-drag" */
  String get userDrag =>
    getPropertyValue('${_browserPrefix}user-drag');

  /** Sets the value of "user-drag" */
  void set userDrag(var value) {
    setProperty('${_browserPrefix}user-drag', value, '');
  }

  /** Gets the value of "user-modify" */
  String get userModify =>
    getPropertyValue('${_browserPrefix}user-modify');

  /** Sets the value of "user-modify" */
  void set userModify(var value) {
    setProperty('${_browserPrefix}user-modify', value, '');
  }

  /** Gets the value of "user-select" */
  String get userSelect =>
    getPropertyValue('${_browserPrefix}user-select');

  /** Sets the value of "user-select" */
  void set userSelect(var value) {
    setProperty('${_browserPrefix}user-select', value, '');
  }

  /** Gets the value of "vertical-align" */
  String get verticalAlign =>
    getPropertyValue('vertical-align');

  /** Sets the value of "vertical-align" */
  void set verticalAlign(var value) {
    setProperty('vertical-align', value, '');
  }

  /** Gets the value of "visibility" */
  String get visibility =>
    getPropertyValue('visibility');

  /** Sets the value of "visibility" */
  void set visibility(var value) {
    setProperty('visibility', value, '');
  }

  /** Gets the value of "white-space" */
  String get whiteSpace =>
    getPropertyValue('white-space');

  /** Sets the value of "white-space" */
  void set whiteSpace(var value) {
    setProperty('white-space', value, '');
  }

  /** Gets the value of "widows" */
  String get widows =>
    getPropertyValue('widows');

  /** Sets the value of "widows" */
  void set widows(var value) {
    setProperty('widows', value, '');
  }

  /** Gets the value of "width" */
  String get width =>
    getPropertyValue('width');

  /** Sets the value of "width" */
  void set width(var value) {
    setProperty('width', value, '');
  }

  /** Gets the value of "word-break" */
  String get wordBreak =>
    getPropertyValue('word-break');

  /** Sets the value of "word-break" */
  void set wordBreak(var value) {
    setProperty('word-break', value, '');
  }

  /** Gets the value of "word-spacing" */
  String get wordSpacing =>
    getPropertyValue('word-spacing');

  /** Sets the value of "word-spacing" */
  void set wordSpacing(var value) {
    setProperty('word-spacing', value, '');
  }

  /** Gets the value of "word-wrap" */
  String get wordWrap =>
    getPropertyValue('word-wrap');

  /** Sets the value of "word-wrap" */
  void set wordWrap(var value) {
    setProperty('word-wrap', value, '');
  }

  /** Gets the value of "wrap-shape" */
  String get wrapShape =>
    getPropertyValue('${_browserPrefix}wrap-shape');

  /** Sets the value of "wrap-shape" */
  void set wrapShape(var value) {
    setProperty('${_browserPrefix}wrap-shape', value, '');
  }

  /** Gets the value of "writing-mode" */
  String get writingMode =>
    getPropertyValue('${_browserPrefix}writing-mode');

  /** Sets the value of "writing-mode" */
  void set writingMode(var value) {
    setProperty('${_browserPrefix}writing-mode', value, '');
  }

  /** Gets the value of "z-index" */
  String get zIndex =>
    getPropertyValue('z-index');

  /** Sets the value of "z-index" */
  void set zIndex(var value) {
    setProperty('z-index', value, '');
  }

  /** Gets the value of "zoom" */
  String get zoom =>
    getPropertyValue('zoom');

  /** Sets the value of "zoom" */
  void set zoom(var value) {
    setProperty('zoom', value, '');
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName CSSStyleRule
class CSSStyleRule extends CSSRule {
  CSSStyleRule.internal(): super.internal();


  /** @domName CSSStyleRule.selectorText */
  String get selectorText native "CSSStyleRule_selectorText_Getter";


  /** @domName CSSStyleRule.selectorText */
  void set selectorText(String value) native "CSSStyleRule_selectorText_Setter";


  /** @domName CSSStyleRule.style */
  CSSStyleDeclaration get style native "CSSStyleRule_style_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName CSSStyleSheet
class CSSStyleSheet extends StyleSheet {
  CSSStyleSheet.internal(): super.internal();


  /** @domName CSSStyleSheet.cssRules */
  List<CSSRule> get cssRules native "CSSStyleSheet_cssRules_Getter";


  /** @domName CSSStyleSheet.ownerRule */
  CSSRule get ownerRule native "CSSStyleSheet_ownerRule_Getter";


  /** @domName CSSStyleSheet.rules */
  List<CSSRule> get rules native "CSSStyleSheet_rules_Getter";

  int addRule(/*DOMString*/ selector, /*DOMString*/ style, [/*unsigned long*/ index]) {
    if (?index) {
      return _addRule_1(selector, style, index);
    }
    return _addRule_2(selector, style);
  }


  /** @domName CSSStyleSheet.addRule_1 */
  int _addRule_1(selector, style, index) native "CSSStyleSheet_addRule_1_Callback";


  /** @domName CSSStyleSheet.addRule_2 */
  int _addRule_2(selector, style) native "CSSStyleSheet_addRule_2_Callback";


  /** @domName CSSStyleSheet.deleteRule */
  void deleteRule(int index) native "CSSStyleSheet_deleteRule_Callback";


  /** @domName CSSStyleSheet.insertRule */
  int insertRule(String rule, int index) native "CSSStyleSheet_insertRule_Callback";


  /** @domName CSSStyleSheet.removeRule */
  void removeRule(int index) native "CSSStyleSheet_removeRule_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitCSSTransformValue
class CSSTransformValue extends _CSSValueList {
  CSSTransformValue.internal(): super.internal();

  static const int CSS_MATRIX = 11;

  static const int CSS_MATRIX3D = 21;

  static const int CSS_PERSPECTIVE = 20;

  static const int CSS_ROTATE = 4;

  static const int CSS_ROTATE3D = 17;

  static const int CSS_ROTATEX = 14;

  static const int CSS_ROTATEY = 15;

  static const int CSS_ROTATEZ = 16;

  static const int CSS_SCALE = 5;

  static const int CSS_SCALE3D = 19;

  static const int CSS_SCALEX = 6;

  static const int CSS_SCALEY = 7;

  static const int CSS_SCALEZ = 18;

  static const int CSS_SKEW = 8;

  static const int CSS_SKEWX = 9;

  static const int CSS_SKEWY = 10;

  static const int CSS_TRANSLATE = 1;

  static const int CSS_TRANSLATE3D = 13;

  static const int CSS_TRANSLATEX = 2;

  static const int CSS_TRANSLATEY = 3;

  static const int CSS_TRANSLATEZ = 12;


  /** @domName WebKitCSSTransformValue.operationType */
  int get operationType native "WebKitCSSTransformValue_operationType_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName CSSUnknownRule
class CSSUnknownRule extends CSSRule {
  CSSUnknownRule.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName CSSValue
class CSSValue extends NativeFieldWrapperClass1 {
  CSSValue.internal();

  static const int CSS_CUSTOM = 3;

  static const int CSS_INHERIT = 0;

  static const int CSS_PRIMITIVE_VALUE = 1;

  static const int CSS_VALUE_LIST = 2;


  /** @domName CSSValue.cssText */
  String get cssText native "CSSValue_cssText_Getter";


  /** @domName CSSValue.cssText */
  void set cssText(String value) native "CSSValue_cssText_Setter";


  /** @domName CSSValue.cssValueType */
  int get cssValueType native "CSSValue_cssValueType_Getter";

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

class CanvasElement extends _Element_Merged {

  factory CanvasElement({int width, int height}) {
    if (!?width) {
      return _Elements.createCanvasElement();
    }
    if (!?height) {
      return _Elements.createCanvasElement(width);
    }
    return _Elements.createCanvasElement(width, height);
  }
  CanvasElement.internal(): super.internal();


  /** @domName HTMLCanvasElement.height */
  int get height native "HTMLCanvasElement_height_Getter";


  /** @domName HTMLCanvasElement.height */
  void set height(int value) native "HTMLCanvasElement_height_Setter";


  /** @domName HTMLCanvasElement.width */
  int get width native "HTMLCanvasElement_width_Getter";


  /** @domName HTMLCanvasElement.width */
  void set width(int value) native "HTMLCanvasElement_width_Setter";


  /** @domName HTMLCanvasElement.getContext */
  Object getContext(String contextId) native "HTMLCanvasElement_getContext_Callback";


  /** @domName HTMLCanvasElement.toDataURL */
  String toDataURL(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";


  CanvasRenderingContext2D get context2d => getContext('2d');
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName CanvasGradient
class CanvasGradient extends NativeFieldWrapperClass1 {
  CanvasGradient.internal();


  /** @domName CanvasGradient.addColorStop */
  void addColorStop(num offset, String color) native "CanvasGradient_addColorStop_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName CanvasPattern
class CanvasPattern extends NativeFieldWrapperClass1 {
  CanvasPattern.internal();

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

// WARNING: Do not edit - generated code.

/// @domName CanvasRenderingContext
class CanvasRenderingContext extends NativeFieldWrapperClass1 {
  CanvasRenderingContext.internal();


  /** @domName CanvasRenderingContext.canvas */
  CanvasElement get canvas native "CanvasRenderingContext_canvas_Getter";

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

class CanvasRenderingContext2D extends CanvasRenderingContext {
  CanvasRenderingContext2D.internal(): super.internal();


  /** @domName CanvasRenderingContext2D.fillStyle */
  dynamic get fillStyle native "CanvasRenderingContext2D_fillStyle_Getter";


  /** @domName CanvasRenderingContext2D.fillStyle */
  void set fillStyle(dynamic value) native "CanvasRenderingContext2D_fillStyle_Setter";


  /** @domName CanvasRenderingContext2D.font */
  String get font native "CanvasRenderingContext2D_font_Getter";


  /** @domName CanvasRenderingContext2D.font */
  void set font(String value) native "CanvasRenderingContext2D_font_Setter";


  /** @domName CanvasRenderingContext2D.globalAlpha */
  num get globalAlpha native "CanvasRenderingContext2D_globalAlpha_Getter";


  /** @domName CanvasRenderingContext2D.globalAlpha */
  void set globalAlpha(num value) native "CanvasRenderingContext2D_globalAlpha_Setter";


  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
  String get globalCompositeOperation native "CanvasRenderingContext2D_globalCompositeOperation_Getter";


  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
  void set globalCompositeOperation(String value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";


  /** @domName CanvasRenderingContext2D.lineCap */
  String get lineCap native "CanvasRenderingContext2D_lineCap_Getter";


  /** @domName CanvasRenderingContext2D.lineCap */
  void set lineCap(String value) native "CanvasRenderingContext2D_lineCap_Setter";


  /** @domName CanvasRenderingContext2D.lineDashOffset */
  num get lineDashOffset native "CanvasRenderingContext2D_lineDashOffset_Getter";


  /** @domName CanvasRenderingContext2D.lineDashOffset */
  void set lineDashOffset(num value) native "CanvasRenderingContext2D_lineDashOffset_Setter";


  /** @domName CanvasRenderingContext2D.lineJoin */
  String get lineJoin native "CanvasRenderingContext2D_lineJoin_Getter";


  /** @domName CanvasRenderingContext2D.lineJoin */
  void set lineJoin(String value) native "CanvasRenderingContext2D_lineJoin_Setter";


  /** @domName CanvasRenderingContext2D.lineWidth */
  num get lineWidth native "CanvasRenderingContext2D_lineWidth_Getter";


  /** @domName CanvasRenderingContext2D.lineWidth */
  void set lineWidth(num value) native "CanvasRenderingContext2D_lineWidth_Setter";


  /** @domName CanvasRenderingContext2D.miterLimit */
  num get miterLimit native "CanvasRenderingContext2D_miterLimit_Getter";


  /** @domName CanvasRenderingContext2D.miterLimit */
  void set miterLimit(num value) native "CanvasRenderingContext2D_miterLimit_Setter";


  /** @domName CanvasRenderingContext2D.shadowBlur */
  num get shadowBlur native "CanvasRenderingContext2D_shadowBlur_Getter";


  /** @domName CanvasRenderingContext2D.shadowBlur */
  void set shadowBlur(num value) native "CanvasRenderingContext2D_shadowBlur_Setter";


  /** @domName CanvasRenderingContext2D.shadowColor */
  String get shadowColor native "CanvasRenderingContext2D_shadowColor_Getter";


  /** @domName CanvasRenderingContext2D.shadowColor */
  void set shadowColor(String value) native "CanvasRenderingContext2D_shadowColor_Setter";


  /** @domName CanvasRenderingContext2D.shadowOffsetX */
  num get shadowOffsetX native "CanvasRenderingContext2D_shadowOffsetX_Getter";


  /** @domName CanvasRenderingContext2D.shadowOffsetX */
  void set shadowOffsetX(num value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";


  /** @domName CanvasRenderingContext2D.shadowOffsetY */
  num get shadowOffsetY native "CanvasRenderingContext2D_shadowOffsetY_Getter";


  /** @domName CanvasRenderingContext2D.shadowOffsetY */
  void set shadowOffsetY(num value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";


  /** @domName CanvasRenderingContext2D.strokeStyle */
  dynamic get strokeStyle native "CanvasRenderingContext2D_strokeStyle_Getter";


  /** @domName CanvasRenderingContext2D.strokeStyle */
  void set strokeStyle(dynamic value) native "CanvasRenderingContext2D_strokeStyle_Setter";


  /** @domName CanvasRenderingContext2D.textAlign */
  String get textAlign native "CanvasRenderingContext2D_textAlign_Getter";


  /** @domName CanvasRenderingContext2D.textAlign */
  void set textAlign(String value) native "CanvasRenderingContext2D_textAlign_Setter";


  /** @domName CanvasRenderingContext2D.textBaseline */
  String get textBaseline native "CanvasRenderingContext2D_textBaseline_Getter";


  /** @domName CanvasRenderingContext2D.textBaseline */
  void set textBaseline(String value) native "CanvasRenderingContext2D_textBaseline_Setter";


  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
  num get webkitBackingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";


  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
  bool get webkitImageSmoothingEnabled native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Getter";


  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
  void set webkitImageSmoothingEnabled(bool value) native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Setter";


  /** @domName CanvasRenderingContext2D.webkitLineDash */
  List get webkitLineDash native "CanvasRenderingContext2D_webkitLineDash_Getter";


  /** @domName CanvasRenderingContext2D.webkitLineDash */
  void set webkitLineDash(List value) native "CanvasRenderingContext2D_webkitLineDash_Setter";


  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
  num get webkitLineDashOffset native "CanvasRenderingContext2D_webkitLineDashOffset_Getter";


  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
  void set webkitLineDashOffset(num value) native "CanvasRenderingContext2D_webkitLineDashOffset_Setter";


  /** @domName CanvasRenderingContext2D.arc */
  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "CanvasRenderingContext2D_arc_Callback";


  /** @domName CanvasRenderingContext2D.arcTo */
  void arcTo(num x1, num y1, num x2, num y2, num radius) native "CanvasRenderingContext2D_arcTo_Callback";


  /** @domName CanvasRenderingContext2D.beginPath */
  void beginPath() native "CanvasRenderingContext2D_beginPath_Callback";


  /** @domName CanvasRenderingContext2D.bezierCurveTo */
  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";


  /** @domName CanvasRenderingContext2D.clearRect */
  void clearRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_clearRect_Callback";


  /** @domName CanvasRenderingContext2D.clearShadow */
  void clearShadow() native "CanvasRenderingContext2D_clearShadow_Callback";


  /** @domName CanvasRenderingContext2D.clip */
  void clip() native "CanvasRenderingContext2D_clip_Callback";


  /** @domName CanvasRenderingContext2D.closePath */
  void closePath() native "CanvasRenderingContext2D_closePath_Callback";

  ImageData createImageData(imagedata_OR_sw, [/*float*/ sh]) {
    if ((imagedata_OR_sw is ImageData || imagedata_OR_sw == null) && !?sh) {
      return _createImageData_1(imagedata_OR_sw);
    }
    if ((imagedata_OR_sw is num || imagedata_OR_sw == null) && (sh is num || sh == null)) {
      return _createImageData_2(imagedata_OR_sw, sh);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.createImageData_1 */
  ImageData _createImageData_1(imagedata_OR_sw) native "CanvasRenderingContext2D_createImageData_1_Callback";


  /** @domName CanvasRenderingContext2D.createImageData_2 */
  ImageData _createImageData_2(imagedata_OR_sw, sh) native "CanvasRenderingContext2D_createImageData_2_Callback";


  /** @domName CanvasRenderingContext2D.createLinearGradient */
  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";

  CanvasPattern createPattern(canvas_OR_image, /*DOMString*/ repetitionType) {
    if ((canvas_OR_image is CanvasElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
      return _createPattern_1(canvas_OR_image, repetitionType);
    }
    if ((canvas_OR_image is ImageElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
      return _createPattern_2(canvas_OR_image, repetitionType);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.createPattern_1 */
  CanvasPattern _createPattern_1(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_1_Callback";


  /** @domName CanvasRenderingContext2D.createPattern_2 */
  CanvasPattern _createPattern_2(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_2_Callback";


  /** @domName CanvasRenderingContext2D.createRadialGradient */
  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";

  void drawImage(canvas_OR_image_OR_video, /*float*/ sx_OR_x, /*float*/ sy_OR_y, [/*float*/ sw_OR_width, /*float*/ height_OR_sh, /*float*/ dx, /*float*/ dy, /*float*/ dw, /*float*/ dh]) {
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.drawImage_1 */
  void _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_1_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_2 */
  void _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_2_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_3 */
  void _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_3_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_4 */
  void _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_4_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_5 */
  void _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_5_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_6 */
  void _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_6_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_7 */
  void _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_7_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_8 */
  void _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_8_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_9 */
  void _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_9_Callback";

  void drawImageFromRect(/*HTMLImageElement*/ image, [/*float*/ sx, /*float*/ sy, /*float*/ sw, /*float*/ sh, /*float*/ dx, /*float*/ dy, /*float*/ dw, /*float*/ dh, /*DOMString*/ compositeOperation]) {
    if (?compositeOperation) {
      _drawImageFromRect_1(image, sx, sy, sw, sh, dx, dy, dw, dh, compositeOperation);
      return;
    }
    if (?dh) {
      _drawImageFromRect_2(image, sx, sy, sw, sh, dx, dy, dw, dh);
      return;
    }
    if (?dw) {
      _drawImageFromRect_3(image, sx, sy, sw, sh, dx, dy, dw);
      return;
    }
    if (?dy) {
      _drawImageFromRect_4(image, sx, sy, sw, sh, dx, dy);
      return;
    }
    if (?dx) {
      _drawImageFromRect_5(image, sx, sy, sw, sh, dx);
      return;
    }
    if (?sh) {
      _drawImageFromRect_6(image, sx, sy, sw, sh);
      return;
    }
    if (?sw) {
      _drawImageFromRect_7(image, sx, sy, sw);
      return;
    }
    if (?sy) {
      _drawImageFromRect_8(image, sx, sy);
      return;
    }
    if (?sx) {
      _drawImageFromRect_9(image, sx);
      return;
    }
    _drawImageFromRect_10(image);
  }


  /** @domName CanvasRenderingContext2D.drawImageFromRect_1 */
  void _drawImageFromRect_1(image, sx, sy, sw, sh, dx, dy, dw, dh, compositeOperation) native "CanvasRenderingContext2D_drawImageFromRect_1_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_2 */
  void _drawImageFromRect_2(image, sx, sy, sw, sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImageFromRect_2_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_3 */
  void _drawImageFromRect_3(image, sx, sy, sw, sh, dx, dy, dw) native "CanvasRenderingContext2D_drawImageFromRect_3_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_4 */
  void _drawImageFromRect_4(image, sx, sy, sw, sh, dx, dy) native "CanvasRenderingContext2D_drawImageFromRect_4_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_5 */
  void _drawImageFromRect_5(image, sx, sy, sw, sh, dx) native "CanvasRenderingContext2D_drawImageFromRect_5_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_6 */
  void _drawImageFromRect_6(image, sx, sy, sw, sh) native "CanvasRenderingContext2D_drawImageFromRect_6_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_7 */
  void _drawImageFromRect_7(image, sx, sy, sw) native "CanvasRenderingContext2D_drawImageFromRect_7_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_8 */
  void _drawImageFromRect_8(image, sx, sy) native "CanvasRenderingContext2D_drawImageFromRect_8_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_9 */
  void _drawImageFromRect_9(image, sx) native "CanvasRenderingContext2D_drawImageFromRect_9_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_10 */
  void _drawImageFromRect_10(image) native "CanvasRenderingContext2D_drawImageFromRect_10_Callback";


  /** @domName CanvasRenderingContext2D.fill */
  void fill() native "CanvasRenderingContext2D_fill_Callback";


  /** @domName CanvasRenderingContext2D.fillRect */
  void fillRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_fillRect_Callback";

  void fillText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
    if (?maxWidth) {
      _fillText_1(text, x, y, maxWidth);
      return;
    }
    _fillText_2(text, x, y);
  }


  /** @domName CanvasRenderingContext2D.fillText_1 */
  void _fillText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_1_Callback";


  /** @domName CanvasRenderingContext2D.fillText_2 */
  void _fillText_2(text, x, y) native "CanvasRenderingContext2D_fillText_2_Callback";


  /** @domName CanvasRenderingContext2D.getImageData */
  ImageData getImageData(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_getImageData_Callback";


  /** @domName CanvasRenderingContext2D.getLineDash */
  List<num> getLineDash() native "CanvasRenderingContext2D_getLineDash_Callback";


  /** @domName CanvasRenderingContext2D.isPointInPath */
  bool isPointInPath(num x, num y) native "CanvasRenderingContext2D_isPointInPath_Callback";


  /** @domName CanvasRenderingContext2D.lineTo */
  void lineTo(num x, num y) native "CanvasRenderingContext2D_lineTo_Callback";


  /** @domName CanvasRenderingContext2D.measureText */
  TextMetrics measureText(String text) native "CanvasRenderingContext2D_measureText_Callback";


  /** @domName CanvasRenderingContext2D.moveTo */
  void moveTo(num x, num y) native "CanvasRenderingContext2D_moveTo_Callback";

  void putImageData(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
      _putImageData_1(imagedata, dx, dy);
      return;
    }
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
      _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.putImageData_1 */
  void _putImageData_1(imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_1_Callback";


  /** @domName CanvasRenderingContext2D.putImageData_2 */
  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_2_Callback";


  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
  void quadraticCurveTo(num cpx, num cpy, num x, num y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";


  /** @domName CanvasRenderingContext2D.rect */
  void rect(num x, num y, num width, num height) native "CanvasRenderingContext2D_rect_Callback";


  /** @domName CanvasRenderingContext2D.restore */
  void restore() native "CanvasRenderingContext2D_restore_Callback";


  /** @domName CanvasRenderingContext2D.rotate */
  void rotate(num angle) native "CanvasRenderingContext2D_rotate_Callback";


  /** @domName CanvasRenderingContext2D.save */
  void save() native "CanvasRenderingContext2D_save_Callback";


  /** @domName CanvasRenderingContext2D.scale */
  void scale(num sx, num sy) native "CanvasRenderingContext2D_scale_Callback";


  /** @domName CanvasRenderingContext2D.setAlpha */
  void setAlpha(num alpha) native "CanvasRenderingContext2D_setAlpha_Callback";


  /** @domName CanvasRenderingContext2D.setCompositeOperation */
  void setCompositeOperation(String compositeOperation) native "CanvasRenderingContext2D_setCompositeOperation_Callback";


  /** @domName CanvasRenderingContext2D.setLineCap */
  void setLineCap(String cap) native "CanvasRenderingContext2D_setLineCap_Callback";


  /** @domName CanvasRenderingContext2D.setLineDash */
  void setLineDash(List<num> dash) native "CanvasRenderingContext2D_setLineDash_Callback";


  /** @domName CanvasRenderingContext2D.setLineJoin */
  void setLineJoin(String join) native "CanvasRenderingContext2D_setLineJoin_Callback";


  /** @domName CanvasRenderingContext2D.setLineWidth */
  void setLineWidth(num width) native "CanvasRenderingContext2D_setLineWidth_Callback";


  /** @domName CanvasRenderingContext2D.setMiterLimit */
  void setMiterLimit(num limit) native "CanvasRenderingContext2D_setMiterLimit_Callback";

  void setShadow(/*float*/ width, /*float*/ height, /*float*/ blur, [c_OR_color_OR_grayLevel_OR_r, /*float*/ alpha_OR_g_OR_m, /*float*/ b_OR_y, /*float*/ a_OR_k, /*float*/ a]) {
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && !?c_OR_color_OR_grayLevel_OR_r && !?alpha_OR_g_OR_m && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_1(width, height, blur);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is String || c_OR_color_OR_grayLevel_OR_r == null) && !?alpha_OR_g_OR_m && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_2(width, height, blur, c_OR_color_OR_grayLevel_OR_r);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is String || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_3(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && !?alpha_OR_g_OR_m && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_4(width, height, blur, c_OR_color_OR_grayLevel_OR_r);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_5(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && (b_OR_y is num || b_OR_y == null) && (a_OR_k is num || a_OR_k == null) && !?a) {
      _setShadow_6(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && (b_OR_y is num || b_OR_y == null) && (a_OR_k is num || a_OR_k == null) && (a is num || a == null)) {
      _setShadow_7(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k, a);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.setShadow_1 */
  void _setShadow_1(width, height, blur) native "CanvasRenderingContext2D_setShadow_1_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_2 */
  void _setShadow_2(width, height, blur, c_OR_color_OR_grayLevel_OR_r) native "CanvasRenderingContext2D_setShadow_2_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_3 */
  void _setShadow_3(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m) native "CanvasRenderingContext2D_setShadow_3_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_4 */
  void _setShadow_4(width, height, blur, c_OR_color_OR_grayLevel_OR_r) native "CanvasRenderingContext2D_setShadow_4_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_5 */
  void _setShadow_5(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m) native "CanvasRenderingContext2D_setShadow_5_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_6 */
  void _setShadow_6(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k) native "CanvasRenderingContext2D_setShadow_6_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_7 */
  void _setShadow_7(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k, a) native "CanvasRenderingContext2D_setShadow_7_Callback";


  /** @domName CanvasRenderingContext2D.setTransform */
  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_setTransform_Callback";


  /** @domName CanvasRenderingContext2D.stroke */
  void stroke() native "CanvasRenderingContext2D_stroke_Callback";

  void strokeRect(/*float*/ x, /*float*/ y, /*float*/ width, /*float*/ height, [/*float*/ lineWidth]) {
    if (?lineWidth) {
      _strokeRect_1(x, y, width, height, lineWidth);
      return;
    }
    _strokeRect_2(x, y, width, height);
  }


  /** @domName CanvasRenderingContext2D.strokeRect_1 */
  void _strokeRect_1(x, y, width, height, lineWidth) native "CanvasRenderingContext2D_strokeRect_1_Callback";


  /** @domName CanvasRenderingContext2D.strokeRect_2 */
  void _strokeRect_2(x, y, width, height) native "CanvasRenderingContext2D_strokeRect_2_Callback";

  void strokeText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
    if (?maxWidth) {
      _strokeText_1(text, x, y, maxWidth);
      return;
    }
    _strokeText_2(text, x, y);
  }


  /** @domName CanvasRenderingContext2D.strokeText_1 */
  void _strokeText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_1_Callback";


  /** @domName CanvasRenderingContext2D.strokeText_2 */
  void _strokeText_2(text, x, y) native "CanvasRenderingContext2D_strokeText_2_Callback";


  /** @domName CanvasRenderingContext2D.transform */
  void transform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_transform_Callback";


  /** @domName CanvasRenderingContext2D.translate */
  void translate(num tx, num ty) native "CanvasRenderingContext2D_translate_Callback";


  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
  ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";

  void webkitPutImageDataHD(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
      _webkitPutImageDataHD_1(imagedata, dx, dy);
      return;
    }
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
      _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_1 */
  void _webkitPutImageDataHD_1(imagedata, dx, dy) native "CanvasRenderingContext2D_webkitPutImageDataHD_1_Callback";


  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_2 */
  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_webkitPutImageDataHD_2_Callback";


  /**
   * Sets the color used inside shapes.
   * [r], [g], [b] are 0-255, [a] is 0-1.
   */
  void setFillColorRgb(int r, int g, int b, [num a = 1]) {
    this.fillStyle = 'rgba($r, $g, $b, $a)';
  }

  /**
   * Sets the color used inside shapes.
   * [h] is in degrees, 0-360.
   * [s], [l] are in percent, 0-100.
   * [a] is 0-1.
   */
  void setFillColorHsl(int h, num s, num l, [num a = 1]) {
    this.fillStyle = 'hsla($h, $s%, $l%, $a)';
  }

  /**
   * Sets the color used for stroking shapes.
   * [r], [g], [b] are 0-255, [a] is 0-1.
   */
  void setStrokeColorRgb(int r, int g, int b, [num a = 1]) {
    this.strokeStyle = 'rgba($r, $g, $b, $a)';
  }

  /**
   * Sets the color used for stroking shapes.
   * [h] is in degrees, 0-360.
   * [s], [l] are in percent, 0-100.
   * [a] is 0-1.
   */
  void setStrokeColorHsl(int h, num s, num l, [num a = 1]) {
    this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName ChannelMergerNode
class ChannelMergerNode extends AudioNode {
  ChannelMergerNode.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName ChannelSplitterNode
class ChannelSplitterNode extends AudioNode {
  ChannelSplitterNode.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName CharacterData
class CharacterData extends Node {
  CharacterData.internal(): super.internal();


  /** @domName CharacterData.data */
  String get data native "CharacterData_data_Getter";


  /** @domName CharacterData.data */
  void set data(String value) native "CharacterData_data_Setter";


  /** @domName CharacterData.length */
  int get length native "CharacterData_length_Getter";


  /** @domName CharacterData.appendData */
  void appendData(String data) native "CharacterData_appendData_Callback";


  /** @domName CharacterData.deleteData */
  void deleteData(int offset, int length) native "CharacterData_deleteData_Callback";


  /** @domName CharacterData.insertData */
  void insertData(int offset, String data) native "CharacterData_insertData_Callback";


  /** @domName CharacterData.remove */
  void remove() native "CharacterData_remove_Callback";


  /** @domName CharacterData.replaceData */
  void replaceData(int offset, int length, String data) native "CharacterData_replaceData_Callback";


  /** @domName CharacterData.substringData */
  String substringData(int offset, int length) native "CharacterData_substringData_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName ClientRect
class ClientRect extends NativeFieldWrapperClass1 {
  ClientRect.internal();


  /** @domName ClientRect.bottom */
  num get bottom native "ClientRect_bottom_Getter";


  /** @domName ClientRect.height */
  num get height native "ClientRect_height_Getter";


  /** @domName ClientRect.left */
  num get left native "ClientRect_left_Getter";


  /** @domName ClientRect.right */
  num get right native "ClientRect_right_Getter";


  /** @domName ClientRect.top */
  num get top native "ClientRect_top_Getter";


  /** @domName ClientRect.width */
  num get width native "ClientRect_width_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Clipboard
class Clipboard extends NativeFieldWrapperClass1 {
  Clipboard.internal();


  /** @domName Clipboard.dropEffect */
  String get dropEffect native "Clipboard_dropEffect_Getter";


  /** @domName Clipboard.dropEffect */
  void set dropEffect(String value) native "Clipboard_dropEffect_Setter";


  /** @domName Clipboard.effectAllowed */
  String get effectAllowed native "Clipboard_effectAllowed_Getter";


  /** @domName Clipboard.effectAllowed */
  void set effectAllowed(String value) native "Clipboard_effectAllowed_Setter";


  /** @domName Clipboard.files */
  List<File> get files native "Clipboard_files_Getter";


  /** @domName Clipboard.items */
  DataTransferItemList get items native "Clipboard_items_Getter";


  /** @domName Clipboard.types */
  List get types native "Clipboard_types_Getter";


  /** @domName Clipboard.clearData */
  void clearData([String type]) native "Clipboard_clearData_Callback";


  /** @domName Clipboard.getData */
  String getData(String type) native "Clipboard_getData_Callback";


  /** @domName Clipboard.setData */
  bool setData(String type, String data) native "Clipboard_setData_Callback";


  /** @domName Clipboard.setDragImage */
  void setDragImage(ImageElement image, int x, int y) native "Clipboard_setDragImage_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName CloseEvent
class CloseEvent extends Event {
  CloseEvent.internal(): super.internal();


  /** @domName CloseEvent.code */
  int get code native "CloseEvent_code_Getter";


  /** @domName CloseEvent.reason */
  String get reason native "CloseEvent_reason_Getter";


  /** @domName CloseEvent.wasClean */
  bool get wasClean native "CloseEvent_wasClean_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Comment
class Comment extends CharacterData {
  Comment.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName CompositionEvent
class CompositionEvent extends UIEvent {
  CompositionEvent.internal(): super.internal();


  /** @domName CompositionEvent.data */
  String get data native "CompositionEvent_data_Getter";


  /** @domName CompositionEvent.initCompositionEvent */
  void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native "CompositionEvent_initCompositionEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Console
class Console extends NativeFieldWrapperClass1 {
  Console.internal();


  /** @domName Console.memory */
  MemoryInfo get memory native "Console_memory_Getter";


  /** @domName Console.profiles */
  List<ScriptProfile> get profiles native "Console_profiles_Getter";


  /** @domName Console.assertCondition */
  void assertCondition(bool condition, Object arg) native "Console_assertCondition_Callback";


  /** @domName Console.count */
  void count(Object arg) native "Console_count_Callback";


  /** @domName Console.debug */
  void debug(Object arg) native "Console_debug_Callback";


  /** @domName Console.dir */
  void dir(Object arg) native "Console_dir_Callback";


  /** @domName Console.dirxml */
  void dirxml(Object arg) native "Console_dirxml_Callback";


  /** @domName Console.error */
  void error(Object arg) native "Console_error_Callback";


  /** @domName Console.group */
  void group(Object arg) native "Console_group_Callback";


  /** @domName Console.groupCollapsed */
  void groupCollapsed(Object arg) native "Console_groupCollapsed_Callback";


  /** @domName Console.groupEnd */
  void groupEnd() native "Console_groupEnd_Callback";


  /** @domName Console.info */
  void info(Object arg) native "Console_info_Callback";


  /** @domName Console.log */
  void log(Object arg) native "Console_log_Callback";


  /** @domName Console.markTimeline */
  void markTimeline(Object arg) native "Console_markTimeline_Callback";


  /** @domName Console.profile */
  void profile(String title) native "Console_profile_Callback";


  /** @domName Console.profileEnd */
  void profileEnd(String title) native "Console_profileEnd_Callback";


  /** @domName Console.time */
  void time(String title) native "Console_time_Callback";


  /** @domName Console.timeEnd */
  void timeEnd(String title, Object arg) native "Console_timeEnd_Callback";


  /** @domName Console.timeStamp */
  void timeStamp(Object arg) native "Console_timeStamp_Callback";


  /** @domName Console.trace */
  void trace(Object arg) native "Console_trace_Callback";


  /** @domName Console.warn */
  void warn(Object arg) native "Console_warn_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLContentElement
class ContentElement extends _Element_Merged {

  factory ContentElement() => _Elements.createContentElement();
  ContentElement.internal(): super.internal();


  /** @domName HTMLContentElement.resetStyleInheritance */
  bool get resetStyleInheritance native "HTMLContentElement_resetStyleInheritance_Getter";


  /** @domName HTMLContentElement.resetStyleInheritance */
  void set resetStyleInheritance(bool value) native "HTMLContentElement_resetStyleInheritance_Setter";


  /** @domName HTMLContentElement.select */
  String get select native "HTMLContentElement_select_Getter";


  /** @domName HTMLContentElement.select */
  void set select(String value) native "HTMLContentElement_select_Setter";


  /** @domName HTMLContentElement.getDistributedNodes */
  List<Node> getDistributedNodes() native "HTMLContentElement_getDistributedNodes_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName ConvolverNode
class ConvolverNode extends AudioNode {
  ConvolverNode.internal(): super.internal();


  /** @domName ConvolverNode.buffer */
  AudioBuffer get buffer native "ConvolverNode_buffer_Getter";


  /** @domName ConvolverNode.buffer */
  void set buffer(AudioBuffer value) native "ConvolverNode_buffer_Setter";


  /** @domName ConvolverNode.normalize */
  bool get normalize native "ConvolverNode_normalize_Getter";


  /** @domName ConvolverNode.normalize */
  void set normalize(bool value) native "ConvolverNode_normalize_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName Coordinates
class Coordinates extends NativeFieldWrapperClass1 {
  Coordinates.internal();


  /** @domName Coordinates.accuracy */
  num get accuracy native "Coordinates_accuracy_Getter";


  /** @domName Coordinates.altitude */
  num get altitude native "Coordinates_altitude_Getter";


  /** @domName Coordinates.altitudeAccuracy */
  num get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";


  /** @domName Coordinates.heading */
  num get heading native "Coordinates_heading_Getter";


  /** @domName Coordinates.latitude */
  num get latitude native "Coordinates_latitude_Getter";


  /** @domName Coordinates.longitude */
  num get longitude native "Coordinates_longitude_Getter";


  /** @domName Coordinates.speed */
  num get speed native "Coordinates_speed_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Counter
class Counter extends NativeFieldWrapperClass1 {
  Counter.internal();


  /** @domName Counter.identifier */
  String get identifier native "Counter_identifier_Getter";


  /** @domName Counter.listStyle */
  String get listStyle native "Counter_listStyle_Getter";


  /** @domName Counter.separator */
  String get separator native "Counter_separator_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Crypto
class Crypto extends NativeFieldWrapperClass1 {
  Crypto.internal();


  /** @domName Crypto.getRandomValues */
  void getRandomValues(ArrayBufferView array) native "Crypto_getRandomValues_Callback";

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

// WARNING: Do not edit - generated code.

class CustomEvent extends Event {
  factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
      Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
      type, canBubble, cancelable, detail);
  CustomEvent.internal(): super.internal();


  /** @domName CustomEvent.detail */
  Object get detail native "CustomEvent_detail_Getter";


  /** @domName CustomEvent.initCustomEvent */
  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "CustomEvent_initCustomEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLDListElement
class DListElement extends _Element_Merged {

  factory DListElement() => _Elements.createDListElement();
  DListElement.internal(): super.internal();


  /** @domName HTMLDListElement.compact */
  bool get compact native "HTMLDListElement_compact_Getter";


  /** @domName HTMLDListElement.compact */
  void set compact(bool value) native "HTMLDListElement_compact_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName DOMApplicationCache
class DOMApplicationCache extends EventTarget {
  DOMApplicationCache.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  DOMApplicationCacheEvents get on =>
    new DOMApplicationCacheEvents(this);

  static const int CHECKING = 2;

  static const int DOWNLOADING = 3;

  static const int IDLE = 1;

  static const int OBSOLETE = 5;

  static const int UNCACHED = 0;

  static const int UPDATEREADY = 4;


  /** @domName DOMApplicationCache.status */
  int get status native "DOMApplicationCache_status_Getter";


  /** @domName DOMApplicationCache.abort */
  void abort() native "DOMApplicationCache_abort_Callback";


  /** @domName DOMApplicationCache.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";


  /** @domName DOMApplicationCache.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "DOMApplicationCache_dispatchEvent_Callback";


  /** @domName DOMApplicationCache.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";


  /** @domName DOMApplicationCache.swapCache */
  void swapCache() native "DOMApplicationCache_swapCache_Callback";


  /** @domName DOMApplicationCache.update */
  void update() native "DOMApplicationCache_update_Callback";

}

class DOMApplicationCacheEvents extends Events {
  DOMApplicationCacheEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get cached => this['cached'];

  EventListenerList get checking => this['checking'];

  EventListenerList get downloading => this['downloading'];

  EventListenerList get error => this['error'];

  EventListenerList get noUpdate => this['noupdate'];

  EventListenerList get obsolete => this['obsolete'];

  EventListenerList get progress => this['progress'];

  EventListenerList get updateReady => this['updateready'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName DOMError
class DOMError extends NativeFieldWrapperClass1 {
  DOMError.internal();


  /** @domName DOMError.name */
  String get name native "DOMError_name_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName DOMException
class DOMException extends NativeFieldWrapperClass1 {
  DOMException.internal();

  static const int ABORT_ERR = 20;

  static const int DATA_CLONE_ERR = 25;

  static const int DOMSTRING_SIZE_ERR = 2;

  static const int HIERARCHY_REQUEST_ERR = 3;

  static const int INDEX_SIZE_ERR = 1;

  static const int INUSE_ATTRIBUTE_ERR = 10;

  static const int INVALID_ACCESS_ERR = 15;

  static const int INVALID_CHARACTER_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 13;

  static const int INVALID_NODE_TYPE_ERR = 24;

  static const int INVALID_STATE_ERR = 11;

  static const int NAMESPACE_ERR = 14;

  static const int NETWORK_ERR = 19;

  static const int NOT_FOUND_ERR = 8;

  static const int NOT_SUPPORTED_ERR = 9;

  static const int NO_DATA_ALLOWED_ERR = 6;

  static const int NO_MODIFICATION_ALLOWED_ERR = 7;

  static const int QUOTA_EXCEEDED_ERR = 22;

  static const int SECURITY_ERR = 18;

  static const int SYNTAX_ERR = 12;

  static const int TIMEOUT_ERR = 23;

  static const int TYPE_MISMATCH_ERR = 17;

  static const int URL_MISMATCH_ERR = 21;

  static const int VALIDATION_ERR = 16;

  static const int WRONG_DOCUMENT_ERR = 4;


  /** @domName DOMCoreException.code */
  int get code native "DOMCoreException_code_Getter";


  /** @domName DOMCoreException.message */
  String get message native "DOMCoreException_message_Getter";


  /** @domName DOMCoreException.name */
  String get name native "DOMCoreException_name_Getter";


  /** @domName DOMCoreException.toString */
  String toString() native "DOMCoreException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DOMFileSystem
class DOMFileSystem extends NativeFieldWrapperClass1 {
  DOMFileSystem.internal();


  /** @domName DOMFileSystem.name */
  String get name native "DOMFileSystem_name_Getter";


  /** @domName DOMFileSystem.root */
  DirectoryEntry get root native "DOMFileSystem_root_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName DOMFileSystemSync
class DOMFileSystemSync extends NativeFieldWrapperClass1 {
  DOMFileSystemSync.internal();


  /** @domName DOMFileSystemSync.name */
  String get name native "DOMFileSystemSync_name_Getter";


  /** @domName DOMFileSystemSync.root */
  DirectoryEntrySync get root native "DOMFileSystemSync_root_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName DOMImplementation
class DOMImplementation extends NativeFieldWrapperClass1 {
  DOMImplementation.internal();


  /** @domName DOMImplementation.createCSSStyleSheet */
  CSSStyleSheet createCSSStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";


  /** @domName DOMImplementation.createDocument */
  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native "DOMImplementation_createDocument_Callback";


  /** @domName DOMImplementation.createDocumentType */
  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";


  /** @domName DOMImplementation.createHTMLDocument */
  Document createHTMLDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";


  /** @domName DOMImplementation.hasFeature */
  bool hasFeature(String feature, String version) native "DOMImplementation_hasFeature_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName MimeType
class DOMMimeType extends NativeFieldWrapperClass1 {
  DOMMimeType.internal();


  /** @domName DOMMimeType.description */
  String get description native "DOMMimeType_description_Getter";


  /** @domName DOMMimeType.enabledPlugin */
  DOMPlugin get enabledPlugin native "DOMMimeType_enabledPlugin_Getter";


  /** @domName DOMMimeType.suffixes */
  String get suffixes native "DOMMimeType_suffixes_Getter";


  /** @domName DOMMimeType.type */
  String get type native "DOMMimeType_type_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MimeTypeArray
class DOMMimeTypeArray extends NativeFieldWrapperClass1 implements List<DOMMimeType> {
  DOMMimeTypeArray.internal();


  /** @domName DOMMimeTypeArray.length */
  int get length native "DOMMimeTypeArray_length_Getter";

  DOMMimeType operator[](int index) native "DOMMimeTypeArray_item_Callback";

  void operator[]=(int index, DOMMimeType value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<DOMMimeType> mixins.
  // DOMMimeType is the element type.

  // From Iterable<DOMMimeType>:

  Iterator<DOMMimeType> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<DOMMimeType>(this);
  }

  // From Collection<DOMMimeType>:

  void add(DOMMimeType value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(DOMMimeType value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<DOMMimeType> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(DOMMimeType element) => _Collections.contains(this, element);

  void forEach(void f(DOMMimeType element)) => _Collections.forEach(this, f);

  Collection map(f(DOMMimeType element)) => _Collections.map(this, [], f);

  Collection<DOMMimeType> filter(bool f(DOMMimeType element)) =>
     _Collections.filter(this, <DOMMimeType>[], f);

  bool every(bool f(DOMMimeType element)) => _Collections.every(this, f);

  bool some(bool f(DOMMimeType element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<DOMMimeType>:

  void sort([Comparator<DOMMimeType> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(DOMMimeType element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(DOMMimeType element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  DOMMimeType get last => this[length - 1];

  DOMMimeType removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<DOMMimeType> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [DOMMimeType initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<DOMMimeType> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <DOMMimeType>[]);

  // -- end List<DOMMimeType> mixins.


  /** @domName DOMMimeTypeArray.item */
  DOMMimeType item(int index) native "DOMMimeTypeArray_item_Callback";


  /** @domName DOMMimeTypeArray.namedItem */
  DOMMimeType namedItem(String name) native "DOMMimeTypeArray_namedItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DOMParser
class DOMParser extends NativeFieldWrapperClass1 {

  factory DOMParser() => _DOMParserFactoryProvider.createDOMParser();
  DOMParser.internal();


  /** @domName DOMParser.parseFromString */
  Document parseFromString(String str, String contentType) native "DOMParser_parseFromString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Plugin
class DOMPlugin extends NativeFieldWrapperClass1 {
  DOMPlugin.internal();


  /** @domName DOMPlugin.description */
  String get description native "DOMPlugin_description_Getter";


  /** @domName DOMPlugin.filename */
  String get filename native "DOMPlugin_filename_Getter";


  /** @domName DOMPlugin.length */
  int get length native "DOMPlugin_length_Getter";


  /** @domName DOMPlugin.name */
  String get name native "DOMPlugin_name_Getter";


  /** @domName DOMPlugin.item */
  DOMMimeType item(int index) native "DOMPlugin_item_Callback";


  /** @domName DOMPlugin.namedItem */
  DOMMimeType namedItem(String name) native "DOMPlugin_namedItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName PluginArray
class DOMPluginArray extends NativeFieldWrapperClass1 implements List<DOMPlugin> {
  DOMPluginArray.internal();


  /** @domName DOMPluginArray.length */
  int get length native "DOMPluginArray_length_Getter";

  DOMPlugin operator[](int index) native "DOMPluginArray_item_Callback";

  void operator[]=(int index, DOMPlugin value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<DOMPlugin> mixins.
  // DOMPlugin is the element type.

  // From Iterable<DOMPlugin>:

  Iterator<DOMPlugin> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<DOMPlugin>(this);
  }

  // From Collection<DOMPlugin>:

  void add(DOMPlugin value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(DOMPlugin value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<DOMPlugin> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(DOMPlugin element) => _Collections.contains(this, element);

  void forEach(void f(DOMPlugin element)) => _Collections.forEach(this, f);

  Collection map(f(DOMPlugin element)) => _Collections.map(this, [], f);

  Collection<DOMPlugin> filter(bool f(DOMPlugin element)) =>
     _Collections.filter(this, <DOMPlugin>[], f);

  bool every(bool f(DOMPlugin element)) => _Collections.every(this, f);

  bool some(bool f(DOMPlugin element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<DOMPlugin>:

  void sort([Comparator<DOMPlugin> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(DOMPlugin element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(DOMPlugin element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  DOMPlugin get last => this[length - 1];

  DOMPlugin removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<DOMPlugin> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [DOMPlugin initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<DOMPlugin> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <DOMPlugin>[]);

  // -- end List<DOMPlugin> mixins.


  /** @domName DOMPluginArray.item */
  DOMPlugin item(int index) native "DOMPluginArray_item_Callback";


  /** @domName DOMPluginArray.namedItem */
  DOMPlugin namedItem(String name) native "DOMPluginArray_namedItem_Callback";


  /** @domName DOMPluginArray.refresh */
  void refresh(bool reload) native "DOMPluginArray_refresh_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Selection
class DOMSelection extends NativeFieldWrapperClass1 {
  DOMSelection.internal();


  /** @domName DOMSelection.anchorNode */
  Node get anchorNode native "DOMSelection_anchorNode_Getter";


  /** @domName DOMSelection.anchorOffset */
  int get anchorOffset native "DOMSelection_anchorOffset_Getter";


  /** @domName DOMSelection.baseNode */
  Node get baseNode native "DOMSelection_baseNode_Getter";


  /** @domName DOMSelection.baseOffset */
  int get baseOffset native "DOMSelection_baseOffset_Getter";


  /** @domName DOMSelection.extentNode */
  Node get extentNode native "DOMSelection_extentNode_Getter";


  /** @domName DOMSelection.extentOffset */
  int get extentOffset native "DOMSelection_extentOffset_Getter";


  /** @domName DOMSelection.focusNode */
  Node get focusNode native "DOMSelection_focusNode_Getter";


  /** @domName DOMSelection.focusOffset */
  int get focusOffset native "DOMSelection_focusOffset_Getter";


  /** @domName DOMSelection.isCollapsed */
  bool get isCollapsed native "DOMSelection_isCollapsed_Getter";


  /** @domName DOMSelection.rangeCount */
  int get rangeCount native "DOMSelection_rangeCount_Getter";


  /** @domName DOMSelection.type */
  String get type native "DOMSelection_type_Getter";


  /** @domName DOMSelection.addRange */
  void addRange(Range range) native "DOMSelection_addRange_Callback";


  /** @domName DOMSelection.collapse */
  void collapse(Node node, int index) native "DOMSelection_collapse_Callback";


  /** @domName DOMSelection.collapseToEnd */
  void collapseToEnd() native "DOMSelection_collapseToEnd_Callback";


  /** @domName DOMSelection.collapseToStart */
  void collapseToStart() native "DOMSelection_collapseToStart_Callback";


  /** @domName DOMSelection.containsNode */
  bool containsNode(Node node, bool allowPartial) native "DOMSelection_containsNode_Callback";


  /** @domName DOMSelection.deleteFromDocument */
  void deleteFromDocument() native "DOMSelection_deleteFromDocument_Callback";


  /** @domName DOMSelection.empty */
  void empty() native "DOMSelection_empty_Callback";


  /** @domName DOMSelection.extend */
  void extend(Node node, int offset) native "DOMSelection_extend_Callback";


  /** @domName DOMSelection.getRangeAt */
  Range getRangeAt(int index) native "DOMSelection_getRangeAt_Callback";


  /** @domName DOMSelection.modify */
  void modify(String alter, String direction, String granularity) native "DOMSelection_modify_Callback";


  /** @domName DOMSelection.removeAllRanges */
  void removeAllRanges() native "DOMSelection_removeAllRanges_Callback";


  /** @domName DOMSelection.selectAllChildren */
  void selectAllChildren(Node node) native "DOMSelection_selectAllChildren_Callback";


  /** @domName DOMSelection.setBaseAndExtent */
  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "DOMSelection_setBaseAndExtent_Callback";


  /** @domName DOMSelection.setPosition */
  void setPosition(Node node, int offset) native "DOMSelection_setPosition_Callback";


  /** @domName DOMSelection.toString */
  String toString() native "DOMSelection_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DOMSettableTokenList
class DOMSettableTokenList extends DOMTokenList {
  DOMSettableTokenList.internal(): super.internal();


  /** @domName DOMSettableTokenList.value */
  String get value native "DOMSettableTokenList_value_Getter";


  /** @domName DOMSettableTokenList.value */
  void set value(String value) native "DOMSettableTokenList_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName DOMStringMap
class DOMStringMap extends NativeFieldWrapperClass1 {
  DOMStringMap.internal();

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

// WARNING: Do not edit - generated code.

/// @domName DOMTokenList
class DOMTokenList extends NativeFieldWrapperClass1 {
  DOMTokenList.internal();


  /** @domName DOMTokenList.length */
  int get length native "DOMTokenList_length_Getter";


  /** @domName DOMTokenList.contains */
  bool contains(String token) native "DOMTokenList_contains_Callback";


  /** @domName DOMTokenList.item */
  String item(int index) native "DOMTokenList_item_Callback";


  /** @domName DOMTokenList.toString */
  String toString() native "DOMTokenList_toString_Callback";

  bool toggle(/*DOMString*/ token, [/*boolean*/ force]) {
    if (?force) {
      return _toggle_1(token, force);
    }
    return _toggle_2(token);
  }


  /** @domName DOMTokenList.toggle_1 */
  bool _toggle_1(token, force) native "DOMTokenList_toggle_1_Callback";


  /** @domName DOMTokenList.toggle_2 */
  bool _toggle_2(token) native "DOMTokenList_toggle_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLDataListElement
class DataListElement extends _Element_Merged {

  factory DataListElement() => _Elements.createDataListElement();
  DataListElement.internal(): super.internal();


  /** @domName HTMLDataListElement.options */
  HTMLCollection get options native "HTMLDataListElement_options_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName DataTransferItem
class DataTransferItem extends NativeFieldWrapperClass1 {
  DataTransferItem.internal();


  /** @domName DataTransferItem.kind */
  String get kind native "DataTransferItem_kind_Getter";


  /** @domName DataTransferItem.type */
  String get type native "DataTransferItem_type_Getter";


  /** @domName DataTransferItem.getAsFile */
  Blob getAsFile() native "DataTransferItem_getAsFile_Callback";


  /** @domName DataTransferItem.getAsString */
  void getAsString([StringCallback callback]) native "DataTransferItem_getAsString_Callback";


  /** @domName DataTransferItem.webkitGetAsEntry */
  Entry webkitGetAsEntry() native "DataTransferItem_webkitGetAsEntry_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DataTransferItemList
class DataTransferItemList extends NativeFieldWrapperClass1 {
  DataTransferItemList.internal();


  /** @domName DataTransferItemList.length */
  int get length native "DataTransferItemList_length_Getter";

  void add(data_OR_file, [/*DOMString*/ type]) {
    if ((data_OR_file is File || data_OR_file == null) && !?type) {
      _add_1(data_OR_file);
      return;
    }
    if ((data_OR_file is String || data_OR_file == null) && (type is String || type == null)) {
      _add_2(data_OR_file, type);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName DataTransferItemList.add_1 */
  void _add_1(data_OR_file) native "DataTransferItemList_add_1_Callback";


  /** @domName DataTransferItemList.add_2 */
  void _add_2(data_OR_file, type) native "DataTransferItemList_add_2_Callback";


  /** @domName DataTransferItemList.clear */
  void clear() native "DataTransferItemList_clear_Callback";


  /** @domName DataTransferItemList.item */
  DataTransferItem item(int index) native "DataTransferItemList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DataView
class DataView extends ArrayBufferView {

  factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
    if (!?byteOffset) {
      return _DataViewFactoryProvider.createDataView(buffer);
    }
    if (!?byteLength) {
      return _DataViewFactoryProvider.createDataView(buffer, byteOffset);
    }
    return _DataViewFactoryProvider.createDataView(buffer, byteOffset, byteLength);
  }
  DataView.internal(): super.internal();

  num getFloat32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getFloat32_1(byteOffset, littleEndian);
    }
    return _getFloat32_2(byteOffset);
  }


  /** @domName DataView.getFloat32_1 */
  num _getFloat32_1(byteOffset, littleEndian) native "DataView_getFloat32_1_Callback";


  /** @domName DataView.getFloat32_2 */
  num _getFloat32_2(byteOffset) native "DataView_getFloat32_2_Callback";

  num getFloat64(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getFloat64_1(byteOffset, littleEndian);
    }
    return _getFloat64_2(byteOffset);
  }


  /** @domName DataView.getFloat64_1 */
  num _getFloat64_1(byteOffset, littleEndian) native "DataView_getFloat64_1_Callback";


  /** @domName DataView.getFloat64_2 */
  num _getFloat64_2(byteOffset) native "DataView_getFloat64_2_Callback";

  int getInt16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getInt16_1(byteOffset, littleEndian);
    }
    return _getInt16_2(byteOffset);
  }


  /** @domName DataView.getInt16_1 */
  int _getInt16_1(byteOffset, littleEndian) native "DataView_getInt16_1_Callback";


  /** @domName DataView.getInt16_2 */
  int _getInt16_2(byteOffset) native "DataView_getInt16_2_Callback";

  int getInt32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getInt32_1(byteOffset, littleEndian);
    }
    return _getInt32_2(byteOffset);
  }


  /** @domName DataView.getInt32_1 */
  int _getInt32_1(byteOffset, littleEndian) native "DataView_getInt32_1_Callback";


  /** @domName DataView.getInt32_2 */
  int _getInt32_2(byteOffset) native "DataView_getInt32_2_Callback";


  /** @domName DataView.getInt8 */
  int getInt8(int byteOffset) native "DataView_getInt8_Callback";

  int getUint16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getUint16_1(byteOffset, littleEndian);
    }
    return _getUint16_2(byteOffset);
  }


  /** @domName DataView.getUint16_1 */
  int _getUint16_1(byteOffset, littleEndian) native "DataView_getUint16_1_Callback";


  /** @domName DataView.getUint16_2 */
  int _getUint16_2(byteOffset) native "DataView_getUint16_2_Callback";

  int getUint32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getUint32_1(byteOffset, littleEndian);
    }
    return _getUint32_2(byteOffset);
  }


  /** @domName DataView.getUint32_1 */
  int _getUint32_1(byteOffset, littleEndian) native "DataView_getUint32_1_Callback";


  /** @domName DataView.getUint32_2 */
  int _getUint32_2(byteOffset) native "DataView_getUint32_2_Callback";


  /** @domName DataView.getUint8 */
  int getUint8(int byteOffset) native "DataView_getUint8_Callback";

  void setFloat32(/*unsigned long*/ byteOffset, /*float*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setFloat32_1(byteOffset, value, littleEndian);
      return;
    }
    _setFloat32_2(byteOffset, value);
  }


  /** @domName DataView.setFloat32_1 */
  void _setFloat32_1(byteOffset, value, littleEndian) native "DataView_setFloat32_1_Callback";


  /** @domName DataView.setFloat32_2 */
  void _setFloat32_2(byteOffset, value) native "DataView_setFloat32_2_Callback";

  void setFloat64(/*unsigned long*/ byteOffset, /*double*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setFloat64_1(byteOffset, value, littleEndian);
      return;
    }
    _setFloat64_2(byteOffset, value);
  }


  /** @domName DataView.setFloat64_1 */
  void _setFloat64_1(byteOffset, value, littleEndian) native "DataView_setFloat64_1_Callback";


  /** @domName DataView.setFloat64_2 */
  void _setFloat64_2(byteOffset, value) native "DataView_setFloat64_2_Callback";

  void setInt16(/*unsigned long*/ byteOffset, /*short*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setInt16_1(byteOffset, value, littleEndian);
      return;
    }
    _setInt16_2(byteOffset, value);
  }


  /** @domName DataView.setInt16_1 */
  void _setInt16_1(byteOffset, value, littleEndian) native "DataView_setInt16_1_Callback";


  /** @domName DataView.setInt16_2 */
  void _setInt16_2(byteOffset, value) native "DataView_setInt16_2_Callback";

  void setInt32(/*unsigned long*/ byteOffset, /*long*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setInt32_1(byteOffset, value, littleEndian);
      return;
    }
    _setInt32_2(byteOffset, value);
  }


  /** @domName DataView.setInt32_1 */
  void _setInt32_1(byteOffset, value, littleEndian) native "DataView_setInt32_1_Callback";


  /** @domName DataView.setInt32_2 */
  void _setInt32_2(byteOffset, value) native "DataView_setInt32_2_Callback";


  /** @domName DataView.setInt8 */
  void setInt8(int byteOffset, int value) native "DataView_setInt8_Callback";

  void setUint16(/*unsigned long*/ byteOffset, /*unsigned short*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setUint16_1(byteOffset, value, littleEndian);
      return;
    }
    _setUint16_2(byteOffset, value);
  }


  /** @domName DataView.setUint16_1 */
  void _setUint16_1(byteOffset, value, littleEndian) native "DataView_setUint16_1_Callback";


  /** @domName DataView.setUint16_2 */
  void _setUint16_2(byteOffset, value) native "DataView_setUint16_2_Callback";

  void setUint32(/*unsigned long*/ byteOffset, /*unsigned long*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setUint32_1(byteOffset, value, littleEndian);
      return;
    }
    _setUint32_2(byteOffset, value);
  }


  /** @domName DataView.setUint32_1 */
  void _setUint32_1(byteOffset, value, littleEndian) native "DataView_setUint32_1_Callback";


  /** @domName DataView.setUint32_2 */
  void _setUint32_2(byteOffset, value) native "DataView_setUint32_2_Callback";


  /** @domName DataView.setUint8 */
  void setUint8(int byteOffset, int value) native "DataView_setUint8_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Database
class Database extends NativeFieldWrapperClass1 {
  Database.internal();


  /** @domName Database.version */
  String get version native "Database_version_Getter";


  /** @domName Database.changeVersion */
  void changeVersion(String oldVersion, String newVersion, [SQLTransactionCallback callback, SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_changeVersion_Callback";


  /** @domName Database.readTransaction */
  void readTransaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_readTransaction_Callback";


  /** @domName Database.transaction */
  void transaction(SQLTransactionCallback callback, [SQLTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_transaction_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName DatabaseSync
class DatabaseSync extends NativeFieldWrapperClass1 {
  DatabaseSync.internal();


  /** @domName DatabaseSync.lastErrorMessage */
  String get lastErrorMessage native "DatabaseSync_lastErrorMessage_Getter";


  /** @domName DatabaseSync.version */
  String get version native "DatabaseSync_version_Getter";


  /** @domName DatabaseSync.changeVersion */
  void changeVersion(String oldVersion, String newVersion, [SQLTransactionSyncCallback callback]) native "DatabaseSync_changeVersion_Callback";


  /** @domName DatabaseSync.readTransaction */
  void readTransaction(SQLTransactionSyncCallback callback) native "DatabaseSync_readTransaction_Callback";


  /** @domName DatabaseSync.transaction */
  void transaction(SQLTransactionSyncCallback callback) native "DatabaseSync_transaction_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DedicatedWorkerContext
class DedicatedWorkerContext extends WorkerContext {
  DedicatedWorkerContext.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  DedicatedWorkerContextEvents get on =>
    new DedicatedWorkerContextEvents(this);


  /** @domName DedicatedWorkerContext.postMessage */
  void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerContext_postMessage_Callback";

}

class DedicatedWorkerContextEvents extends WorkerContextEvents {
  DedicatedWorkerContextEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get message => this['message'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName DelayNode
class DelayNode extends AudioNode {
  DelayNode.internal(): super.internal();


  /** @domName DelayNode.delayTime */
  AudioParam get delayTime native "DelayNode_delayTime_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLDetailsElement
class DetailsElement extends _Element_Merged {

  factory DetailsElement() => _Elements.createDetailsElement();
  DetailsElement.internal(): super.internal();


  /** @domName HTMLDetailsElement.open */
  bool get open native "HTMLDetailsElement_open_Getter";


  /** @domName HTMLDetailsElement.open */
  void set open(bool value) native "HTMLDetailsElement_open_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName DeviceMotionEvent
class DeviceMotionEvent extends Event {
  DeviceMotionEvent.internal(): super.internal();


  /** @domName DeviceMotionEvent.interval */
  num get interval native "DeviceMotionEvent_interval_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName DeviceOrientationEvent
class DeviceOrientationEvent extends Event {
  DeviceOrientationEvent.internal(): super.internal();


  /** @domName DeviceOrientationEvent.absolute */
  bool get absolute native "DeviceOrientationEvent_absolute_Getter";


  /** @domName DeviceOrientationEvent.alpha */
  num get alpha native "DeviceOrientationEvent_alpha_Getter";


  /** @domName DeviceOrientationEvent.beta */
  num get beta native "DeviceOrientationEvent_beta_Getter";


  /** @domName DeviceOrientationEvent.gamma */
  num get gamma native "DeviceOrientationEvent_gamma_Getter";


  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
  void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLDirectoryElement
class DirectoryElement extends _Element_Merged {
  DirectoryElement.internal(): super.internal();


  /** @domName HTMLDirectoryElement.compact */
  bool get compact native "HTMLDirectoryElement_compact_Getter";


  /** @domName HTMLDirectoryElement.compact */
  void set compact(bool value) native "HTMLDirectoryElement_compact_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName DirectoryEntry
class DirectoryEntry extends Entry {
  DirectoryEntry.internal(): super.internal();


  /** @domName DirectoryEntry.createReader */
  DirectoryReader createReader() native "DirectoryEntry_createReader_Callback";


  /** @domName DirectoryEntry.getDirectory */
  void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getDirectory_Callback";


  /** @domName DirectoryEntry.getFile */
  void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getFile_Callback";


  /** @domName DirectoryEntry.removeRecursively */
  void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryEntry_removeRecursively_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DirectoryEntrySync
class DirectoryEntrySync extends EntrySync {
  DirectoryEntrySync.internal(): super.internal();


  /** @domName DirectoryEntrySync.createReader */
  DirectoryReaderSync createReader() native "DirectoryEntrySync_createReader_Callback";


  /** @domName DirectoryEntrySync.getDirectory */
  DirectoryEntrySync getDirectory(String path, Map flags) native "DirectoryEntrySync_getDirectory_Callback";


  /** @domName DirectoryEntrySync.getFile */
  FileEntrySync getFile(String path, Map flags) native "DirectoryEntrySync_getFile_Callback";


  /** @domName DirectoryEntrySync.removeRecursively */
  void removeRecursively() native "DirectoryEntrySync_removeRecursively_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DirectoryReader
class DirectoryReader extends NativeFieldWrapperClass1 {
  DirectoryReader.internal();


  /** @domName DirectoryReader.readEntries */
  void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryReader_readEntries_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DirectoryReaderSync
class DirectoryReaderSync extends NativeFieldWrapperClass1 {
  DirectoryReaderSync.internal();


  /** @domName DirectoryReaderSync.readEntries */
  List<EntrySync> readEntries() native "DirectoryReaderSync_readEntries_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLDivElement
class DivElement extends _Element_Merged {

  factory DivElement() => _Elements.createDivElement();
  DivElement.internal(): super.internal();


  /** @domName HTMLDivElement.align */
  String get align native "HTMLDivElement_align_Getter";


  /** @domName HTMLDivElement.align */
  void set align(String value) native "HTMLDivElement_align_Setter";

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

class Document extends Node
{

  Document.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  DocumentEvents get on =>
    new DocumentEvents(this);


  /** @domName Document.body */
  Element get body native "Document_body_Getter";


  /** @domName Document.body */
  void set body(Element value) native "Document_body_Setter";


  /** @domName Document.charset */
  String get charset native "Document_charset_Getter";


  /** @domName Document.charset */
  void set charset(String value) native "Document_charset_Setter";


  /** @domName Document.cookie */
  String get cookie native "Document_cookie_Getter";


  /** @domName Document.cookie */
  void set cookie(String value) native "Document_cookie_Setter";


  /** @domName Document.defaultView */
  Window get window native "Document_defaultView_Getter";


  /** @domName Document.documentElement */
  Element get documentElement native "Document_documentElement_Getter";


  /** @domName Document.domain */
  String get domain native "Document_domain_Getter";


  /** @domName Document.head */
  HeadElement get head native "Document_head_Getter";


  /** @domName Document.implementation */
  DOMImplementation get implementation native "Document_implementation_Getter";


  /** @domName Document.lastModified */
  String get lastModified native "Document_lastModified_Getter";


  /** @domName Document.preferredStylesheetSet */
  String get preferredStylesheetSet native "Document_preferredStylesheetSet_Getter";


  /** @domName Document.readyState */
  String get readyState native "Document_readyState_Getter";


  /** @domName Document.referrer */
  String get referrer native "Document_referrer_Getter";


  /** @domName Document.selectedStylesheetSet */
  String get selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";


  /** @domName Document.selectedStylesheetSet */
  void set selectedStylesheetSet(String value) native "Document_selectedStylesheetSet_Setter";


  /** @domName Document.styleSheets */
  List<StyleSheet> get styleSheets native "Document_styleSheets_Getter";


  /** @domName Document.title */
  String get title native "Document_title_Getter";


  /** @domName Document.title */
  void set title(String value) native "Document_title_Setter";


  /** @domName Document.webkitCurrentFullScreenElement */
  Element get webkitCurrentFullScreenElement native "Document_webkitCurrentFullScreenElement_Getter";


  /** @domName Document.webkitFullScreenKeyboardInputAllowed */
  bool get webkitFullScreenKeyboardInputAllowed native "Document_webkitFullScreenKeyboardInputAllowed_Getter";


  /** @domName Document.webkitFullscreenElement */
  Element get webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";


  /** @domName Document.webkitFullscreenEnabled */
  bool get webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";


  /** @domName Document.webkitHidden */
  bool get webkitHidden native "Document_webkitHidden_Getter";


  /** @domName Document.webkitIsFullScreen */
  bool get webkitIsFullScreen native "Document_webkitIsFullScreen_Getter";


  /** @domName Document.webkitPointerLockElement */
  Element get webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";


  /** @domName Document.webkitVisibilityState */
  String get webkitVisibilityState native "Document_webkitVisibilityState_Getter";


  /** @domName Document.caretRangeFromPoint */
  Range caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";


  /** @domName Document.createCDATASection */
  CDATASection createCDATASection(String data) native "Document_createCDATASection_Callback";


  /** @domName Document.createDocumentFragment */
  DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";


  /** @domName Document.createElement */
  Element $dom_createElement(String tagName) native "Document_createElement_Callback";


  /** @domName Document.createElementNS */
  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "Document_createElementNS_Callback";


  /** @domName Document.createEvent */
  Event $dom_createEvent(String eventType) native "Document_createEvent_Callback";


  /** @domName Document.createRange */
  Range createRange() native "Document_createRange_Callback";


  /** @domName Document.createTextNode */
  Text $dom_createTextNode(String data) native "Document_createTextNode_Callback";


  /** @domName Document.createTouch */
  Touch createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) native "Document_createTouch_Callback";


  /** @domName Document.createTouchList */
  TouchList $dom_createTouchList() native "Document_createTouchList_Callback";


  /** @domName Document.elementFromPoint */
  Element elementFromPoint(int x, int y) native "Document_elementFromPoint_Callback";


  /** @domName Document.execCommand */
  bool execCommand(String command, bool userInterface, String value) native "Document_execCommand_Callback";


  /** @domName Document.getCSSCanvasContext */
  CanvasRenderingContext getCSSCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";


  /** @domName Document.getElementById */
  Element $dom_getElementById(String elementId) native "Document_getElementById_Callback";


  /** @domName Document.getElementsByClassName */
  List<Node> $dom_getElementsByClassName(String tagname) native "Document_getElementsByClassName_Callback";


  /** @domName Document.getElementsByName */
  List<Node> $dom_getElementsByName(String elementName) native "Document_getElementsByName_Callback";


  /** @domName Document.getElementsByTagName */
  List<Node> $dom_getElementsByTagName(String tagname) native "Document_getElementsByTagName_Callback";


  /** @domName Document.queryCommandEnabled */
  bool queryCommandEnabled(String command) native "Document_queryCommandEnabled_Callback";


  /** @domName Document.queryCommandIndeterm */
  bool queryCommandIndeterm(String command) native "Document_queryCommandIndeterm_Callback";


  /** @domName Document.queryCommandState */
  bool queryCommandState(String command) native "Document_queryCommandState_Callback";


  /** @domName Document.queryCommandSupported */
  bool queryCommandSupported(String command) native "Document_queryCommandSupported_Callback";


  /** @domName Document.queryCommandValue */
  String queryCommandValue(String command) native "Document_queryCommandValue_Callback";


  /** @domName Document.querySelector */
  Element $dom_querySelector(String selectors) native "Document_querySelector_Callback";


  /** @domName Document.querySelectorAll */
  List<Node> $dom_querySelectorAll(String selectors) native "Document_querySelectorAll_Callback";


  /** @domName Document.webkitCancelFullScreen */
  void webkitCancelFullScreen() native "Document_webkitCancelFullScreen_Callback";


  /** @domName Document.webkitExitFullscreen */
  void webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";


  /** @domName Document.webkitExitPointerLock */
  void webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";

  /** @domName HTMLDocument.activeElement */
  Element get activeElement;

  // TODO(jacobr): implement all Element methods not on Document.

  Element query(String selectors) {
    // It is fine for our RegExp to detect element id query selectors to have
    // false negatives but not false positives.
    if (const RegExp("^#[_a-zA-Z]\\w*\$").hasMatch(selectors)) {
      return $dom_getElementById(selectors.substring(1));
    }
    return $dom_querySelector(selectors);
  }

  List<Element> queryAll(String selectors) {
    if (const RegExp("""^\\[name=["'][^'"]+['"]\\]\$""").hasMatch(selectors)) {
      final mutableMatches = $dom_getElementsByName(
          selectors.substring(7,selectors.length - 2));
      int len = mutableMatches.length;
      final copyOfMatches = new List<Element>(len);
      for (int i = 0; i < len; ++i) {
        copyOfMatches[i] = mutableMatches[i];
      }
      return new _FrozenElementList._wrap(copyOfMatches);
    } else if (const RegExp("^[*a-zA-Z0-9]+\$").hasMatch(selectors)) {
      final mutableMatches = $dom_getElementsByTagName(selectors);
      int len = mutableMatches.length;
      final copyOfMatches = new List<Element>(len);
      for (int i = 0; i < len; ++i) {
        copyOfMatches[i] = mutableMatches[i];
      }
      return new _FrozenElementList._wrap(copyOfMatches);
    } else {
      return new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
    }
  }
}

class DocumentEvents extends ElementEvents {
  DocumentEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get beforeCopy => this['beforecopy'];

  EventListenerList get beforeCut => this['beforecut'];

  EventListenerList get beforePaste => this['beforepaste'];

  EventListenerList get blur => this['blur'];

  EventListenerList get change => this['change'];

  EventListenerList get click => this['click'];

  EventListenerList get contextMenu => this['contextmenu'];

  EventListenerList get copy => this['copy'];

  EventListenerList get cut => this['cut'];

  EventListenerList get doubleClick => this['dblclick'];

  EventListenerList get drag => this['drag'];

  EventListenerList get dragEnd => this['dragend'];

  EventListenerList get dragEnter => this['dragenter'];

  EventListenerList get dragLeave => this['dragleave'];

  EventListenerList get dragOver => this['dragover'];

  EventListenerList get dragStart => this['dragstart'];

  EventListenerList get drop => this['drop'];

  EventListenerList get error => this['error'];

  EventListenerList get focus => this['focus'];

  EventListenerList get input => this['input'];

  EventListenerList get invalid => this['invalid'];

  EventListenerList get keyDown => this['keydown'];

  EventListenerList get keyPress => this['keypress'];

  EventListenerList get keyUp => this['keyup'];

  EventListenerList get load => this['load'];

  EventListenerList get mouseDown => this['mousedown'];

  EventListenerList get mouseMove => this['mousemove'];

  EventListenerList get mouseOut => this['mouseout'];

  EventListenerList get mouseOver => this['mouseover'];

  EventListenerList get mouseUp => this['mouseup'];

  EventListenerList get mouseWheel => this['mousewheel'];

  EventListenerList get paste => this['paste'];

  EventListenerList get readyStateChange => this['readystatechange'];

  EventListenerList get reset => this['reset'];

  EventListenerList get scroll => this['scroll'];

  EventListenerList get search => this['search'];

  EventListenerList get select => this['select'];

  EventListenerList get selectionChange => this['selectionchange'];

  EventListenerList get selectStart => this['selectstart'];

  EventListenerList get submit => this['submit'];

  EventListenerList get touchCancel => this['touchcancel'];

  EventListenerList get touchEnd => this['touchend'];

  EventListenerList get touchMove => this['touchmove'];

  EventListenerList get touchStart => this['touchstart'];

  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];

  EventListenerList get fullscreenError => this['webkitfullscreenerror'];

  EventListenerList get pointerLockChange => this['webkitpointerlockchange'];

  EventListenerList get pointerLockError => this['webkitpointerlockerror'];
}
// Copyright (c) 2011, 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.

class _FilteredElementList implements List {
  final Node _node;
  final List<Node> _childNodes;

  _FilteredElementList(Node node): _childNodes = node.nodes, _node = node;

  // We can't memoize this, since it's possible that children will be messed
  // with externally to this class.
  //
  // TODO(nweiz): Do we really need to copy the list to make the types work out?
  List<Element> get _filtered =>
    new List.from(_childNodes.filter((n) => n is Element));

  void forEach(void f(Element element)) {
    _filtered.forEach(f);
  }

  void operator []=(int index, Element value) {
    this[index].replaceWith(value);
  }

  void set length(int newLength) {
    final len = this.length;
    if (newLength >= len) {
      return;
    } else if (newLength < 0) {
      throw new ArgumentError("Invalid list length");
    }

    removeRange(newLength - 1, len - newLength);
  }

  void add(Element value) {
    _childNodes.add(value);
  }

  void addAll(Collection<Element> collection) {
    collection.forEach(add);
  }

  void addLast(Element value) {
    add(value);
  }

  bool contains(Element element) {
    return element is Element && _childNodes.contains(element);
  }

  void sort([Comparator<Element> compare = Comparable.compare]) {
    throw new UnsupportedError('TODO(jacobr): should we impl?');
  }

  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
    throw new UnimplementedError();
  }

  void removeRange(int start, int rangeLength) {
    _filtered.getRange(start, rangeLength).forEach((el) => el.remove());
  }

  void insertRange(int start, int rangeLength, [initialValue = null]) {
    throw new UnimplementedError();
  }

  void clear() {
    // Currently, ElementList#clear clears even non-element nodes, so we follow
    // that behavior.
    _childNodes.clear();
  }

  Element removeLast() {
    final result = this.last;
    if (result != null) {
      result.remove();
    }
    return result;
  }

  Collection map(f(Element element)) => _filtered.map(f);
  Collection<Element> filter(bool f(Element element)) => _filtered.filter(f);
  bool every(bool f(Element element)) => _filtered.every(f);
  bool some(bool f(Element element)) => _filtered.some(f);
  bool get isEmpty => _filtered.isEmpty;
  int get length => _filtered.length;
  Element operator [](int index) => _filtered[index];
  Iterator<Element> iterator() => _filtered.iterator();
  List<Element> getRange(int start, int rangeLength) =>
    _filtered.getRange(start, rangeLength);
  int indexOf(Element element, [int start = 0]) =>
    _filtered.indexOf(element, start);

  int lastIndexOf(Element element, [int start = null]) {
    if (start == null) start = length - 1;
    return _filtered.lastIndexOf(element, start);
  }

  Element get last => _filtered.last;
}

Future<CSSStyleDeclaration> _emptyStyleFuture() {
  return _createMeasurementFuture(() => new Element.tag('div').style,
                                  new Completer<CSSStyleDeclaration>());
}

class EmptyElementRect implements ElementRect {
  final ClientRect client = const _SimpleClientRect(0, 0, 0, 0);
  final ClientRect offset = const _SimpleClientRect(0, 0, 0, 0);
  final ClientRect scroll = const _SimpleClientRect(0, 0, 0, 0);
  final ClientRect bounding = const _SimpleClientRect(0, 0, 0, 0);
  final List<ClientRect> clientRects = const <ClientRect>[];

  const EmptyElementRect();
}

class _FrozenCssClassSet extends _CssClassSet {
  _FrozenCssClassSet() : super(null);

  void _write(Set s) {
    throw new UnsupportedError(
        'frozen class set cannot be modified');
  }
  Set<String> _read() => new Set<String>();

  bool get frozen => true;
}

class DocumentFragment extends Node {
  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();

  factory DocumentFragment.html(String html) =>
      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);

  factory DocumentFragment.svg(String svg) =>
      new _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svg);

  List<Element> _elements;

  List<Element> get elements {
    if (_elements == null) {
      _elements = new _FilteredElementList(this);
    }
    return _elements;
  }

  // TODO: The type of value should be Collection<Element>. See http://b/5392897
  void set elements(value) {
    // Copy list first since we don't want liveness during iteration.
    List copy = new List.from(value);
    final elements = this.elements;
    elements.clear();
    elements.addAll(copy);
  }

  Element query(String selectors) => $dom_querySelector(selectors);

  List<Element> queryAll(String selectors) =>
    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));

  String get innerHTML {
    final e = new Element.tag("div");
    e.nodes.add(this.clone(true));
    return e.innerHTML;
  }

  String get outerHTML => innerHTML;

  // TODO(nweiz): Do we want to support some variant of innerHTML for XML and/or
  // SVG strings?
  void set innerHTML(String value) {
    this.nodes.clear();

    final e = new Element.tag("div");
    e.innerHTML = value;

    // Copy list first since we don't want liveness during iteration.
    List nodes = new List.from(e.nodes);
    this.nodes.addAll(nodes);
  }

  Node _insertAdjacentNode(String where, Node node) {
    switch (where.toLowerCase()) {
      case "beforebegin": return null;
      case "afterend": return null;
      case "afterbegin":
        var first = this.nodes.length > 0 ? this.nodes[0] : null;
        this.insertBefore(node, first);
        return node;
      case "beforeend":
        this.nodes.add(node);
        return node;
      default:
        throw new ArgumentError("Invalid position ${where}");
    }
  }

  Element insertAdjacentElement(String where, Element element)
    => this._insertAdjacentNode(where, element);

  void insertAdjacentText(String where, String text) {
    this._insertAdjacentNode(where, new Text(text));
  }

  void insertAdjacentHTML(String where, String text) {
    this._insertAdjacentNode(where, new DocumentFragment.html(text));
  }

  void addText(String text) {
    this.insertAdjacentText('beforeend', text);
  }

  void addHTML(String text) {
    this.insertAdjacentHTML('beforeend', text);
  }

  Future<ElementRect> get rect {
    return _createMeasurementFuture(() => const EmptyElementRect(),
                                    new Completer<ElementRect>());
  }

  // If we can come up with a semi-reasonable default value for an Element
  // getter, we'll use it. In general, these return the same values as an
  // element that has no parent.
  String get contentEditable => "false";
  bool get isContentEditable => false;
  bool get draggable => false;
  bool get hidden => false;
  bool get spellcheck => false;
  bool get translate => false;
  int get tabIndex => -1;
  String get id => "";
  String get title => "";
  String get tagName => "";
  String get webkitdropzone => "";
  String get webkitRegionOverflow => "";
  Element get $m_firstElementChild {
    if (elements.length > 0) {
      return elements[0];
    }
    return null;
  }
  Element get $m_lastElementChild() => elements.last;
  Element get nextElementSibling => null;
  Element get previousElementSibling => null;
  Element get offsetParent => null;
  Element get parent => null;
  Map<String, String> get attributes => const {};
  CssClassSet get classes => new _FrozenCssClassSet();
  Map<String, String> get dataAttributes => const {};
  CSSStyleDeclaration get style => new Element.tag('div').style;
  Future<CSSStyleDeclaration> get computedStyle =>
      _emptyStyleFuture();
  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) =>
      _emptyStyleFuture();
  bool matchesSelector(String selectors) => false;

  // Imperative Element methods are made into no-ops, as they are on parentless
  // elements.
  void blur() {}
  void focus() {}
  void click() {}
  void scrollByLines(int lines) {}
  void scrollByPages(int pages) {}
  void scrollIntoView([bool centerIfNeeded]) {}
  void webkitRequestFullScreen(int flags) {}
  void webkitRequestFullscreen() {}

  // Setters throw errors rather than being no-ops because we aren't going to
  // retain the values that were set, and erroring out seems clearer.
  void set attributes(Map<String, String> value) {
    throw new UnsupportedError(
      "Attributes can't be set for document fragments.");
  }

  void set classes(Collection<String> value) {
    throw new UnsupportedError(
      "Classes can't be set for document fragments.");
  }

  void set dataAttributes(Map<String, String> value) {
    throw new UnsupportedError(
      "Data attributes can't be set for document fragments.");
  }

  void set contentEditable(String value) {
    throw new UnsupportedError(
      "Content editable can't be set for document fragments.");
  }

  String get dir {
    throw new UnsupportedError(
      "Document fragments don't support text direction.");
  }

  void set dir(String value) {
    throw new UnsupportedError(
      "Document fragments don't support text direction.");
  }

  void set draggable(bool value) {
    throw new UnsupportedError(
      "Draggable can't be set for document fragments.");
  }

  void set hidden(bool value) {
    throw new UnsupportedError(
      "Hidden can't be set for document fragments.");
  }

  void set id(String value) {
    throw new UnsupportedError(
      "ID can't be set for document fragments.");
  }

  String get lang {
    throw new UnsupportedError(
      "Document fragments don't support language.");
  }

  void set lang(String value) {
    throw new UnsupportedError(
      "Document fragments don't support language.");
  }

  void set scrollLeft(int value) {
    throw new UnsupportedError(
      "Document fragments don't support scrolling.");
  }

  void set scrollTop(int value) {
    throw new UnsupportedError(
      "Document fragments don't support scrolling.");
  }

  void set spellcheck(bool value) {
     throw new UnsupportedError(
      "Spellcheck can't be set for document fragments.");
  }

  void set translate(bool value) {
     throw new UnsupportedError(
      "Spellcheck can't be set for document fragments.");
  }

  void set tabIndex(int value) {
    throw new UnsupportedError(
      "Tab index can't be set for document fragments.");
  }

  void set title(String value) {
    throw new UnsupportedError(
      "Title can't be set for document fragments.");
  }

  void set webkitdropzone(String value) {
    throw new UnsupportedError(
      "WebKit drop zone can't be set for document fragments.");
  }

  void set webkitRegionOverflow(String value) {
    throw new UnsupportedError(
      "WebKit region overflow can't be set for document fragments.");
  }

  DocumentFragment.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  ElementEvents get on =>
    new ElementEvents(this);


  /** @domName DocumentFragment.querySelector */
  Element $dom_querySelector(String selectors) native "DocumentFragment_querySelector_Callback";


  /** @domName DocumentFragment.querySelectorAll */
  List<Node> $dom_querySelectorAll(String selectors) native "DocumentFragment_querySelectorAll_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DocumentType
class DocumentType extends Node {
  DocumentType.internal(): super.internal();


  /** @domName DocumentType.entities */
  NamedNodeMap get entities native "DocumentType_entities_Getter";


  /** @domName DocumentType.internalSubset */
  String get internalSubset native "DocumentType_internalSubset_Getter";


  /** @domName DocumentType.name */
  String get name native "DocumentType_name_Getter";


  /** @domName DocumentType.notations */
  NamedNodeMap get notations native "DocumentType_notations_Getter";


  /** @domName DocumentType.publicId */
  String get publicId native "DocumentType_publicId_Getter";


  /** @domName DocumentType.systemId */
  String get systemId native "DocumentType_systemId_Getter";


  /** @domName DocumentType.remove */
  void remove() native "DocumentType_remove_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName DynamicsCompressorNode
class DynamicsCompressorNode extends AudioNode {
  DynamicsCompressorNode.internal(): super.internal();


  /** @domName DynamicsCompressorNode.attack */
  AudioParam get attack native "DynamicsCompressorNode_attack_Getter";


  /** @domName DynamicsCompressorNode.knee */
  AudioParam get knee native "DynamicsCompressorNode_knee_Getter";


  /** @domName DynamicsCompressorNode.ratio */
  AudioParam get ratio native "DynamicsCompressorNode_ratio_Getter";


  /** @domName DynamicsCompressorNode.reduction */
  AudioParam get reduction native "DynamicsCompressorNode_reduction_Getter";


  /** @domName DynamicsCompressorNode.release */
  AudioParam get release native "DynamicsCompressorNode_release_Getter";


  /** @domName DynamicsCompressorNode.threshold */
  AudioParam get threshold native "DynamicsCompressorNode_threshold_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName EXTTextureFilterAnisotropic
class EXTTextureFilterAnisotropic extends NativeFieldWrapperClass1 {
  EXTTextureFilterAnisotropic.internal();

  static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;

  static const int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;

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

// TODO(jacobr): use _Lists.dart to remove some of the duplicated
// functionality.
class _ChildrenElementList implements List {
  // Raw Element.
  final Element _element;
  final HTMLCollection _childElements;

  _ChildrenElementList._wrap(Element element)
    : _childElements = element.$dom_children,
      _element = element;

  List<Element> _toList() {
    final output = new List(_childElements.length);
    for (int i = 0, len = _childElements.length; i < len; i++) {
      output[i] = _childElements[i];
    }
    return output;
  }

  bool contains(Element element) => _childElements.contains(element);

  void forEach(void f(Element element)) {
    for (Element element in _childElements) {
      f(element);
    }
  }

  List<Element> filter(bool f(Element element)) {
    final output = [];
    forEach((Element element) {
      if (f(element)) {
        output.add(element);
      }
    });
    return new _FrozenElementList._wrap(output);
  }

  bool every(bool f(Element element)) {
    for (Element element in this) {
      if (!f(element)) {
        return false;
      }
    };
    return true;
  }

  bool some(bool f(Element element)) {
    for (Element element in this) {
      if (f(element)) {
        return true;
      }
    };
    return false;
  }

  Collection map(f(Element element)) {
    final out = [];
    for (Element el in this) {
      out.add(f(el));
    }
    return out;
  }

  bool get isEmpty {
    return _element.$dom_firstElementChild == null;
  }

  int get length {
    return _childElements.length;
  }

  Element operator [](int index) {
    return _childElements[index];
  }

  void operator []=(int index, Element value) {
    _element.$dom_replaceChild(value, _childElements[index]);
  }

   void set length(int newLength) {
     // TODO(jacobr): remove children when length is reduced.
     throw new UnsupportedError('');
   }

  Element add(Element value) {
    _element.$dom_appendChild(value);
    return value;
  }

  Element addLast(Element value) => add(value);

  Iterator<Element> iterator() => _toList().iterator();

  void addAll(Collection<Element> collection) {
    for (Element element in collection) {
      _element.$dom_appendChild(element);
    }
  }

  void sort([Comparator<Element> compare = Comparable.compare]) {
    throw new UnsupportedError('TODO(jacobr): should we impl?');
  }

  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
    throw new UnimplementedError();
  }

  void removeRange(int start, int rangeLength) {
    throw new UnimplementedError();
  }

  void insertRange(int start, int rangeLength, [initialValue = null]) {
    throw new UnimplementedError();
  }

  List getRange(int start, int rangeLength) =>
    new _FrozenElementList._wrap(_Lists.getRange(this, start, rangeLength,
        []));

  int indexOf(Element element, [int start = 0]) {
    return _Lists.indexOf(this, element, start, this.length);
  }

  int lastIndexOf(Element element, [int start = null]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  void clear() {
    // It is unclear if we want to keep non element nodes?
    _element.text = '';
  }

  Element removeLast() {
    final result = this.last;
    if (result != null) {
      _element.$dom_removeChild(result);
    }
    return result;
  }

  Element get last {
    return _element.$dom_lastElementChild;
  }
}

// TODO(jacobr): this is an inefficient implementation but it is hard to see
// a better option given that we cannot quite force NodeList to be an
// ElementList as there are valid cases where a NodeList JavaScript object
// contains Node objects that are not Elements.
class _FrozenElementList implements List {
  final List<Node> _nodeList;

  _FrozenElementList._wrap(this._nodeList);

  Element get first {
    return _nodeList[0];
  }

  bool contains(Element element) {
    for (Element el in this) {
      if (el == element) return true;
    }
    return false;
  }

  void forEach(void f(Element element)) {
    for (Element el in this) {
      f(el);
    }
  }

  Collection map(f(Element element)) {
    final out = [];
    for (Element el in this) {
      out.add(f(el));
    }
    return out;
  }

  List<Element> filter(bool f(Element element)) {
    final out = [];
    for (Element el in this) {
      if (f(el)) out.add(el);
    }
    return out;
  }

  bool every(bool f(Element element)) {
    for(Element element in this) {
      if (!f(element)) {
        return false;
      }
    };
    return true;
  }

  bool some(bool f(Element element)) {
    for(Element element in this) {
      if (f(element)) {
        return true;
      }
    };
    return false;
  }

  bool get isEmpty => _nodeList.isEmpty;

  int get length => _nodeList.length;

  Element operator [](int index) => _nodeList[index];

  void operator []=(int index, Element value) {
    throw new UnsupportedError('');
  }

  void set length(int newLength) {
    _nodeList.length = newLength;
  }

  void add(Element value) {
    throw new UnsupportedError('');
  }

  void addLast(Element value) {
    throw new UnsupportedError('');
  }

  Iterator<Element> iterator() => new _FrozenElementListIterator(this);

  void addAll(Collection<Element> collection) {
    throw new UnsupportedError('');
  }

  void sort([Comparator<Element> compare = Comparable.compare]) {
    throw new UnsupportedError('');
  }

  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
    throw new UnsupportedError('');
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError('');
  }

  void insertRange(int start, int rangeLength, [initialValue = null]) {
    throw new UnsupportedError('');
  }

  List<Element> getRange(int start, int rangeLength) =>
    new _FrozenElementList._wrap(_nodeList.getRange(start, rangeLength));

  int indexOf(Element element, [int start = 0]) =>
    _nodeList.indexOf(element, start);

  int lastIndexOf(Element element, [int start = null]) =>
    _nodeList.lastIndexOf(element, start);

  void clear() {
    throw new UnsupportedError('');
  }

  Element removeLast() {
    throw new UnsupportedError('');
  }

  Element get last => _nodeList.last;
}

class _FrozenElementListIterator implements Iterator<Element> {
  final _FrozenElementList _list;
  int _index = 0;

  _FrozenElementListIterator(this._list);

  /**
   * Gets the next element in the iteration. Throws a
   * [StateError("No more elements")] if no element is left.
   */
  Element next() {
    if (!hasNext) {
      throw new StateError("No more elements");
    }

    return _list[_index++];
  }

  /**
   * Returns whether the [Iterator] has elements left.
   */
  bool get hasNext => _index < _list.length;
}

/**
 * All your attribute manipulation needs in one place.
 * Extends the regular Map interface by automatically coercing non-string
 * values to strings.
 */
abstract class AttributeMap implements Map<String, String> {
  void operator []=(String key, value);
}

class _ElementAttributeMap extends AttributeMap {

  final Element _element;

  _ElementAttributeMap(this._element);

  bool containsValue(String value) {
    final attributes = _element.$dom_attributes;
    for (int i = 0, len = attributes.length; i < len; i++) {
      if(value == attributes[i].value) {
        return true;
      }
    }
    return false;
  }

  bool containsKey(String key) {
    return _element.$dom_hasAttribute(key);
  }

  String operator [](String key) {
    return _element.$dom_getAttribute(key);
  }

  void operator []=(String key, value) {
    _element.$dom_setAttribute(key, '$value');
  }

  String putIfAbsent(String key, String ifAbsent()) {
    if (!containsKey(key)) {
      this[key] = ifAbsent();
    }
    return this[key];
  }

  String remove(String key) {
    String value = _element.$dom_getAttribute(key);
    _element.$dom_removeAttribute(key);
    return value;
  }

  void clear() {
    final attributes = _element.$dom_attributes;
    for (int i = attributes.length - 1; i >= 0; i--) {
      remove(attributes[i].name);
    }
  }

  void forEach(void f(String key, String value)) {
    final attributes = _element.$dom_attributes;
    for (int i = 0, len = attributes.length; i < len; i++) {
      final item = attributes[i];
      f(item.name, item.value);
    }
  }

  Collection<String> get keys {
    // TODO(jacobr): generate a lazy collection instead.
    final attributes = _element.$dom_attributes;
    final keys = new List<String>(attributes.length);
    for (int i = 0, len = attributes.length; i < len; i++) {
      keys[i] = attributes[i].name;
    }
    return keys;
  }

  Collection<String> get values {
    // TODO(jacobr): generate a lazy collection instead.
    final attributes = _element.$dom_attributes;
    final values = new List<String>(attributes.length);
    for (int i = 0, len = attributes.length; i < len; i++) {
      values[i] = attributes[i].value;
    }
    return values;
  }

  /**
   * The number of {key, value} pairs in the map.
   */
  int get length {
    return _element.$dom_attributes.length;
  }

  /**
   * Returns true if there is no {key, value} pair in the map.
   */
  bool get isEmpty {
    return length == 0;
  }
}

/**
 * Provides a Map abstraction on top of data-* attributes, similar to the
 * dataSet in the old DOM.
 */
class _DataAttributeMap extends AttributeMap {

  final Map<String, String> $dom_attributes;

  _DataAttributeMap(this.$dom_attributes);

  // interface Map

  // TODO: Use lazy iterator when it is available on Map.
  bool containsValue(String value) => values.some((v) => v == value);

  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));

  String operator [](String key) => $dom_attributes[_attr(key)];

  void operator []=(String key, value) {
    $dom_attributes[_attr(key)] = '$value';
  }

  String putIfAbsent(String key, String ifAbsent()) =>
    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);

  String remove(String key) => $dom_attributes.remove(_attr(key));

  void clear() {
    // Needs to operate on a snapshot since we are mutating the collection.
    for (String key in keys) {
      remove(key);
    }
  }

  void forEach(void f(String key, String value)) {
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        f(_strip(key), value);
      }
    });
  }

  Collection<String> get keys {
    final keys = new List<String>();
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        keys.add(_strip(key));
      }
    });
    return keys;
  }

  Collection<String> get values {
    final values = new List<String>();
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        values.add(value);
      }
    });
    return values;
  }

  int get length => keys.length;

  // TODO: Use lazy iterator when it is available on Map.
  bool get isEmpty => length == 0;

  // Helpers.
  String _attr(String key) => 'data-$key';
  bool _matches(String key) => key.startsWith('data-');
  String _strip(String key) => key.substring(5);
}

abstract class CssClassSet implements Set<String> {
  /**
   * Adds the class [token] to the element if it is not on it, removes it if it
   * is.
   */
  bool toggle(String token);

  /**
   * Returns [:true:] if classes cannot be added or removed from this
   * [:CssClassSet:].
   */
  bool get frozen;
}

class _CssClassSet extends CssClassSet {

  final Element _element;

  _CssClassSet(this._element);

  String toString() => _formatSet(_read());

  // interface Iterable - BEGIN
  Iterator<String> iterator() => _read().iterator();
  // interface Iterable - END

  // interface Collection - BEGIN
  void forEach(void f(String element)) {
    _read().forEach(f);
  }

  Collection map(f(String element)) => _read().map(f);

  Collection<String> filter(bool f(String element)) => _read().filter(f);

  bool every(bool f(String element)) => _read().every(f);

  bool some(bool f(String element)) => _read().some(f);

  bool get isEmpty => _read().isEmpty;

  /**
   * Returns [:true:] if classes cannot be added or removed from this
   * [:CssClassSet:].
   */
  bool get frozen => false;

  int get length =>_read().length;

  // interface Collection - END

  // interface Set - BEGIN
  bool contains(String value) => _read().contains(value);

  void add(String value) {
    // TODO - figure out if we need to do any validation here
    // or if the browser natively does enough
    _modify((s) => s.add(value));
  }

  bool remove(String value) {
    Set<String> s = _read();
    bool result = s.remove(value);
    _write(s);
    return result;
  }

  /**
   * Adds the class [token] to the element if it is not on it, removes it if it
   * is.
   */
  bool toggle(String value) {
    Set<String> s = _read();
    bool result = false;
    if (s.contains(value)) {
      s.remove(value);
    } else {
      s.add(value);
      result = true;
    }
    _write(s);
    return result;
  }

  void addAll(Collection<String> collection) {
    // TODO - see comment above about validation
    _modify((s) => s.addAll(collection));
  }

  void removeAll(Collection<String> collection) {
    _modify((s) => s.removeAll(collection));
  }

  bool isSubsetOf(Collection<String> collection) =>
    _read().isSubsetOf(collection);

  bool containsAll(Collection<String> collection) =>
    _read().containsAll(collection);

  Set<String> intersection(Collection<String> other) =>
    _read().intersection(other);

  void clear() {
    _modify((s) => s.clear());
  }
  // interface Set - END

  /**
   * Helper method used to modify the set of css classes on this element.
   *
   *   f - callback with:
   *      s - a Set of all the css class name currently on this element.
   *
   *   After f returns, the modified set is written to the
   *       className property of this element.
   */
  void _modify( f(Set<String> s)) {
    Set<String> s = _read();
    f(s);
    _write(s);
  }

  /**
   * Read the class names from the Element class property,
   * and put them into a set (duplicates are discarded).
   */
  Set<String> _read() {
    // TODO(mattsh) simplify this once split can take regex.
    Set<String> s = new Set<String>();
    for (String name in _classname().split(' ')) {
      String trimmed = name.trim();
      if (!trimmed.isEmpty) {
        s.add(trimmed);
      }
    }
    return s;
  }

  /**
   * Read the class names as a space-separated string. This is meant to be
   * overridden by subclasses.
   */
  String _classname() => _element.$dom_className;

  /**
   * Join all the elements of a set into one string and write
   * back to the element.
   */
  void _write(Set s) {
    _element.$dom_className = _formatSet(s);
  }

  String _formatSet(Set<String> s) {
    // TODO(mattsh) should be able to pass Set to String.joins http:/b/5398605
    List list = new List.from(s);
    return Strings.join(list, ' ');
  }
}

class _SimpleClientRect implements ClientRect {
  final num left;
  final num top;
  final num width;
  final num height;
  num get right => left + width;
  num get bottom => top + height;

  const _SimpleClientRect(this.left, this.top, this.width, this.height);

  bool operator ==(ClientRect other) {
    return other != null && left == other.left && top == other.top
        && width == other.width && height == other.height;
  }

  String toString() => "($left, $top, $width, $height)";
}

// TODO(jacobr): we cannot currently be lazy about calculating the client
// rects as we must perform all measurement queries at a safe point to avoid
// triggering unneeded layouts.
/**
 * All your element measurement needs in one place.
 * @domName none
 */
class ElementRect {
  // Relative to offsetParent.
  final ClientRect client;
  final ClientRect offset;
  final ClientRect scroll;

  // TODO(jacobr): should we move these outside of ElementRect to avoid the
  // overhead of computing them every time even though they are rarely used.
  final ClientRect _boundingClientRect;
  final _ClientRectList _clientRects;

  ElementRect(Element element) :
    client = new _SimpleClientRect(element.clientLeft,
                                  element.clientTop,
                                  element.clientWidth,
                                  element.clientHeight),
    offset = new _SimpleClientRect(element.offsetLeft,
                                  element.offsetTop,
                                  element.offsetWidth,
                                  element.offsetHeight),
    scroll = new _SimpleClientRect(element.scrollLeft,
                                  element.scrollTop,
                                  element.scrollWidth,
                                  element.scrollHeight),
    _boundingClientRect = element.getBoundingClientRect(),
    _clientRects = element.getClientRects();

  // In global coords.
  ClientRect get bounding => _boundingClientRect;

  // In global coords.
  List<ClientRect> get clientRects {
    final out = new List(_clientRects.length);
    for (num i = 0; i < _clientRects.length; i++) {
      out[i] = _clientRects.item(i);
    }
    return out;
  }
}

class Element extends Node implements ElementTraversal {

  factory Element.html(String html) =>
      _ElementFactoryProvider.createElement_html(html);
  factory Element.tag(String tag) =>
      _ElementFactoryProvider.createElement_tag(tag);

  /**
   * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute,
   *   Element.removeAttribute
   */
  _ElementAttributeMap get attributes => new _ElementAttributeMap(this);

  void set attributes(Map<String, String> value) {
    Map<String, String> attributes = this.attributes;
    attributes.clear();
    for (String key in value.keys) {
      attributes[key] = value[key];
    }
  }

  void set elements(Collection<Element> value) {
    final elements = this.elements;
    elements.clear();
    elements.addAll(value);
  }

  /**
   * @domName childElementCount, firstElementChild, lastElementChild,
   *   children, Node.nodes.add
   */
  List<Element> get elements => new _ChildrenElementList._wrap(this);

  Element query(String selectors) => $dom_querySelector(selectors);

  List<Element> queryAll(String selectors) =>
    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));

  /** @domName className, classList */
  CssClassSet get classes => new _CssClassSet(this);

  void set classes(Collection<String> value) {
    CssClassSet classSet = classes;
    classSet.clear();
    classSet.addAll(value);
  }

  Map<String, String> get dataAttributes =>
    new _DataAttributeMap(attributes);

  void set dataAttributes(Map<String, String> value) {
    final dataAttributes = this.dataAttributes;
    dataAttributes.clear();
    for (String key in value.keys) {
      dataAttributes[key] = value[key];
    }
  }

  /**
   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
   * scrollHeight, scrollWidth, scrollTop, scrollLeft
   */
  Future<ElementRect> get rect {
    return _createMeasurementFuture(
        () => new ElementRect(this),
        new Completer<ElementRect>());
  }

  /** @domName Window.getComputedStyle */
  Future<CSSStyleDeclaration> get computedStyle {
     // TODO(jacobr): last param should be null, see b/5045788
     return getComputedStyle('');
  }

  /** @domName Window.getComputedStyle */
  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) {
    return _createMeasurementFuture(
        () => window.$dom_getComputedStyle(this, pseudoElement),
        new Completer<CSSStyleDeclaration>());
  }

  /**
   * Adds the specified text as a text node after the last child of this.
   */
  void addText(String text) {
    this.insertAdjacentText('beforeend', text);
  }

  /**
   * Parses the specified text as HTML and adds the resulting node after the
   * last child of this.
   */
  void addHTML(String text) {
    this.insertAdjacentHTML('beforeend', text);
  }

  // Hooks to support custom WebComponents.
  /**
   * Experimental support for [web components][wc]. This field stores a
   * reference to the component implementation. It was inspired by Mozilla's
   * [x-tags][] project. Please note: in the future it may be possible to
   * `extend Element` from your class, in which case this field will be
   * deprecated and will simply return this [Element] object.
   *
   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
   * [x-tags]: http://x-tags.org/
   */
  var xtag;

  noSuchMethod(InvocationMirror invocation) {
    if (dynamicUnknownElementDispatcher == null) {
      throw new NoSuchMethodError(this, invocation.memberName,
                                        invocation.positionalArguments,
                                        invocation.namedArguments);
    } else {
      String hackedName = invocation.memberName;
      if (invocation.isGetter) hackedName = "get:$hackedName";
      if (invocation.isSetter) hackedName = "set:$hackedName";
      return dynamicUnknownElementDispatcher(this,
                                             hackedName,
                                             invocation.positionalArguments);
    }
  }


  Element.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  ElementEvents get on =>
    new ElementEvents(this);

  static const int ALLOW_KEYBOARD_INPUT = 1;


  /** @domName Element.childElementCount */
  int get $dom_childElementCount native "Element_childElementCount_Getter";


  /** @domName Element.className */
  String get $dom_className native "Element_className_Getter";


  /** @domName Element.className */
  void set $dom_className(String value) native "Element_className_Setter";


  /** @domName Element.clientHeight */
  int get clientHeight native "Element_clientHeight_Getter";


  /** @domName Element.clientLeft */
  int get clientLeft native "Element_clientLeft_Getter";


  /** @domName Element.clientTop */
  int get clientTop native "Element_clientTop_Getter";


  /** @domName Element.clientWidth */
  int get clientWidth native "Element_clientWidth_Getter";


  /** @domName Element.dataset */
  Map<String, String> get dataset native "Element_dataset_Getter";


  /** @domName Element.firstElementChild */
  Element get $dom_firstElementChild native "Element_firstElementChild_Getter";


  /** @domName Element.lastElementChild */
  Element get $dom_lastElementChild native "Element_lastElementChild_Getter";


  /** @domName Element.nextElementSibling */
  Element get nextElementSibling native "Element_nextElementSibling_Getter";


  /** @domName Element.offsetHeight */
  int get offsetHeight native "Element_offsetHeight_Getter";


  /** @domName Element.offsetLeft */
  int get offsetLeft native "Element_offsetLeft_Getter";


  /** @domName Element.offsetParent */
  Element get offsetParent native "Element_offsetParent_Getter";


  /** @domName Element.offsetTop */
  int get offsetTop native "Element_offsetTop_Getter";


  /** @domName Element.offsetWidth */
  int get offsetWidth native "Element_offsetWidth_Getter";


  /** @domName Element.previousElementSibling */
  Element get previousElementSibling native "Element_previousElementSibling_Getter";


  /** @domName Element.scrollHeight */
  int get scrollHeight native "Element_scrollHeight_Getter";


  /** @domName Element.scrollLeft */
  int get scrollLeft native "Element_scrollLeft_Getter";


  /** @domName Element.scrollLeft */
  void set scrollLeft(int value) native "Element_scrollLeft_Setter";


  /** @domName Element.scrollTop */
  int get scrollTop native "Element_scrollTop_Getter";


  /** @domName Element.scrollTop */
  void set scrollTop(int value) native "Element_scrollTop_Setter";


  /** @domName Element.scrollWidth */
  int get scrollWidth native "Element_scrollWidth_Getter";


  /** @domName Element.style */
  CSSStyleDeclaration get style native "Element_style_Getter";


  /** @domName Element.tagName */
  String get tagName native "Element_tagName_Getter";


  /** @domName Element.blur */
  void blur() native "Element_blur_Callback";


  /** @domName Element.focus */
  void focus() native "Element_focus_Callback";


  /** @domName Element.getAttribute */
  String $dom_getAttribute(String name) native "Element_getAttribute_Callback";


  /** @domName Element.getBoundingClientRect */
  ClientRect getBoundingClientRect() native "Element_getBoundingClientRect_Callback";


  /** @domName Element.getClientRects */
  List<ClientRect> getClientRects() native "Element_getClientRects_Callback";


  /** @domName Element.getElementsByClassName */
  List<Node> $dom_getElementsByClassName(String name) native "Element_getElementsByClassName_Callback";


  /** @domName Element.getElementsByTagName */
  List<Node> $dom_getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";


  /** @domName Element.hasAttribute */
  bool $dom_hasAttribute(String name) native "Element_hasAttribute_Callback";


  /** @domName Element.querySelector */
  Element $dom_querySelector(String selectors) native "Element_querySelector_Callback";


  /** @domName Element.querySelectorAll */
  List<Node> $dom_querySelectorAll(String selectors) native "Element_querySelectorAll_Callback";


  /** @domName Element.remove */
  void remove() native "Element_remove_Callback";


  /** @domName Element.removeAttribute */
  void $dom_removeAttribute(String name) native "Element_removeAttribute_Callback";


  /** @domName Element.scrollByLines */
  void scrollByLines(int lines) native "Element_scrollByLines_Callback";


  /** @domName Element.scrollByPages */
  void scrollByPages(int pages) native "Element_scrollByPages_Callback";

  void scrollIntoView([/*boolean*/ centerIfNeeded]) {
    if (?centerIfNeeded) {
      _scrollIntoViewIfNeeded_1(centerIfNeeded);
      return;
    }
    _scrollIntoViewIfNeeded_2();
  }


  /** @domName Element.scrollIntoViewIfNeeded_1 */
  void _scrollIntoViewIfNeeded_1(centerIfNeeded) native "Element_scrollIntoViewIfNeeded_1_Callback";


  /** @domName Element.scrollIntoViewIfNeeded_2 */
  void _scrollIntoViewIfNeeded_2() native "Element_scrollIntoViewIfNeeded_2_Callback";


  /** @domName Element.setAttribute */
  void $dom_setAttribute(String name, String value) native "Element_setAttribute_Callback";


  /** @domName Element.webkitMatchesSelector */
  bool matchesSelector(String selectors) native "Element_webkitMatchesSelector_Callback";


  /** @domName Element.webkitRequestFullScreen */
  void webkitRequestFullScreen(int flags) native "Element_webkitRequestFullScreen_Callback";


  /** @domName Element.webkitRequestFullscreen */
  void webkitRequestFullscreen() native "Element_webkitRequestFullscreen_Callback";


  /** @domName Element.webkitRequestPointerLock */
  void webkitRequestPointerLock() native "Element_webkitRequestPointerLock_Callback";

  /** @domName HTMLElement.children */
  HTMLCollection get $dom_children;

  /** @domName HTMLElement.contentEditable */
  String contentEditable;

  /** @domName HTMLElement.dir */
  String dir;

  /** @domName HTMLElement.draggable */
  bool draggable;

  /** @domName HTMLElement.hidden */
  bool hidden;

  /** @domName HTMLElement.id */
  String id;

  /** @domName HTMLElement.innerHTML */
  String innerHTML;

  /** @domName HTMLElement.isContentEditable */
  bool get isContentEditable;

  /** @domName HTMLElement.lang */
  String lang;

  /** @domName HTMLElement.outerHTML */
  String get outerHTML;

  /** @domName HTMLElement.spellcheck */
  bool spellcheck;

  /** @domName HTMLElement.tabIndex */
  int tabIndex;

  /** @domName HTMLElement.title */
  String title;

  /** @domName HTMLElement.translate */
  bool translate;

  /** @domName HTMLElement.webkitdropzone */
  String webkitdropzone;

  /** @domName HTMLElement.click */
  void click();

  /** @domName HTMLElement.insertAdjacentElement */
  Element insertAdjacentElement(String where, Element element);

  /** @domName HTMLElement.insertAdjacentHTML */
  void insertAdjacentHTML(String where, String html);

  /** @domName HTMLElement.insertAdjacentText */
  void insertAdjacentText(String where, String text);

}

// Temporary dispatch hook to support WebComponents.
Function dynamicUnknownElementDispatcher;

final _START_TAG_REGEXP = const RegExp('<(\\w+)');
class _ElementFactoryProvider {
  static final _CUSTOM_PARENT_TAG_MAP = const {
    'body' : 'html',
    'head' : 'html',
    'caption' : 'table',
    'td': 'tr',
    'colgroup': 'table',
    'col' : 'colgroup',
    'tr' : 'tbody',
    'tbody' : 'table',
    'tfoot' : 'table',
    'thead' : 'table',
    'track' : 'audio',
  };

  /** @domName Document.createElement */
  static Element createElement_html(String html) {
    // TODO(jacobr): this method can be made more robust and performant.
    // 1) Cache the dummy parent elements required to use innerHTML rather than
    //    creating them every call.
    // 2) Verify that the html does not contain leading or trailing text nodes.
    // 3) Verify that the html does not contain both <head> and <body> tags.
    // 4) Detatch the created element from its dummy parent.
    String parentTag = 'div';
    String tag;
    final match = _START_TAG_REGEXP.firstMatch(html);
    if (match != null) {
      tag = match.group(1).toLowerCase();
      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
      }
    }
    final Element temp = new Element.tag(parentTag);
    temp.innerHTML = html;

    Element element;
    if (temp.elements.length == 1) {
      element = temp.elements[0];
    } else if (parentTag == 'html' && temp.elements.length == 2) {
      // Work around for edge case in WebKit and possibly other browsers where
      // both body and head elements are created even though the inner html
      // only contains a head or body element.
      element = temp.elements[tag == 'head' ? 0 : 1];
    } else {
      throw new ArgumentError('HTML had ${temp.elements.length} '
          'top level elements but 1 expected');
    }
    element.remove();
    return element;
  }

  /** @domName Document.createElement */
  static Element createElement_tag(String tag) =>
      document.$dom_createElement(tag);
}

class ElementEvents extends Events {
  ElementEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get beforeCopy => this['beforecopy'];

  EventListenerList get beforeCut => this['beforecut'];

  EventListenerList get beforePaste => this['beforepaste'];

  EventListenerList get blur => this['blur'];

  EventListenerList get change => this['change'];

  EventListenerList get click => this['click'];

  EventListenerList get contextMenu => this['contextmenu'];

  EventListenerList get copy => this['copy'];

  EventListenerList get cut => this['cut'];

  EventListenerList get doubleClick => this['dblclick'];

  EventListenerList get drag => this['drag'];

  EventListenerList get dragEnd => this['dragend'];

  EventListenerList get dragEnter => this['dragenter'];

  EventListenerList get dragLeave => this['dragleave'];

  EventListenerList get dragOver => this['dragover'];

  EventListenerList get dragStart => this['dragstart'];

  EventListenerList get drop => this['drop'];

  EventListenerList get error => this['error'];

  EventListenerList get focus => this['focus'];

  EventListenerList get input => this['input'];

  EventListenerList get invalid => this['invalid'];

  EventListenerList get keyDown => this['keydown'];

  EventListenerList get keyPress => this['keypress'];

  EventListenerList get keyUp => this['keyup'];

  EventListenerList get load => this['load'];

  EventListenerList get mouseDown => this['mousedown'];

  EventListenerList get mouseMove => this['mousemove'];

  EventListenerList get mouseOut => this['mouseout'];

  EventListenerList get mouseOver => this['mouseover'];

  EventListenerList get mouseUp => this['mouseup'];

  EventListenerList get mouseWheel => this['mousewheel'];

  EventListenerList get paste => this['paste'];

  EventListenerList get reset => this['reset'];

  EventListenerList get scroll => this['scroll'];

  EventListenerList get search => this['search'];

  EventListenerList get select => this['select'];

  EventListenerList get selectStart => this['selectstart'];

  EventListenerList get submit => this['submit'];

  EventListenerList get touchCancel => this['touchcancel'];

  EventListenerList get touchEnd => this['touchend'];

  EventListenerList get touchEnter => this['touchenter'];

  EventListenerList get touchLeave => this['touchleave'];

  EventListenerList get touchMove => this['touchmove'];

  EventListenerList get touchStart => this['touchstart'];

  EventListenerList get transitionEnd => this['webkitTransitionEnd'];

  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];

  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName ElementTimeControl
class ElementTimeControl extends NativeFieldWrapperClass1 {
  ElementTimeControl.internal();


  /** @domName ElementTimeControl.beginElement */
  void beginElement() native "ElementTimeControl_beginElement_Callback";


  /** @domName ElementTimeControl.beginElementAt */
  void beginElementAt(num offset) native "ElementTimeControl_beginElementAt_Callback";


  /** @domName ElementTimeControl.endElement */
  void endElement() native "ElementTimeControl_endElement_Callback";


  /** @domName ElementTimeControl.endElementAt */
  void endElementAt(num offset) native "ElementTimeControl_endElementAt_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName ElementTraversal
class ElementTraversal extends NativeFieldWrapperClass1 {
  ElementTraversal.internal();


  /** @domName ElementTraversal.childElementCount */
  int get childElementCount native "ElementTraversal_childElementCount_Getter";


  /** @domName ElementTraversal.firstElementChild */
  Element get firstElementChild native "ElementTraversal_firstElementChild_Getter";


  /** @domName ElementTraversal.lastElementChild */
  Element get lastElementChild native "ElementTraversal_lastElementChild_Getter";


  /** @domName ElementTraversal.nextElementSibling */
  Element get nextElementSibling native "ElementTraversal_nextElementSibling_Getter";


  /** @domName ElementTraversal.previousElementSibling */
  Element get previousElementSibling native "ElementTraversal_previousElementSibling_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLEmbedElement
class EmbedElement extends _Element_Merged {

  factory EmbedElement() => _Elements.createEmbedElement();
  EmbedElement.internal(): super.internal();


  /** @domName HTMLEmbedElement.align */
  String get align native "HTMLEmbedElement_align_Getter";


  /** @domName HTMLEmbedElement.align */
  void set align(String value) native "HTMLEmbedElement_align_Setter";


  /** @domName HTMLEmbedElement.height */
  String get height native "HTMLEmbedElement_height_Getter";


  /** @domName HTMLEmbedElement.height */
  void set height(String value) native "HTMLEmbedElement_height_Setter";


  /** @domName HTMLEmbedElement.name */
  String get name native "HTMLEmbedElement_name_Getter";


  /** @domName HTMLEmbedElement.name */
  void set name(String value) native "HTMLEmbedElement_name_Setter";


  /** @domName HTMLEmbedElement.src */
  String get src native "HTMLEmbedElement_src_Getter";


  /** @domName HTMLEmbedElement.src */
  void set src(String value) native "HTMLEmbedElement_src_Setter";


  /** @domName HTMLEmbedElement.type */
  String get type native "HTMLEmbedElement_type_Getter";


  /** @domName HTMLEmbedElement.type */
  void set type(String value) native "HTMLEmbedElement_type_Setter";


  /** @domName HTMLEmbedElement.width */
  String get width native "HTMLEmbedElement_width_Getter";


  /** @domName HTMLEmbedElement.width */
  void set width(String value) native "HTMLEmbedElement_width_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName EntityReference
class EntityReference extends Node {
  EntityReference.internal(): super.internal();

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

// WARNING: Do not edit - generated code.


typedef void EntriesCallback(List<Entry> entries);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName Entry
class Entry extends NativeFieldWrapperClass1 {
  Entry.internal();


  /** @domName Entry.filesystem */
  DOMFileSystem get filesystem native "Entry_filesystem_Getter";


  /** @domName Entry.fullPath */
  String get fullPath native "Entry_fullPath_Getter";


  /** @domName Entry.isDirectory */
  bool get isDirectory native "Entry_isDirectory_Getter";


  /** @domName Entry.isFile */
  bool get isFile native "Entry_isFile_Getter";


  /** @domName Entry.name */
  String get name native "Entry_name_Getter";

  void copyTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
    if (?name) {
      _copyTo_1(parent, name, successCallback, errorCallback);
      return;
    }
    _copyTo_2(parent);
  }


  /** @domName Entry.copyTo_1 */
  void _copyTo_1(parent, name, successCallback, errorCallback) native "Entry_copyTo_1_Callback";


  /** @domName Entry.copyTo_2 */
  void _copyTo_2(parent) native "Entry_copyTo_2_Callback";


  /** @domName Entry.getMetadata */
  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native "Entry_getMetadata_Callback";


  /** @domName Entry.getParent */
  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native "Entry_getParent_Callback";

  void moveTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
    if (?name) {
      _moveTo_1(parent, name, successCallback, errorCallback);
      return;
    }
    _moveTo_2(parent);
  }


  /** @domName Entry.moveTo_1 */
  void _moveTo_1(parent, name, successCallback, errorCallback) native "Entry_moveTo_1_Callback";


  /** @domName Entry.moveTo_2 */
  void _moveTo_2(parent) native "Entry_moveTo_2_Callback";


  /** @domName Entry.remove */
  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native "Entry_remove_Callback";


  /** @domName Entry.toURL */
  String toURL() native "Entry_toURL_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName EntrySync
class EntrySync extends NativeFieldWrapperClass1 {
  EntrySync.internal();


  /** @domName EntrySync.filesystem */
  DOMFileSystemSync get filesystem native "EntrySync_filesystem_Getter";


  /** @domName EntrySync.fullPath */
  String get fullPath native "EntrySync_fullPath_Getter";


  /** @domName EntrySync.isDirectory */
  bool get isDirectory native "EntrySync_isDirectory_Getter";


  /** @domName EntrySync.isFile */
  bool get isFile native "EntrySync_isFile_Getter";


  /** @domName EntrySync.name */
  String get name native "EntrySync_name_Getter";


  /** @domName EntrySync.copyTo */
  EntrySync copyTo(DirectoryEntrySync parent, String name) native "EntrySync_copyTo_Callback";


  /** @domName EntrySync.getMetadata */
  Metadata getMetadata() native "EntrySync_getMetadata_Callback";


  /** @domName EntrySync.getParent */
  EntrySync getParent() native "EntrySync_getParent_Callback";


  /** @domName EntrySync.moveTo */
  EntrySync moveTo(DirectoryEntrySync parent, String name) native "EntrySync_moveTo_Callback";


  /** @domName EntrySync.remove */
  void remove() native "EntrySync_remove_Callback";


  /** @domName EntrySync.toURL */
  String toURL() native "EntrySync_toURL_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName ErrorEvent
class ErrorEvent extends Event {
  ErrorEvent.internal(): super.internal();


  /** @domName ErrorEvent.filename */
  String get filename native "ErrorEvent_filename_Getter";


  /** @domName ErrorEvent.lineno */
  int get lineno native "ErrorEvent_lineno_Getter";


  /** @domName ErrorEvent.message */
  String get message native "ErrorEvent_message_Getter";

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

// WARNING: Do not edit - generated code.

class Event extends NativeFieldWrapperClass1 {
  // In JS, canBubble and cancelable are technically required parameters to
  // init*Event. In practice, though, if they aren't provided they simply
  // default to false (since that's Boolean(undefined)).
  //
  // Contrary to JS, we default canBubble and cancelable to true, since that's
  // what people want most of the time anyway.
  factory Event(String type, [bool canBubble = true, bool cancelable = true]) =>
      _EventFactoryProvider.createEvent(type, canBubble, cancelable);
  Event.internal();

  static const int AT_TARGET = 2;

  static const int BLUR = 8192;

  static const int BUBBLING_PHASE = 3;

  static const int CAPTURING_PHASE = 1;

  static const int CHANGE = 32768;

  static const int CLICK = 64;

  static const int DBLCLICK = 128;

  static const int DRAGDROP = 2048;

  static const int FOCUS = 4096;

  static const int KEYDOWN = 256;

  static const int KEYPRESS = 1024;

  static const int KEYUP = 512;

  static const int MOUSEDOWN = 1;

  static const int MOUSEDRAG = 32;

  static const int MOUSEMOVE = 16;

  static const int MOUSEOUT = 8;

  static const int MOUSEOVER = 4;

  static const int MOUSEUP = 2;

  static const int NONE = 0;

  static const int SELECT = 16384;


  /** @domName Event.bubbles */
  bool get bubbles native "Event_bubbles_Getter";


  /** @domName Event.cancelBubble */
  bool get cancelBubble native "Event_cancelBubble_Getter";


  /** @domName Event.cancelBubble */
  void set cancelBubble(bool value) native "Event_cancelBubble_Setter";


  /** @domName Event.cancelable */
  bool get cancelable native "Event_cancelable_Getter";


  /** @domName Event.clipboardData */
  Clipboard get clipboardData native "Event_clipboardData_Getter";


  /** @domName Event.currentTarget */
  EventTarget get currentTarget native "Event_currentTarget_Getter";


  /** @domName Event.defaultPrevented */
  bool get defaultPrevented native "Event_defaultPrevented_Getter";


  /** @domName Event.eventPhase */
  int get eventPhase native "Event_eventPhase_Getter";


  /** @domName Event.returnValue */
  bool get returnValue native "Event_returnValue_Getter";


  /** @domName Event.returnValue */
  void set returnValue(bool value) native "Event_returnValue_Setter";


  /** @domName Event.srcElement */
  EventTarget get srcElement native "Event_srcElement_Getter";


  /** @domName Event.target */
  EventTarget get target native "Event_target_Getter";


  /** @domName Event.timeStamp */
  int get timeStamp native "Event_timeStamp_Getter";


  /** @domName Event.type */
  String get type native "Event_type_Getter";


  /** @domName Event.initEvent */
  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "Event_initEvent_Callback";


  /** @domName Event.preventDefault */
  void preventDefault() native "Event_preventDefault_Callback";


  /** @domName Event.stopImmediatePropagation */
  void stopImmediatePropagation() native "Event_stopImmediatePropagation_Callback";


  /** @domName Event.stopPropagation */
  void stopPropagation() native "Event_stopPropagation_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName EventException
class EventException extends NativeFieldWrapperClass1 {
  EventException.internal();

  static const int DISPATCH_REQUEST_ERR = 1;

  static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;


  /** @domName EventException.code */
  int get code native "EventException_code_Getter";


  /** @domName EventException.message */
  String get message native "EventException_message_Getter";


  /** @domName EventException.name */
  String get name native "EventException_name_Getter";


  /** @domName EventException.toString */
  String toString() native "EventException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName EventSource
class EventSource extends EventTarget {

  factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
  EventSource.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  EventSourceEvents get on =>
    new EventSourceEvents(this);

  static const int CLOSED = 2;

  static const int CONNECTING = 0;

  static const int OPEN = 1;


  /** @domName EventSource.URL */
  String get URL native "EventSource_URL_Getter";


  /** @domName EventSource.readyState */
  int get readyState native "EventSource_readyState_Getter";


  /** @domName EventSource.url */
  String get url native "EventSource_url_Getter";


  /** @domName EventSource.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";


  /** @domName EventSource.close */
  void close() native "EventSource_close_Callback";


  /** @domName EventSource.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "EventSource_dispatchEvent_Callback";


  /** @domName EventSource.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";

}

class EventSourceEvents extends Events {
  EventSourceEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get error => this['error'];

  EventListenerList get message => this['message'];

  EventListenerList get open => this['open'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class Events {
  /* Raw event target. */
  final EventTarget _ptr;

  Events(this._ptr);

  EventListenerList operator [](String type) {
    return new EventListenerList(_ptr, type);
  }
}

class EventListenerList {

  final EventTarget _ptr;
  final String _type;

  EventListenerList(this._ptr, this._type);

  // TODO(jacobr): implement equals.

  EventListenerList add(EventListener listener,
      [bool useCapture = false]) {
    _add(listener, useCapture);
    return this;
  }

  EventListenerList remove(EventListener listener,
      [bool useCapture = false]) {
    _remove(listener, useCapture);
    return this;
  }

  bool dispatch(Event evt) {
    return _ptr.$dom_dispatchEvent(evt);
  }

  void _add(EventListener listener, bool useCapture) {
    _ptr.$dom_addEventListener(_type, listener, useCapture);
  }

  void _remove(EventListener listener, bool useCapture) {
    _ptr.$dom_removeEventListener(_type, listener, useCapture);
  }
}


class EventTarget extends NativeFieldWrapperClass1 {

  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
  Events get on => new Events(this);
  EventTarget.internal();


  /** @domName EventTarget.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_addEventListener_Callback";


  /** @domName EventTarget.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "EventTarget_dispatchEvent_Callback";


  /** @domName EventTarget.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_removeEventListener_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLFieldSetElement
class FieldSetElement extends _Element_Merged {

  factory FieldSetElement() => _Elements.createFieldSetElement();
  FieldSetElement.internal(): super.internal();


  /** @domName HTMLFieldSetElement.disabled */
  bool get disabled native "HTMLFieldSetElement_disabled_Getter";


  /** @domName HTMLFieldSetElement.disabled */
  void set disabled(bool value) native "HTMLFieldSetElement_disabled_Setter";


  /** @domName HTMLFieldSetElement.elements */
  HTMLCollection get elements native "HTMLFieldSetElement_elements_Getter";


  /** @domName HTMLFieldSetElement.form */
  FormElement get form native "HTMLFieldSetElement_form_Getter";


  /** @domName HTMLFieldSetElement.name */
  String get name native "HTMLFieldSetElement_name_Getter";


  /** @domName HTMLFieldSetElement.name */
  void set name(String value) native "HTMLFieldSetElement_name_Setter";


  /** @domName HTMLFieldSetElement.type */
  String get type native "HTMLFieldSetElement_type_Getter";


  /** @domName HTMLFieldSetElement.validationMessage */
  String get validationMessage native "HTMLFieldSetElement_validationMessage_Getter";


  /** @domName HTMLFieldSetElement.validity */
  ValidityState get validity native "HTMLFieldSetElement_validity_Getter";


  /** @domName HTMLFieldSetElement.willValidate */
  bool get willValidate native "HTMLFieldSetElement_willValidate_Getter";


  /** @domName HTMLFieldSetElement.checkValidity */
  bool checkValidity() native "HTMLFieldSetElement_checkValidity_Callback";


  /** @domName HTMLFieldSetElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLFieldSetElement_setCustomValidity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName File
class File extends Blob {
  File.internal(): super.internal();


  /** @domName File.lastModifiedDate */
  Date get lastModifiedDate native "File_lastModifiedDate_Getter";


  /** @domName File.name */
  String get name native "File_name_Getter";


  /** @domName File.webkitRelativePath */
  String get webkitRelativePath native "File_webkitRelativePath_Getter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName FileEntry
class FileEntry extends Entry {
  FileEntry.internal(): super.internal();


  /** @domName FileEntry.createWriter */
  void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_createWriter_Callback";


  /** @domName FileEntry.file */
  void file(FileCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_file_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName FileEntrySync
class FileEntrySync extends EntrySync {
  FileEntrySync.internal(): super.internal();


  /** @domName FileEntrySync.createWriter */
  FileWriterSync createWriter() native "FileEntrySync_createWriter_Callback";


  /** @domName FileEntrySync.file */
  File file() native "FileEntrySync_file_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName FileError
class FileError extends NativeFieldWrapperClass1 {
  FileError.internal();

  static const int ABORT_ERR = 3;

  static const int ENCODING_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 9;

  static const int INVALID_STATE_ERR = 7;

  static const int NOT_FOUND_ERR = 1;

  static const int NOT_READABLE_ERR = 4;

  static const int NO_MODIFICATION_ALLOWED_ERR = 6;

  static const int PATH_EXISTS_ERR = 12;

  static const int QUOTA_EXCEEDED_ERR = 10;

  static const int SECURITY_ERR = 2;

  static const int SYNTAX_ERR = 8;

  static const int TYPE_MISMATCH_ERR = 11;


  /** @domName FileError.code */
  int get code native "FileError_code_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName FileException
class FileException extends NativeFieldWrapperClass1 {
  FileException.internal();

  static const int ABORT_ERR = 3;

  static const int ENCODING_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 9;

  static const int INVALID_STATE_ERR = 7;

  static const int NOT_FOUND_ERR = 1;

  static const int NOT_READABLE_ERR = 4;

  static const int NO_MODIFICATION_ALLOWED_ERR = 6;

  static const int PATH_EXISTS_ERR = 12;

  static const int QUOTA_EXCEEDED_ERR = 10;

  static const int SECURITY_ERR = 2;

  static const int SYNTAX_ERR = 8;

  static const int TYPE_MISMATCH_ERR = 11;


  /** @domName FileException.code */
  int get code native "FileException_code_Getter";


  /** @domName FileException.message */
  String get message native "FileException_message_Getter";


  /** @domName FileException.name */
  String get name native "FileException_name_Getter";


  /** @domName FileException.toString */
  String toString() native "FileException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName FileReader
class FileReader extends EventTarget {

  factory FileReader() => _FileReaderFactoryProvider.createFileReader();
  FileReader.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  FileReaderEvents get on =>
    new FileReaderEvents(this);

  static const int DONE = 2;

  static const int EMPTY = 0;

  static const int LOADING = 1;


  /** @domName FileReader.error */
  FileError get error native "FileReader_error_Getter";


  /** @domName FileReader.readyState */
  int get readyState native "FileReader_readyState_Getter";


  /** @domName FileReader.result */
  Object get result native "FileReader_result_Getter";


  /** @domName FileReader.abort */
  void abort() native "FileReader_abort_Callback";


  /** @domName FileReader.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";


  /** @domName FileReader.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "FileReader_dispatchEvent_Callback";


  /** @domName FileReader.readAsArrayBuffer */
  void readAsArrayBuffer(Blob blob) native "FileReader_readAsArrayBuffer_Callback";


  /** @domName FileReader.readAsBinaryString */
  void readAsBinaryString(Blob blob) native "FileReader_readAsBinaryString_Callback";


  /** @domName FileReader.readAsDataURL */
  void readAsDataURL(Blob blob) native "FileReader_readAsDataURL_Callback";

  void readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
    if (?encoding) {
      _readAsText_1(blob, encoding);
      return;
    }
    _readAsText_2(blob);
  }


  /** @domName FileReader.readAsText_1 */
  void _readAsText_1(blob, encoding) native "FileReader_readAsText_1_Callback";


  /** @domName FileReader.readAsText_2 */
  void _readAsText_2(blob) native "FileReader_readAsText_2_Callback";


  /** @domName FileReader.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";

}

class FileReaderEvents extends Events {
  FileReaderEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get error => this['error'];

  EventListenerList get load => this['load'];

  EventListenerList get loadEnd => this['loadend'];

  EventListenerList get loadStart => this['loadstart'];

  EventListenerList get progress => this['progress'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName FileReaderSync
class FileReaderSync extends NativeFieldWrapperClass1 {

  factory FileReaderSync() => _FileReaderSyncFactoryProvider.createFileReaderSync();
  FileReaderSync.internal();


  /** @domName FileReaderSync.readAsArrayBuffer */
  ArrayBuffer readAsArrayBuffer(Blob blob) native "FileReaderSync_readAsArrayBuffer_Callback";


  /** @domName FileReaderSync.readAsBinaryString */
  String readAsBinaryString(Blob blob) native "FileReaderSync_readAsBinaryString_Callback";


  /** @domName FileReaderSync.readAsDataURL */
  String readAsDataURL(Blob blob) native "FileReaderSync_readAsDataURL_Callback";

  String readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
    if (?encoding) {
      return _readAsText_1(blob, encoding);
    }
    return _readAsText_2(blob);
  }


  /** @domName FileReaderSync.readAsText_1 */
  String _readAsText_1(blob, encoding) native "FileReaderSync_readAsText_1_Callback";


  /** @domName FileReaderSync.readAsText_2 */
  String _readAsText_2(blob) native "FileReaderSync_readAsText_2_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName FileWriter
class FileWriter extends EventTarget {
  FileWriter.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  FileWriterEvents get on =>
    new FileWriterEvents(this);

  static const int DONE = 2;

  static const int INIT = 0;

  static const int WRITING = 1;


  /** @domName FileWriter.error */
  FileError get error native "FileWriter_error_Getter";


  /** @domName FileWriter.length */
  int get length native "FileWriter_length_Getter";


  /** @domName FileWriter.position */
  int get position native "FileWriter_position_Getter";


  /** @domName FileWriter.readyState */
  int get readyState native "FileWriter_readyState_Getter";


  /** @domName FileWriter.abort */
  void abort() native "FileWriter_abort_Callback";


  /** @domName FileWriter.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";


  /** @domName FileWriter.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "FileWriter_dispatchEvent_Callback";


  /** @domName FileWriter.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";


  /** @domName FileWriter.seek */
  void seek(int position) native "FileWriter_seek_Callback";


  /** @domName FileWriter.truncate */
  void truncate(int size) native "FileWriter_truncate_Callback";


  /** @domName FileWriter.write */
  void write(Blob data) native "FileWriter_write_Callback";

}

class FileWriterEvents extends Events {
  FileWriterEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get error => this['error'];

  EventListenerList get progress => this['progress'];

  EventListenerList get write => this['write'];

  EventListenerList get writeEnd => this['writeend'];

  EventListenerList get writeStart => this['writestart'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName FileWriterSync
class FileWriterSync extends NativeFieldWrapperClass1 {
  FileWriterSync.internal();


  /** @domName FileWriterSync.length */
  int get length native "FileWriterSync_length_Getter";


  /** @domName FileWriterSync.position */
  int get position native "FileWriterSync_position_Getter";


  /** @domName FileWriterSync.seek */
  void seek(int position) native "FileWriterSync_seek_Callback";


  /** @domName FileWriterSync.truncate */
  void truncate(int size) native "FileWriterSync_truncate_Callback";


  /** @domName FileWriterSync.write */
  void write(Blob data) native "FileWriterSync_write_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Float32Array
class Float32Array extends ArrayBufferView implements List<num> {

  factory Float32Array(int length) =>
    _TypedArrayFactoryProvider.createFloat32Array(length);

  factory Float32Array.fromList(List<num> list) =>
    _TypedArrayFactoryProvider.createFloat32Array_fromList(list);

  factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createFloat32Array_fromBuffer(buffer, byteOffset, length);
  Float32Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 4;


  /** @domName Float32Array.length */
  int get length native "Float32Array_length_Getter";


  /** @domName Float32Array.numericIndexGetter */
  num operator[](int index) native "Float32Array_numericIndexGetter_Callback";


  /** @domName Float32Array.numericIndexSetter */
  void operator[]=(int index, num value) native "Float32Array_numericIndexSetter_Callback";
  // -- start List<num> mixins.
  // num is the element type.

  // From Iterable<num>:

  Iterator<num> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<num>(this);
  }

  // From Collection<num>:

  void add(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<num> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(num element) => _Collections.contains(this, element);

  void forEach(void f(num element)) => _Collections.forEach(this, f);

  Collection map(f(num element)) => _Collections.map(this, [], f);

  Collection<num> filter(bool f(num element)) =>
     _Collections.filter(this, <num>[], f);

  bool every(bool f(num element)) => _Collections.every(this, f);

  bool some(bool f(num element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<num>:

  void sort([Comparator<num> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(num element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(num element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  num get last => this[length - 1];

  num removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [num initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<num> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <num>[]);

  // -- end List<num> mixins.


  /** @domName Float32Array.setElements */
  void setElements(Object array, [int offset]) native "Float32Array_setElements_Callback";

  Float32Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Float32Array.subarray_1 */
  Float32Array _subarray_1(start, end) native "Float32Array_subarray_1_Callback";


  /** @domName Float32Array.subarray_2 */
  Float32Array _subarray_2(start) native "Float32Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Float64Array
class Float64Array extends ArrayBufferView implements List<num> {

  factory Float64Array(int length) =>
    _TypedArrayFactoryProvider.createFloat64Array(length);

  factory Float64Array.fromList(List<num> list) =>
    _TypedArrayFactoryProvider.createFloat64Array_fromList(list);

  factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createFloat64Array_fromBuffer(buffer, byteOffset, length);
  Float64Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 8;


  /** @domName Float64Array.length */
  int get length native "Float64Array_length_Getter";


  /** @domName Float64Array.numericIndexGetter */
  num operator[](int index) native "Float64Array_numericIndexGetter_Callback";


  /** @domName Float64Array.numericIndexSetter */
  void operator[]=(int index, num value) native "Float64Array_numericIndexSetter_Callback";
  // -- start List<num> mixins.
  // num is the element type.

  // From Iterable<num>:

  Iterator<num> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<num>(this);
  }

  // From Collection<num>:

  void add(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<num> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(num element) => _Collections.contains(this, element);

  void forEach(void f(num element)) => _Collections.forEach(this, f);

  Collection map(f(num element)) => _Collections.map(this, [], f);

  Collection<num> filter(bool f(num element)) =>
     _Collections.filter(this, <num>[], f);

  bool every(bool f(num element)) => _Collections.every(this, f);

  bool some(bool f(num element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<num>:

  void sort([Comparator<num> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(num element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(num element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  num get last => this[length - 1];

  num removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [num initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<num> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <num>[]);

  // -- end List<num> mixins.


  /** @domName Float64Array.setElements */
  void setElements(Object array, [int offset]) native "Float64Array_setElements_Callback";

  Float64Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Float64Array.subarray_1 */
  Float64Array _subarray_1(start, end) native "Float64Array_subarray_1_Callback";


  /** @domName Float64Array.subarray_2 */
  Float64Array _subarray_2(start) native "Float64Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLFontElement
class FontElement extends _Element_Merged {
  FontElement.internal(): super.internal();


  /** @domName HTMLFontElement.color */
  String get color native "HTMLFontElement_color_Getter";


  /** @domName HTMLFontElement.color */
  void set color(String value) native "HTMLFontElement_color_Setter";


  /** @domName HTMLFontElement.face */
  String get face native "HTMLFontElement_face_Getter";


  /** @domName HTMLFontElement.face */
  void set face(String value) native "HTMLFontElement_face_Setter";


  /** @domName HTMLFontElement.size */
  String get size native "HTMLFontElement_size_Getter";


  /** @domName HTMLFontElement.size */
  void set size(String value) native "HTMLFontElement_size_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName FormData
class FormData extends NativeFieldWrapperClass1 {

  factory FormData([FormElement form]) {
    if (!?form) {
      return _FormDataFactoryProvider.createFormData();
    }
    return _FormDataFactoryProvider.createFormData(form);
  }
  FormData.internal();


  /** @domName DOMFormData.append */
  void append(String name, String value, String filename) native "DOMFormData_append_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLFormElement
class FormElement extends _Element_Merged {

  factory FormElement() => _Elements.createFormElement();
  FormElement.internal(): super.internal();


  /** @domName HTMLFormElement.acceptCharset */
  String get acceptCharset native "HTMLFormElement_acceptCharset_Getter";


  /** @domName HTMLFormElement.acceptCharset */
  void set acceptCharset(String value) native "HTMLFormElement_acceptCharset_Setter";


  /** @domName HTMLFormElement.action */
  String get action native "HTMLFormElement_action_Getter";


  /** @domName HTMLFormElement.action */
  void set action(String value) native "HTMLFormElement_action_Setter";


  /** @domName HTMLFormElement.autocomplete */
  String get autocomplete native "HTMLFormElement_autocomplete_Getter";


  /** @domName HTMLFormElement.autocomplete */
  void set autocomplete(String value) native "HTMLFormElement_autocomplete_Setter";


  /** @domName HTMLFormElement.encoding */
  String get encoding native "HTMLFormElement_encoding_Getter";


  /** @domName HTMLFormElement.encoding */
  void set encoding(String value) native "HTMLFormElement_encoding_Setter";


  /** @domName HTMLFormElement.enctype */
  String get enctype native "HTMLFormElement_enctype_Getter";


  /** @domName HTMLFormElement.enctype */
  void set enctype(String value) native "HTMLFormElement_enctype_Setter";


  /** @domName HTMLFormElement.length */
  int get length native "HTMLFormElement_length_Getter";


  /** @domName HTMLFormElement.method */
  String get method native "HTMLFormElement_method_Getter";


  /** @domName HTMLFormElement.method */
  void set method(String value) native "HTMLFormElement_method_Setter";


  /** @domName HTMLFormElement.name */
  String get name native "HTMLFormElement_name_Getter";


  /** @domName HTMLFormElement.name */
  void set name(String value) native "HTMLFormElement_name_Setter";


  /** @domName HTMLFormElement.noValidate */
  bool get noValidate native "HTMLFormElement_noValidate_Getter";


  /** @domName HTMLFormElement.noValidate */
  void set noValidate(bool value) native "HTMLFormElement_noValidate_Setter";


  /** @domName HTMLFormElement.target */
  String get target native "HTMLFormElement_target_Getter";


  /** @domName HTMLFormElement.target */
  void set target(String value) native "HTMLFormElement_target_Setter";


  /** @domName HTMLFormElement.checkValidity */
  bool checkValidity() native "HTMLFormElement_checkValidity_Callback";


  /** @domName HTMLFormElement.reset */
  void reset() native "HTMLFormElement_reset_Callback";


  /** @domName HTMLFormElement.submit */
  void submit() native "HTMLFormElement_submit_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLFrameElement
class FrameElement extends _Element_Merged {
  FrameElement.internal(): super.internal();


  /** @domName HTMLFrameElement.contentWindow */
  Window get contentWindow native "HTMLFrameElement_contentWindow_Getter";


  /** @domName HTMLFrameElement.frameBorder */
  String get frameBorder native "HTMLFrameElement_frameBorder_Getter";


  /** @domName HTMLFrameElement.frameBorder */
  void set frameBorder(String value) native "HTMLFrameElement_frameBorder_Setter";


  /** @domName HTMLFrameElement.height */
  int get height native "HTMLFrameElement_height_Getter";


  /** @domName HTMLFrameElement.location */
  String get location native "HTMLFrameElement_location_Getter";


  /** @domName HTMLFrameElement.location */
  void set location(String value) native "HTMLFrameElement_location_Setter";


  /** @domName HTMLFrameElement.longDesc */
  String get longDesc native "HTMLFrameElement_longDesc_Getter";


  /** @domName HTMLFrameElement.longDesc */
  void set longDesc(String value) native "HTMLFrameElement_longDesc_Setter";


  /** @domName HTMLFrameElement.marginHeight */
  String get marginHeight native "HTMLFrameElement_marginHeight_Getter";


  /** @domName HTMLFrameElement.marginHeight */
  void set marginHeight(String value) native "HTMLFrameElement_marginHeight_Setter";


  /** @domName HTMLFrameElement.marginWidth */
  String get marginWidth native "HTMLFrameElement_marginWidth_Getter";


  /** @domName HTMLFrameElement.marginWidth */
  void set marginWidth(String value) native "HTMLFrameElement_marginWidth_Setter";


  /** @domName HTMLFrameElement.name */
  String get name native "HTMLFrameElement_name_Getter";


  /** @domName HTMLFrameElement.name */
  void set name(String value) native "HTMLFrameElement_name_Setter";


  /** @domName HTMLFrameElement.noResize */
  bool get noResize native "HTMLFrameElement_noResize_Getter";


  /** @domName HTMLFrameElement.noResize */
  void set noResize(bool value) native "HTMLFrameElement_noResize_Setter";


  /** @domName HTMLFrameElement.scrolling */
  String get scrolling native "HTMLFrameElement_scrolling_Getter";


  /** @domName HTMLFrameElement.scrolling */
  void set scrolling(String value) native "HTMLFrameElement_scrolling_Setter";


  /** @domName HTMLFrameElement.src */
  String get src native "HTMLFrameElement_src_Getter";


  /** @domName HTMLFrameElement.src */
  void set src(String value) native "HTMLFrameElement_src_Setter";


  /** @domName HTMLFrameElement.width */
  int get width native "HTMLFrameElement_width_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLFrameSetElement
class FrameSetElement extends _Element_Merged {
  FrameSetElement.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  FrameSetElementEvents get on =>
    new FrameSetElementEvents(this);


  /** @domName HTMLFrameSetElement.cols */
  String get cols native "HTMLFrameSetElement_cols_Getter";


  /** @domName HTMLFrameSetElement.cols */
  void set cols(String value) native "HTMLFrameSetElement_cols_Setter";


  /** @domName HTMLFrameSetElement.rows */
  String get rows native "HTMLFrameSetElement_rows_Getter";


  /** @domName HTMLFrameSetElement.rows */
  void set rows(String value) native "HTMLFrameSetElement_rows_Setter";

}

class FrameSetElementEvents extends ElementEvents {
  FrameSetElementEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get beforeUnload => this['beforeunload'];

  EventListenerList get blur => this['blur'];

  EventListenerList get error => this['error'];

  EventListenerList get focus => this['focus'];

  EventListenerList get hashChange => this['hashchange'];

  EventListenerList get load => this['load'];

  EventListenerList get message => this['message'];

  EventListenerList get offline => this['offline'];

  EventListenerList get online => this['online'];

  EventListenerList get popState => this['popstate'];

  EventListenerList get resize => this['resize'];

  EventListenerList get storage => this['storage'];

  EventListenerList get unload => this['unload'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName GainNode
class GainNode extends AudioNode {
  GainNode.internal(): super.internal();


  /** @domName GainNode.gain */
  AudioGain get gain native "GainNode_gain_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Gamepad
class Gamepad extends NativeFieldWrapperClass1 {
  Gamepad.internal();


  /** @domName Gamepad.axes */
  List<num> get axes native "Gamepad_axes_Getter";


  /** @domName Gamepad.buttons */
  List<num> get buttons native "Gamepad_buttons_Getter";


  /** @domName Gamepad.id */
  String get id native "Gamepad_id_Getter";


  /** @domName Gamepad.index */
  int get index native "Gamepad_index_Getter";


  /** @domName Gamepad.timestamp */
  int get timestamp native "Gamepad_timestamp_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Geolocation
class Geolocation extends NativeFieldWrapperClass1 {
  Geolocation.internal();


  /** @domName Geolocation.clearWatch */
  void clearWatch(int watchId) native "Geolocation_clearWatch_Callback";


  /** @domName Geolocation.getCurrentPosition */
  void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_getCurrentPosition_Callback";


  /** @domName Geolocation.watchPosition */
  int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_watchPosition_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Geoposition
class Geoposition extends NativeFieldWrapperClass1 {
  Geoposition.internal();


  /** @domName Geoposition.coords */
  Coordinates get coords native "Geoposition_coords_Getter";


  /** @domName Geoposition.timestamp */
  int get timestamp native "Geoposition_timestamp_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLHRElement
class HRElement extends _Element_Merged {

  factory HRElement() => _Elements.createHRElement();
  HRElement.internal(): super.internal();


  /** @domName HTMLHRElement.align */
  String get align native "HTMLHRElement_align_Getter";


  /** @domName HTMLHRElement.align */
  void set align(String value) native "HTMLHRElement_align_Setter";


  /** @domName HTMLHRElement.noShade */
  bool get noShade native "HTMLHRElement_noShade_Getter";


  /** @domName HTMLHRElement.noShade */
  void set noShade(bool value) native "HTMLHRElement_noShade_Setter";


  /** @domName HTMLHRElement.size */
  String get size native "HTMLHRElement_size_Getter";


  /** @domName HTMLHRElement.size */
  void set size(String value) native "HTMLHRElement_size_Setter";


  /** @domName HTMLHRElement.width */
  String get width native "HTMLHRElement_width_Getter";


  /** @domName HTMLHRElement.width */
  void set width(String value) native "HTMLHRElement_width_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLAllCollection
class HTMLAllCollection extends NativeFieldWrapperClass1 implements List<Node> {
  HTMLAllCollection.internal();


  /** @domName HTMLAllCollection.length */
  int get length native "HTMLAllCollection_length_Getter";

  Node operator[](int index) native "HTMLAllCollection_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Node> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Node element) => _Collections.contains(this, element);

  void forEach(void f(Node element)) => _Collections.forEach(this, f);

  Collection map(f(Node element)) => _Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     _Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => _Collections.every(this, f);

  bool some(bool f(Node element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:

  void sort([Comparator<Node> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Node get last => this[length - 1];

  Node removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.


  /** @domName HTMLAllCollection.item */
  Node item(int index) native "HTMLAllCollection_item_Callback";


  /** @domName HTMLAllCollection.namedItem */
  Node namedItem(String name) native "HTMLAllCollection_namedItem_Callback";


  /** @domName HTMLAllCollection.tags */
  List<Node> tags(String name) native "HTMLAllCollection_tags_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLCollection
class HTMLCollection extends NativeFieldWrapperClass1 implements List<Node> {
  HTMLCollection.internal();


  /** @domName HTMLCollection.length */
  int get length native "HTMLCollection_length_Getter";

  Node operator[](int index) native "HTMLCollection_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Node> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Node element) => _Collections.contains(this, element);

  void forEach(void f(Node element)) => _Collections.forEach(this, f);

  Collection map(f(Node element)) => _Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     _Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => _Collections.every(this, f);

  bool some(bool f(Node element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:

  void sort([Comparator<Node> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Node get last => this[length - 1];

  Node removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.


  /** @domName HTMLCollection.item */
  Node item(int index) native "HTMLCollection_item_Callback";


  /** @domName HTMLCollection.namedItem */
  Node namedItem(String name) native "HTMLCollection_namedItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLOptionsCollection
class HTMLOptionsCollection extends HTMLCollection {
  HTMLOptionsCollection.internal(): super.internal();


  /** @domName HTMLOptionsCollection.length */
  int get length native "HTMLOptionsCollection_length_Getter";


  /** @domName HTMLOptionsCollection.length */
  void set length(int value) native "HTMLOptionsCollection_length_Setter";


  /** @domName HTMLOptionsCollection.selectedIndex */
  int get selectedIndex native "HTMLOptionsCollection_selectedIndex_Getter";


  /** @domName HTMLOptionsCollection.selectedIndex */
  void set selectedIndex(int value) native "HTMLOptionsCollection_selectedIndex_Setter";


  /** @domName HTMLOptionsCollection.numericIndexSetter */
  void operator[]=(int index, Node value) native "HTMLOptionsCollection_numericIndexSetter_Callback";


  /** @domName HTMLOptionsCollection.remove */
  void remove(int index) native "HTMLOptionsCollection_remove_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HashChangeEvent
class HashChangeEvent extends Event {
  HashChangeEvent.internal(): super.internal();


  /** @domName HashChangeEvent.newURL */
  String get newURL native "HashChangeEvent_newURL_Getter";


  /** @domName HashChangeEvent.oldURL */
  String get oldURL native "HashChangeEvent_oldURL_Getter";


  /** @domName HashChangeEvent.initHashChangeEvent */
  void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native "HashChangeEvent_initHashChangeEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLHeadElement
class HeadElement extends _Element_Merged {

  factory HeadElement() => _Elements.createHeadElement();
  HeadElement.internal(): super.internal();


  /** @domName HTMLHeadElement.profile */
  String get profile native "HTMLHeadElement_profile_Getter";


  /** @domName HTMLHeadElement.profile */
  void set profile(String value) native "HTMLHeadElement_profile_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLHeadingElement
class HeadingElement extends _Element_Merged {

  factory HeadingElement.h1() => _Elements.createHeadingElement_h1();

  factory HeadingElement.h2() => _Elements.createHeadingElement_h2();

  factory HeadingElement.h3() => _Elements.createHeadingElement_h3();

  factory HeadingElement.h4() => _Elements.createHeadingElement_h4();

  factory HeadingElement.h5() => _Elements.createHeadingElement_h5();

  factory HeadingElement.h6() => _Elements.createHeadingElement_h6();
  HeadingElement.internal(): super.internal();


  /** @domName HTMLHeadingElement.align */
  String get align native "HTMLHeadingElement_align_Getter";


  /** @domName HTMLHeadingElement.align */
  void set align(String value) native "HTMLHeadingElement_align_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLHtmlElement
class HtmlElement extends _Element_Merged {

  factory HtmlElement() => _Elements.createHtmlElement();
  HtmlElement.internal(): super.internal();

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

class HttpRequest extends EventTarget {
  factory HttpRequest.get(String url, onSuccess(HttpRequest request)) =>
      _HttpRequestFactoryProvider.createHttpRequest_get(url, onSuccess);

  factory HttpRequest.getWithCredentials(String url, onSuccess(HttpRequest request)) =>
      _HttpRequestFactoryProvider.createHttpRequestgetWithCredentials(url, onSuccess);


  factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
  HttpRequest.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  HttpRequestEvents get on =>
    new HttpRequestEvents(this);

  static const int DONE = 4;

  static const int HEADERS_RECEIVED = 2;

  static const int LOADING = 3;

  static const int OPENED = 1;

  static const int UNSENT = 0;


  /** @domName XMLHttpRequest.readyState */
  int get readyState native "XMLHttpRequest_readyState_Getter";


  /** @domName XMLHttpRequest.response */
  Object get response native "XMLHttpRequest_response_Getter";


  /** @domName XMLHttpRequest.responseText */
  String get responseText native "XMLHttpRequest_responseText_Getter";


  /** @domName XMLHttpRequest.responseType */
  String get responseType native "XMLHttpRequest_responseType_Getter";


  /** @domName XMLHttpRequest.responseType */
  void set responseType(String value) native "XMLHttpRequest_responseType_Setter";


  /** @domName XMLHttpRequest.responseXML */
  Document get responseXML native "XMLHttpRequest_responseXML_Getter";


  /** @domName XMLHttpRequest.status */
  int get status native "XMLHttpRequest_status_Getter";


  /** @domName XMLHttpRequest.statusText */
  String get statusText native "XMLHttpRequest_statusText_Getter";


  /** @domName XMLHttpRequest.upload */
  HttpRequestUpload get upload native "XMLHttpRequest_upload_Getter";


  /** @domName XMLHttpRequest.withCredentials */
  bool get withCredentials native "XMLHttpRequest_withCredentials_Getter";


  /** @domName XMLHttpRequest.withCredentials */
  void set withCredentials(bool value) native "XMLHttpRequest_withCredentials_Setter";


  /** @domName XMLHttpRequest.abort */
  void abort() native "XMLHttpRequest_abort_Callback";


  /** @domName XMLHttpRequest.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";


  /** @domName XMLHttpRequest.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "XMLHttpRequest_dispatchEvent_Callback";


  /** @domName XMLHttpRequest.getAllResponseHeaders */
  String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";


  /** @domName XMLHttpRequest.getResponseHeader */
  String getResponseHeader(String header) native "XMLHttpRequest_getResponseHeader_Callback";


  /** @domName XMLHttpRequest.open */
  void open(String method, String url, [bool async, String user, String password]) native "XMLHttpRequest_open_Callback";


  /** @domName XMLHttpRequest.overrideMimeType */
  void overrideMimeType(String override) native "XMLHttpRequest_overrideMimeType_Callback";


  /** @domName XMLHttpRequest.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";


  /** @domName XMLHttpRequest.send */
  void send([data]) native "XMLHttpRequest_send_Callback";


  /** @domName XMLHttpRequest.setRequestHeader */
  void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";

}

class HttpRequestEvents extends Events {
  HttpRequestEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get error => this['error'];

  EventListenerList get load => this['load'];

  EventListenerList get loadEnd => this['loadend'];

  EventListenerList get loadStart => this['loadstart'];

  EventListenerList get progress => this['progress'];

  EventListenerList get readyStateChange => this['readystatechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName XMLHttpRequestException
class HttpRequestException extends NativeFieldWrapperClass1 {
  HttpRequestException.internal();

  static const int ABORT_ERR = 102;

  static const int NETWORK_ERR = 101;


  /** @domName XMLHttpRequestException.code */
  int get code native "XMLHttpRequestException_code_Getter";


  /** @domName XMLHttpRequestException.message */
  String get message native "XMLHttpRequestException_message_Getter";


  /** @domName XMLHttpRequestException.name */
  String get name native "XMLHttpRequestException_name_Getter";


  /** @domName XMLHttpRequestException.toString */
  String toString() native "XMLHttpRequestException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName XMLHttpRequestProgressEvent
class HttpRequestProgressEvent extends ProgressEvent {
  HttpRequestProgressEvent.internal(): super.internal();


  /** @domName XMLHttpRequestProgressEvent.position */
  int get position native "XMLHttpRequestProgressEvent_position_Getter";


  /** @domName XMLHttpRequestProgressEvent.totalSize */
  int get totalSize native "XMLHttpRequestProgressEvent_totalSize_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName XMLHttpRequestUpload
class HttpRequestUpload extends EventTarget {
  HttpRequestUpload.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  HttpRequestUploadEvents get on =>
    new HttpRequestUploadEvents(this);


  /** @domName XMLHttpRequestUpload.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_addEventListener_Callback";


  /** @domName XMLHttpRequestUpload.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "XMLHttpRequestUpload_dispatchEvent_Callback";


  /** @domName XMLHttpRequestUpload.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_removeEventListener_Callback";

}

class HttpRequestUploadEvents extends Events {
  HttpRequestUploadEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get error => this['error'];

  EventListenerList get load => this['load'];

  EventListenerList get loadEnd => this['loadend'];

  EventListenerList get loadStart => this['loadstart'];

  EventListenerList get progress => this['progress'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName IDBAny
class IDBAny extends NativeFieldWrapperClass1 {
  IDBAny.internal();

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

// WARNING: Do not edit - generated code.

/// @domName IDBCursor
class IDBCursor extends NativeFieldWrapperClass1 {
  IDBCursor.internal();

  static const int NEXT = 0;

  static const int NEXT_NO_DUPLICATE = 1;

  static const int PREV = 2;

  static const int PREV_NO_DUPLICATE = 3;


  /** @domName IDBCursor.direction */
  String get direction native "IDBCursor_direction_Getter";


  /** @domName IDBCursor.key */
  Object get key native "IDBCursor_key_Getter";


  /** @domName IDBCursor.primaryKey */
  Object get primaryKey native "IDBCursor_primaryKey_Getter";


  /** @domName IDBCursor.source */
  dynamic get source native "IDBCursor_source_Getter";


  /** @domName IDBCursor.advance */
  void advance(int count) native "IDBCursor_advance_Callback";

  void continueFunction([/*IDBKey*/ key]) {
    if (?key) {
      _continue_1(key);
      return;
    }
    _continue_2();
  }


  /** @domName IDBCursor.continue_1 */
  void _continue_1(key) native "IDBCursor_continue_1_Callback";


  /** @domName IDBCursor.continue_2 */
  void _continue_2() native "IDBCursor_continue_2_Callback";


  /** @domName IDBCursor.delete */
  IDBRequest delete() native "IDBCursor_delete_Callback";


  /** @domName IDBCursor.update */
  IDBRequest update(Object value) native "IDBCursor_update_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName IDBCursorWithValue
class IDBCursorWithValue extends IDBCursor {
  IDBCursorWithValue.internal(): super.internal();


  /** @domName IDBCursorWithValue.value */
  Object get value native "IDBCursorWithValue_value_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName IDBDatabase
class IDBDatabase extends EventTarget {
  IDBDatabase.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  IDBDatabaseEvents get on =>
    new IDBDatabaseEvents(this);


  /** @domName IDBDatabase.name */
  String get name native "IDBDatabase_name_Getter";


  /** @domName IDBDatabase.objectStoreNames */
  List<String> get objectStoreNames native "IDBDatabase_objectStoreNames_Getter";


  /** @domName IDBDatabase.version */
  dynamic get version native "IDBDatabase_version_Getter";


  /** @domName IDBDatabase.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_addEventListener_Callback";


  /** @domName IDBDatabase.close */
  void close() native "IDBDatabase_close_Callback";


  /** @domName IDBDatabase.createObjectStore */
  IDBObjectStore createObjectStore(String name, [Map options]) native "IDBDatabase_createObjectStore_Callback";


  /** @domName IDBDatabase.deleteObjectStore */
  void deleteObjectStore(String name) native "IDBDatabase_deleteObjectStore_Callback";


  /** @domName IDBDatabase.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "IDBDatabase_dispatchEvent_Callback";


  /** @domName IDBDatabase.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBDatabase_removeEventListener_Callback";


  /** @domName IDBDatabase.setVersion */
  IDBVersionChangeRequest setVersion(String version) native "IDBDatabase_setVersion_Callback";

  IDBTransaction transaction(storeName_OR_storeNames, /*DOMString*/ mode) {
    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
      return _transaction_1(storeName_OR_storeNames, mode);
    }
    if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
      return _transaction_2(storeName_OR_storeNames, mode);
    }
    if ((storeName_OR_storeNames is String || storeName_OR_storeNames == null) && (mode is String || mode == null)) {
      return _transaction_3(storeName_OR_storeNames, mode);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBDatabase.transaction_1 */
  IDBTransaction _transaction_1(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_1_Callback";


  /** @domName IDBDatabase.transaction_2 */
  IDBTransaction _transaction_2(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_2_Callback";


  /** @domName IDBDatabase.transaction_3 */
  IDBTransaction _transaction_3(storeName_OR_storeNames, mode) native "IDBDatabase_transaction_3_Callback";

}

class IDBDatabaseEvents extends Events {
  IDBDatabaseEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get error => this['error'];

  EventListenerList get versionChange => this['versionchange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName IDBDatabaseException
class IDBDatabaseException extends NativeFieldWrapperClass1 {
  IDBDatabaseException.internal();

  static const int ABORT_ERR = 20;

  static const int CONSTRAINT_ERR = 4;

  static const int DATA_ERR = 5;

  static const int NON_TRANSIENT_ERR = 2;

  static const int NOT_ALLOWED_ERR = 6;

  static const int NOT_FOUND_ERR = 8;

  static const int NO_ERR = 0;

  static const int QUOTA_ERR = 22;

  static const int READ_ONLY_ERR = 9;

  static const int TIMEOUT_ERR = 23;

  static const int TRANSACTION_INACTIVE_ERR = 7;

  static const int UNKNOWN_ERR = 1;

  static const int VER_ERR = 12;


  /** @domName IDBDatabaseException.code */
  int get code native "IDBDatabaseException_code_Getter";


  /** @domName IDBDatabaseException.message */
  String get message native "IDBDatabaseException_message_Getter";


  /** @domName IDBDatabaseException.name */
  String get name native "IDBDatabaseException_name_Getter";


  /** @domName IDBDatabaseException.toString */
  String toString() native "IDBDatabaseException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName IDBFactory
class IDBFactory extends NativeFieldWrapperClass1 {
  IDBFactory.internal();


  /** @domName IDBFactory.cmp */
  int cmp(/*IDBKey*/ first, /*IDBKey*/ second) native "IDBFactory_cmp_Callback";


  /** @domName IDBFactory.deleteDatabase */
  IDBVersionChangeRequest deleteDatabase(String name) native "IDBFactory_deleteDatabase_Callback";

  IDBOpenDBRequest open(/*DOMString*/ name, [/*long long*/ version]) {
    if (?version) {
      return _open_1(name, version);
    }
    return _open_2(name);
  }


  /** @domName IDBFactory.open_1 */
  IDBOpenDBRequest _open_1(name, version) native "IDBFactory_open_1_Callback";


  /** @domName IDBFactory.open_2 */
  IDBOpenDBRequest _open_2(name) native "IDBFactory_open_2_Callback";


  /** @domName IDBFactory.webkitGetDatabaseNames */
  IDBRequest webkitGetDatabaseNames() native "IDBFactory_webkitGetDatabaseNames_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName IDBIndex
class IDBIndex extends NativeFieldWrapperClass1 {
  IDBIndex.internal();


  /** @domName IDBIndex.keyPath */
  dynamic get keyPath native "IDBIndex_keyPath_Getter";


  /** @domName IDBIndex.multiEntry */
  bool get multiEntry native "IDBIndex_multiEntry_Getter";


  /** @domName IDBIndex.name */
  String get name native "IDBIndex_name_Getter";


  /** @domName IDBIndex.objectStore */
  IDBObjectStore get objectStore native "IDBIndex_objectStore_Getter";


  /** @domName IDBIndex.unique */
  bool get unique native "IDBIndex_unique_Getter";

  IDBRequest count([key_OR_range]) {
    if (!?key_OR_range) {
      return _count_1();
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
      return _count_2(key_OR_range);
    }
    return _count_3(key_OR_range);
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBIndex.count_1 */
  IDBRequest _count_1() native "IDBIndex_count_1_Callback";


  /** @domName IDBIndex.count_2 */
  IDBRequest _count_2(key_OR_range) native "IDBIndex_count_2_Callback";


  /** @domName IDBIndex.count_3 */
  IDBRequest _count_3(key_OR_range) native "IDBIndex_count_3_Callback";

  IDBRequest get(key) {
    if ((key is IDBKeyRange || key == null)) {
      return _get_1(key);
    }
    return _get_2(key);
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBIndex.get_1 */
  IDBRequest _get_1(key) native "IDBIndex_get_1_Callback";


  /** @domName IDBIndex.get_2 */
  IDBRequest _get_2(key) native "IDBIndex_get_2_Callback";

  IDBRequest getKey(key) {
    if ((key is IDBKeyRange || key == null)) {
      return _getKey_1(key);
    }
    return _getKey_2(key);
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBIndex.getKey_1 */
  IDBRequest _getKey_1(key) native "IDBIndex_getKey_1_Callback";


  /** @domName IDBIndex.getKey_2 */
  IDBRequest _getKey_2(key) native "IDBIndex_getKey_2_Callback";

  IDBRequest openCursor([key_OR_range, /*DOMString*/ direction]) {
    if (!?key_OR_range && !?direction) {
      return _openCursor_1();
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null) && !?direction) {
      return _openCursor_2(key_OR_range);
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null) && (direction is String || direction == null)) {
      return _openCursor_3(key_OR_range, direction);
    }
    if (!?direction) {
      return _openCursor_4(key_OR_range);
    }
    if ((direction is String || direction == null)) {
      return _openCursor_5(key_OR_range, direction);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBIndex.openCursor_1 */
  IDBRequest _openCursor_1() native "IDBIndex_openCursor_1_Callback";


  /** @domName IDBIndex.openCursor_2 */
  IDBRequest _openCursor_2(key_OR_range) native "IDBIndex_openCursor_2_Callback";


  /** @domName IDBIndex.openCursor_3 */
  IDBRequest _openCursor_3(key_OR_range, direction) native "IDBIndex_openCursor_3_Callback";


  /** @domName IDBIndex.openCursor_4 */
  IDBRequest _openCursor_4(key_OR_range) native "IDBIndex_openCursor_4_Callback";


  /** @domName IDBIndex.openCursor_5 */
  IDBRequest _openCursor_5(key_OR_range, direction) native "IDBIndex_openCursor_5_Callback";

  IDBRequest openKeyCursor([key_OR_range, /*DOMString*/ direction]) {
    if (!?key_OR_range && !?direction) {
      return _openKeyCursor_1();
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null) && !?direction) {
      return _openKeyCursor_2(key_OR_range);
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null) && (direction is String || direction == null)) {
      return _openKeyCursor_3(key_OR_range, direction);
    }
    if (!?direction) {
      return _openKeyCursor_4(key_OR_range);
    }
    if ((direction is String || direction == null)) {
      return _openKeyCursor_5(key_OR_range, direction);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBIndex.openKeyCursor_1 */
  IDBRequest _openKeyCursor_1() native "IDBIndex_openKeyCursor_1_Callback";


  /** @domName IDBIndex.openKeyCursor_2 */
  IDBRequest _openKeyCursor_2(key_OR_range) native "IDBIndex_openKeyCursor_2_Callback";


  /** @domName IDBIndex.openKeyCursor_3 */
  IDBRequest _openKeyCursor_3(key_OR_range, direction) native "IDBIndex_openKeyCursor_3_Callback";


  /** @domName IDBIndex.openKeyCursor_4 */
  IDBRequest _openKeyCursor_4(key_OR_range) native "IDBIndex_openKeyCursor_4_Callback";


  /** @domName IDBIndex.openKeyCursor_5 */
  IDBRequest _openKeyCursor_5(key_OR_range, direction) native "IDBIndex_openKeyCursor_5_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName IDBKey
class IDBKey extends NativeFieldWrapperClass1 {
  IDBKey.internal();

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

class IDBKeyRange extends NativeFieldWrapperClass1 {
  /**
   * @domName IDBKeyRange.only
   */
  factory IDBKeyRange.only(/*IDBKey*/ value) =>
      _IDBKeyRangeFactoryProvider.createIDBKeyRange_only(value);

  /**
   * @domName IDBKeyRange.lowerBound
   */
  factory IDBKeyRange.lowerBound(/*IDBKey*/ bound, [bool open = false]) =>
      _IDBKeyRangeFactoryProvider.createIDBKeyRange_lowerBound(bound, open);

  /**
   * @domName IDBKeyRange.upperBound
   */
  factory IDBKeyRange.upperBound(/*IDBKey*/ bound, [bool open = false]) =>
      _IDBKeyRangeFactoryProvider.createIDBKeyRange_upperBound(bound, open);

  /**
   * @domName IDBKeyRange.bound
   */
  factory IDBKeyRange.bound(/*IDBKey*/ lower, /*IDBKey*/ upper,
                            [bool lowerOpen = false, bool upperOpen = false]) =>
      _IDBKeyRangeFactoryProvider.createIDBKeyRange_bound(
          lower, upper, lowerOpen, upperOpen);

  IDBKeyRange.internal();


  /** @domName IDBKeyRange.lower */
  dynamic get lower native "IDBKeyRange_lower_Getter";


  /** @domName IDBKeyRange.lowerOpen */
  bool get lowerOpen native "IDBKeyRange_lowerOpen_Getter";


  /** @domName IDBKeyRange.upper */
  dynamic get upper native "IDBKeyRange_upper_Getter";


  /** @domName IDBKeyRange.upperOpen */
  bool get upperOpen native "IDBKeyRange_upperOpen_Getter";

  static IDBKeyRange bound_(/*IDBKey*/ lower, /*IDBKey*/ upper, [/*boolean*/ lowerOpen, /*boolean*/ upperOpen]) {
    if (?upperOpen) {
      return _bound_1(lower, upper, lowerOpen, upperOpen);
    }
    if (?lowerOpen) {
      return _bound_2(lower, upper, lowerOpen);
    }
    return _bound_3(lower, upper);
  }


  /** @domName IDBKeyRange.bound_1 */
  static IDBKeyRange _bound_1(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_1_Callback";


  /** @domName IDBKeyRange.bound_2 */
  static IDBKeyRange _bound_2(lower, upper, lowerOpen) native "IDBKeyRange_bound_2_Callback";


  /** @domName IDBKeyRange.bound_3 */
  static IDBKeyRange _bound_3(lower, upper) native "IDBKeyRange_bound_3_Callback";

  static IDBKeyRange lowerBound_(/*IDBKey*/ bound, [/*boolean*/ open]) {
    if (?open) {
      return _lowerBound_1(bound, open);
    }
    return _lowerBound_2(bound);
  }


  /** @domName IDBKeyRange.lowerBound_1 */
  static IDBKeyRange _lowerBound_1(bound, open) native "IDBKeyRange_lowerBound_1_Callback";


  /** @domName IDBKeyRange.lowerBound_2 */
  static IDBKeyRange _lowerBound_2(bound) native "IDBKeyRange_lowerBound_2_Callback";


  /** @domName IDBKeyRange.only_ */
  static IDBKeyRange only_(/*IDBKey*/ value) native "IDBKeyRange_only__Callback";

  static IDBKeyRange upperBound_(/*IDBKey*/ bound, [/*boolean*/ open]) {
    if (?open) {
      return _upperBound_1(bound, open);
    }
    return _upperBound_2(bound);
  }


  /** @domName IDBKeyRange.upperBound_1 */
  static IDBKeyRange _upperBound_1(bound, open) native "IDBKeyRange_upperBound_1_Callback";


  /** @domName IDBKeyRange.upperBound_2 */
  static IDBKeyRange _upperBound_2(bound) native "IDBKeyRange_upperBound_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName IDBObjectStore
class IDBObjectStore extends NativeFieldWrapperClass1 {
  IDBObjectStore.internal();


  /** @domName IDBObjectStore.autoIncrement */
  bool get autoIncrement native "IDBObjectStore_autoIncrement_Getter";


  /** @domName IDBObjectStore.indexNames */
  List<String> get indexNames native "IDBObjectStore_indexNames_Getter";


  /** @domName IDBObjectStore.keyPath */
  dynamic get keyPath native "IDBObjectStore_keyPath_Getter";


  /** @domName IDBObjectStore.name */
  String get name native "IDBObjectStore_name_Getter";


  /** @domName IDBObjectStore.transaction */
  IDBTransaction get transaction native "IDBObjectStore_transaction_Getter";

  IDBRequest add(/*any*/ value, [/*IDBKey*/ key]) {
    if (?key) {
      return _add_1(value, key);
    }
    return _add_2(value);
  }


  /** @domName IDBObjectStore.add_1 */
  IDBRequest _add_1(value, key) native "IDBObjectStore_add_1_Callback";


  /** @domName IDBObjectStore.add_2 */
  IDBRequest _add_2(value) native "IDBObjectStore_add_2_Callback";


  /** @domName IDBObjectStore.clear */
  IDBRequest clear() native "IDBObjectStore_clear_Callback";

  IDBRequest count([key_OR_range]) {
    if (!?key_OR_range) {
      return _count_1();
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null)) {
      return _count_2(key_OR_range);
    }
    return _count_3(key_OR_range);
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBObjectStore.count_1 */
  IDBRequest _count_1() native "IDBObjectStore_count_1_Callback";


  /** @domName IDBObjectStore.count_2 */
  IDBRequest _count_2(key_OR_range) native "IDBObjectStore_count_2_Callback";


  /** @domName IDBObjectStore.count_3 */
  IDBRequest _count_3(key_OR_range) native "IDBObjectStore_count_3_Callback";

  IDBIndex createIndex(/*DOMString*/ name, keyPath, [/*Dictionary*/ options]) {
    if ((name is String || name == null) && (keyPath is List<String> || keyPath == null) && (options is Map || options == null)) {
      return _createIndex_1(name, keyPath, options);
    }
    if ((name is String || name == null) && (keyPath is String || keyPath == null) && (options is Map || options == null)) {
      return _createIndex_2(name, keyPath, options);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBObjectStore.createIndex_1 */
  IDBIndex _createIndex_1(name, keyPath, options) native "IDBObjectStore_createIndex_1_Callback";


  /** @domName IDBObjectStore.createIndex_2 */
  IDBIndex _createIndex_2(name, keyPath, options) native "IDBObjectStore_createIndex_2_Callback";

  IDBRequest delete(key_OR_keyRange) {
    if ((key_OR_keyRange is IDBKeyRange || key_OR_keyRange == null)) {
      return _delete_1(key_OR_keyRange);
    }
    return _delete_2(key_OR_keyRange);
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBObjectStore.delete_1 */
  IDBRequest _delete_1(key_OR_keyRange) native "IDBObjectStore_delete_1_Callback";


  /** @domName IDBObjectStore.delete_2 */
  IDBRequest _delete_2(key_OR_keyRange) native "IDBObjectStore_delete_2_Callback";


  /** @domName IDBObjectStore.deleteIndex */
  void deleteIndex(String name) native "IDBObjectStore_deleteIndex_Callback";

  IDBRequest getObject(key) {
    if ((key is IDBKeyRange || key == null)) {
      return _get_1(key);
    }
    return _get_2(key);
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBObjectStore.get_1 */
  IDBRequest _get_1(key) native "IDBObjectStore_get_1_Callback";


  /** @domName IDBObjectStore.get_2 */
  IDBRequest _get_2(key) native "IDBObjectStore_get_2_Callback";


  /** @domName IDBObjectStore.index */
  IDBIndex index(String name) native "IDBObjectStore_index_Callback";

  IDBRequest openCursor([key_OR_range, /*DOMString*/ direction]) {
    if (!?key_OR_range && !?direction) {
      return _openCursor_1();
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null) && !?direction) {
      return _openCursor_2(key_OR_range);
    }
    if ((key_OR_range is IDBKeyRange || key_OR_range == null) && (direction is String || direction == null)) {
      return _openCursor_3(key_OR_range, direction);
    }
    if (!?direction) {
      return _openCursor_4(key_OR_range);
    }
    if ((direction is String || direction == null)) {
      return _openCursor_5(key_OR_range, direction);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName IDBObjectStore.openCursor_1 */
  IDBRequest _openCursor_1() native "IDBObjectStore_openCursor_1_Callback";


  /** @domName IDBObjectStore.openCursor_2 */
  IDBRequest _openCursor_2(key_OR_range) native "IDBObjectStore_openCursor_2_Callback";


  /** @domName IDBObjectStore.openCursor_3 */
  IDBRequest _openCursor_3(key_OR_range, direction) native "IDBObjectStore_openCursor_3_Callback";


  /** @domName IDBObjectStore.openCursor_4 */
  IDBRequest _openCursor_4(key_OR_range) native "IDBObjectStore_openCursor_4_Callback";


  /** @domName IDBObjectStore.openCursor_5 */
  IDBRequest _openCursor_5(key_OR_range, direction) native "IDBObjectStore_openCursor_5_Callback";

  IDBRequest put(/*any*/ value, [/*IDBKey*/ key]) {
    if (?key) {
      return _put_1(value, key);
    }
    return _put_2(value);
  }


  /** @domName IDBObjectStore.put_1 */
  IDBRequest _put_1(value, key) native "IDBObjectStore_put_1_Callback";


  /** @domName IDBObjectStore.put_2 */
  IDBRequest _put_2(value) native "IDBObjectStore_put_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName IDBOpenDBRequest
class IDBOpenDBRequest extends IDBRequest implements EventTarget {
  IDBOpenDBRequest.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  IDBOpenDBRequestEvents get on =>
    new IDBOpenDBRequestEvents(this);

}

class IDBOpenDBRequestEvents extends IDBRequestEvents {
  IDBOpenDBRequestEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get blocked => this['blocked'];

  EventListenerList get upgradeNeeded => this['upgradeneeded'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName IDBRequest
class IDBRequest extends EventTarget {
  IDBRequest.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  IDBRequestEvents get on =>
    new IDBRequestEvents(this);


  /** @domName IDBRequest.error */
  DOMError get error native "IDBRequest_error_Getter";


  /** @domName IDBRequest.errorCode */
  int get errorCode native "IDBRequest_errorCode_Getter";


  /** @domName IDBRequest.readyState */
  String get readyState native "IDBRequest_readyState_Getter";


  /** @domName IDBRequest.result */
  dynamic get result native "IDBRequest_result_Getter";


  /** @domName IDBRequest.source */
  dynamic get source native "IDBRequest_source_Getter";


  /** @domName IDBRequest.transaction */
  IDBTransaction get transaction native "IDBRequest_transaction_Getter";


  /** @domName IDBRequest.webkitErrorMessage */
  String get webkitErrorMessage native "IDBRequest_webkitErrorMessage_Getter";


  /** @domName IDBRequest.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_addEventListener_Callback";


  /** @domName IDBRequest.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "IDBRequest_dispatchEvent_Callback";


  /** @domName IDBRequest.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBRequest_removeEventListener_Callback";

}

class IDBRequestEvents extends Events {
  IDBRequestEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get error => this['error'];

  EventListenerList get success => this['success'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName IDBTransaction
class IDBTransaction extends EventTarget {
  IDBTransaction.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  IDBTransactionEvents get on =>
    new IDBTransactionEvents(this);

  static const int READ_ONLY = 0;

  static const int READ_WRITE = 1;

  static const int VERSION_CHANGE = 2;


  /** @domName IDBTransaction.db */
  IDBDatabase get db native "IDBTransaction_db_Getter";


  /** @domName IDBTransaction.error */
  DOMError get error native "IDBTransaction_error_Getter";


  /** @domName IDBTransaction.mode */
  String get mode native "IDBTransaction_mode_Getter";


  /** @domName IDBTransaction.abort */
  void abort() native "IDBTransaction_abort_Callback";


  /** @domName IDBTransaction.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_addEventListener_Callback";


  /** @domName IDBTransaction.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "IDBTransaction_dispatchEvent_Callback";


  /** @domName IDBTransaction.objectStore */
  IDBObjectStore objectStore(String name) native "IDBTransaction_objectStore_Callback";


  /** @domName IDBTransaction.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "IDBTransaction_removeEventListener_Callback";

}

class IDBTransactionEvents extends Events {
  IDBTransactionEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get complete => this['complete'];

  EventListenerList get error => this['error'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName IDBVersionChangeEvent
class IDBUpgradeNeededEvent extends Event {
  IDBUpgradeNeededEvent.internal(): super.internal();


  /** @domName IDBUpgradeNeededEvent.newVersion */
  int get newVersion native "IDBUpgradeNeededEvent_newVersion_Getter";


  /** @domName IDBUpgradeNeededEvent.oldVersion */
  int get oldVersion native "IDBUpgradeNeededEvent_oldVersion_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName IDBVersionChangeEvent
class IDBVersionChangeEvent extends Event {
  IDBVersionChangeEvent.internal(): super.internal();


  /** @domName IDBVersionChangeEvent.version */
  String get version native "IDBVersionChangeEvent_version_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName IDBVersionChangeRequest
class IDBVersionChangeRequest extends IDBRequest implements EventTarget {
  IDBVersionChangeRequest.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  IDBVersionChangeRequestEvents get on =>
    new IDBVersionChangeRequestEvents(this);

}

class IDBVersionChangeRequestEvents extends IDBRequestEvents {
  IDBVersionChangeRequestEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get blocked => this['blocked'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName HTMLIFrameElement
class IFrameElement extends _Element_Merged {

  factory IFrameElement() => _Elements.createIFrameElement();
  IFrameElement.internal(): super.internal();


  /** @domName HTMLIFrameElement.align */
  String get align native "HTMLIFrameElement_align_Getter";


  /** @domName HTMLIFrameElement.align */
  void set align(String value) native "HTMLIFrameElement_align_Setter";


  /** @domName HTMLIFrameElement.contentWindow */
  Window get contentWindow native "HTMLIFrameElement_contentWindow_Getter";


  /** @domName HTMLIFrameElement.frameBorder */
  String get frameBorder native "HTMLIFrameElement_frameBorder_Getter";


  /** @domName HTMLIFrameElement.frameBorder */
  void set frameBorder(String value) native "HTMLIFrameElement_frameBorder_Setter";


  /** @domName HTMLIFrameElement.height */
  String get height native "HTMLIFrameElement_height_Getter";


  /** @domName HTMLIFrameElement.height */
  void set height(String value) native "HTMLIFrameElement_height_Setter";


  /** @domName HTMLIFrameElement.longDesc */
  String get longDesc native "HTMLIFrameElement_longDesc_Getter";


  /** @domName HTMLIFrameElement.longDesc */
  void set longDesc(String value) native "HTMLIFrameElement_longDesc_Setter";


  /** @domName HTMLIFrameElement.marginHeight */
  String get marginHeight native "HTMLIFrameElement_marginHeight_Getter";


  /** @domName HTMLIFrameElement.marginHeight */
  void set marginHeight(String value) native "HTMLIFrameElement_marginHeight_Setter";


  /** @domName HTMLIFrameElement.marginWidth */
  String get marginWidth native "HTMLIFrameElement_marginWidth_Getter";


  /** @domName HTMLIFrameElement.marginWidth */
  void set marginWidth(String value) native "HTMLIFrameElement_marginWidth_Setter";


  /** @domName HTMLIFrameElement.name */
  String get name native "HTMLIFrameElement_name_Getter";


  /** @domName HTMLIFrameElement.name */
  void set name(String value) native "HTMLIFrameElement_name_Setter";


  /** @domName HTMLIFrameElement.sandbox */
  String get sandbox native "HTMLIFrameElement_sandbox_Getter";


  /** @domName HTMLIFrameElement.sandbox */
  void set sandbox(String value) native "HTMLIFrameElement_sandbox_Setter";


  /** @domName HTMLIFrameElement.scrolling */
  String get scrolling native "HTMLIFrameElement_scrolling_Getter";


  /** @domName HTMLIFrameElement.scrolling */
  void set scrolling(String value) native "HTMLIFrameElement_scrolling_Setter";


  /** @domName HTMLIFrameElement.src */
  String get src native "HTMLIFrameElement_src_Getter";


  /** @domName HTMLIFrameElement.src */
  void set src(String value) native "HTMLIFrameElement_src_Setter";


  /** @domName HTMLIFrameElement.srcdoc */
  String get srcdoc native "HTMLIFrameElement_srcdoc_Getter";


  /** @domName HTMLIFrameElement.srcdoc */
  void set srcdoc(String value) native "HTMLIFrameElement_srcdoc_Setter";


  /** @domName HTMLIFrameElement.width */
  String get width native "HTMLIFrameElement_width_Getter";


  /** @domName HTMLIFrameElement.width */
  void set width(String value) native "HTMLIFrameElement_width_Setter";

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

// WARNING: Do not edit - generated code.


typedef void IceCallback(IceCandidate candidate, bool moreToFollow, PeerConnection00 source);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName IceCandidate
class IceCandidate extends NativeFieldWrapperClass1 {

  factory IceCandidate(String label, String candidateLine) => _IceCandidateFactoryProvider.createIceCandidate(label, candidateLine);
  IceCandidate.internal();


  /** @domName IceCandidate.label */
  String get label native "IceCandidate_label_Getter";


  /** @domName IceCandidate.toSdp */
  String toSdp() native "IceCandidate_toSdp_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName ImageData
class ImageData extends NativeFieldWrapperClass1 {
  ImageData.internal();


  /** @domName ImageData.data */
  Uint8ClampedArray get data native "ImageData_data_Getter";


  /** @domName ImageData.height */
  int get height native "ImageData_height_Getter";


  /** @domName ImageData.width */
  int get width native "ImageData_width_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLImageElement
class ImageElement extends _Element_Merged {

  factory ImageElement({String src, int width, int height}) {
    if (!?src) {
      return _Elements.createImageElement();
    }
    if (!?width) {
      return _Elements.createImageElement(src);
    }
    if (!?height) {
      return _Elements.createImageElement(src, width);
    }
    return _Elements.createImageElement(src, width, height);
  }
  ImageElement.internal(): super.internal();


  /** @domName HTMLImageElement.align */
  String get align native "HTMLImageElement_align_Getter";


  /** @domName HTMLImageElement.align */
  void set align(String value) native "HTMLImageElement_align_Setter";


  /** @domName HTMLImageElement.alt */
  String get alt native "HTMLImageElement_alt_Getter";


  /** @domName HTMLImageElement.alt */
  void set alt(String value) native "HTMLImageElement_alt_Setter";


  /** @domName HTMLImageElement.border */
  String get border native "HTMLImageElement_border_Getter";


  /** @domName HTMLImageElement.border */
  void set border(String value) native "HTMLImageElement_border_Setter";


  /** @domName HTMLImageElement.complete */
  bool get complete native "HTMLImageElement_complete_Getter";


  /** @domName HTMLImageElement.crossOrigin */
  String get crossOrigin native "HTMLImageElement_crossOrigin_Getter";


  /** @domName HTMLImageElement.crossOrigin */
  void set crossOrigin(String value) native "HTMLImageElement_crossOrigin_Setter";


  /** @domName HTMLImageElement.height */
  int get height native "HTMLImageElement_height_Getter";


  /** @domName HTMLImageElement.height */
  void set height(int value) native "HTMLImageElement_height_Setter";


  /** @domName HTMLImageElement.hspace */
  int get hspace native "HTMLImageElement_hspace_Getter";


  /** @domName HTMLImageElement.hspace */
  void set hspace(int value) native "HTMLImageElement_hspace_Setter";


  /** @domName HTMLImageElement.isMap */
  bool get isMap native "HTMLImageElement_isMap_Getter";


  /** @domName HTMLImageElement.isMap */
  void set isMap(bool value) native "HTMLImageElement_isMap_Setter";


  /** @domName HTMLImageElement.longDesc */
  String get longDesc native "HTMLImageElement_longDesc_Getter";


  /** @domName HTMLImageElement.longDesc */
  void set longDesc(String value) native "HTMLImageElement_longDesc_Setter";


  /** @domName HTMLImageElement.lowsrc */
  String get lowsrc native "HTMLImageElement_lowsrc_Getter";


  /** @domName HTMLImageElement.lowsrc */
  void set lowsrc(String value) native "HTMLImageElement_lowsrc_Setter";


  /** @domName HTMLImageElement.name */
  String get name native "HTMLImageElement_name_Getter";


  /** @domName HTMLImageElement.name */
  void set name(String value) native "HTMLImageElement_name_Setter";


  /** @domName HTMLImageElement.naturalHeight */
  int get naturalHeight native "HTMLImageElement_naturalHeight_Getter";


  /** @domName HTMLImageElement.naturalWidth */
  int get naturalWidth native "HTMLImageElement_naturalWidth_Getter";


  /** @domName HTMLImageElement.src */
  String get src native "HTMLImageElement_src_Getter";


  /** @domName HTMLImageElement.src */
  void set src(String value) native "HTMLImageElement_src_Setter";


  /** @domName HTMLImageElement.useMap */
  String get useMap native "HTMLImageElement_useMap_Getter";


  /** @domName HTMLImageElement.useMap */
  void set useMap(String value) native "HTMLImageElement_useMap_Setter";


  /** @domName HTMLImageElement.vspace */
  int get vspace native "HTMLImageElement_vspace_Getter";


  /** @domName HTMLImageElement.vspace */
  void set vspace(int value) native "HTMLImageElement_vspace_Setter";


  /** @domName HTMLImageElement.width */
  int get width native "HTMLImageElement_width_Getter";


  /** @domName HTMLImageElement.width */
  void set width(int value) native "HTMLImageElement_width_Setter";


  /** @domName HTMLImageElement.x */
  int get x native "HTMLImageElement_x_Getter";


  /** @domName HTMLImageElement.y */
  int get y native "HTMLImageElement_y_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLInputElement
class InputElement extends _Element_Merged {

  factory InputElement({String type}) {
    if (!?type) {
      return _Elements.createInputElement();
    }
    return _Elements.createInputElement(type);
  }
  InputElement.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  InputElementEvents get on =>
    new InputElementEvents(this);


  /** @domName HTMLInputElement.accept */
  String get accept native "HTMLInputElement_accept_Getter";


  /** @domName HTMLInputElement.accept */
  void set accept(String value) native "HTMLInputElement_accept_Setter";


  /** @domName HTMLInputElement.align */
  String get align native "HTMLInputElement_align_Getter";


  /** @domName HTMLInputElement.align */
  void set align(String value) native "HTMLInputElement_align_Setter";


  /** @domName HTMLInputElement.alt */
  String get alt native "HTMLInputElement_alt_Getter";


  /** @domName HTMLInputElement.alt */
  void set alt(String value) native "HTMLInputElement_alt_Setter";


  /** @domName HTMLInputElement.autocomplete */
  String get autocomplete native "HTMLInputElement_autocomplete_Getter";


  /** @domName HTMLInputElement.autocomplete */
  void set autocomplete(String value) native "HTMLInputElement_autocomplete_Setter";


  /** @domName HTMLInputElement.autofocus */
  bool get autofocus native "HTMLInputElement_autofocus_Getter";


  /** @domName HTMLInputElement.autofocus */
  void set autofocus(bool value) native "HTMLInputElement_autofocus_Setter";


  /** @domName HTMLInputElement.checked */
  bool get checked native "HTMLInputElement_checked_Getter";


  /** @domName HTMLInputElement.checked */
  void set checked(bool value) native "HTMLInputElement_checked_Setter";


  /** @domName HTMLInputElement.defaultChecked */
  bool get defaultChecked native "HTMLInputElement_defaultChecked_Getter";


  /** @domName HTMLInputElement.defaultChecked */
  void set defaultChecked(bool value) native "HTMLInputElement_defaultChecked_Setter";


  /** @domName HTMLInputElement.defaultValue */
  String get defaultValue native "HTMLInputElement_defaultValue_Getter";


  /** @domName HTMLInputElement.defaultValue */
  void set defaultValue(String value) native "HTMLInputElement_defaultValue_Setter";


  /** @domName HTMLInputElement.dirName */
  String get dirName native "HTMLInputElement_dirName_Getter";


  /** @domName HTMLInputElement.dirName */
  void set dirName(String value) native "HTMLInputElement_dirName_Setter";


  /** @domName HTMLInputElement.disabled */
  bool get disabled native "HTMLInputElement_disabled_Getter";


  /** @domName HTMLInputElement.disabled */
  void set disabled(bool value) native "HTMLInputElement_disabled_Setter";


  /** @domName HTMLInputElement.files */
  List<File> get files native "HTMLInputElement_files_Getter";


  /** @domName HTMLInputElement.files */
  void set files(List<File> value) native "HTMLInputElement_files_Setter";


  /** @domName HTMLInputElement.form */
  FormElement get form native "HTMLInputElement_form_Getter";


  /** @domName HTMLInputElement.formAction */
  String get formAction native "HTMLInputElement_formAction_Getter";


  /** @domName HTMLInputElement.formAction */
  void set formAction(String value) native "HTMLInputElement_formAction_Setter";


  /** @domName HTMLInputElement.formEnctype */
  String get formEnctype native "HTMLInputElement_formEnctype_Getter";


  /** @domName HTMLInputElement.formEnctype */
  void set formEnctype(String value) native "HTMLInputElement_formEnctype_Setter";


  /** @domName HTMLInputElement.formMethod */
  String get formMethod native "HTMLInputElement_formMethod_Getter";


  /** @domName HTMLInputElement.formMethod */
  void set formMethod(String value) native "HTMLInputElement_formMethod_Setter";


  /** @domName HTMLInputElement.formNoValidate */
  bool get formNoValidate native "HTMLInputElement_formNoValidate_Getter";


  /** @domName HTMLInputElement.formNoValidate */
  void set formNoValidate(bool value) native "HTMLInputElement_formNoValidate_Setter";


  /** @domName HTMLInputElement.formTarget */
  String get formTarget native "HTMLInputElement_formTarget_Getter";


  /** @domName HTMLInputElement.formTarget */
  void set formTarget(String value) native "HTMLInputElement_formTarget_Setter";


  /** @domName HTMLInputElement.height */
  int get height native "HTMLInputElement_height_Getter";


  /** @domName HTMLInputElement.height */
  void set height(int value) native "HTMLInputElement_height_Setter";


  /** @domName HTMLInputElement.incremental */
  bool get incremental native "HTMLInputElement_incremental_Getter";


  /** @domName HTMLInputElement.incremental */
  void set incremental(bool value) native "HTMLInputElement_incremental_Setter";


  /** @domName HTMLInputElement.indeterminate */
  bool get indeterminate native "HTMLInputElement_indeterminate_Getter";


  /** @domName HTMLInputElement.indeterminate */
  void set indeterminate(bool value) native "HTMLInputElement_indeterminate_Setter";


  /** @domName HTMLInputElement.labels */
  List<Node> get labels native "HTMLInputElement_labels_Getter";


  /** @domName HTMLInputElement.list */
  Element get list native "HTMLInputElement_list_Getter";


  /** @domName HTMLInputElement.max */
  String get max native "HTMLInputElement_max_Getter";


  /** @domName HTMLInputElement.max */
  void set max(String value) native "HTMLInputElement_max_Setter";


  /** @domName HTMLInputElement.maxLength */
  int get maxLength native "HTMLInputElement_maxLength_Getter";


  /** @domName HTMLInputElement.maxLength */
  void set maxLength(int value) native "HTMLInputElement_maxLength_Setter";


  /** @domName HTMLInputElement.min */
  String get min native "HTMLInputElement_min_Getter";


  /** @domName HTMLInputElement.min */
  void set min(String value) native "HTMLInputElement_min_Setter";


  /** @domName HTMLInputElement.multiple */
  bool get multiple native "HTMLInputElement_multiple_Getter";


  /** @domName HTMLInputElement.multiple */
  void set multiple(bool value) native "HTMLInputElement_multiple_Setter";


  /** @domName HTMLInputElement.name */
  String get name native "HTMLInputElement_name_Getter";


  /** @domName HTMLInputElement.name */
  void set name(String value) native "HTMLInputElement_name_Setter";


  /** @domName HTMLInputElement.pattern */
  String get pattern native "HTMLInputElement_pattern_Getter";


  /** @domName HTMLInputElement.pattern */
  void set pattern(String value) native "HTMLInputElement_pattern_Setter";


  /** @domName HTMLInputElement.placeholder */
  String get placeholder native "HTMLInputElement_placeholder_Getter";


  /** @domName HTMLInputElement.placeholder */
  void set placeholder(String value) native "HTMLInputElement_placeholder_Setter";


  /** @domName HTMLInputElement.readOnly */
  bool get readOnly native "HTMLInputElement_readOnly_Getter";


  /** @domName HTMLInputElement.readOnly */
  void set readOnly(bool value) native "HTMLInputElement_readOnly_Setter";


  /** @domName HTMLInputElement.required */
  bool get required native "HTMLInputElement_required_Getter";


  /** @domName HTMLInputElement.required */
  void set required(bool value) native "HTMLInputElement_required_Setter";


  /** @domName HTMLInputElement.selectionDirection */
  String get selectionDirection native "HTMLInputElement_selectionDirection_Getter";


  /** @domName HTMLInputElement.selectionDirection */
  void set selectionDirection(String value) native "HTMLInputElement_selectionDirection_Setter";


  /** @domName HTMLInputElement.selectionEnd */
  int get selectionEnd native "HTMLInputElement_selectionEnd_Getter";


  /** @domName HTMLInputElement.selectionEnd */
  void set selectionEnd(int value) native "HTMLInputElement_selectionEnd_Setter";


  /** @domName HTMLInputElement.selectionStart */
  int get selectionStart native "HTMLInputElement_selectionStart_Getter";


  /** @domName HTMLInputElement.selectionStart */
  void set selectionStart(int value) native "HTMLInputElement_selectionStart_Setter";


  /** @domName HTMLInputElement.size */
  int get size native "HTMLInputElement_size_Getter";


  /** @domName HTMLInputElement.size */
  void set size(int value) native "HTMLInputElement_size_Setter";


  /** @domName HTMLInputElement.src */
  String get src native "HTMLInputElement_src_Getter";


  /** @domName HTMLInputElement.src */
  void set src(String value) native "HTMLInputElement_src_Setter";


  /** @domName HTMLInputElement.step */
  String get step native "HTMLInputElement_step_Getter";


  /** @domName HTMLInputElement.step */
  void set step(String value) native "HTMLInputElement_step_Setter";


  /** @domName HTMLInputElement.type */
  String get type native "HTMLInputElement_type_Getter";


  /** @domName HTMLInputElement.type */
  void set type(String value) native "HTMLInputElement_type_Setter";


  /** @domName HTMLInputElement.useMap */
  String get useMap native "HTMLInputElement_useMap_Getter";


  /** @domName HTMLInputElement.useMap */
  void set useMap(String value) native "HTMLInputElement_useMap_Setter";


  /** @domName HTMLInputElement.validationMessage */
  String get validationMessage native "HTMLInputElement_validationMessage_Getter";


  /** @domName HTMLInputElement.validity */
  ValidityState get validity native "HTMLInputElement_validity_Getter";


  /** @domName HTMLInputElement.value */
  String get value native "HTMLInputElement_value_Getter";


  /** @domName HTMLInputElement.value */
  void set value(String value) native "HTMLInputElement_value_Setter";


  /** @domName HTMLInputElement.valueAsDate */
  Date get valueAsDate native "HTMLInputElement_valueAsDate_Getter";


  /** @domName HTMLInputElement.valueAsDate */
  void set valueAsDate(Date value) native "HTMLInputElement_valueAsDate_Setter";


  /** @domName HTMLInputElement.valueAsNumber */
  num get valueAsNumber native "HTMLInputElement_valueAsNumber_Getter";


  /** @domName HTMLInputElement.valueAsNumber */
  void set valueAsNumber(num value) native "HTMLInputElement_valueAsNumber_Setter";


  /** @domName HTMLInputElement.webkitEntries */
  List<Entry> get webkitEntries native "HTMLInputElement_webkitEntries_Getter";


  /** @domName HTMLInputElement.webkitGrammar */
  bool get webkitGrammar native "HTMLInputElement_webkitGrammar_Getter";


  /** @domName HTMLInputElement.webkitGrammar */
  void set webkitGrammar(bool value) native "HTMLInputElement_webkitGrammar_Setter";


  /** @domName HTMLInputElement.webkitSpeech */
  bool get webkitSpeech native "HTMLInputElement_webkitSpeech_Getter";


  /** @domName HTMLInputElement.webkitSpeech */
  void set webkitSpeech(bool value) native "HTMLInputElement_webkitSpeech_Setter";


  /** @domName HTMLInputElement.webkitdirectory */
  bool get webkitdirectory native "HTMLInputElement_webkitdirectory_Getter";


  /** @domName HTMLInputElement.webkitdirectory */
  void set webkitdirectory(bool value) native "HTMLInputElement_webkitdirectory_Setter";


  /** @domName HTMLInputElement.width */
  int get width native "HTMLInputElement_width_Getter";


  /** @domName HTMLInputElement.width */
  void set width(int value) native "HTMLInputElement_width_Setter";


  /** @domName HTMLInputElement.willValidate */
  bool get willValidate native "HTMLInputElement_willValidate_Getter";


  /** @domName HTMLInputElement.checkValidity */
  bool checkValidity() native "HTMLInputElement_checkValidity_Callback";


  /** @domName HTMLInputElement.select */
  void select() native "HTMLInputElement_select_Callback";


  /** @domName HTMLInputElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";

  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
      _setRangeText_1(replacement);
      return;
    }
    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
      _setRangeText_2(replacement, start, end, selectionMode);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName HTMLInputElement.setRangeText_1 */
  void _setRangeText_1(replacement) native "HTMLInputElement_setRangeText_1_Callback";


  /** @domName HTMLInputElement.setRangeText_2 */
  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_2_Callback";


  /** @domName HTMLInputElement.setSelectionRange */
  void setSelectionRange(int start, int end, [String direction]) native "HTMLInputElement_setSelectionRange_Callback";

  void stepDown([/*long*/ n]) {
    if (?n) {
      _stepDown_1(n);
      return;
    }
    _stepDown_2();
  }


  /** @domName HTMLInputElement.stepDown_1 */
  void _stepDown_1(n) native "HTMLInputElement_stepDown_1_Callback";


  /** @domName HTMLInputElement.stepDown_2 */
  void _stepDown_2() native "HTMLInputElement_stepDown_2_Callback";

  void stepUp([/*long*/ n]) {
    if (?n) {
      _stepUp_1(n);
      return;
    }
    _stepUp_2();
  }


  /** @domName HTMLInputElement.stepUp_1 */
  void _stepUp_1(n) native "HTMLInputElement_stepUp_1_Callback";


  /** @domName HTMLInputElement.stepUp_2 */
  void _stepUp_2() native "HTMLInputElement_stepUp_2_Callback";

}

class InputElementEvents extends ElementEvents {
  InputElementEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get speechChange => this['webkitSpeechChange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName Int16Array
class Int16Array extends ArrayBufferView implements List<int> {

  factory Int16Array(int length) =>
    _TypedArrayFactoryProvider.createInt16Array(length);

  factory Int16Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt16Array_fromList(list);

  factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt16Array_fromBuffer(buffer, byteOffset, length);
  Int16Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 2;


  /** @domName Int16Array.length */
  int get length native "Int16Array_length_Getter";


  /** @domName Int16Array.numericIndexGetter */
  int operator[](int index) native "Int16Array_numericIndexGetter_Callback";


  /** @domName Int16Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Int16Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(int element) => _Collections.contains(this, element);

  void forEach(void f(int element)) => _Collections.forEach(this, f);

  Collection map(f(int element)) => _Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     _Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => _Collections.every(this, f);

  bool some(bool f(int element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:

  void sort([Comparator<int> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  int get last => this[length - 1];

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Int16Array.setElements */
  void setElements(Object array, [int offset]) native "Int16Array_setElements_Callback";

  Int16Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Int16Array.subarray_1 */
  Int16Array _subarray_1(start, end) native "Int16Array_subarray_1_Callback";


  /** @domName Int16Array.subarray_2 */
  Int16Array _subarray_2(start) native "Int16Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Int32Array
class Int32Array extends ArrayBufferView implements List<int> {

  factory Int32Array(int length) =>
    _TypedArrayFactoryProvider.createInt32Array(length);

  factory Int32Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt32Array_fromList(list);

  factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt32Array_fromBuffer(buffer, byteOffset, length);
  Int32Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 4;


  /** @domName Int32Array.length */
  int get length native "Int32Array_length_Getter";


  /** @domName Int32Array.numericIndexGetter */
  int operator[](int index) native "Int32Array_numericIndexGetter_Callback";


  /** @domName Int32Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Int32Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(int element) => _Collections.contains(this, element);

  void forEach(void f(int element)) => _Collections.forEach(this, f);

  Collection map(f(int element)) => _Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     _Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => _Collections.every(this, f);

  bool some(bool f(int element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:

  void sort([Comparator<int> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  int get last => this[length - 1];

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Int32Array.setElements */
  void setElements(Object array, [int offset]) native "Int32Array_setElements_Callback";

  Int32Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Int32Array.subarray_1 */
  Int32Array _subarray_1(start, end) native "Int32Array_subarray_1_Callback";


  /** @domName Int32Array.subarray_2 */
  Int32Array _subarray_2(start) native "Int32Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Int8Array
class Int8Array extends ArrayBufferView implements List<int> {

  factory Int8Array(int length) =>
    _TypedArrayFactoryProvider.createInt8Array(length);

  factory Int8Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt8Array_fromList(list);

  factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt8Array_fromBuffer(buffer, byteOffset, length);
  Int8Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 1;


  /** @domName Int8Array.length */
  int get length native "Int8Array_length_Getter";


  /** @domName Int8Array.numericIndexGetter */
  int operator[](int index) native "Int8Array_numericIndexGetter_Callback";


  /** @domName Int8Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Int8Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(int element) => _Collections.contains(this, element);

  void forEach(void f(int element)) => _Collections.forEach(this, f);

  Collection map(f(int element)) => _Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     _Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => _Collections.every(this, f);

  bool some(bool f(int element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:

  void sort([Comparator<int> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  int get last => this[length - 1];

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Int8Array.setElements */
  void setElements(Object array, [int offset]) native "Int8Array_setElements_Callback";

  Int8Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Int8Array.subarray_1 */
  Int8Array _subarray_1(start, end) native "Int8Array_subarray_1_Callback";


  /** @domName Int8Array.subarray_2 */
  Int8Array _subarray_2(start) native "Int8Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName JavaScriptCallFrame
class JavaScriptCallFrame extends NativeFieldWrapperClass1 {
  JavaScriptCallFrame.internal();

  static const int CATCH_SCOPE = 4;

  static const int CLOSURE_SCOPE = 3;

  static const int GLOBAL_SCOPE = 0;

  static const int LOCAL_SCOPE = 1;

  static const int WITH_SCOPE = 2;


  /** @domName JavaScriptCallFrame.caller */
  JavaScriptCallFrame get caller native "JavaScriptCallFrame_caller_Getter";


  /** @domName JavaScriptCallFrame.column */
  int get column native "JavaScriptCallFrame_column_Getter";


  /** @domName JavaScriptCallFrame.functionName */
  String get functionName native "JavaScriptCallFrame_functionName_Getter";


  /** @domName JavaScriptCallFrame.line */
  int get line native "JavaScriptCallFrame_line_Getter";


  /** @domName JavaScriptCallFrame.scopeChain */
  List get scopeChain native "JavaScriptCallFrame_scopeChain_Getter";


  /** @domName JavaScriptCallFrame.sourceID */
  int get sourceID native "JavaScriptCallFrame_sourceID_Getter";


  /** @domName JavaScriptCallFrame.thisObject */
  Object get thisObject native "JavaScriptCallFrame_thisObject_Getter";


  /** @domName JavaScriptCallFrame.type */
  String get type native "JavaScriptCallFrame_type_Getter";


  /** @domName JavaScriptCallFrame.evaluate */
  void evaluate(String script) native "JavaScriptCallFrame_evaluate_Callback";


  /** @domName JavaScriptCallFrame.restart */
  Object restart() native "JavaScriptCallFrame_restart_Callback";


  /** @domName JavaScriptCallFrame.scopeType */
  int scopeType(int scopeIndex) native "JavaScriptCallFrame_scopeType_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName KeyboardEvent
class KeyboardEvent extends UIEvent {
  KeyboardEvent.internal(): super.internal();


  /** @domName KeyboardEvent.altGraphKey */
  bool get altGraphKey native "KeyboardEvent_altGraphKey_Getter";


  /** @domName KeyboardEvent.altKey */
  bool get altKey native "KeyboardEvent_altKey_Getter";


  /** @domName KeyboardEvent.ctrlKey */
  bool get ctrlKey native "KeyboardEvent_ctrlKey_Getter";


  /** @domName KeyboardEvent.keyIdentifier */
  String get keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";


  /** @domName KeyboardEvent.keyLocation */
  int get keyLocation native "KeyboardEvent_keyLocation_Getter";


  /** @domName KeyboardEvent.metaKey */
  bool get metaKey native "KeyboardEvent_metaKey_Getter";


  /** @domName KeyboardEvent.shiftKey */
  bool get shiftKey native "KeyboardEvent_shiftKey_Getter";


  /** @domName KeyboardEvent.initKeyboardEvent */
  void initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLKeygenElement
class KeygenElement extends _Element_Merged {

  factory KeygenElement() => _Elements.createKeygenElement();
  KeygenElement.internal(): super.internal();


  /** @domName HTMLKeygenElement.autofocus */
  bool get autofocus native "HTMLKeygenElement_autofocus_Getter";


  /** @domName HTMLKeygenElement.autofocus */
  void set autofocus(bool value) native "HTMLKeygenElement_autofocus_Setter";


  /** @domName HTMLKeygenElement.challenge */
  String get challenge native "HTMLKeygenElement_challenge_Getter";


  /** @domName HTMLKeygenElement.challenge */
  void set challenge(String value) native "HTMLKeygenElement_challenge_Setter";


  /** @domName HTMLKeygenElement.disabled */
  bool get disabled native "HTMLKeygenElement_disabled_Getter";


  /** @domName HTMLKeygenElement.disabled */
  void set disabled(bool value) native "HTMLKeygenElement_disabled_Setter";


  /** @domName HTMLKeygenElement.form */
  FormElement get form native "HTMLKeygenElement_form_Getter";


  /** @domName HTMLKeygenElement.keytype */
  String get keytype native "HTMLKeygenElement_keytype_Getter";


  /** @domName HTMLKeygenElement.keytype */
  void set keytype(String value) native "HTMLKeygenElement_keytype_Setter";


  /** @domName HTMLKeygenElement.labels */
  List<Node> get labels native "HTMLKeygenElement_labels_Getter";


  /** @domName HTMLKeygenElement.name */
  String get name native "HTMLKeygenElement_name_Getter";


  /** @domName HTMLKeygenElement.name */
  void set name(String value) native "HTMLKeygenElement_name_Setter";


  /** @domName HTMLKeygenElement.type */
  String get type native "HTMLKeygenElement_type_Getter";


  /** @domName HTMLKeygenElement.validationMessage */
  String get validationMessage native "HTMLKeygenElement_validationMessage_Getter";


  /** @domName HTMLKeygenElement.validity */
  ValidityState get validity native "HTMLKeygenElement_validity_Getter";


  /** @domName HTMLKeygenElement.willValidate */
  bool get willValidate native "HTMLKeygenElement_willValidate_Getter";


  /** @domName HTMLKeygenElement.checkValidity */
  bool checkValidity() native "HTMLKeygenElement_checkValidity_Callback";


  /** @domName HTMLKeygenElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLKeygenElement_setCustomValidity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLLIElement
class LIElement extends _Element_Merged {

  factory LIElement() => _Elements.createLIElement();
  LIElement.internal(): super.internal();


  /** @domName HTMLLIElement.type */
  String get type native "HTMLLIElement_type_Getter";


  /** @domName HTMLLIElement.type */
  void set type(String value) native "HTMLLIElement_type_Setter";


  /** @domName HTMLLIElement.value */
  int get value native "HTMLLIElement_value_Getter";


  /** @domName HTMLLIElement.value */
  void set value(int value) native "HTMLLIElement_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLLabelElement
class LabelElement extends _Element_Merged {

  factory LabelElement() => _Elements.createLabelElement();
  LabelElement.internal(): super.internal();


  /** @domName HTMLLabelElement.control */
  Element get control native "HTMLLabelElement_control_Getter";


  /** @domName HTMLLabelElement.form */
  FormElement get form native "HTMLLabelElement_form_Getter";


  /** @domName HTMLLabelElement.htmlFor */
  String get htmlFor native "HTMLLabelElement_htmlFor_Getter";


  /** @domName HTMLLabelElement.htmlFor */
  void set htmlFor(String value) native "HTMLLabelElement_htmlFor_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLLegendElement
class LegendElement extends _Element_Merged {

  factory LegendElement() => _Elements.createLegendElement();
  LegendElement.internal(): super.internal();


  /** @domName HTMLLegendElement.align */
  String get align native "HTMLLegendElement_align_Getter";


  /** @domName HTMLLegendElement.align */
  void set align(String value) native "HTMLLegendElement_align_Setter";


  /** @domName HTMLLegendElement.form */
  FormElement get form native "HTMLLegendElement_form_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLLinkElement
class LinkElement extends _Element_Merged {

  factory LinkElement() => _Elements.createLinkElement();
  LinkElement.internal(): super.internal();


  /** @domName HTMLLinkElement.charset */
  String get charset native "HTMLLinkElement_charset_Getter";


  /** @domName HTMLLinkElement.charset */
  void set charset(String value) native "HTMLLinkElement_charset_Setter";


  /** @domName HTMLLinkElement.disabled */
  bool get disabled native "HTMLLinkElement_disabled_Getter";


  /** @domName HTMLLinkElement.disabled */
  void set disabled(bool value) native "HTMLLinkElement_disabled_Setter";


  /** @domName HTMLLinkElement.href */
  String get href native "HTMLLinkElement_href_Getter";


  /** @domName HTMLLinkElement.href */
  void set href(String value) native "HTMLLinkElement_href_Setter";


  /** @domName HTMLLinkElement.hreflang */
  String get hreflang native "HTMLLinkElement_hreflang_Getter";


  /** @domName HTMLLinkElement.hreflang */
  void set hreflang(String value) native "HTMLLinkElement_hreflang_Setter";


  /** @domName HTMLLinkElement.media */
  String get media native "HTMLLinkElement_media_Getter";


  /** @domName HTMLLinkElement.media */
  void set media(String value) native "HTMLLinkElement_media_Setter";


  /** @domName HTMLLinkElement.rel */
  String get rel native "HTMLLinkElement_rel_Getter";


  /** @domName HTMLLinkElement.rel */
  void set rel(String value) native "HTMLLinkElement_rel_Setter";


  /** @domName HTMLLinkElement.rev */
  String get rev native "HTMLLinkElement_rev_Getter";


  /** @domName HTMLLinkElement.rev */
  void set rev(String value) native "HTMLLinkElement_rev_Setter";


  /** @domName HTMLLinkElement.sheet */
  StyleSheet get sheet native "HTMLLinkElement_sheet_Getter";


  /** @domName HTMLLinkElement.sizes */
  DOMSettableTokenList get sizes native "HTMLLinkElement_sizes_Getter";


  /** @domName HTMLLinkElement.sizes */
  void set sizes(DOMSettableTokenList value) native "HTMLLinkElement_sizes_Setter";


  /** @domName HTMLLinkElement.target */
  String get target native "HTMLLinkElement_target_Getter";


  /** @domName HTMLLinkElement.target */
  void set target(String value) native "HTMLLinkElement_target_Setter";


  /** @domName HTMLLinkElement.type */
  String get type native "HTMLLinkElement_type_Getter";


  /** @domName HTMLLinkElement.type */
  void set type(String value) native "HTMLLinkElement_type_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName History
class LocalHistory extends NativeFieldWrapperClass1 implements History {
  LocalHistory.internal();


  /** @domName History.length */
  int get length native "History_length_Getter";


  /** @domName History.state */
  dynamic get state native "History_state_Getter";


  /** @domName History.back */
  void back() native "History_back_Callback";


  /** @domName History.forward */
  void forward() native "History_forward_Callback";


  /** @domName History.go */
  void go(int distance) native "History_go_Callback";


  /** @domName History.pushState */
  void pushState(Object data, String title, [String url]) native "History_pushState_Callback";


  /** @domName History.replaceState */
  void replaceState(Object data, String title, [String url]) native "History_replaceState_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Location
class LocalLocation extends NativeFieldWrapperClass1 implements Location {
  LocalLocation.internal();


  /** @domName Location.ancestorOrigins */
  List<String> get ancestorOrigins native "Location_ancestorOrigins_Getter";


  /** @domName Location.hash */
  String get hash native "Location_hash_Getter";


  /** @domName Location.hash */
  void set hash(String value) native "Location_hash_Setter";


  /** @domName Location.host */
  String get host native "Location_host_Getter";


  /** @domName Location.host */
  void set host(String value) native "Location_host_Setter";


  /** @domName Location.hostname */
  String get hostname native "Location_hostname_Getter";


  /** @domName Location.hostname */
  void set hostname(String value) native "Location_hostname_Setter";


  /** @domName Location.href */
  String get href native "Location_href_Getter";


  /** @domName Location.href */
  void set href(String value) native "Location_href_Setter";


  /** @domName Location.origin */
  String get origin native "Location_origin_Getter";


  /** @domName Location.pathname */
  String get pathname native "Location_pathname_Getter";


  /** @domName Location.pathname */
  void set pathname(String value) native "Location_pathname_Setter";


  /** @domName Location.port */
  String get port native "Location_port_Getter";


  /** @domName Location.port */
  void set port(String value) native "Location_port_Setter";


  /** @domName Location.protocol */
  String get protocol native "Location_protocol_Getter";


  /** @domName Location.protocol */
  void set protocol(String value) native "Location_protocol_Setter";


  /** @domName Location.search */
  String get search native "Location_search_Getter";


  /** @domName Location.search */
  void set search(String value) native "Location_search_Setter";


  /** @domName Location.assign */
  void assign(String url) native "Location_assign_Callback";


  /** @domName Location.reload */
  void reload() native "Location_reload_Callback";


  /** @domName Location.replace */
  void replace(String url) native "Location_replace_Callback";


  /** @domName Location.toString */
  String toString() native "Location_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName LocalMediaStream
class LocalMediaStream extends MediaStream implements EventTarget {
  LocalMediaStream.internal(): super.internal();


  /** @domName LocalMediaStream.stop */
  void stop() native "LocalMediaStream_stop_Callback";

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

class LocalWindow extends EventTarget implements Window {

  /**
   * Executes a [callback] after the next batch of browser layout measurements
   * has completed or would have completed if any browser layout measurements
   * had been scheduled.
   */
  void requestLayoutFrame(TimeoutHandler callback) {
    _addMeasurementFrameCallback(callback);
  }

  /**
   * Lookup a port by its [name].  Return null if no port is
   * registered under [name].
   */
  lookupPort(String name) {
    var port = JSON.parse(localStorage['dart-port:$name']);
    return _deserialize(port);
  }

  /**
   * Register a [port] on this window under the given [name].  This
   * port may be retrieved by any isolate (or JavaScript script)
   * running in this window.
   */
  registerPort(String name, var port) {
    var serialized = _serialize(port);
    localStorage['dart-port:$name'] = JSON.stringify(serialized);
  }

  LocalWindow.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  LocalWindowEvents get on =>
    new LocalWindowEvents(this);

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;


  /** @domName DOMWindow.applicationCache */
  DOMApplicationCache get applicationCache native "DOMWindow_applicationCache_Getter";


  /** @domName DOMWindow.clientInformation */
  Navigator get clientInformation native "DOMWindow_clientInformation_Getter";


  /** @domName DOMWindow.closed */
  bool get closed native "DOMWindow_closed_Getter";


  /** @domName DOMWindow.console */
  Console get console native "DOMWindow_console_Getter";


  /** @domName DOMWindow.crypto */
  Crypto get crypto native "DOMWindow_crypto_Getter";


  /** @domName DOMWindow.defaultStatus */
  String get defaultStatus native "DOMWindow_defaultStatus_Getter";


  /** @domName DOMWindow.defaultStatus */
  void set defaultStatus(String value) native "DOMWindow_defaultStatus_Setter";


  /** @domName DOMWindow.defaultstatus */
  String get defaultstatus native "DOMWindow_defaultstatus_Getter";


  /** @domName DOMWindow.defaultstatus */
  void set defaultstatus(String value) native "DOMWindow_defaultstatus_Setter";


  /** @domName DOMWindow.devicePixelRatio */
  num get devicePixelRatio native "DOMWindow_devicePixelRatio_Getter";


  /** @domName DOMWindow.document */
  Document get document native "DOMWindow_document_Getter";


  /** @domName DOMWindow.event */
  Event get event native "DOMWindow_event_Getter";


  /** @domName DOMWindow.history */
  LocalHistory get history native "DOMWindow_history_Getter";


  /** @domName DOMWindow.indexedDB */
  IDBFactory get indexedDB native "DOMWindow_indexedDB_Getter";


  /** @domName DOMWindow.innerHeight */
  int get innerHeight native "DOMWindow_innerHeight_Getter";


  /** @domName DOMWindow.innerWidth */
  int get innerWidth native "DOMWindow_innerWidth_Getter";


  /** @domName DOMWindow.localStorage */
  Storage get localStorage native "DOMWindow_localStorage_Getter";


  /** @domName DOMWindow.location */
  LocalLocation get location native "DOMWindow_location_Getter";


  /** @domName DOMWindow.location */
  void set location(LocalLocation value) native "DOMWindow_location_Setter";


  /** @domName DOMWindow.locationbar */
  BarInfo get locationbar native "DOMWindow_locationbar_Getter";


  /** @domName DOMWindow.menubar */
  BarInfo get menubar native "DOMWindow_menubar_Getter";


  /** @domName DOMWindow.name */
  String get name native "DOMWindow_name_Getter";


  /** @domName DOMWindow.name */
  void set name(String value) native "DOMWindow_name_Setter";


  /** @domName DOMWindow.navigator */
  Navigator get navigator native "DOMWindow_navigator_Getter";


  /** @domName DOMWindow.offscreenBuffering */
  bool get offscreenBuffering native "DOMWindow_offscreenBuffering_Getter";


  /** @domName DOMWindow.opener */
  Window get opener native "DOMWindow_opener_Getter";


  /** @domName DOMWindow.outerHeight */
  int get outerHeight native "DOMWindow_outerHeight_Getter";


  /** @domName DOMWindow.outerWidth */
  int get outerWidth native "DOMWindow_outerWidth_Getter";


  /** @domName DOMWindow.pagePopupController */
  PagePopupController get pagePopupController native "DOMWindow_pagePopupController_Getter";


  /** @domName DOMWindow.pageXOffset */
  int get pageXOffset native "DOMWindow_pageXOffset_Getter";


  /** @domName DOMWindow.pageYOffset */
  int get pageYOffset native "DOMWindow_pageYOffset_Getter";


  /** @domName DOMWindow.parent */
  Window get parent native "DOMWindow_parent_Getter";


  /** @domName DOMWindow.performance */
  Performance get performance native "DOMWindow_performance_Getter";


  /** @domName DOMWindow.personalbar */
  BarInfo get personalbar native "DOMWindow_personalbar_Getter";


  /** @domName DOMWindow.screen */
  Screen get screen native "DOMWindow_screen_Getter";


  /** @domName DOMWindow.screenLeft */
  int get screenLeft native "DOMWindow_screenLeft_Getter";


  /** @domName DOMWindow.screenTop */
  int get screenTop native "DOMWindow_screenTop_Getter";


  /** @domName DOMWindow.screenX */
  int get screenX native "DOMWindow_screenX_Getter";


  /** @domName DOMWindow.screenY */
  int get screenY native "DOMWindow_screenY_Getter";


  /** @domName DOMWindow.scrollX */
  int get scrollX native "DOMWindow_scrollX_Getter";


  /** @domName DOMWindow.scrollY */
  int get scrollY native "DOMWindow_scrollY_Getter";


  /** @domName DOMWindow.scrollbars */
  BarInfo get scrollbars native "DOMWindow_scrollbars_Getter";


  /** @domName DOMWindow.self */
  Window get self native "DOMWindow_self_Getter";


  /** @domName DOMWindow.sessionStorage */
  Storage get sessionStorage native "DOMWindow_sessionStorage_Getter";


  /** @domName DOMWindow.status */
  String get status native "DOMWindow_status_Getter";


  /** @domName DOMWindow.status */
  void set status(String value) native "DOMWindow_status_Setter";


  /** @domName DOMWindow.statusbar */
  BarInfo get statusbar native "DOMWindow_statusbar_Getter";


  /** @domName DOMWindow.styleMedia */
  StyleMedia get styleMedia native "DOMWindow_styleMedia_Getter";


  /** @domName DOMWindow.toolbar */
  BarInfo get toolbar native "DOMWindow_toolbar_Getter";


  /** @domName DOMWindow.top */
  Window get top native "DOMWindow_top_Getter";


  /** @domName DOMWindow.webkitIndexedDB */
  IDBFactory get webkitIndexedDB native "DOMWindow_webkitIndexedDB_Getter";


  /** @domName DOMWindow.webkitNotifications */
  NotificationCenter get webkitNotifications native "DOMWindow_webkitNotifications_Getter";


  /** @domName DOMWindow.webkitStorageInfo */
  StorageInfo get webkitStorageInfo native "DOMWindow_webkitStorageInfo_Getter";


  /** @domName DOMWindow.window */
  Window get window native "DOMWindow_window_Getter";


  /** @domName DOMWindow.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_addEventListener_Callback";


  /** @domName DOMWindow.alert */
  void alert(String message) native "DOMWindow_alert_Callback";


  /** @domName DOMWindow.atob */
  String atob(String string) native "DOMWindow_atob_Callback";


  /** @domName DOMWindow.blur */
  void blur() native "DOMWindow_blur_Callback";


  /** @domName DOMWindow.btoa */
  String btoa(String string) native "DOMWindow_btoa_Callback";


  /** @domName DOMWindow.cancelAnimationFrame */
  void cancelAnimationFrame(int id) native "DOMWindow_cancelAnimationFrame_Callback";


  /** @domName DOMWindow.captureEvents */
  void captureEvents() native "DOMWindow_captureEvents_Callback";


  /** @domName DOMWindow.clearInterval */
  void clearInterval(int handle) native "DOMWindow_clearInterval_Callback";


  /** @domName DOMWindow.clearTimeout */
  void clearTimeout(int handle) native "DOMWindow_clearTimeout_Callback";


  /** @domName DOMWindow.close */
  void close() native "DOMWindow_close_Callback";


  /** @domName DOMWindow.confirm */
  bool confirm(String message) native "DOMWindow_confirm_Callback";


  /** @domName DOMWindow.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "DOMWindow_dispatchEvent_Callback";


  /** @domName DOMWindow.find */
  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "DOMWindow_find_Callback";


  /** @domName DOMWindow.focus */
  void focus() native "DOMWindow_focus_Callback";


  /** @domName DOMWindow.getComputedStyle */
  CSSStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "DOMWindow_getComputedStyle_Callback";


  /** @domName DOMWindow.getMatchedCSSRules */
  List<CSSRule> getMatchedCSSRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";


  /** @domName DOMWindow.getSelection */
  DOMSelection getSelection() native "DOMWindow_getSelection_Callback";


  /** @domName DOMWindow.matchMedia */
  MediaQueryList matchMedia(String query) native "DOMWindow_matchMedia_Callback";


  /** @domName DOMWindow.moveBy */
  void moveBy(num x, num y) native "DOMWindow_moveBy_Callback";


  /** @domName DOMWindow.moveTo */
  void moveTo(num x, num y) native "DOMWindow_moveTo_Callback";


  /** @domName DOMWindow.open */
  Window open(String url, String name, [String options]) native "DOMWindow_open_Callback";


  /** @domName DOMWindow.openDatabase */
  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "DOMWindow_openDatabase_Callback";


  /** @domName DOMWindow.postMessage */
  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";


  /** @domName DOMWindow.print */
  void print() native "DOMWindow_print_Callback";


  /** @domName DOMWindow.prompt */
  String prompt(String message, String defaultValue) native "DOMWindow_prompt_Callback";


  /** @domName DOMWindow.releaseEvents */
  void releaseEvents() native "DOMWindow_releaseEvents_Callback";


  /** @domName DOMWindow.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_removeEventListener_Callback";


  /** @domName DOMWindow.requestAnimationFrame */
  int requestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_requestAnimationFrame_Callback";


  /** @domName DOMWindow.resizeBy */
  void resizeBy(num x, num y) native "DOMWindow_resizeBy_Callback";


  /** @domName DOMWindow.resizeTo */
  void resizeTo(num width, num height) native "DOMWindow_resizeTo_Callback";


  /** @domName DOMWindow.scroll */
  void scroll(int x, int y) native "DOMWindow_scroll_Callback";


  /** @domName DOMWindow.scrollBy */
  void scrollBy(int x, int y) native "DOMWindow_scrollBy_Callback";


  /** @domName DOMWindow.scrollTo */
  void scrollTo(int x, int y) native "DOMWindow_scrollTo_Callback";


  /** @domName DOMWindow.setInterval */
  int setInterval(TimeoutHandler handler, int timeout) native "DOMWindow_setInterval_Callback";


  /** @domName DOMWindow.setTimeout */
  int setTimeout(TimeoutHandler handler, int timeout) native "DOMWindow_setTimeout_Callback";


  /** @domName DOMWindow.showModalDialog */
  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native "DOMWindow_showModalDialog_Callback";


  /** @domName DOMWindow.stop */
  void stop() native "DOMWindow_stop_Callback";


  /** @domName DOMWindow.webkitCancelAnimationFrame */
  void webkitCancelAnimationFrame(int id) native "DOMWindow_webkitCancelAnimationFrame_Callback";


  /** @domName DOMWindow.webkitConvertPointFromNodeToPage */
  Point webkitConvertPointFromNodeToPage(Node node, Point p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";


  /** @domName DOMWindow.webkitConvertPointFromPageToNode */
  Point webkitConvertPointFromPageToNode(Node node, Point p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";


  /** @domName DOMWindow.webkitRequestAnimationFrame */
  int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_webkitRequestAnimationFrame_Callback";


  /** @domName DOMWindow.webkitRequestFileSystem */
  void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitRequestFileSystem_Callback";


  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";

}

class LocalWindowEvents extends Events {
  LocalWindowEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get beforeUnload => this['beforeunload'];

  EventListenerList get blur => this['blur'];

  EventListenerList get canPlay => this['canplay'];

  EventListenerList get canPlayThrough => this['canplaythrough'];

  EventListenerList get change => this['change'];

  EventListenerList get click => this['click'];

  EventListenerList get contextMenu => this['contextmenu'];

  EventListenerList get doubleClick => this['dblclick'];

  EventListenerList get deviceMotion => this['devicemotion'];

  EventListenerList get deviceOrientation => this['deviceorientation'];

  EventListenerList get drag => this['drag'];

  EventListenerList get dragEnd => this['dragend'];

  EventListenerList get dragEnter => this['dragenter'];

  EventListenerList get dragLeave => this['dragleave'];

  EventListenerList get dragOver => this['dragover'];

  EventListenerList get dragStart => this['dragstart'];

  EventListenerList get drop => this['drop'];

  EventListenerList get durationChange => this['durationchange'];

  EventListenerList get emptied => this['emptied'];

  EventListenerList get ended => this['ended'];

  EventListenerList get error => this['error'];

  EventListenerList get focus => this['focus'];

  EventListenerList get hashChange => this['hashchange'];

  EventListenerList get input => this['input'];

  EventListenerList get invalid => this['invalid'];

  EventListenerList get keyDown => this['keydown'];

  EventListenerList get keyPress => this['keypress'];

  EventListenerList get keyUp => this['keyup'];

  EventListenerList get load => this['load'];

  EventListenerList get loadedData => this['loadeddata'];

  EventListenerList get loadedMetadata => this['loadedmetadata'];

  EventListenerList get loadStart => this['loadstart'];

  EventListenerList get message => this['message'];

  EventListenerList get mouseDown => this['mousedown'];

  EventListenerList get mouseMove => this['mousemove'];

  EventListenerList get mouseOut => this['mouseout'];

  EventListenerList get mouseOver => this['mouseover'];

  EventListenerList get mouseUp => this['mouseup'];

  EventListenerList get mouseWheel => this['mousewheel'];

  EventListenerList get offline => this['offline'];

  EventListenerList get online => this['online'];

  EventListenerList get pageHide => this['pagehide'];

  EventListenerList get pageShow => this['pageshow'];

  EventListenerList get pause => this['pause'];

  EventListenerList get play => this['play'];

  EventListenerList get playing => this['playing'];

  EventListenerList get popState => this['popstate'];

  EventListenerList get progress => this['progress'];

  EventListenerList get rateChange => this['ratechange'];

  EventListenerList get reset => this['reset'];

  EventListenerList get resize => this['resize'];

  EventListenerList get scroll => this['scroll'];

  EventListenerList get search => this['search'];

  EventListenerList get seeked => this['seeked'];

  EventListenerList get seeking => this['seeking'];

  EventListenerList get select => this['select'];

  EventListenerList get stalled => this['stalled'];

  EventListenerList get storage => this['storage'];

  EventListenerList get submit => this['submit'];

  EventListenerList get suspend => this['suspend'];

  EventListenerList get timeUpdate => this['timeupdate'];

  EventListenerList get touchCancel => this['touchcancel'];

  EventListenerList get touchEnd => this['touchend'];

  EventListenerList get touchMove => this['touchmove'];

  EventListenerList get touchStart => this['touchstart'];

  EventListenerList get unload => this['unload'];

  EventListenerList get volumeChange => this['volumechange'];

  EventListenerList get waiting => this['waiting'];

  EventListenerList get animationEnd => this['webkitAnimationEnd'];

  EventListenerList get animationIteration => this['webkitAnimationIteration'];

  EventListenerList get animationStart => this['webkitAnimationStart'];

  EventListenerList get transitionEnd => this['webkitTransitionEnd'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName HTMLMapElement
class MapElement extends _Element_Merged {

  factory MapElement() => _Elements.createMapElement();
  MapElement.internal(): super.internal();


  /** @domName HTMLMapElement.areas */
  HTMLCollection get areas native "HTMLMapElement_areas_Getter";


  /** @domName HTMLMapElement.name */
  String get name native "HTMLMapElement_name_Getter";


  /** @domName HTMLMapElement.name */
  void set name(String value) native "HTMLMapElement_name_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLMarqueeElement
class MarqueeElement extends _Element_Merged {
  MarqueeElement.internal(): super.internal();


  /** @domName HTMLMarqueeElement.behavior */
  String get behavior native "HTMLMarqueeElement_behavior_Getter";


  /** @domName HTMLMarqueeElement.behavior */
  void set behavior(String value) native "HTMLMarqueeElement_behavior_Setter";


  /** @domName HTMLMarqueeElement.bgColor */
  String get bgColor native "HTMLMarqueeElement_bgColor_Getter";


  /** @domName HTMLMarqueeElement.bgColor */
  void set bgColor(String value) native "HTMLMarqueeElement_bgColor_Setter";


  /** @domName HTMLMarqueeElement.direction */
  String get direction native "HTMLMarqueeElement_direction_Getter";


  /** @domName HTMLMarqueeElement.direction */
  void set direction(String value) native "HTMLMarqueeElement_direction_Setter";


  /** @domName HTMLMarqueeElement.height */
  String get height native "HTMLMarqueeElement_height_Getter";


  /** @domName HTMLMarqueeElement.height */
  void set height(String value) native "HTMLMarqueeElement_height_Setter";


  /** @domName HTMLMarqueeElement.hspace */
  int get hspace native "HTMLMarqueeElement_hspace_Getter";


  /** @domName HTMLMarqueeElement.hspace */
  void set hspace(int value) native "HTMLMarqueeElement_hspace_Setter";


  /** @domName HTMLMarqueeElement.loop */
  int get loop native "HTMLMarqueeElement_loop_Getter";


  /** @domName HTMLMarqueeElement.loop */
  void set loop(int value) native "HTMLMarqueeElement_loop_Setter";


  /** @domName HTMLMarqueeElement.scrollAmount */
  int get scrollAmount native "HTMLMarqueeElement_scrollAmount_Getter";


  /** @domName HTMLMarqueeElement.scrollAmount */
  void set scrollAmount(int value) native "HTMLMarqueeElement_scrollAmount_Setter";


  /** @domName HTMLMarqueeElement.scrollDelay */
  int get scrollDelay native "HTMLMarqueeElement_scrollDelay_Getter";


  /** @domName HTMLMarqueeElement.scrollDelay */
  void set scrollDelay(int value) native "HTMLMarqueeElement_scrollDelay_Setter";


  /** @domName HTMLMarqueeElement.trueSpeed */
  bool get trueSpeed native "HTMLMarqueeElement_trueSpeed_Getter";


  /** @domName HTMLMarqueeElement.trueSpeed */
  void set trueSpeed(bool value) native "HTMLMarqueeElement_trueSpeed_Setter";


  /** @domName HTMLMarqueeElement.vspace */
  int get vspace native "HTMLMarqueeElement_vspace_Getter";


  /** @domName HTMLMarqueeElement.vspace */
  void set vspace(int value) native "HTMLMarqueeElement_vspace_Setter";


  /** @domName HTMLMarqueeElement.width */
  String get width native "HTMLMarqueeElement_width_Getter";


  /** @domName HTMLMarqueeElement.width */
  void set width(String value) native "HTMLMarqueeElement_width_Setter";


  /** @domName HTMLMarqueeElement.start */
  void start() native "HTMLMarqueeElement_start_Callback";


  /** @domName HTMLMarqueeElement.stop */
  void stop() native "HTMLMarqueeElement_stop_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName MediaController
class MediaController extends EventTarget {

  factory MediaController() => _MediaControllerFactoryProvider.createMediaController();
  MediaController.internal(): super.internal();


  /** @domName MediaController.buffered */
  TimeRanges get buffered native "MediaController_buffered_Getter";


  /** @domName MediaController.currentTime */
  num get currentTime native "MediaController_currentTime_Getter";


  /** @domName MediaController.currentTime */
  void set currentTime(num value) native "MediaController_currentTime_Setter";


  /** @domName MediaController.defaultPlaybackRate */
  num get defaultPlaybackRate native "MediaController_defaultPlaybackRate_Getter";


  /** @domName MediaController.defaultPlaybackRate */
  void set defaultPlaybackRate(num value) native "MediaController_defaultPlaybackRate_Setter";


  /** @domName MediaController.duration */
  num get duration native "MediaController_duration_Getter";


  /** @domName MediaController.muted */
  bool get muted native "MediaController_muted_Getter";


  /** @domName MediaController.muted */
  void set muted(bool value) native "MediaController_muted_Setter";


  /** @domName MediaController.paused */
  bool get paused native "MediaController_paused_Getter";


  /** @domName MediaController.playbackRate */
  num get playbackRate native "MediaController_playbackRate_Getter";


  /** @domName MediaController.playbackRate */
  void set playbackRate(num value) native "MediaController_playbackRate_Setter";


  /** @domName MediaController.played */
  TimeRanges get played native "MediaController_played_Getter";


  /** @domName MediaController.seekable */
  TimeRanges get seekable native "MediaController_seekable_Getter";


  /** @domName MediaController.volume */
  num get volume native "MediaController_volume_Getter";


  /** @domName MediaController.volume */
  void set volume(num value) native "MediaController_volume_Setter";


  /** @domName MediaController.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";


  /** @domName MediaController.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "MediaController_dispatchEvent_Callback";


  /** @domName MediaController.pause */
  void pause() native "MediaController_pause_Callback";


  /** @domName MediaController.play */
  void play() native "MediaController_play_Callback";


  /** @domName MediaController.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLMediaElement
class MediaElement extends _Element_Merged {
  MediaElement.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  MediaElementEvents get on =>
    new MediaElementEvents(this);

  static const int HAVE_CURRENT_DATA = 2;

  static const int HAVE_ENOUGH_DATA = 4;

  static const int HAVE_FUTURE_DATA = 3;

  static const int HAVE_METADATA = 1;

  static const int HAVE_NOTHING = 0;

  static const int NETWORK_EMPTY = 0;

  static const int NETWORK_IDLE = 1;

  static const int NETWORK_LOADING = 2;

  static const int NETWORK_NO_SOURCE = 3;


  /** @domName HTMLMediaElement.autoplay */
  bool get autoplay native "HTMLMediaElement_autoplay_Getter";


  /** @domName HTMLMediaElement.autoplay */
  void set autoplay(bool value) native "HTMLMediaElement_autoplay_Setter";


  /** @domName HTMLMediaElement.buffered */
  TimeRanges get buffered native "HTMLMediaElement_buffered_Getter";


  /** @domName HTMLMediaElement.controller */
  MediaController get controller native "HTMLMediaElement_controller_Getter";


  /** @domName HTMLMediaElement.controller */
  void set controller(MediaController value) native "HTMLMediaElement_controller_Setter";


  /** @domName HTMLMediaElement.controls */
  bool get controls native "HTMLMediaElement_controls_Getter";


  /** @domName HTMLMediaElement.controls */
  void set controls(bool value) native "HTMLMediaElement_controls_Setter";


  /** @domName HTMLMediaElement.currentSrc */
  String get currentSrc native "HTMLMediaElement_currentSrc_Getter";


  /** @domName HTMLMediaElement.currentTime */
  num get currentTime native "HTMLMediaElement_currentTime_Getter";


  /** @domName HTMLMediaElement.currentTime */
  void set currentTime(num value) native "HTMLMediaElement_currentTime_Setter";


  /** @domName HTMLMediaElement.defaultMuted */
  bool get defaultMuted native "HTMLMediaElement_defaultMuted_Getter";


  /** @domName HTMLMediaElement.defaultMuted */
  void set defaultMuted(bool value) native "HTMLMediaElement_defaultMuted_Setter";


  /** @domName HTMLMediaElement.defaultPlaybackRate */
  num get defaultPlaybackRate native "HTMLMediaElement_defaultPlaybackRate_Getter";


  /** @domName HTMLMediaElement.defaultPlaybackRate */
  void set defaultPlaybackRate(num value) native "HTMLMediaElement_defaultPlaybackRate_Setter";


  /** @domName HTMLMediaElement.duration */
  num get duration native "HTMLMediaElement_duration_Getter";


  /** @domName HTMLMediaElement.ended */
  bool get ended native "HTMLMediaElement_ended_Getter";


  /** @domName HTMLMediaElement.error */
  MediaError get error native "HTMLMediaElement_error_Getter";


  /** @domName HTMLMediaElement.initialTime */
  num get initialTime native "HTMLMediaElement_initialTime_Getter";


  /** @domName HTMLMediaElement.loop */
  bool get loop native "HTMLMediaElement_loop_Getter";


  /** @domName HTMLMediaElement.loop */
  void set loop(bool value) native "HTMLMediaElement_loop_Setter";


  /** @domName HTMLMediaElement.mediaGroup */
  String get mediaGroup native "HTMLMediaElement_mediaGroup_Getter";


  /** @domName HTMLMediaElement.mediaGroup */
  void set mediaGroup(String value) native "HTMLMediaElement_mediaGroup_Setter";


  /** @domName HTMLMediaElement.muted */
  bool get muted native "HTMLMediaElement_muted_Getter";


  /** @domName HTMLMediaElement.muted */
  void set muted(bool value) native "HTMLMediaElement_muted_Setter";


  /** @domName HTMLMediaElement.networkState */
  int get networkState native "HTMLMediaElement_networkState_Getter";


  /** @domName HTMLMediaElement.paused */
  bool get paused native "HTMLMediaElement_paused_Getter";


  /** @domName HTMLMediaElement.playbackRate */
  num get playbackRate native "HTMLMediaElement_playbackRate_Getter";


  /** @domName HTMLMediaElement.playbackRate */
  void set playbackRate(num value) native "HTMLMediaElement_playbackRate_Setter";


  /** @domName HTMLMediaElement.played */
  TimeRanges get played native "HTMLMediaElement_played_Getter";


  /** @domName HTMLMediaElement.preload */
  String get preload native "HTMLMediaElement_preload_Getter";


  /** @domName HTMLMediaElement.preload */
  void set preload(String value) native "HTMLMediaElement_preload_Setter";


  /** @domName HTMLMediaElement.readyState */
  int get readyState native "HTMLMediaElement_readyState_Getter";


  /** @domName HTMLMediaElement.seekable */
  TimeRanges get seekable native "HTMLMediaElement_seekable_Getter";


  /** @domName HTMLMediaElement.seeking */
  bool get seeking native "HTMLMediaElement_seeking_Getter";


  /** @domName HTMLMediaElement.src */
  String get src native "HTMLMediaElement_src_Getter";


  /** @domName HTMLMediaElement.src */
  void set src(String value) native "HTMLMediaElement_src_Setter";


  /** @domName HTMLMediaElement.startTime */
  num get startTime native "HTMLMediaElement_startTime_Getter";


  /** @domName HTMLMediaElement.textTracks */
  TextTrackList get textTracks native "HTMLMediaElement_textTracks_Getter";


  /** @domName HTMLMediaElement.volume */
  num get volume native "HTMLMediaElement_volume_Getter";


  /** @domName HTMLMediaElement.volume */
  void set volume(num value) native "HTMLMediaElement_volume_Setter";


  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
  int get webkitAudioDecodedByteCount native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";


  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
  bool get webkitClosedCaptionsVisible native "HTMLMediaElement_webkitClosedCaptionsVisible_Getter";


  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
  void set webkitClosedCaptionsVisible(bool value) native "HTMLMediaElement_webkitClosedCaptionsVisible_Setter";


  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
  bool get webkitHasClosedCaptions native "HTMLMediaElement_webkitHasClosedCaptions_Getter";


  /** @domName HTMLMediaElement.webkitPreservesPitch */
  bool get webkitPreservesPitch native "HTMLMediaElement_webkitPreservesPitch_Getter";


  /** @domName HTMLMediaElement.webkitPreservesPitch */
  void set webkitPreservesPitch(bool value) native "HTMLMediaElement_webkitPreservesPitch_Setter";


  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
  int get webkitVideoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";

  TextTrack addTextTrack(/*DOMString*/ kind, [/*DOMString*/ label, /*DOMString*/ language]) {
    if (?language) {
      return _addTextTrack_1(kind, label, language);
    }
    if (?label) {
      return _addTextTrack_2(kind, label);
    }
    return _addTextTrack_3(kind);
  }


  /** @domName HTMLMediaElement.addTextTrack_1 */
  TextTrack _addTextTrack_1(kind, label, language) native "HTMLMediaElement_addTextTrack_1_Callback";


  /** @domName HTMLMediaElement.addTextTrack_2 */
  TextTrack _addTextTrack_2(kind, label) native "HTMLMediaElement_addTextTrack_2_Callback";


  /** @domName HTMLMediaElement.addTextTrack_3 */
  TextTrack _addTextTrack_3(kind) native "HTMLMediaElement_addTextTrack_3_Callback";


  /** @domName HTMLMediaElement.canPlayType */
  String canPlayType(String type, String keySystem) native "HTMLMediaElement_canPlayType_Callback";


  /** @domName HTMLMediaElement.load */
  void load() native "HTMLMediaElement_load_Callback";


  /** @domName HTMLMediaElement.pause */
  void pause() native "HTMLMediaElement_pause_Callback";


  /** @domName HTMLMediaElement.play */
  void play() native "HTMLMediaElement_play_Callback";

  void webkitAddKey(/*DOMString*/ keySystem, /*Uint8Array*/ key, [/*Uint8Array*/ initData, /*DOMString*/ sessionId]) {
    if (?initData) {
      _webkitAddKey_1(keySystem, key, initData, sessionId);
      return;
    }
    _webkitAddKey_2(keySystem, key);
  }


  /** @domName HTMLMediaElement.webkitAddKey_1 */
  void _webkitAddKey_1(keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_1_Callback";


  /** @domName HTMLMediaElement.webkitAddKey_2 */
  void _webkitAddKey_2(keySystem, key) native "HTMLMediaElement_webkitAddKey_2_Callback";


  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
  void webkitCancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";

  void webkitGenerateKeyRequest(/*DOMString*/ keySystem, [/*Uint8Array*/ initData]) {
    if (?initData) {
      _webkitGenerateKeyRequest_1(keySystem, initData);
      return;
    }
    _webkitGenerateKeyRequest_2(keySystem);
  }


  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_1 */
  void _webkitGenerateKeyRequest_1(keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_1_Callback";


  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_2 */
  void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_2_Callback";

}

class MediaElementEvents extends ElementEvents {
  MediaElementEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get canPlay => this['canplay'];

  EventListenerList get canPlayThrough => this['canplaythrough'];

  EventListenerList get durationChange => this['durationchange'];

  EventListenerList get emptied => this['emptied'];

  EventListenerList get ended => this['ended'];

  EventListenerList get loadedData => this['loadeddata'];

  EventListenerList get loadedMetadata => this['loadedmetadata'];

  EventListenerList get loadStart => this['loadstart'];

  EventListenerList get pause => this['pause'];

  EventListenerList get play => this['play'];

  EventListenerList get playing => this['playing'];

  EventListenerList get progress => this['progress'];

  EventListenerList get rateChange => this['ratechange'];

  EventListenerList get seeked => this['seeked'];

  EventListenerList get seeking => this['seeking'];

  EventListenerList get show => this['show'];

  EventListenerList get stalled => this['stalled'];

  EventListenerList get suspend => this['suspend'];

  EventListenerList get timeUpdate => this['timeupdate'];

  EventListenerList get volumeChange => this['volumechange'];

  EventListenerList get waiting => this['waiting'];

  EventListenerList get keyAdded => this['webkitkeyadded'];

  EventListenerList get keyError => this['webkitkeyerror'];

  EventListenerList get keyMessage => this['webkitkeymessage'];

  EventListenerList get needKey => this['webkitneedkey'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName MediaElementAudioSourceNode
class MediaElementAudioSourceNode extends AudioSourceNode {
  MediaElementAudioSourceNode.internal(): super.internal();


  /** @domName MediaElementAudioSourceNode.mediaElement */
  MediaElement get mediaElement native "MediaElementAudioSourceNode_mediaElement_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MediaError
class MediaError extends NativeFieldWrapperClass1 {
  MediaError.internal();

  static const int MEDIA_ERR_ABORTED = 1;

  static const int MEDIA_ERR_DECODE = 3;

  static const int MEDIA_ERR_ENCRYPTED = 5;

  static const int MEDIA_ERR_NETWORK = 2;

  static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;


  /** @domName MediaError.code */
  int get code native "MediaError_code_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MediaKeyError
class MediaKeyError extends NativeFieldWrapperClass1 {
  MediaKeyError.internal();

  static const int MEDIA_KEYERR_CLIENT = 2;

  static const int MEDIA_KEYERR_DOMAIN = 6;

  static const int MEDIA_KEYERR_HARDWARECHANGE = 5;

  static const int MEDIA_KEYERR_OUTPUT = 4;

  static const int MEDIA_KEYERR_SERVICE = 3;

  static const int MEDIA_KEYERR_UNKNOWN = 1;


  /** @domName MediaKeyError.code */
  int get code native "MediaKeyError_code_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MediaKeyEvent
class MediaKeyEvent extends Event {
  MediaKeyEvent.internal(): super.internal();


  /** @domName MediaKeyEvent.defaultURL */
  String get defaultURL native "MediaKeyEvent_defaultURL_Getter";


  /** @domName MediaKeyEvent.errorCode */
  MediaKeyError get errorCode native "MediaKeyEvent_errorCode_Getter";


  /** @domName MediaKeyEvent.initData */
  Uint8Array get initData native "MediaKeyEvent_initData_Getter";


  /** @domName MediaKeyEvent.keySystem */
  String get keySystem native "MediaKeyEvent_keySystem_Getter";


  /** @domName MediaKeyEvent.message */
  Uint8Array get message native "MediaKeyEvent_message_Getter";


  /** @domName MediaKeyEvent.sessionId */
  String get sessionId native "MediaKeyEvent_sessionId_Getter";


  /** @domName MediaKeyEvent.systemCode */
  int get systemCode native "MediaKeyEvent_systemCode_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MediaList
class MediaList extends NativeFieldWrapperClass1 {
  MediaList.internal();


  /** @domName MediaList.length */
  int get length native "MediaList_length_Getter";


  /** @domName MediaList.mediaText */
  String get mediaText native "MediaList_mediaText_Getter";


  /** @domName MediaList.mediaText */
  void set mediaText(String value) native "MediaList_mediaText_Setter";


  /** @domName MediaList.appendMedium */
  void appendMedium(String newMedium) native "MediaList_appendMedium_Callback";


  /** @domName MediaList.deleteMedium */
  void deleteMedium(String oldMedium) native "MediaList_deleteMedium_Callback";


  /** @domName MediaList.item */
  String item(int index) native "MediaList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName MediaQueryList
class MediaQueryList extends NativeFieldWrapperClass1 {
  MediaQueryList.internal();


  /** @domName MediaQueryList.matches */
  bool get matches native "MediaQueryList_matches_Getter";


  /** @domName MediaQueryList.media */
  String get media native "MediaQueryList_media_Getter";


  /** @domName MediaQueryList.addListener */
  void addListener(MediaQueryListListener listener) native "MediaQueryList_addListener_Callback";


  /** @domName MediaQueryList.removeListener */
  void removeListener(MediaQueryListListener listener) native "MediaQueryList_removeListener_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName MediaQueryListListener
class MediaQueryListListener extends NativeFieldWrapperClass1 {
  MediaQueryListListener.internal();


  /** @domName MediaQueryListListener.queryChanged */
  void queryChanged(MediaQueryList list) native "MediaQueryListListener_queryChanged_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName MediaSource
class MediaSource extends EventTarget {

  factory MediaSource() => _MediaSourceFactoryProvider.createMediaSource();
  MediaSource.internal(): super.internal();


  /** @domName MediaSource.activeSourceBuffers */
  SourceBufferList get activeSourceBuffers native "MediaSource_activeSourceBuffers_Getter";


  /** @domName MediaSource.duration */
  num get duration native "MediaSource_duration_Getter";


  /** @domName MediaSource.duration */
  void set duration(num value) native "MediaSource_duration_Setter";


  /** @domName MediaSource.readyState */
  String get readyState native "MediaSource_readyState_Getter";


  /** @domName MediaSource.sourceBuffers */
  SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";


  /** @domName MediaSource.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";


  /** @domName MediaSource.addSourceBuffer */
  SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";


  /** @domName MediaSource.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";


  /** @domName MediaSource.endOfStream */
  void endOfStream(String error) native "MediaSource_endOfStream_Callback";


  /** @domName MediaSource.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";


  /** @domName MediaSource.removeSourceBuffer */
  void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName MediaStream
class MediaStream extends EventTarget {

  factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _MediaStreamFactoryProvider.createMediaStream(audioTracks, videoTracks);
  MediaStream.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  MediaStreamEvents get on =>
    new MediaStreamEvents(this);

  static const int ENDED = 2;

  static const int LIVE = 1;


  /** @domName MediaStream.audioTracks */
  MediaStreamTrackList get audioTracks native "MediaStream_audioTracks_Getter";


  /** @domName MediaStream.label */
  String get label native "MediaStream_label_Getter";


  /** @domName MediaStream.readyState */
  int get readyState native "MediaStream_readyState_Getter";


  /** @domName MediaStream.videoTracks */
  MediaStreamTrackList get videoTracks native "MediaStream_videoTracks_Getter";


  /** @domName MediaStream.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";


  /** @domName MediaStream.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";


  /** @domName MediaStream.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";

}

class MediaStreamEvents extends Events {
  MediaStreamEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get ended => this['ended'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName MediaStreamAudioSourceNode
class MediaStreamAudioSourceNode extends AudioSourceNode {
  MediaStreamAudioSourceNode.internal(): super.internal();


  /** @domName MediaStreamAudioSourceNode.mediaStream */
  MediaStream get mediaStream native "MediaStreamAudioSourceNode_mediaStream_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MediaStreamEvent
class MediaStreamEvent extends Event {
  MediaStreamEvent.internal(): super.internal();


  /** @domName MediaStreamEvent.stream */
  MediaStream get stream native "MediaStreamEvent_stream_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MediaStreamTrack
class MediaStreamTrack extends EventTarget {
  MediaStreamTrack.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  MediaStreamTrackEvents get on =>
    new MediaStreamTrackEvents(this);

  static const int ENDED = 2;

  static const int LIVE = 0;

  static const int MUTED = 1;


  /** @domName MediaStreamTrack.enabled */
  bool get enabled native "MediaStreamTrack_enabled_Getter";


  /** @domName MediaStreamTrack.enabled */
  void set enabled(bool value) native "MediaStreamTrack_enabled_Setter";


  /** @domName MediaStreamTrack.kind */
  String get kind native "MediaStreamTrack_kind_Getter";


  /** @domName MediaStreamTrack.label */
  String get label native "MediaStreamTrack_label_Getter";


  /** @domName MediaStreamTrack.readyState */
  int get readyState native "MediaStreamTrack_readyState_Getter";


  /** @domName MediaStreamTrack.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_addEventListener_Callback";


  /** @domName MediaStreamTrack.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaStreamTrack_dispatchEvent_Callback";


  /** @domName MediaStreamTrack.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";

}

class MediaStreamTrackEvents extends Events {
  MediaStreamTrackEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get ended => this['ended'];

  EventListenerList get mute => this['mute'];

  EventListenerList get unmute => this['unmute'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName MediaStreamTrackEvent
class MediaStreamTrackEvent extends Event {
  MediaStreamTrackEvent.internal(): super.internal();


  /** @domName MediaStreamTrackEvent.track */
  MediaStreamTrack get track native "MediaStreamTrackEvent_track_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MediaStreamTrackList
class MediaStreamTrackList extends EventTarget {
  MediaStreamTrackList.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  MediaStreamTrackListEvents get on =>
    new MediaStreamTrackListEvents(this);


  /** @domName MediaStreamTrackList.length */
  int get length native "MediaStreamTrackList_length_Getter";


  /** @domName MediaStreamTrackList.add */
  void add(MediaStreamTrack track) native "MediaStreamTrackList_add_Callback";


  /** @domName MediaStreamTrackList.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_addEventListener_Callback";


  /** @domName MediaStreamTrackList.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaStreamTrackList_dispatchEvent_Callback";


  /** @domName MediaStreamTrackList.item */
  MediaStreamTrack item(int index) native "MediaStreamTrackList_item_Callback";


  /** @domName MediaStreamTrackList.remove */
  void remove(MediaStreamTrack track) native "MediaStreamTrackList_remove_Callback";


  /** @domName MediaStreamTrackList.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_removeEventListener_Callback";

}

class MediaStreamTrackListEvents extends Events {
  MediaStreamTrackListEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get addTrack => this['addtrack'];

  EventListenerList get removeTrack => this['removetrack'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName MemoryInfo
class MemoryInfo extends NativeFieldWrapperClass1 {
  MemoryInfo.internal();


  /** @domName MemoryInfo.jsHeapSizeLimit */
  int get jsHeapSizeLimit native "MemoryInfo_jsHeapSizeLimit_Getter";


  /** @domName MemoryInfo.totalJSHeapSize */
  int get totalJSHeapSize native "MemoryInfo_totalJSHeapSize_Getter";


  /** @domName MemoryInfo.usedJSHeapSize */
  int get usedJSHeapSize native "MemoryInfo_usedJSHeapSize_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLMenuElement
class MenuElement extends _Element_Merged {

  factory MenuElement() => _Elements.createMenuElement();
  MenuElement.internal(): super.internal();


  /** @domName HTMLMenuElement.compact */
  bool get compact native "HTMLMenuElement_compact_Getter";


  /** @domName HTMLMenuElement.compact */
  void set compact(bool value) native "HTMLMenuElement_compact_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName MessageChannel
class MessageChannel extends NativeFieldWrapperClass1 {

  factory MessageChannel() => _MessageChannelFactoryProvider.createMessageChannel();
  MessageChannel.internal();


  /** @domName MessageChannel.port1 */
  MessagePort get port1 native "MessageChannel_port1_Getter";


  /** @domName MessageChannel.port2 */
  MessagePort get port2 native "MessageChannel_port2_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName MessageEvent
class MessageEvent extends Event {
  MessageEvent.internal(): super.internal();


  /** @domName MessageEvent.data */
  Object get data native "MessageEvent_data_Getter";


  /** @domName MessageEvent.lastEventId */
  String get lastEventId native "MessageEvent_lastEventId_Getter";


  /** @domName MessageEvent.origin */
  String get origin native "MessageEvent_origin_Getter";


  /** @domName MessageEvent.ports */
  List get ports native "MessageEvent_ports_Getter";


  /** @domName MessageEvent.source */
  Window get source native "MessageEvent_source_Getter";


  /** @domName MessageEvent.initMessageEvent */
  void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts) native "MessageEvent_initMessageEvent_Callback";


  /** @domName MessageEvent.webkitInitMessageEvent */
  void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List transferables) native "MessageEvent_webkitInitMessageEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName MessagePort
class MessagePort extends EventTarget {
  MessagePort.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  MessagePortEvents get on =>
    new MessagePortEvents(this);


  /** @domName MessagePort.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";


  /** @domName MessagePort.close */
  void close() native "MessagePort_close_Callback";


  /** @domName MessagePort.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "MessagePort_dispatchEvent_Callback";


  /** @domName MessagePort.postMessage */
  void postMessage(Object message, [List messagePorts]) native "MessagePort_postMessage_Callback";


  /** @domName MessagePort.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";


  /** @domName MessagePort.start */
  void start() native "MessagePort_start_Callback";

}

class MessagePortEvents extends Events {
  MessagePortEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get message => this['message'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName HTMLMetaElement
class MetaElement extends _Element_Merged {
  MetaElement.internal(): super.internal();


  /** @domName HTMLMetaElement.content */
  String get content native "HTMLMetaElement_content_Getter";


  /** @domName HTMLMetaElement.content */
  void set content(String value) native "HTMLMetaElement_content_Setter";


  /** @domName HTMLMetaElement.httpEquiv */
  String get httpEquiv native "HTMLMetaElement_httpEquiv_Getter";


  /** @domName HTMLMetaElement.httpEquiv */
  void set httpEquiv(String value) native "HTMLMetaElement_httpEquiv_Setter";


  /** @domName HTMLMetaElement.name */
  String get name native "HTMLMetaElement_name_Getter";


  /** @domName HTMLMetaElement.name */
  void set name(String value) native "HTMLMetaElement_name_Setter";


  /** @domName HTMLMetaElement.scheme */
  String get scheme native "HTMLMetaElement_scheme_Getter";


  /** @domName HTMLMetaElement.scheme */
  void set scheme(String value) native "HTMLMetaElement_scheme_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName Metadata
class Metadata extends NativeFieldWrapperClass1 {
  Metadata.internal();


  /** @domName Metadata.modificationTime */
  Date get modificationTime native "Metadata_modificationTime_Getter";


  /** @domName Metadata.size */
  int get size native "Metadata_size_Getter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName HTMLMeterElement
class MeterElement extends _Element_Merged {

  factory MeterElement() => _Elements.createMeterElement();
  MeterElement.internal(): super.internal();


  /** @domName HTMLMeterElement.high */
  num get high native "HTMLMeterElement_high_Getter";


  /** @domName HTMLMeterElement.high */
  void set high(num value) native "HTMLMeterElement_high_Setter";


  /** @domName HTMLMeterElement.labels */
  List<Node> get labels native "HTMLMeterElement_labels_Getter";


  /** @domName HTMLMeterElement.low */
  num get low native "HTMLMeterElement_low_Getter";


  /** @domName HTMLMeterElement.low */
  void set low(num value) native "HTMLMeterElement_low_Setter";


  /** @domName HTMLMeterElement.max */
  num get max native "HTMLMeterElement_max_Getter";


  /** @domName HTMLMeterElement.max */
  void set max(num value) native "HTMLMeterElement_max_Setter";


  /** @domName HTMLMeterElement.min */
  num get min native "HTMLMeterElement_min_Getter";


  /** @domName HTMLMeterElement.min */
  void set min(num value) native "HTMLMeterElement_min_Setter";


  /** @domName HTMLMeterElement.optimum */
  num get optimum native "HTMLMeterElement_optimum_Getter";


  /** @domName HTMLMeterElement.optimum */
  void set optimum(num value) native "HTMLMeterElement_optimum_Setter";


  /** @domName HTMLMeterElement.value */
  num get value native "HTMLMeterElement_value_Getter";


  /** @domName HTMLMeterElement.value */
  void set value(num value) native "HTMLMeterElement_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLModElement
class ModElement extends _Element_Merged {
  ModElement.internal(): super.internal();


  /** @domName HTMLModElement.cite */
  String get cite native "HTMLModElement_cite_Getter";


  /** @domName HTMLModElement.cite */
  void set cite(String value) native "HTMLModElement_cite_Setter";


  /** @domName HTMLModElement.dateTime */
  String get dateTime native "HTMLModElement_dateTime_Getter";


  /** @domName HTMLModElement.dateTime */
  void set dateTime(String value) native "HTMLModElement_dateTime_Setter";

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

// WARNING: Do not edit - generated code.

class MouseEvent extends UIEvent {
  factory MouseEvent(String type, Window view, int detail, int screenX,
      int screenY, int clientX, int clientY, int button, [bool canBubble = true,
      bool cancelable = true, bool ctrlKey = false, bool altKey = false,
      bool shiftKey = false, bool metaKey = false,
      EventTarget relatedTarget = null]) =>
      _MouseEventFactoryProvider.createMouseEvent(
          type, view, detail, screenX, screenY,
          clientX, clientY, button, canBubble, cancelable,
          ctrlKey, altKey, shiftKey, metaKey,
          relatedTarget);
  MouseEvent.internal(): super.internal();


  /** @domName MouseEvent.altKey */
  bool get altKey native "MouseEvent_altKey_Getter";


  /** @domName MouseEvent.button */
  int get button native "MouseEvent_button_Getter";


  /** @domName MouseEvent.clientX */
  int get clientX native "MouseEvent_clientX_Getter";


  /** @domName MouseEvent.clientY */
  int get clientY native "MouseEvent_clientY_Getter";


  /** @domName MouseEvent.ctrlKey */
  bool get ctrlKey native "MouseEvent_ctrlKey_Getter";


  /** @domName MouseEvent.dataTransfer */
  Clipboard get dataTransfer native "MouseEvent_dataTransfer_Getter";


  /** @domName MouseEvent.fromElement */
  Node get fromElement native "MouseEvent_fromElement_Getter";


  /** @domName MouseEvent.metaKey */
  bool get metaKey native "MouseEvent_metaKey_Getter";


  /** @domName MouseEvent.offsetX */
  int get offsetX native "MouseEvent_offsetX_Getter";


  /** @domName MouseEvent.offsetY */
  int get offsetY native "MouseEvent_offsetY_Getter";


  /** @domName MouseEvent.relatedTarget */
  EventTarget get relatedTarget native "MouseEvent_relatedTarget_Getter";


  /** @domName MouseEvent.screenX */
  int get screenX native "MouseEvent_screenX_Getter";


  /** @domName MouseEvent.screenY */
  int get screenY native "MouseEvent_screenY_Getter";


  /** @domName MouseEvent.shiftKey */
  bool get shiftKey native "MouseEvent_shiftKey_Getter";


  /** @domName MouseEvent.toElement */
  Node get toElement native "MouseEvent_toElement_Getter";


  /** @domName MouseEvent.webkitMovementX */
  int get webkitMovementX native "MouseEvent_webkitMovementX_Getter";


  /** @domName MouseEvent.webkitMovementY */
  int get webkitMovementY native "MouseEvent_webkitMovementY_Getter";


  /** @domName MouseEvent.x */
  int get x native "MouseEvent_x_Getter";


  /** @domName MouseEvent.y */
  int get y native "MouseEvent_y_Getter";


  /** @domName MouseEvent.initMouseEvent */
  void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) native "MouseEvent_initMouseEvent_Callback";

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

// WARNING: Do not edit - generated code.


typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName MutationEvent
class MutationEvent extends Event {
  MutationEvent.internal(): super.internal();

  static const int ADDITION = 2;

  static const int MODIFICATION = 1;

  static const int REMOVAL = 3;


  /** @domName MutationEvent.attrChange */
  int get attrChange native "MutationEvent_attrChange_Getter";


  /** @domName MutationEvent.attrName */
  String get attrName native "MutationEvent_attrName_Getter";


  /** @domName MutationEvent.newValue */
  String get newValue native "MutationEvent_newValue_Getter";


  /** @domName MutationEvent.prevValue */
  String get prevValue native "MutationEvent_prevValue_Getter";


  /** @domName MutationEvent.relatedNode */
  Node get relatedNode native "MutationEvent_relatedNode_Getter";


  /** @domName MutationEvent.initMutationEvent */
  void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native "MutationEvent_initMutationEvent_Callback";

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

class MutationObserver extends NativeFieldWrapperClass1 {

  factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
  MutationObserver.internal();


  /** @domName MutationObserver.disconnect */
  void disconnect() native "MutationObserver_disconnect_Callback";


  /** @domName MutationObserver._observe */
  void _observe(Node target, Map options) native "MutationObserver__observe_Callback";


  /** @domName MutationObserver.takeRecords */
  List<MutationRecord> takeRecords() native "MutationObserver_takeRecords_Callback";

  void observe(Node target,
               {Map options,
                bool childList,
                bool attributes,
                bool characterData,
                bool subtree,
                bool attributeOldValue,
                bool characterDataOldValue,
                List<String> attributeFilter}) {

    // Parse options into map of known type.
    var parsedOptions = _createDict();

    if (options != null) {
      options.forEach((k, v) {
          if (_boolKeys.containsKey(k)) {
            _add(parsedOptions, k, true == v);
          } else if (k == 'attributeFilter') {
            _add(parsedOptions, k, _fixupList(v));
          } else {
            throw new ArgumentError(
                "Illegal MutationObserver.observe option '$k'");
          }
        });
    }

    // Override options passed in the map with named optional arguments.
    override(key, value) {
      if (value != null) _add(parsedOptions, key, value);
    }

    override('childList', childList);
    override('attributes', attributes);
    override('characterData', characterData);
    override('subtree', subtree);
    override('attributeOldValue', attributeOldValue);
    override('characterDataOldValue', characterDataOldValue);
    if (attributeFilter != null) {
      override('attributeFilter', _fixupList(attributeFilter));
    }

    _call(target, parsedOptions);
  }

   // TODO: Change to a set when const Sets are available.
  static final _boolKeys =
    const {'childList': true,
           'attributes': true,
           'characterData': true,
           'subtree': true,
           'attributeOldValue': true,
           'characterDataOldValue': true };

  static _createDict() => {};
  static _add(m, String key, value) { m[key] = value; }
  static _fixupList(list) => list;

  void _call(Node target, options) {
    _observe(target, options);
  }

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

// WARNING: Do not edit - generated code.

/// @domName MutationRecord
class MutationRecord extends NativeFieldWrapperClass1 {
  MutationRecord.internal();


  /** @domName MutationRecord.addedNodes */
  List<Node> get addedNodes native "MutationRecord_addedNodes_Getter";


  /** @domName MutationRecord.attributeName */
  String get attributeName native "MutationRecord_attributeName_Getter";


  /** @domName MutationRecord.attributeNamespace */
  String get attributeNamespace native "MutationRecord_attributeNamespace_Getter";


  /** @domName MutationRecord.nextSibling */
  Node get nextSibling native "MutationRecord_nextSibling_Getter";


  /** @domName MutationRecord.oldValue */
  String get oldValue native "MutationRecord_oldValue_Getter";


  /** @domName MutationRecord.previousSibling */
  Node get previousSibling native "MutationRecord_previousSibling_Getter";


  /** @domName MutationRecord.removedNodes */
  List<Node> get removedNodes native "MutationRecord_removedNodes_Getter";


  /** @domName MutationRecord.target */
  Node get target native "MutationRecord_target_Getter";


  /** @domName MutationRecord.type */
  String get type native "MutationRecord_type_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName NamedNodeMap
class NamedNodeMap extends NativeFieldWrapperClass1 implements List<Node> {
  NamedNodeMap.internal();


  /** @domName NamedNodeMap.length */
  int get length native "NamedNodeMap_length_Getter";

  Node operator[](int index) native "NamedNodeMap_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Node> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Node element) => _Collections.contains(this, element);

  void forEach(void f(Node element)) => _Collections.forEach(this, f);

  Collection map(f(Node element)) => _Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     _Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => _Collections.every(this, f);

  bool some(bool f(Node element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:

  void sort([Comparator<Node> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Node get last => this[length - 1];

  Node removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.


  /** @domName NamedNodeMap.getNamedItem */
  Node getNamedItem(String name) native "NamedNodeMap_getNamedItem_Callback";


  /** @domName NamedNodeMap.getNamedItemNS */
  Node getNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_getNamedItemNS_Callback";


  /** @domName NamedNodeMap.item */
  Node item(int index) native "NamedNodeMap_item_Callback";


  /** @domName NamedNodeMap.removeNamedItem */
  Node removeNamedItem(String name) native "NamedNodeMap_removeNamedItem_Callback";


  /** @domName NamedNodeMap.removeNamedItemNS */
  Node removeNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_removeNamedItemNS_Callback";


  /** @domName NamedNodeMap.setNamedItem */
  Node setNamedItem(Node node) native "NamedNodeMap_setNamedItem_Callback";


  /** @domName NamedNodeMap.setNamedItemNS */
  Node setNamedItemNS(Node node) native "NamedNodeMap_setNamedItemNS_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Navigator
class Navigator extends NativeFieldWrapperClass1 {
  Navigator.internal();


  /** @domName Navigator.appCodeName */
  String get appCodeName native "Navigator_appCodeName_Getter";


  /** @domName Navigator.appName */
  String get appName native "Navigator_appName_Getter";


  /** @domName Navigator.appVersion */
  String get appVersion native "Navigator_appVersion_Getter";


  /** @domName Navigator.cookieEnabled */
  bool get cookieEnabled native "Navigator_cookieEnabled_Getter";


  /** @domName Navigator.geolocation */
  Geolocation get geolocation native "Navigator_geolocation_Getter";


  /** @domName Navigator.language */
  String get language native "Navigator_language_Getter";


  /** @domName Navigator.mimeTypes */
  DOMMimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";


  /** @domName Navigator.onLine */
  bool get onLine native "Navigator_onLine_Getter";


  /** @domName Navigator.platform */
  String get platform native "Navigator_platform_Getter";


  /** @domName Navigator.plugins */
  DOMPluginArray get plugins native "Navigator_plugins_Getter";


  /** @domName Navigator.product */
  String get product native "Navigator_product_Getter";


  /** @domName Navigator.productSub */
  String get productSub native "Navigator_productSub_Getter";


  /** @domName Navigator.userAgent */
  String get userAgent native "Navigator_userAgent_Getter";


  /** @domName Navigator.vendor */
  String get vendor native "Navigator_vendor_Getter";


  /** @domName Navigator.vendorSub */
  String get vendorSub native "Navigator_vendorSub_Getter";


  /** @domName Navigator.webkitBattery */
  BatteryManager get webkitBattery native "Navigator_webkitBattery_Getter";


  /** @domName Navigator.getStorageUpdates */
  void getStorageUpdates() native "Navigator_getStorageUpdates_Callback";


  /** @domName Navigator.javaEnabled */
  bool javaEnabled() native "Navigator_javaEnabled_Callback";


  /** @domName Navigator.webkitGetGamepads */
  List<Gamepad> webkitGetGamepads() native "Navigator_webkitGetGamepads_Callback";


  /** @domName Navigator.webkitGetUserMedia */
  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName NavigatorUserMediaError
class NavigatorUserMediaError extends NativeFieldWrapperClass1 {
  NavigatorUserMediaError.internal();

  static const int PERMISSION_DENIED = 1;


  /** @domName NavigatorUserMediaError.code */
  int get code native "NavigatorUserMediaError_code_Getter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.


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

/**
 * Lazy implementation of the child nodes of an element that does not request
 * the actual child nodes of an element until strictly necessary greatly
 * improving performance for the typical cases where it is not required.
 */
class _ChildNodeListLazy implements List {
  final Node _this;

  _ChildNodeListLazy(this._this);


  Node get first => _this.$dom_firstChild;
  Node get last => _this.$dom_lastChild;

  void add(Node value) {
    _this.$dom_appendChild(value);
  }

  void addLast(Node value) {
    _this.$dom_appendChild(value);
  }


  void addAll(Collection<Node> collection) {
    for (Node node in collection) {
      _this.$dom_appendChild(node);
    }
  }

  Node removeLast() {
    final result = last;
    if (result != null) {
      _this.$dom_removeChild(result);
    }
    return result;
  }

  void clear() {
    _this.text = '';
  }

  void operator []=(int index, Node value) {
    _this.$dom_replaceChild(value, this[index]);
  }

  Iterator<Node> iterator() => _this.$dom_childNodes.iterator();

  // TODO(jacobr): We can implement these methods much more efficiently by
  // looking up the nodeList only once instead of once per iteration.
  bool contains(Node element) => _Collections.contains(this, element);

  void forEach(void f(Node element)) => _Collections.forEach(this, f);

  Collection map(f(Node element)) => _Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));

  bool every(bool f(Node element)) => _Collections.every(this, f);

  bool some(bool f(Node element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:

  // TODO(jacobr): this could be implemented for child node lists.
  // The exception we throw here is misleading.
  void sort([Comparator<Node> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start = 0]) =>
      _Lists.lastIndexOf(this, element, start);

  // FIXME: implement these.
  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError(
        "Cannot setRange on immutable List.");
  }
  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError(
        "Cannot removeRange on immutable List.");
  }
  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError(
        "Cannot insertRange on immutable List.");
  }
  List<Node> getRange(int start, int rangeLength) =>
    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));

  // -- end List<Node> mixins.

  // TODO(jacobr): benchmark whether this is more efficient or whether caching
  // a local copy of $dom_childNodes is more efficient.
  int get length => _this.$dom_childNodes.length;

  Node operator[](int index) => _this.$dom_childNodes[index];
}

class Node extends EventTarget {
  _ChildNodeListLazy get nodes {
    return new _ChildNodeListLazy(this);
  }

  void set nodes(Collection<Node> value) {
    // Copy list first since we don't want liveness during iteration.
    // TODO(jacobr): there is a better way to do this.
    List copy = new List.from(value);
    text = '';
    for (Node node in copy) {
      $dom_appendChild(node);
    }
  }

  /**
   * Removes this node from the DOM.
   * @domName Node.removeChild
   */
  void remove() {
    // TODO(jacobr): should we throw an exception if parent is already null?
    // TODO(vsm): Use the native remove when available.
    if (this.parent != null) {
      final Node parent = this.parent;
      parent.$dom_removeChild(this);
    }
  }

  /**
   * Replaces this node with another node.
   * @domName Node.replaceChild
   */
  Node replaceWith(Node otherNode) {
    try {
      final Node parent = this.parent;
      parent.$dom_replaceChild(otherNode, this);
    } catch (e) {

    };
    return this;
  }

  Node.internal(): super.internal();

  static const int ATTRIBUTE_NODE = 2;

  static const int CDATA_SECTION_NODE = 4;

  static const int COMMENT_NODE = 8;

  static const int DOCUMENT_FRAGMENT_NODE = 11;

  static const int DOCUMENT_NODE = 9;

  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;

  static const int DOCUMENT_POSITION_CONTAINS = 0x08;

  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;

  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;

  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;

  static const int DOCUMENT_POSITION_PRECEDING = 0x02;

  static const int DOCUMENT_TYPE_NODE = 10;

  static const int ELEMENT_NODE = 1;

  static const int ENTITY_NODE = 6;

  static const int ENTITY_REFERENCE_NODE = 5;

  static const int NOTATION_NODE = 12;

  static const int PROCESSING_INSTRUCTION_NODE = 7;

  static const int TEXT_NODE = 3;


  /** @domName Node.attributes */
  NamedNodeMap get $dom_attributes native "Node_attributes_Getter";


  /** @domName Node.childNodes */
  List<Node> get $dom_childNodes native "Node_childNodes_Getter";


  /** @domName Node.firstChild */
  Node get $dom_firstChild native "Node_firstChild_Getter";


  /** @domName Node.lastChild */
  Node get $dom_lastChild native "Node_lastChild_Getter";


  /** @domName Node.nextSibling */
  Node get nextNode native "Node_nextSibling_Getter";


  /** @domName Node.nodeType */
  int get $dom_nodeType native "Node_nodeType_Getter";


  /** @domName Node.ownerDocument */
  Document get document native "Node_ownerDocument_Getter";


  /** @domName Node.parentNode */
  Node get parent native "Node_parentNode_Getter";


  /** @domName Node.previousSibling */
  Node get previousNode native "Node_previousSibling_Getter";


  /** @domName Node.textContent */
  String get text native "Node_textContent_Getter";


  /** @domName Node.textContent */
  void set text(String value) native "Node_textContent_Setter";


  /** @domName Node.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";


  /** @domName Node.appendChild */
  Node $dom_appendChild(Node newChild) native "Node_appendChild_Callback";


  /** @domName Node.cloneNode */
  Node clone(bool deep) native "Node_cloneNode_Callback";


  /** @domName Node.contains */
  bool contains(Node other) native "Node_contains_Callback";


  /** @domName Node.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "Node_dispatchEvent_Callback";


  /** @domName Node.hasChildNodes */
  bool hasChildNodes() native "Node_hasChildNodes_Callback";


  /** @domName Node.insertBefore */
  Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";


  /** @domName Node.removeChild */
  Node $dom_removeChild(Node oldChild) native "Node_removeChild_Callback";


  /** @domName Node.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_Callback";


  /** @domName Node.replaceChild */
  Node $dom_replaceChild(Node newChild, Node oldChild) native "Node_replaceChild_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName NodeFilter
class NodeFilter extends NativeFieldWrapperClass1 {
  NodeFilter.internal();

  static const int FILTER_ACCEPT = 1;

  static const int FILTER_REJECT = 2;

  static const int FILTER_SKIP = 3;

  static const int SHOW_ALL = 0xFFFFFFFF;

  static const int SHOW_ATTRIBUTE = 0x00000002;

  static const int SHOW_CDATA_SECTION = 0x00000008;

  static const int SHOW_COMMENT = 0x00000080;

  static const int SHOW_DOCUMENT = 0x00000100;

  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;

  static const int SHOW_DOCUMENT_TYPE = 0x00000200;

  static const int SHOW_ELEMENT = 0x00000001;

  static const int SHOW_ENTITY = 0x00000020;

  static const int SHOW_ENTITY_REFERENCE = 0x00000010;

  static const int SHOW_NOTATION = 0x00000800;

  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;

  static const int SHOW_TEXT = 0x00000004;


  /** @domName NodeFilter.acceptNode */
  int acceptNode(Node n) native "NodeFilter_acceptNode_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName NodeIterator
class NodeIterator extends NativeFieldWrapperClass1 {
  NodeIterator.internal();


  /** @domName NodeIterator.expandEntityReferences */
  bool get expandEntityReferences native "NodeIterator_expandEntityReferences_Getter";


  /** @domName NodeIterator.filter */
  NodeFilter get filter native "NodeIterator_filter_Getter";


  /** @domName NodeIterator.pointerBeforeReferenceNode */
  bool get pointerBeforeReferenceNode native "NodeIterator_pointerBeforeReferenceNode_Getter";


  /** @domName NodeIterator.referenceNode */
  Node get referenceNode native "NodeIterator_referenceNode_Getter";


  /** @domName NodeIterator.root */
  Node get root native "NodeIterator_root_Getter";


  /** @domName NodeIterator.whatToShow */
  int get whatToShow native "NodeIterator_whatToShow_Getter";


  /** @domName NodeIterator.detach */
  void detach() native "NodeIterator_detach_Callback";


  /** @domName NodeIterator.nextNode */
  Node nextNode() native "NodeIterator_nextNode_Callback";


  /** @domName NodeIterator.previousNode */
  Node previousNode() native "NodeIterator_previousNode_Callback";

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

// TODO(nweiz): when all implementations we target have the same name for the
// coreimpl implementation of List<E>, extend that rather than wrapping.
class _ListWrapper<E> implements List<E> {
  List _list;

  _ListWrapper(List this._list);

  Iterator<E> iterator() => _list.iterator();

  bool contains(E element) => _list.contains(element);

  void forEach(void f(E element)) => _list.forEach(f);

  Collection map(f(E element)) => _list.map(f);

  List<E> filter(bool f(E element)) => _list.filter(f);

  bool every(bool f(E element)) => _list.every(f);

  bool some(bool f(E element)) => _list.some(f);

  bool get isEmpty => _list.isEmpty;

  int get length => _list.length;

  E operator [](int index) => _list[index];

  void operator []=(int index, E value) { _list[index] = value; }

  void set length(int newLength) { _list.length = newLength; }

  void add(E value) => _list.add(value);

  void addLast(E value) => _list.addLast(value);

  void addAll(Collection<E> collection) => _list.addAll(collection);

  void sort([Comparator<E> compare = Comparable.compare]) => _list.sort(compare);

  int indexOf(E element, [int start = 0]) => _list.indexOf(element, start);

  int lastIndexOf(E element, [int start = 0]) =>
    _list.lastIndexOf(element, start);

  void clear() => _list.clear();

  E removeLast() => _list.removeLast();

  E get last => _list.last;

  List<E> getRange(int start, int rangeLength) =>
    _list.getRange(start, rangeLength);

  void setRange(int start, int rangeLength, List<E> from, [int startFrom = 0])
      => _list.setRange(start, rangeLength, from, startFrom);

  void removeRange(int start, int rangeLength) =>
    _list.removeRange(start, rangeLength);

  void insertRange(int start, int rangeLength, [E initialValue = null]) =>
    _list.insertRange(start, rangeLength, initialValue);

  E get first => _list[0];
}

/**
 * This class is used to insure the results of list operations are NodeLists
 * instead of lists.
 */
class _NodeListWrapper extends _ListWrapper<Node> implements List {
  _NodeListWrapper(List list) : super(list);

  List<Node> filter(bool f(Node element)) =>
    new _NodeListWrapper(_list.filter(f));

  List<Node> getRange(int start, int rangeLength) =>
    new _NodeListWrapper(_list.getRange(start, rangeLength));
}

class NodeList extends NativeFieldWrapperClass1 implements List<Node> {
  Node _parent;

  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    _parent.$dom_appendChild(value);
  }

  void addLast(Node value) {
    _parent.$dom_appendChild(value);
  }

  void addAll(Collection<Node> collection) {
    for (Node node in collection) {
      _parent.$dom_appendChild(node);
    }
  }

  Node removeLast() {
    final result = this.last;
    if (result != null) {
      _parent.$dom_removeChild(result);
    }
    return result;
  }

  void clear() {
    _parent.text = '';
  }

  void operator []=(int index, Node value) {
    _parent.$dom_replaceChild(value, this[index]);
  }

  bool contains(Node element) => _Collections.contains(this, element);

  void forEach(void f(Node element)) => _Collections.forEach(this, f);

  Collection map(f(Node element)) => _Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     new _NodeListWrapper(_Collections.filter(this, <Node>[], f));

  bool every(bool f(Node element)) => _Collections.every(this, f);

  bool some(bool f(Node element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:

  void sort([Comparator<Node> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start = 0]) =>
      _Lists.lastIndexOf(this, element, start);

  Node get last => this[length - 1];
  Node get first => this[0];

  // FIXME: implement thesee.
  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }
  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }
  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }
  List<Node> getRange(int start, int rangeLength) =>
    new _NodeListWrapper(_Lists.getRange(this, start, rangeLength, <Node>[]));

  // -- end List<Node> mixins.

  NodeList.internal();


  /** @domName NodeList.length */
  int get length native "NodeList_length_Getter";

  Node operator[](int index) native "NodeList_item_Callback";


  /** @domName NodeList.item */
  Node _item(int index) native "NodeList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Notation
class Notation extends Node {
  Notation.internal(): super.internal();


  /** @domName Notation.publicId */
  String get publicId native "Notation_publicId_Getter";


  /** @domName Notation.systemId */
  String get systemId native "Notation_systemId_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Notification
class Notification extends EventTarget {

  factory Notification(String title, [Map options]) {
    if (!?options) {
      return _NotificationFactoryProvider.createNotification(title);
    }
    return _NotificationFactoryProvider.createNotification(title, options);
  }
  Notification.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  NotificationEvents get on =>
    new NotificationEvents(this);


  /** @domName Notification.dir */
  String get dir native "Notification_dir_Getter";


  /** @domName Notification.dir */
  void set dir(String value) native "Notification_dir_Setter";


  /** @domName Notification.permission */
  String get permission native "Notification_permission_Getter";


  /** @domName Notification.replaceId */
  String get replaceId native "Notification_replaceId_Getter";


  /** @domName Notification.replaceId */
  void set replaceId(String value) native "Notification_replaceId_Setter";


  /** @domName Notification.tag */
  String get tag native "Notification_tag_Getter";


  /** @domName Notification.tag */
  void set tag(String value) native "Notification_tag_Setter";


  /** @domName Notification.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";


  /** @domName Notification.cancel */
  void cancel() native "Notification_cancel_Callback";


  /** @domName Notification.close */
  void close() native "Notification_close_Callback";


  /** @domName Notification.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "Notification_dispatchEvent_Callback";


  /** @domName Notification.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";


  /** @domName Notification.requestPermission */
  static void requestPermission(NotificationPermissionCallback callback) native "Notification_requestPermission_Callback";


  /** @domName Notification.show */
  void show() native "Notification_show_Callback";

}

class NotificationEvents extends Events {
  NotificationEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get click => this['click'];

  EventListenerList get close => this['close'];

  EventListenerList get display => this['display'];

  EventListenerList get error => this['error'];

  EventListenerList get show => this['show'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName NotificationCenter
class NotificationCenter extends NativeFieldWrapperClass1 {
  NotificationCenter.internal();


  /** @domName NotificationCenter.checkPermission */
  int checkPermission() native "NotificationCenter_checkPermission_Callback";


  /** @domName NotificationCenter.createHTMLNotification */
  Notification createHTMLNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";


  /** @domName NotificationCenter.createNotification */
  Notification createNotification(String iconUrl, String title, String body) native "NotificationCenter_createNotification_Callback";


  /** @domName NotificationCenter.requestPermission */
  void requestPermission(VoidCallback callback) native "NotificationCenter_requestPermission_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName OESElementIndexUint
class OESElementIndexUint extends NativeFieldWrapperClass1 {
  OESElementIndexUint.internal();

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

// WARNING: Do not edit - generated code.

/// @domName OESStandardDerivatives
class OESStandardDerivatives extends NativeFieldWrapperClass1 {
  OESStandardDerivatives.internal();

  static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;

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

// WARNING: Do not edit - generated code.

/// @domName OESTextureFloat
class OESTextureFloat extends NativeFieldWrapperClass1 {
  OESTextureFloat.internal();

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

// WARNING: Do not edit - generated code.

/// @domName OESVertexArrayObject
class OESVertexArrayObject extends NativeFieldWrapperClass1 {
  OESVertexArrayObject.internal();

  static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;


  /** @domName OESVertexArrayObject.bindVertexArrayOES */
  void bindVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";


  /** @domName OESVertexArrayObject.createVertexArrayOES */
  WebGLVertexArrayObjectOES createVertexArrayOES() native "OESVertexArrayObject_createVertexArrayOES_Callback";


  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
  void deleteVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";


  /** @domName OESVertexArrayObject.isVertexArrayOES */
  bool isVertexArrayOES(WebGLVertexArrayObjectOES arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLOListElement
class OListElement extends _Element_Merged {

  factory OListElement() => _Elements.createOListElement();
  OListElement.internal(): super.internal();


  /** @domName HTMLOListElement.compact */
  bool get compact native "HTMLOListElement_compact_Getter";


  /** @domName HTMLOListElement.compact */
  void set compact(bool value) native "HTMLOListElement_compact_Setter";


  /** @domName HTMLOListElement.reversed */
  bool get reversed native "HTMLOListElement_reversed_Getter";


  /** @domName HTMLOListElement.reversed */
  void set reversed(bool value) native "HTMLOListElement_reversed_Setter";


  /** @domName HTMLOListElement.start */
  int get start native "HTMLOListElement_start_Getter";


  /** @domName HTMLOListElement.start */
  void set start(int value) native "HTMLOListElement_start_Setter";


  /** @domName HTMLOListElement.type */
  String get type native "HTMLOListElement_type_Getter";


  /** @domName HTMLOListElement.type */
  void set type(String value) native "HTMLOListElement_type_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLObjectElement
class ObjectElement extends _Element_Merged {

  factory ObjectElement() => _Elements.createObjectElement();
  ObjectElement.internal(): super.internal();


  /** @domName HTMLObjectElement.align */
  String get align native "HTMLObjectElement_align_Getter";


  /** @domName HTMLObjectElement.align */
  void set align(String value) native "HTMLObjectElement_align_Setter";


  /** @domName HTMLObjectElement.archive */
  String get archive native "HTMLObjectElement_archive_Getter";


  /** @domName HTMLObjectElement.archive */
  void set archive(String value) native "HTMLObjectElement_archive_Setter";


  /** @domName HTMLObjectElement.border */
  String get border native "HTMLObjectElement_border_Getter";


  /** @domName HTMLObjectElement.border */
  void set border(String value) native "HTMLObjectElement_border_Setter";


  /** @domName HTMLObjectElement.code */
  String get code native "HTMLObjectElement_code_Getter";


  /** @domName HTMLObjectElement.code */
  void set code(String value) native "HTMLObjectElement_code_Setter";


  /** @domName HTMLObjectElement.codeBase */
  String get codeBase native "HTMLObjectElement_codeBase_Getter";


  /** @domName HTMLObjectElement.codeBase */
  void set codeBase(String value) native "HTMLObjectElement_codeBase_Setter";


  /** @domName HTMLObjectElement.codeType */
  String get codeType native "HTMLObjectElement_codeType_Getter";


  /** @domName HTMLObjectElement.codeType */
  void set codeType(String value) native "HTMLObjectElement_codeType_Setter";


  /** @domName HTMLObjectElement.data */
  String get data native "HTMLObjectElement_data_Getter";


  /** @domName HTMLObjectElement.data */
  void set data(String value) native "HTMLObjectElement_data_Setter";


  /** @domName HTMLObjectElement.declare */
  bool get declare native "HTMLObjectElement_declare_Getter";


  /** @domName HTMLObjectElement.declare */
  void set declare(bool value) native "HTMLObjectElement_declare_Setter";


  /** @domName HTMLObjectElement.form */
  FormElement get form native "HTMLObjectElement_form_Getter";


  /** @domName HTMLObjectElement.height */
  String get height native "HTMLObjectElement_height_Getter";


  /** @domName HTMLObjectElement.height */
  void set height(String value) native "HTMLObjectElement_height_Setter";


  /** @domName HTMLObjectElement.hspace */
  int get hspace native "HTMLObjectElement_hspace_Getter";


  /** @domName HTMLObjectElement.hspace */
  void set hspace(int value) native "HTMLObjectElement_hspace_Setter";


  /** @domName HTMLObjectElement.name */
  String get name native "HTMLObjectElement_name_Getter";


  /** @domName HTMLObjectElement.name */
  void set name(String value) native "HTMLObjectElement_name_Setter";


  /** @domName HTMLObjectElement.standby */
  String get standby native "HTMLObjectElement_standby_Getter";


  /** @domName HTMLObjectElement.standby */
  void set standby(String value) native "HTMLObjectElement_standby_Setter";


  /** @domName HTMLObjectElement.type */
  String get type native "HTMLObjectElement_type_Getter";


  /** @domName HTMLObjectElement.type */
  void set type(String value) native "HTMLObjectElement_type_Setter";


  /** @domName HTMLObjectElement.useMap */
  String get useMap native "HTMLObjectElement_useMap_Getter";


  /** @domName HTMLObjectElement.useMap */
  void set useMap(String value) native "HTMLObjectElement_useMap_Setter";


  /** @domName HTMLObjectElement.validationMessage */
  String get validationMessage native "HTMLObjectElement_validationMessage_Getter";


  /** @domName HTMLObjectElement.validity */
  ValidityState get validity native "HTMLObjectElement_validity_Getter";


  /** @domName HTMLObjectElement.vspace */
  int get vspace native "HTMLObjectElement_vspace_Getter";


  /** @domName HTMLObjectElement.vspace */
  void set vspace(int value) native "HTMLObjectElement_vspace_Setter";


  /** @domName HTMLObjectElement.width */
  String get width native "HTMLObjectElement_width_Getter";


  /** @domName HTMLObjectElement.width */
  void set width(String value) native "HTMLObjectElement_width_Setter";


  /** @domName HTMLObjectElement.willValidate */
  bool get willValidate native "HTMLObjectElement_willValidate_Getter";


  /** @domName HTMLObjectElement.checkValidity */
  bool checkValidity() native "HTMLObjectElement_checkValidity_Callback";


  /** @domName HTMLObjectElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLObjectElement_setCustomValidity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName OfflineAudioCompletionEvent
class OfflineAudioCompletionEvent extends Event {
  OfflineAudioCompletionEvent.internal(): super.internal();


  /** @domName OfflineAudioCompletionEvent.renderedBuffer */
  AudioBuffer get renderedBuffer native "OfflineAudioCompletionEvent_renderedBuffer_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLOptGroupElement
class OptGroupElement extends _Element_Merged {

  factory OptGroupElement() => _Elements.createOptGroupElement();
  OptGroupElement.internal(): super.internal();


  /** @domName HTMLOptGroupElement.disabled */
  bool get disabled native "HTMLOptGroupElement_disabled_Getter";


  /** @domName HTMLOptGroupElement.disabled */
  void set disabled(bool value) native "HTMLOptGroupElement_disabled_Setter";


  /** @domName HTMLOptGroupElement.label */
  String get label native "HTMLOptGroupElement_label_Getter";


  /** @domName HTMLOptGroupElement.label */
  void set label(String value) native "HTMLOptGroupElement_label_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLOptionElement
class OptionElement extends _Element_Merged {

  factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
    if (!?data) {
      return _OptionElementFactoryProvider.createOptionElement();
    }
    if (!?value) {
      return _OptionElementFactoryProvider.createOptionElement(data);
    }
    if (!?defaultSelected) {
      return _OptionElementFactoryProvider.createOptionElement(data, value);
    }
    if (!?selected) {
      return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected);
    }
    return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected, selected);
  }
  OptionElement.internal(): super.internal();


  /** @domName HTMLOptionElement.defaultSelected */
  bool get defaultSelected native "HTMLOptionElement_defaultSelected_Getter";


  /** @domName HTMLOptionElement.defaultSelected */
  void set defaultSelected(bool value) native "HTMLOptionElement_defaultSelected_Setter";


  /** @domName HTMLOptionElement.disabled */
  bool get disabled native "HTMLOptionElement_disabled_Getter";


  /** @domName HTMLOptionElement.disabled */
  void set disabled(bool value) native "HTMLOptionElement_disabled_Setter";


  /** @domName HTMLOptionElement.form */
  FormElement get form native "HTMLOptionElement_form_Getter";


  /** @domName HTMLOptionElement.index */
  int get index native "HTMLOptionElement_index_Getter";


  /** @domName HTMLOptionElement.label */
  String get label native "HTMLOptionElement_label_Getter";


  /** @domName HTMLOptionElement.label */
  void set label(String value) native "HTMLOptionElement_label_Setter";


  /** @domName HTMLOptionElement.selected */
  bool get selected native "HTMLOptionElement_selected_Getter";


  /** @domName HTMLOptionElement.selected */
  void set selected(bool value) native "HTMLOptionElement_selected_Setter";


  /** @domName HTMLOptionElement.value */
  String get value native "HTMLOptionElement_value_Getter";


  /** @domName HTMLOptionElement.value */
  void set value(String value) native "HTMLOptionElement_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName OscillatorNode
class OscillatorNode extends AudioSourceNode {
  OscillatorNode.internal(): super.internal();

  static const int CUSTOM = 4;

  static const int FINISHED_STATE = 3;

  static const int PLAYING_STATE = 2;

  static const int SAWTOOTH = 2;

  static const int SCHEDULED_STATE = 1;

  static const int SINE = 0;

  static const int SQUARE = 1;

  static const int TRIANGLE = 3;

  static const int UNSCHEDULED_STATE = 0;


  /** @domName OscillatorNode.detune */
  AudioParam get detune native "OscillatorNode_detune_Getter";


  /** @domName OscillatorNode.frequency */
  AudioParam get frequency native "OscillatorNode_frequency_Getter";


  /** @domName OscillatorNode.playbackState */
  int get playbackState native "OscillatorNode_playbackState_Getter";


  /** @domName OscillatorNode.type */
  int get type native "OscillatorNode_type_Getter";


  /** @domName OscillatorNode.type */
  void set type(int value) native "OscillatorNode_type_Setter";


  /** @domName OscillatorNode.setWaveTable */
  void setWaveTable(WaveTable waveTable) native "OscillatorNode_setWaveTable_Callback";


  /** @domName OscillatorNode.start */
  void start(num when) native "OscillatorNode_start_Callback";


  /** @domName OscillatorNode.stop */
  void stop(num when) native "OscillatorNode_stop_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLOutputElement
class OutputElement extends _Element_Merged {

  factory OutputElement() => _Elements.createOutputElement();
  OutputElement.internal(): super.internal();


  /** @domName HTMLOutputElement.defaultValue */
  String get defaultValue native "HTMLOutputElement_defaultValue_Getter";


  /** @domName HTMLOutputElement.defaultValue */
  void set defaultValue(String value) native "HTMLOutputElement_defaultValue_Setter";


  /** @domName HTMLOutputElement.form */
  FormElement get form native "HTMLOutputElement_form_Getter";


  /** @domName HTMLOutputElement.htmlFor */
  DOMSettableTokenList get htmlFor native "HTMLOutputElement_htmlFor_Getter";


  /** @domName HTMLOutputElement.htmlFor */
  void set htmlFor(DOMSettableTokenList value) native "HTMLOutputElement_htmlFor_Setter";


  /** @domName HTMLOutputElement.labels */
  List<Node> get labels native "HTMLOutputElement_labels_Getter";


  /** @domName HTMLOutputElement.name */
  String get name native "HTMLOutputElement_name_Getter";


  /** @domName HTMLOutputElement.name */
  void set name(String value) native "HTMLOutputElement_name_Setter";


  /** @domName HTMLOutputElement.type */
  String get type native "HTMLOutputElement_type_Getter";


  /** @domName HTMLOutputElement.validationMessage */
  String get validationMessage native "HTMLOutputElement_validationMessage_Getter";


  /** @domName HTMLOutputElement.validity */
  ValidityState get validity native "HTMLOutputElement_validity_Getter";


  /** @domName HTMLOutputElement.value */
  String get value native "HTMLOutputElement_value_Getter";


  /** @domName HTMLOutputElement.value */
  void set value(String value) native "HTMLOutputElement_value_Setter";


  /** @domName HTMLOutputElement.willValidate */
  bool get willValidate native "HTMLOutputElement_willValidate_Getter";


  /** @domName HTMLOutputElement.checkValidity */
  bool checkValidity() native "HTMLOutputElement_checkValidity_Callback";


  /** @domName HTMLOutputElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLOutputElement_setCustomValidity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName OverflowEvent
class OverflowEvent extends Event {
  OverflowEvent.internal(): super.internal();

  static const int BOTH = 2;

  static const int HORIZONTAL = 0;

  static const int VERTICAL = 1;


  /** @domName OverflowEvent.horizontalOverflow */
  bool get horizontalOverflow native "OverflowEvent_horizontalOverflow_Getter";


  /** @domName OverflowEvent.orient */
  int get orient native "OverflowEvent_orient_Getter";


  /** @domName OverflowEvent.verticalOverflow */
  bool get verticalOverflow native "OverflowEvent_verticalOverflow_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName PagePopupController
class PagePopupController extends NativeFieldWrapperClass1 {
  PagePopupController.internal();


  /** @domName PagePopupController.localizeNumberString */
  String localizeNumberString(String numberString) native "PagePopupController_localizeNumberString_Callback";


  /** @domName PagePopupController.setValueAndClosePopup */
  void setValueAndClosePopup(int numberValue, String stringValue) native "PagePopupController_setValueAndClosePopup_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName PageTransitionEvent
class PageTransitionEvent extends Event {
  PageTransitionEvent.internal(): super.internal();


  /** @domName PageTransitionEvent.persisted */
  bool get persisted native "PageTransitionEvent_persisted_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName PannerNode
class PannerNode extends AudioNode {
  PannerNode.internal(): super.internal();

  static const int EQUALPOWER = 0;

  static const int EXPONENTIAL_DISTANCE = 2;

  static const int HRTF = 1;

  static const int INVERSE_DISTANCE = 1;

  static const int LINEAR_DISTANCE = 0;

  static const int SOUNDFIELD = 2;


  /** @domName PannerNode.coneGain */
  AudioGain get coneGain native "PannerNode_coneGain_Getter";


  /** @domName PannerNode.coneInnerAngle */
  num get coneInnerAngle native "PannerNode_coneInnerAngle_Getter";


  /** @domName PannerNode.coneInnerAngle */
  void set coneInnerAngle(num value) native "PannerNode_coneInnerAngle_Setter";


  /** @domName PannerNode.coneOuterAngle */
  num get coneOuterAngle native "PannerNode_coneOuterAngle_Getter";


  /** @domName PannerNode.coneOuterAngle */
  void set coneOuterAngle(num value) native "PannerNode_coneOuterAngle_Setter";


  /** @domName PannerNode.coneOuterGain */
  num get coneOuterGain native "PannerNode_coneOuterGain_Getter";


  /** @domName PannerNode.coneOuterGain */
  void set coneOuterGain(num value) native "PannerNode_coneOuterGain_Setter";


  /** @domName PannerNode.distanceGain */
  AudioGain get distanceGain native "PannerNode_distanceGain_Getter";


  /** @domName PannerNode.distanceModel */
  int get distanceModel native "PannerNode_distanceModel_Getter";


  /** @domName PannerNode.distanceModel */
  void set distanceModel(int value) native "PannerNode_distanceModel_Setter";


  /** @domName PannerNode.maxDistance */
  num get maxDistance native "PannerNode_maxDistance_Getter";


  /** @domName PannerNode.maxDistance */
  void set maxDistance(num value) native "PannerNode_maxDistance_Setter";


  /** @domName PannerNode.panningModel */
  int get panningModel native "PannerNode_panningModel_Getter";


  /** @domName PannerNode.panningModel */
  void set panningModel(int value) native "PannerNode_panningModel_Setter";


  /** @domName PannerNode.refDistance */
  num get refDistance native "PannerNode_refDistance_Getter";


  /** @domName PannerNode.refDistance */
  void set refDistance(num value) native "PannerNode_refDistance_Setter";


  /** @domName PannerNode.rolloffFactor */
  num get rolloffFactor native "PannerNode_rolloffFactor_Getter";


  /** @domName PannerNode.rolloffFactor */
  void set rolloffFactor(num value) native "PannerNode_rolloffFactor_Setter";


  /** @domName PannerNode.setOrientation */
  void setOrientation(num x, num y, num z) native "PannerNode_setOrientation_Callback";


  /** @domName PannerNode.setPosition */
  void setPosition(num x, num y, num z) native "PannerNode_setPosition_Callback";


  /** @domName PannerNode.setVelocity */
  void setVelocity(num x, num y, num z) native "PannerNode_setVelocity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLParagraphElement
class ParagraphElement extends _Element_Merged {

  factory ParagraphElement() => _Elements.createParagraphElement();
  ParagraphElement.internal(): super.internal();


  /** @domName HTMLParagraphElement.align */
  String get align native "HTMLParagraphElement_align_Getter";


  /** @domName HTMLParagraphElement.align */
  void set align(String value) native "HTMLParagraphElement_align_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLParamElement
class ParamElement extends _Element_Merged {

  factory ParamElement() => _Elements.createParamElement();
  ParamElement.internal(): super.internal();


  /** @domName HTMLParamElement.name */
  String get name native "HTMLParamElement_name_Getter";


  /** @domName HTMLParamElement.name */
  void set name(String value) native "HTMLParamElement_name_Setter";


  /** @domName HTMLParamElement.type */
  String get type native "HTMLParamElement_type_Getter";


  /** @domName HTMLParamElement.type */
  void set type(String value) native "HTMLParamElement_type_Setter";


  /** @domName HTMLParamElement.value */
  String get value native "HTMLParamElement_value_Getter";


  /** @domName HTMLParamElement.value */
  void set value(String value) native "HTMLParamElement_value_Setter";


  /** @domName HTMLParamElement.valueType */
  String get valueType native "HTMLParamElement_valueType_Getter";


  /** @domName HTMLParamElement.valueType */
  void set valueType(String value) native "HTMLParamElement_valueType_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName PeerConnection00
class PeerConnection00 extends EventTarget {

  factory PeerConnection00(String serverConfiguration, IceCallback iceCallback) => _PeerConnection00FactoryProvider.createPeerConnection00(serverConfiguration, iceCallback);
  PeerConnection00.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  PeerConnection00Events get on =>
    new PeerConnection00Events(this);

  static const int ACTIVE = 2;

  static const int CLOSED = 3;

  static const int ICE_CHECKING = 0x300;

  static const int ICE_CLOSED = 0x700;

  static const int ICE_COMPLETED = 0x500;

  static const int ICE_CONNECTED = 0x400;

  static const int ICE_FAILED = 0x600;

  static const int ICE_GATHERING = 0x100;

  static const int ICE_WAITING = 0x200;

  static const int NEW = 0;

  static const int OPENING = 1;

  static const int SDP_ANSWER = 0x300;

  static const int SDP_OFFER = 0x100;

  static const int SDP_PRANSWER = 0x200;


  /** @domName PeerConnection00.iceState */
  int get iceState native "PeerConnection00_iceState_Getter";


  /** @domName PeerConnection00.localDescription */
  SessionDescription get localDescription native "PeerConnection00_localDescription_Getter";


  /** @domName PeerConnection00.localStreams */
  List<MediaStream> get localStreams native "PeerConnection00_localStreams_Getter";


  /** @domName PeerConnection00.readyState */
  int get readyState native "PeerConnection00_readyState_Getter";


  /** @domName PeerConnection00.remoteDescription */
  SessionDescription get remoteDescription native "PeerConnection00_remoteDescription_Getter";


  /** @domName PeerConnection00.remoteStreams */
  List<MediaStream> get remoteStreams native "PeerConnection00_remoteStreams_Getter";


  /** @domName PeerConnection00.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "PeerConnection00_addEventListener_Callback";


  /** @domName PeerConnection00.addStream */
  void addStream(MediaStream stream, [Map mediaStreamHints]) native "PeerConnection00_addStream_Callback";


  /** @domName PeerConnection00.close */
  void close() native "PeerConnection00_close_Callback";


  /** @domName PeerConnection00.createAnswer */
  SessionDescription createAnswer(String offer, [Map mediaHints]) native "PeerConnection00_createAnswer_Callback";


  /** @domName PeerConnection00.createOffer */
  SessionDescription createOffer([Map mediaHints]) native "PeerConnection00_createOffer_Callback";


  /** @domName PeerConnection00.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "PeerConnection00_dispatchEvent_Callback";


  /** @domName PeerConnection00.processIceMessage */
  void processIceMessage(IceCandidate candidate) native "PeerConnection00_processIceMessage_Callback";


  /** @domName PeerConnection00.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "PeerConnection00_removeEventListener_Callback";


  /** @domName PeerConnection00.removeStream */
  void removeStream(MediaStream stream) native "PeerConnection00_removeStream_Callback";


  /** @domName PeerConnection00.setLocalDescription */
  void setLocalDescription(int action, SessionDescription desc) native "PeerConnection00_setLocalDescription_Callback";


  /** @domName PeerConnection00.setRemoteDescription */
  void setRemoteDescription(int action, SessionDescription desc) native "PeerConnection00_setRemoteDescription_Callback";


  /** @domName PeerConnection00.startIce */
  void startIce([Map iceOptions]) native "PeerConnection00_startIce_Callback";

}

class PeerConnection00Events extends Events {
  PeerConnection00Events(EventTarget _ptr) : super(_ptr);

  EventListenerList get addStream => this['addstream'];

  EventListenerList get connecting => this['connecting'];

  EventListenerList get open => this['open'];

  EventListenerList get removeStream => this['removestream'];

  EventListenerList get stateChange => this['statechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName Performance
class Performance extends EventTarget {
  Performance.internal(): super.internal();


  /** @domName Performance.memory */
  MemoryInfo get memory native "Performance_memory_Getter";


  /** @domName Performance.navigation */
  PerformanceNavigation get navigation native "Performance_navigation_Getter";


  /** @domName Performance.timing */
  PerformanceTiming get timing native "Performance_timing_Getter";


  /** @domName Performance.now */
  num now() native "Performance_now_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName PerformanceNavigation
class PerformanceNavigation extends NativeFieldWrapperClass1 {
  PerformanceNavigation.internal();

  static const int TYPE_BACK_FORWARD = 2;

  static const int TYPE_NAVIGATE = 0;

  static const int TYPE_RELOAD = 1;

  static const int TYPE_RESERVED = 255;


  /** @domName PerformanceNavigation.redirectCount */
  int get redirectCount native "PerformanceNavigation_redirectCount_Getter";


  /** @domName PerformanceNavigation.type */
  int get type native "PerformanceNavigation_type_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName PerformanceTiming
class PerformanceTiming extends NativeFieldWrapperClass1 {
  PerformanceTiming.internal();


  /** @domName PerformanceTiming.connectEnd */
  int get connectEnd native "PerformanceTiming_connectEnd_Getter";


  /** @domName PerformanceTiming.connectStart */
  int get connectStart native "PerformanceTiming_connectStart_Getter";


  /** @domName PerformanceTiming.domComplete */
  int get domComplete native "PerformanceTiming_domComplete_Getter";


  /** @domName PerformanceTiming.domContentLoadedEventEnd */
  int get domContentLoadedEventEnd native "PerformanceTiming_domContentLoadedEventEnd_Getter";


  /** @domName PerformanceTiming.domContentLoadedEventStart */
  int get domContentLoadedEventStart native "PerformanceTiming_domContentLoadedEventStart_Getter";


  /** @domName PerformanceTiming.domInteractive */
  int get domInteractive native "PerformanceTiming_domInteractive_Getter";


  /** @domName PerformanceTiming.domLoading */
  int get domLoading native "PerformanceTiming_domLoading_Getter";


  /** @domName PerformanceTiming.domainLookupEnd */
  int get domainLookupEnd native "PerformanceTiming_domainLookupEnd_Getter";


  /** @domName PerformanceTiming.domainLookupStart */
  int get domainLookupStart native "PerformanceTiming_domainLookupStart_Getter";


  /** @domName PerformanceTiming.fetchStart */
  int get fetchStart native "PerformanceTiming_fetchStart_Getter";


  /** @domName PerformanceTiming.loadEventEnd */
  int get loadEventEnd native "PerformanceTiming_loadEventEnd_Getter";


  /** @domName PerformanceTiming.loadEventStart */
  int get loadEventStart native "PerformanceTiming_loadEventStart_Getter";


  /** @domName PerformanceTiming.navigationStart */
  int get navigationStart native "PerformanceTiming_navigationStart_Getter";


  /** @domName PerformanceTiming.redirectEnd */
  int get redirectEnd native "PerformanceTiming_redirectEnd_Getter";


  /** @domName PerformanceTiming.redirectStart */
  int get redirectStart native "PerformanceTiming_redirectStart_Getter";


  /** @domName PerformanceTiming.requestStart */
  int get requestStart native "PerformanceTiming_requestStart_Getter";


  /** @domName PerformanceTiming.responseEnd */
  int get responseEnd native "PerformanceTiming_responseEnd_Getter";


  /** @domName PerformanceTiming.responseStart */
  int get responseStart native "PerformanceTiming_responseStart_Getter";


  /** @domName PerformanceTiming.secureConnectionStart */
  int get secureConnectionStart native "PerformanceTiming_secureConnectionStart_Getter";


  /** @domName PerformanceTiming.unloadEventEnd */
  int get unloadEventEnd native "PerformanceTiming_unloadEventEnd_Getter";


  /** @domName PerformanceTiming.unloadEventStart */
  int get unloadEventStart native "PerformanceTiming_unloadEventStart_Getter";

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

// WARNING: Do not edit - generated code.

class Point extends NativeFieldWrapperClass1 {
  factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
  Point.internal();


  /** @domName WebKitPoint.x */
  num get x native "WebKitPoint_x_Getter";


  /** @domName WebKitPoint.x */
  void set x(num value) native "WebKitPoint_x_Setter";


  /** @domName WebKitPoint.y */
  num get y native "WebKitPoint_y_Getter";


  /** @domName WebKitPoint.y */
  void set y(num value) native "WebKitPoint_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName PopStateEvent
class PopStateEvent extends Event {
  PopStateEvent.internal(): super.internal();


  /** @domName PopStateEvent.state */
  Object get state native "PopStateEvent_state_Getter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName PositionError
class PositionError extends NativeFieldWrapperClass1 {
  PositionError.internal();

  static const int PERMISSION_DENIED = 1;

  static const int POSITION_UNAVAILABLE = 2;

  static const int TIMEOUT = 3;


  /** @domName PositionError.code */
  int get code native "PositionError_code_Getter";


  /** @domName PositionError.message */
  String get message native "PositionError_message_Getter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName HTMLPreElement
class PreElement extends _Element_Merged {

  factory PreElement() => _Elements.createPreElement();
  PreElement.internal(): super.internal();


  /** @domName HTMLPreElement.width */
  int get width native "HTMLPreElement_width_Getter";


  /** @domName HTMLPreElement.width */
  void set width(int value) native "HTMLPreElement_width_Setter";


  /** @domName HTMLPreElement.wrap */
  bool get wrap native "HTMLPreElement_wrap_Getter";


  /** @domName HTMLPreElement.wrap */
  void set wrap(bool value) native "HTMLPreElement_wrap_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName ProcessingInstruction
class ProcessingInstruction extends Node {
  ProcessingInstruction.internal(): super.internal();


  /** @domName ProcessingInstruction.data */
  String get data native "ProcessingInstruction_data_Getter";


  /** @domName ProcessingInstruction.data */
  void set data(String value) native "ProcessingInstruction_data_Setter";


  /** @domName ProcessingInstruction.sheet */
  StyleSheet get sheet native "ProcessingInstruction_sheet_Getter";


  /** @domName ProcessingInstruction.target */
  String get target native "ProcessingInstruction_target_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLProgressElement
class ProgressElement extends _Element_Merged {

  factory ProgressElement() => _Elements.createProgressElement();
  ProgressElement.internal(): super.internal();


  /** @domName HTMLProgressElement.labels */
  List<Node> get labels native "HTMLProgressElement_labels_Getter";


  /** @domName HTMLProgressElement.max */
  num get max native "HTMLProgressElement_max_Getter";


  /** @domName HTMLProgressElement.max */
  void set max(num value) native "HTMLProgressElement_max_Setter";


  /** @domName HTMLProgressElement.position */
  num get position native "HTMLProgressElement_position_Getter";


  /** @domName HTMLProgressElement.value */
  num get value native "HTMLProgressElement_value_Getter";


  /** @domName HTMLProgressElement.value */
  void set value(num value) native "HTMLProgressElement_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName ProgressEvent
class ProgressEvent extends Event {
  ProgressEvent.internal(): super.internal();


  /** @domName ProgressEvent.lengthComputable */
  bool get lengthComputable native "ProgressEvent_lengthComputable_Getter";


  /** @domName ProgressEvent.loaded */
  int get loaded native "ProgressEvent_loaded_Getter";


  /** @domName ProgressEvent.total */
  int get total native "ProgressEvent_total_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLQuoteElement
class QuoteElement extends _Element_Merged {
  QuoteElement.internal(): super.internal();


  /** @domName HTMLQuoteElement.cite */
  String get cite native "HTMLQuoteElement_cite_Getter";


  /** @domName HTMLQuoteElement.cite */
  void set cite(String value) native "HTMLQuoteElement_cite_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName RGBColor
class RGBColor extends NativeFieldWrapperClass1 {
  RGBColor.internal();


  /** @domName RGBColor.blue */
  CSSPrimitiveValue get blue native "RGBColor_blue_Getter";


  /** @domName RGBColor.green */
  CSSPrimitiveValue get green native "RGBColor_green_Getter";


  /** @domName RGBColor.red */
  CSSPrimitiveValue get red native "RGBColor_red_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName RTCDataChannel
class RTCDataChannel extends EventTarget {
  RTCDataChannel.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  RTCDataChannelEvents get on =>
    new RTCDataChannelEvents(this);


  /** @domName RTCDataChannel.binaryType */
  String get binaryType native "RTCDataChannel_binaryType_Getter";


  /** @domName RTCDataChannel.binaryType */
  void set binaryType(String value) native "RTCDataChannel_binaryType_Setter";


  /** @domName RTCDataChannel.bufferedAmount */
  int get bufferedAmount native "RTCDataChannel_bufferedAmount_Getter";


  /** @domName RTCDataChannel.label */
  String get label native "RTCDataChannel_label_Getter";


  /** @domName RTCDataChannel.readyState */
  String get readyState native "RTCDataChannel_readyState_Getter";


  /** @domName RTCDataChannel.reliable */
  bool get reliable native "RTCDataChannel_reliable_Getter";


  /** @domName RTCDataChannel.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";


  /** @domName RTCDataChannel.close */
  void close() native "RTCDataChannel_close_Callback";


  /** @domName RTCDataChannel.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";


  /** @domName RTCDataChannel.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";

  void send(data) {
    if ((data is ArrayBuffer || data == null)) {
      _send_1(data);
      return;
    }
    if ((data is ArrayBufferView || data == null)) {
      _send_2(data);
      return;
    }
    if ((data is Blob || data == null)) {
      _send_3(data);
      return;
    }
    if ((data is String || data == null)) {
      _send_4(data);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName RTCDataChannel.send_1 */
  void _send_1(data) native "RTCDataChannel_send_1_Callback";


  /** @domName RTCDataChannel.send_2 */
  void _send_2(data) native "RTCDataChannel_send_2_Callback";


  /** @domName RTCDataChannel.send_3 */
  void _send_3(data) native "RTCDataChannel_send_3_Callback";


  /** @domName RTCDataChannel.send_4 */
  void _send_4(data) native "RTCDataChannel_send_4_Callback";

}

class RTCDataChannelEvents extends Events {
  RTCDataChannelEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get close => this['close'];

  EventListenerList get error => this['error'];

  EventListenerList get message => this['message'];

  EventListenerList get open => this['open'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName RTCDataChannelEvent
class RTCDataChannelEvent extends Event {
  RTCDataChannelEvent.internal(): super.internal();


  /** @domName RTCDataChannelEvent.channel */
  RTCDataChannel get channel native "RTCDataChannelEvent_channel_Getter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName RTCIceCandidate
class RTCIceCandidate extends NativeFieldWrapperClass1 {

  factory RTCIceCandidate(Map dictionary) => _RTCIceCandidateFactoryProvider.createRTCIceCandidate(dictionary);
  RTCIceCandidate.internal();


  /** @domName RTCIceCandidate.candidate */
  String get candidate native "RTCIceCandidate_candidate_Getter";


  /** @domName RTCIceCandidate.sdpMLineIndex */
  int get sdpMLineIndex native "RTCIceCandidate_sdpMLineIndex_Getter";


  /** @domName RTCIceCandidate.sdpMid */
  String get sdpMid native "RTCIceCandidate_sdpMid_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName RTCIceCandidateEvent
class RTCIceCandidateEvent extends Event {
  RTCIceCandidateEvent.internal(): super.internal();


  /** @domName RTCIceCandidateEvent.candidate */
  RTCIceCandidate get candidate native "RTCIceCandidateEvent_candidate_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName RTCPeerConnection
class RTCPeerConnection extends EventTarget {

  factory RTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
    if (!?mediaConstraints) {
      return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers);
    }
    return _RTCPeerConnectionFactoryProvider.createRTCPeerConnection(rtcIceServers, mediaConstraints);
  }
  RTCPeerConnection.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  RTCPeerConnectionEvents get on =>
    new RTCPeerConnectionEvents(this);


  /** @domName RTCPeerConnection.iceState */
  String get iceState native "RTCPeerConnection_iceState_Getter";


  /** @domName RTCPeerConnection.localDescription */
  RTCSessionDescription get localDescription native "RTCPeerConnection_localDescription_Getter";


  /** @domName RTCPeerConnection.localStreams */
  List<MediaStream> get localStreams native "RTCPeerConnection_localStreams_Getter";


  /** @domName RTCPeerConnection.readyState */
  String get readyState native "RTCPeerConnection_readyState_Getter";


  /** @domName RTCPeerConnection.remoteDescription */
  RTCSessionDescription get remoteDescription native "RTCPeerConnection_remoteDescription_Getter";


  /** @domName RTCPeerConnection.remoteStreams */
  List<MediaStream> get remoteStreams native "RTCPeerConnection_remoteStreams_Getter";


  /** @domName RTCPeerConnection.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";


  /** @domName RTCPeerConnection.addIceCandidate */
  void addIceCandidate(RTCIceCandidate candidate) native "RTCPeerConnection_addIceCandidate_Callback";


  /** @domName RTCPeerConnection.addStream */
  void addStream(MediaStream stream, [Map mediaConstraints]) native "RTCPeerConnection_addStream_Callback";


  /** @domName RTCPeerConnection.close */
  void close() native "RTCPeerConnection_close_Callback";


  /** @domName RTCPeerConnection.createAnswer */
  void createAnswer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createAnswer_Callback";


  /** @domName RTCPeerConnection.createDataChannel */
  RTCDataChannel createDataChannel(String label, [Map options]) native "RTCPeerConnection_createDataChannel_Callback";


  /** @domName RTCPeerConnection.createOffer */
  void createOffer(RTCSessionDescriptionCallback successCallback, [RTCErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";


  /** @domName RTCPeerConnection.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";


  /** @domName RTCPeerConnection.getStats */
  void getStats(RTCStatsCallback successCallback, MediaStreamTrack selector) native "RTCPeerConnection_getStats_Callback";


  /** @domName RTCPeerConnection.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";


  /** @domName RTCPeerConnection.removeStream */
  void removeStream(MediaStream stream) native "RTCPeerConnection_removeStream_Callback";


  /** @domName RTCPeerConnection.setLocalDescription */
  void setLocalDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native "RTCPeerConnection_setLocalDescription_Callback";


  /** @domName RTCPeerConnection.setRemoteDescription */
  void setRemoteDescription(RTCSessionDescription description, [VoidCallback successCallback, RTCErrorCallback failureCallback]) native "RTCPeerConnection_setRemoteDescription_Callback";


  /** @domName RTCPeerConnection.updateIce */
  void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";

}

class RTCPeerConnectionEvents extends Events {
  RTCPeerConnectionEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get addStream => this['addstream'];

  EventListenerList get iceCandidate => this['icecandidate'];

  EventListenerList get iceChange => this['icechange'];

  EventListenerList get negotiationNeeded => this['negotiationneeded'];

  EventListenerList get open => this['open'];

  EventListenerList get removeStream => this['removestream'];

  EventListenerList get stateChange => this['statechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName RTCSessionDescription
class RTCSessionDescription extends NativeFieldWrapperClass1 {

  factory RTCSessionDescription(Map dictionary) => _RTCSessionDescriptionFactoryProvider.createRTCSessionDescription(dictionary);
  RTCSessionDescription.internal();


  /** @domName RTCSessionDescription.sdp */
  String get sdp native "RTCSessionDescription_sdp_Getter";


  /** @domName RTCSessionDescription.sdp */
  void set sdp(String value) native "RTCSessionDescription_sdp_Setter";


  /** @domName RTCSessionDescription.type */
  String get type native "RTCSessionDescription_type_Getter";


  /** @domName RTCSessionDescription.type */
  void set type(String value) native "RTCSessionDescription_type_Setter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName RTCStatsElement
class RTCStatsElement extends NativeFieldWrapperClass1 {
  RTCStatsElement.internal();


  /** @domName RTCStatsElement.timestamp */
  Date get timestamp native "RTCStatsElement_timestamp_Getter";


  /** @domName RTCStatsElement.stat */
  String stat(String name) native "RTCStatsElement_stat_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName RTCStatsReport
class RTCStatsReport extends NativeFieldWrapperClass1 {
  RTCStatsReport.internal();


  /** @domName RTCStatsReport.local */
  RTCStatsElement get local native "RTCStatsReport_local_Getter";


  /** @domName RTCStatsReport.remote */
  RTCStatsElement get remote native "RTCStatsReport_remote_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName RTCStatsResponse
class RTCStatsResponse extends NativeFieldWrapperClass1 {
  RTCStatsResponse.internal();


  /** @domName RTCStatsResponse.result */
  List<RTCStatsReport> result() native "RTCStatsResponse_result_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName RadioNodeList
class RadioNodeList extends NodeList {
  RadioNodeList.internal(): super.internal();


  /** @domName RadioNodeList.value */
  String get value native "RadioNodeList_value_Getter";


  /** @domName RadioNodeList.value */
  void set value(String value) native "RadioNodeList_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName Range
class Range extends NativeFieldWrapperClass1 {
  Range.internal();

  static const int END_TO_END = 2;

  static const int END_TO_START = 3;

  static const int NODE_AFTER = 1;

  static const int NODE_BEFORE = 0;

  static const int NODE_BEFORE_AND_AFTER = 2;

  static const int NODE_INSIDE = 3;

  static const int START_TO_END = 1;

  static const int START_TO_START = 0;


  /** @domName Range.collapsed */
  bool get collapsed native "Range_collapsed_Getter";


  /** @domName Range.commonAncestorContainer */
  Node get commonAncestorContainer native "Range_commonAncestorContainer_Getter";


  /** @domName Range.endContainer */
  Node get endContainer native "Range_endContainer_Getter";


  /** @domName Range.endOffset */
  int get endOffset native "Range_endOffset_Getter";


  /** @domName Range.startContainer */
  Node get startContainer native "Range_startContainer_Getter";


  /** @domName Range.startOffset */
  int get startOffset native "Range_startOffset_Getter";


  /** @domName Range.cloneContents */
  DocumentFragment cloneContents() native "Range_cloneContents_Callback";


  /** @domName Range.cloneRange */
  Range cloneRange() native "Range_cloneRange_Callback";


  /** @domName Range.collapse */
  void collapse(bool toStart) native "Range_collapse_Callback";


  /** @domName Range.compareNode */
  int compareNode(Node refNode) native "Range_compareNode_Callback";


  /** @domName Range.comparePoint */
  int comparePoint(Node refNode, int offset) native "Range_comparePoint_Callback";


  /** @domName Range.createContextualFragment */
  DocumentFragment createContextualFragment(String html) native "Range_createContextualFragment_Callback";


  /** @domName Range.deleteContents */
  void deleteContents() native "Range_deleteContents_Callback";


  /** @domName Range.detach */
  void detach() native "Range_detach_Callback";


  /** @domName Range.expand */
  void expand(String unit) native "Range_expand_Callback";


  /** @domName Range.extractContents */
  DocumentFragment extractContents() native "Range_extractContents_Callback";


  /** @domName Range.getBoundingClientRect */
  ClientRect getBoundingClientRect() native "Range_getBoundingClientRect_Callback";


  /** @domName Range.getClientRects */
  List<ClientRect> getClientRects() native "Range_getClientRects_Callback";


  /** @domName Range.insertNode */
  void insertNode(Node newNode) native "Range_insertNode_Callback";


  /** @domName Range.intersectsNode */
  bool intersectsNode(Node refNode) native "Range_intersectsNode_Callback";


  /** @domName Range.isPointInRange */
  bool isPointInRange(Node refNode, int offset) native "Range_isPointInRange_Callback";


  /** @domName Range.selectNode */
  void selectNode(Node refNode) native "Range_selectNode_Callback";


  /** @domName Range.selectNodeContents */
  void selectNodeContents(Node refNode) native "Range_selectNodeContents_Callback";


  /** @domName Range.setEnd */
  void setEnd(Node refNode, int offset) native "Range_setEnd_Callback";


  /** @domName Range.setEndAfter */
  void setEndAfter(Node refNode) native "Range_setEndAfter_Callback";


  /** @domName Range.setEndBefore */
  void setEndBefore(Node refNode) native "Range_setEndBefore_Callback";


  /** @domName Range.setStart */
  void setStart(Node refNode, int offset) native "Range_setStart_Callback";


  /** @domName Range.setStartAfter */
  void setStartAfter(Node refNode) native "Range_setStartAfter_Callback";


  /** @domName Range.setStartBefore */
  void setStartBefore(Node refNode) native "Range_setStartBefore_Callback";


  /** @domName Range.surroundContents */
  void surroundContents(Node newParent) native "Range_surroundContents_Callback";


  /** @domName Range.toString */
  String toString() native "Range_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName RangeException
class RangeException extends NativeFieldWrapperClass1 {
  RangeException.internal();

  static const int BAD_BOUNDARYPOINTS_ERR = 1;

  static const int INVALID_NODE_TYPE_ERR = 2;


  /** @domName RangeException.code */
  int get code native "RangeException_code_Getter";


  /** @domName RangeException.message */
  String get message native "RangeException_message_Getter";


  /** @domName RangeException.name */
  String get name native "RangeException_name_Getter";


  /** @domName RangeException.toString */
  String toString() native "RangeException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Rect
class Rect extends NativeFieldWrapperClass1 {
  Rect.internal();


  /** @domName Rect.bottom */
  CSSPrimitiveValue get bottom native "Rect_bottom_Getter";


  /** @domName Rect.left */
  CSSPrimitiveValue get left native "Rect_left_Getter";


  /** @domName Rect.right */
  CSSPrimitiveValue get right native "Rect_right_Getter";


  /** @domName Rect.top */
  CSSPrimitiveValue get top native "Rect_top_Getter";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName SQLError
class SQLError extends NativeFieldWrapperClass1 {
  SQLError.internal();

  static const int CONSTRAINT_ERR = 6;

  static const int DATABASE_ERR = 1;

  static const int QUOTA_ERR = 4;

  static const int SYNTAX_ERR = 5;

  static const int TIMEOUT_ERR = 7;

  static const int TOO_LARGE_ERR = 3;

  static const int UNKNOWN_ERR = 0;

  static const int VERSION_ERR = 2;


  /** @domName SQLError.code */
  int get code native "SQLError_code_Getter";


  /** @domName SQLError.message */
  String get message native "SQLError_message_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SQLException
class SQLException extends NativeFieldWrapperClass1 {
  SQLException.internal();

  static const int CONSTRAINT_ERR = 6;

  static const int DATABASE_ERR = 1;

  static const int QUOTA_ERR = 4;

  static const int SYNTAX_ERR = 5;

  static const int TIMEOUT_ERR = 7;

  static const int TOO_LARGE_ERR = 3;

  static const int UNKNOWN_ERR = 0;

  static const int VERSION_ERR = 2;


  /** @domName SQLException.code */
  int get code native "SQLException_code_Getter";


  /** @domName SQLException.message */
  String get message native "SQLException_message_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SQLResultSet
class SQLResultSet extends NativeFieldWrapperClass1 {
  SQLResultSet.internal();


  /** @domName SQLResultSet.insertId */
  int get insertId native "SQLResultSet_insertId_Getter";


  /** @domName SQLResultSet.rows */
  SQLResultSetRowList get rows native "SQLResultSet_rows_Getter";


  /** @domName SQLResultSet.rowsAffected */
  int get rowsAffected native "SQLResultSet_rowsAffected_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SQLResultSetRowList
class SQLResultSetRowList extends NativeFieldWrapperClass1 implements List<Map> {
  SQLResultSetRowList.internal();


  /** @domName SQLResultSetRowList.length */
  int get length native "SQLResultSetRowList_length_Getter";

  Map operator[](int index) native "SQLResultSetRowList_item_Callback";

  void operator[]=(int index, Map value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Map> mixins.
  // Map is the element type.

  // From Iterable<Map>:

  Iterator<Map> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Map>(this);
  }

  // From Collection<Map>:

  void add(Map value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Map value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Map> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Map element) => _Collections.contains(this, element);

  void forEach(void f(Map element)) => _Collections.forEach(this, f);

  Collection map(f(Map element)) => _Collections.map(this, [], f);

  Collection<Map> filter(bool f(Map element)) =>
     _Collections.filter(this, <Map>[], f);

  bool every(bool f(Map element)) => _Collections.every(this, f);

  bool some(bool f(Map element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Map>:

  void sort([Comparator<Map> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Map element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Map element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Map get last => this[length - 1];

  Map removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Map> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Map initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Map> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Map>[]);

  // -- end List<Map> mixins.


  /** @domName SQLResultSetRowList.item */
  Map item(int index) native "SQLResultSetRowList_item_Callback";

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

// WARNING: Do not edit - generated code.


typedef void SQLStatementCallback(SQLTransaction transaction, SQLResultSet resultSet);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void SQLStatementErrorCallback(SQLTransaction transaction, SQLError error);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SQLTransaction
class SQLTransaction extends NativeFieldWrapperClass1 {
  SQLTransaction.internal();


  /** @domName SQLTransaction.executeSql */
  void executeSql(String sqlStatement, List arguments, [SQLStatementCallback callback, SQLStatementErrorCallback errorCallback]) native "SQLTransaction_executeSql_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName SQLTransactionSync
class SQLTransactionSync extends NativeFieldWrapperClass1 {
  SQLTransactionSync.internal();


  /** @domName SQLTransactionSync.executeSql */
  SQLResultSet executeSql(String sqlStatement, List arguments) native "SQLTransactionSync_executeSql_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName SVGAElement
class SVGAElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
  SVGAElement.internal(): super.internal();


  /** @domName SVGAElement.target */
  SVGAnimatedString get target native "SVGAElement_target_Getter";


  /** @domName SVGAElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGAElement_externalResourcesRequired_Getter";


  /** @domName SVGAElement.xmllang */
  String get xmllang native "SVGAElement_xmllang_Getter";


  /** @domName SVGAElement.xmllang */
  void set xmllang(String value) native "SVGAElement_xmllang_Setter";


  /** @domName SVGAElement.xmlspace */
  String get xmlspace native "SVGAElement_xmlspace_Getter";


  /** @domName SVGAElement.xmlspace */
  void set xmlspace(String value) native "SVGAElement_xmlspace_Setter";


  /** @domName SVGAElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGAElement_farthestViewportElement_Getter";


  /** @domName SVGAElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGAElement_nearestViewportElement_Getter";


  /** @domName SVGAElement.getBBox */
  SVGRect getBBox() native "SVGAElement_getBBox_Callback";


  /** @domName SVGAElement.getCTM */
  SVGMatrix getCTM() native "SVGAElement_getCTM_Callback";


  /** @domName SVGAElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGAElement_getScreenCTM_Callback";


  /** @domName SVGAElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGAElement_getTransformToElement_Callback";


  /** @domName SVGAElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGAElement_className_Getter";


  /** @domName SVGAElement.style */
  CSSStyleDeclaration get style native "SVGAElement_style_Getter";


  /** @domName SVGAElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGAElement_getPresentationAttribute_Callback";


  /** @domName SVGAElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGAElement_requiredExtensions_Getter";


  /** @domName SVGAElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGAElement_requiredFeatures_Getter";


  /** @domName SVGAElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGAElement_systemLanguage_Getter";


  /** @domName SVGAElement.hasExtension */
  bool hasExtension(String extension) native "SVGAElement_hasExtension_Callback";


  /** @domName SVGAElement.transform */
  SVGAnimatedTransformList get transform native "SVGAElement_transform_Getter";


  /** @domName SVGAElement.href */
  SVGAnimatedString get href native "SVGAElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAltGlyphDefElement
class SVGAltGlyphDefElement extends SVGElement {
  SVGAltGlyphDefElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGAltGlyphElement
class SVGAltGlyphElement extends SVGTextPositioningElement implements SVGURIReference {
  SVGAltGlyphElement.internal(): super.internal();


  /** @domName SVGAltGlyphElement.format */
  String get format native "SVGAltGlyphElement_format_Getter";


  /** @domName SVGAltGlyphElement.format */
  void set format(String value) native "SVGAltGlyphElement_format_Setter";


  /** @domName SVGAltGlyphElement.glyphRef */
  String get glyphRef native "SVGAltGlyphElement_glyphRef_Getter";


  /** @domName SVGAltGlyphElement.glyphRef */
  void set glyphRef(String value) native "SVGAltGlyphElement_glyphRef_Setter";


  /** @domName SVGAltGlyphElement.href */
  SVGAnimatedString get href native "SVGAltGlyphElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAltGlyphItemElement
class SVGAltGlyphItemElement extends SVGElement {
  SVGAltGlyphItemElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGAngle
class SVGAngle extends NativeFieldWrapperClass1 {
  SVGAngle.internal();

  static const int SVG_ANGLETYPE_DEG = 2;

  static const int SVG_ANGLETYPE_GRAD = 4;

  static const int SVG_ANGLETYPE_RAD = 3;

  static const int SVG_ANGLETYPE_UNKNOWN = 0;

  static const int SVG_ANGLETYPE_UNSPECIFIED = 1;


  /** @domName SVGAngle.unitType */
  int get unitType native "SVGAngle_unitType_Getter";


  /** @domName SVGAngle.value */
  num get value native "SVGAngle_value_Getter";


  /** @domName SVGAngle.value */
  void set value(num value) native "SVGAngle_value_Setter";


  /** @domName SVGAngle.valueAsString */
  String get valueAsString native "SVGAngle_valueAsString_Getter";


  /** @domName SVGAngle.valueAsString */
  void set valueAsString(String value) native "SVGAngle_valueAsString_Setter";


  /** @domName SVGAngle.valueInSpecifiedUnits */
  num get valueInSpecifiedUnits native "SVGAngle_valueInSpecifiedUnits_Getter";


  /** @domName SVGAngle.valueInSpecifiedUnits */
  void set valueInSpecifiedUnits(num value) native "SVGAngle_valueInSpecifiedUnits_Setter";


  /** @domName SVGAngle.convertToSpecifiedUnits */
  void convertToSpecifiedUnits(int unitType) native "SVGAngle_convertToSpecifiedUnits_Callback";


  /** @domName SVGAngle.newValueSpecifiedUnits */
  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimateColorElement
class SVGAnimateColorElement extends SVGAnimationElement {
  SVGAnimateColorElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimateElement
class SVGAnimateElement extends SVGAnimationElement {
  SVGAnimateElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimateMotionElement
class SVGAnimateMotionElement extends SVGAnimationElement {
  SVGAnimateMotionElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimateTransformElement
class SVGAnimateTransformElement extends SVGAnimationElement {
  SVGAnimateTransformElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedAngle
class SVGAnimatedAngle extends NativeFieldWrapperClass1 {
  SVGAnimatedAngle.internal();


  /** @domName SVGAnimatedAngle.animVal */
  SVGAngle get animVal native "SVGAnimatedAngle_animVal_Getter";


  /** @domName SVGAnimatedAngle.baseVal */
  SVGAngle get baseVal native "SVGAnimatedAngle_baseVal_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedBoolean
class SVGAnimatedBoolean extends NativeFieldWrapperClass1 {
  SVGAnimatedBoolean.internal();


  /** @domName SVGAnimatedBoolean.animVal */
  bool get animVal native "SVGAnimatedBoolean_animVal_Getter";


  /** @domName SVGAnimatedBoolean.baseVal */
  bool get baseVal native "SVGAnimatedBoolean_baseVal_Getter";


  /** @domName SVGAnimatedBoolean.baseVal */
  void set baseVal(bool value) native "SVGAnimatedBoolean_baseVal_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedEnumeration
class SVGAnimatedEnumeration extends NativeFieldWrapperClass1 {
  SVGAnimatedEnumeration.internal();


  /** @domName SVGAnimatedEnumeration.animVal */
  int get animVal native "SVGAnimatedEnumeration_animVal_Getter";


  /** @domName SVGAnimatedEnumeration.baseVal */
  int get baseVal native "SVGAnimatedEnumeration_baseVal_Getter";


  /** @domName SVGAnimatedEnumeration.baseVal */
  void set baseVal(int value) native "SVGAnimatedEnumeration_baseVal_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedInteger
class SVGAnimatedInteger extends NativeFieldWrapperClass1 {
  SVGAnimatedInteger.internal();


  /** @domName SVGAnimatedInteger.animVal */
  int get animVal native "SVGAnimatedInteger_animVal_Getter";


  /** @domName SVGAnimatedInteger.baseVal */
  int get baseVal native "SVGAnimatedInteger_baseVal_Getter";


  /** @domName SVGAnimatedInteger.baseVal */
  void set baseVal(int value) native "SVGAnimatedInteger_baseVal_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedLength
class SVGAnimatedLength extends NativeFieldWrapperClass1 {
  SVGAnimatedLength.internal();


  /** @domName SVGAnimatedLength.animVal */
  SVGLength get animVal native "SVGAnimatedLength_animVal_Getter";


  /** @domName SVGAnimatedLength.baseVal */
  SVGLength get baseVal native "SVGAnimatedLength_baseVal_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedLengthList
class SVGAnimatedLengthList extends NativeFieldWrapperClass1 implements List<SVGAnimatedLength> {
  SVGAnimatedLengthList.internal();


  /** @domName SVGAnimatedLengthList.animVal */
  SVGLengthList get animVal native "SVGAnimatedLengthList_animVal_Getter";


  /** @domName SVGAnimatedLengthList.baseVal */
  SVGLengthList get baseVal native "SVGAnimatedLengthList_baseVal_Getter";

  SVGAnimatedLength operator[](int index) native "SVGAnimatedLengthList_item_Callback";

  void operator[]=(int index, SVGAnimatedLength value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGAnimatedLength> mixins.
  // SVGAnimatedLength is the element type.

  // From Iterable<SVGAnimatedLength>:

  Iterator<SVGAnimatedLength> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGAnimatedLength>(this);
  }

  // From Collection<SVGAnimatedLength>:

  void add(SVGAnimatedLength value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGAnimatedLength value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGAnimatedLength> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGAnimatedLength element) => _Collections.contains(this, element);

  void forEach(void f(SVGAnimatedLength element)) => _Collections.forEach(this, f);

  Collection map(f(SVGAnimatedLength element)) => _Collections.map(this, [], f);

  Collection<SVGAnimatedLength> filter(bool f(SVGAnimatedLength element)) =>
     _Collections.filter(this, <SVGAnimatedLength>[], f);

  bool every(bool f(SVGAnimatedLength element)) => _Collections.every(this, f);

  bool some(bool f(SVGAnimatedLength element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGAnimatedLength>:

  void sort([Comparator<SVGAnimatedLength> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGAnimatedLength element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGAnimatedLength element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGAnimatedLength get last => this[length - 1];

  SVGAnimatedLength removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGAnimatedLength> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGAnimatedLength initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGAnimatedLength> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGAnimatedLength>[]);

  // -- end List<SVGAnimatedLength> mixins.

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedNumber
class SVGAnimatedNumber extends NativeFieldWrapperClass1 {
  SVGAnimatedNumber.internal();


  /** @domName SVGAnimatedNumber.animVal */
  num get animVal native "SVGAnimatedNumber_animVal_Getter";


  /** @domName SVGAnimatedNumber.baseVal */
  num get baseVal native "SVGAnimatedNumber_baseVal_Getter";


  /** @domName SVGAnimatedNumber.baseVal */
  void set baseVal(num value) native "SVGAnimatedNumber_baseVal_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedNumberList
class SVGAnimatedNumberList extends NativeFieldWrapperClass1 implements List<SVGAnimatedNumber> {
  SVGAnimatedNumberList.internal();


  /** @domName SVGAnimatedNumberList.animVal */
  SVGNumberList get animVal native "SVGAnimatedNumberList_animVal_Getter";


  /** @domName SVGAnimatedNumberList.baseVal */
  SVGNumberList get baseVal native "SVGAnimatedNumberList_baseVal_Getter";

  SVGAnimatedNumber operator[](int index) native "SVGAnimatedNumberList_item_Callback";

  void operator[]=(int index, SVGAnimatedNumber value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGAnimatedNumber> mixins.
  // SVGAnimatedNumber is the element type.

  // From Iterable<SVGAnimatedNumber>:

  Iterator<SVGAnimatedNumber> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGAnimatedNumber>(this);
  }

  // From Collection<SVGAnimatedNumber>:

  void add(SVGAnimatedNumber value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGAnimatedNumber value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGAnimatedNumber> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGAnimatedNumber element) => _Collections.contains(this, element);

  void forEach(void f(SVGAnimatedNumber element)) => _Collections.forEach(this, f);

  Collection map(f(SVGAnimatedNumber element)) => _Collections.map(this, [], f);

  Collection<SVGAnimatedNumber> filter(bool f(SVGAnimatedNumber element)) =>
     _Collections.filter(this, <SVGAnimatedNumber>[], f);

  bool every(bool f(SVGAnimatedNumber element)) => _Collections.every(this, f);

  bool some(bool f(SVGAnimatedNumber element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGAnimatedNumber>:

  void sort([Comparator<SVGAnimatedNumber> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGAnimatedNumber element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGAnimatedNumber element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGAnimatedNumber get last => this[length - 1];

  SVGAnimatedNumber removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGAnimatedNumber> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGAnimatedNumber initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGAnimatedNumber> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGAnimatedNumber>[]);

  // -- end List<SVGAnimatedNumber> mixins.

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedPreserveAspectRatio
class SVGAnimatedPreserveAspectRatio extends NativeFieldWrapperClass1 {
  SVGAnimatedPreserveAspectRatio.internal();


  /** @domName SVGAnimatedPreserveAspectRatio.animVal */
  SVGPreserveAspectRatio get animVal native "SVGAnimatedPreserveAspectRatio_animVal_Getter";


  /** @domName SVGAnimatedPreserveAspectRatio.baseVal */
  SVGPreserveAspectRatio get baseVal native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedRect
class SVGAnimatedRect extends NativeFieldWrapperClass1 {
  SVGAnimatedRect.internal();


  /** @domName SVGAnimatedRect.animVal */
  SVGRect get animVal native "SVGAnimatedRect_animVal_Getter";


  /** @domName SVGAnimatedRect.baseVal */
  SVGRect get baseVal native "SVGAnimatedRect_baseVal_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedString
class SVGAnimatedString extends NativeFieldWrapperClass1 {
  SVGAnimatedString.internal();


  /** @domName SVGAnimatedString.animVal */
  String get animVal native "SVGAnimatedString_animVal_Getter";


  /** @domName SVGAnimatedString.baseVal */
  String get baseVal native "SVGAnimatedString_baseVal_Getter";


  /** @domName SVGAnimatedString.baseVal */
  void set baseVal(String value) native "SVGAnimatedString_baseVal_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimatedTransformList
class SVGAnimatedTransformList extends NativeFieldWrapperClass1 implements List<SVGAnimateTransformElement> {
  SVGAnimatedTransformList.internal();


  /** @domName SVGAnimatedTransformList.animVal */
  SVGTransformList get animVal native "SVGAnimatedTransformList_animVal_Getter";


  /** @domName SVGAnimatedTransformList.baseVal */
  SVGTransformList get baseVal native "SVGAnimatedTransformList_baseVal_Getter";

  SVGAnimateTransformElement operator[](int index) native "SVGAnimatedTransformList_item_Callback";

  void operator[]=(int index, SVGAnimateTransformElement value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGAnimateTransformElement> mixins.
  // SVGAnimateTransformElement is the element type.

  // From Iterable<SVGAnimateTransformElement>:

  Iterator<SVGAnimateTransformElement> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGAnimateTransformElement>(this);
  }

  // From Collection<SVGAnimateTransformElement>:

  void add(SVGAnimateTransformElement value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGAnimateTransformElement value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGAnimateTransformElement> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGAnimateTransformElement element) => _Collections.contains(this, element);

  void forEach(void f(SVGAnimateTransformElement element)) => _Collections.forEach(this, f);

  Collection map(f(SVGAnimateTransformElement element)) => _Collections.map(this, [], f);

  Collection<SVGAnimateTransformElement> filter(bool f(SVGAnimateTransformElement element)) =>
     _Collections.filter(this, <SVGAnimateTransformElement>[], f);

  bool every(bool f(SVGAnimateTransformElement element)) => _Collections.every(this, f);

  bool some(bool f(SVGAnimateTransformElement element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGAnimateTransformElement>:

  void sort([Comparator<SVGAnimateTransformElement> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGAnimateTransformElement element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGAnimateTransformElement element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGAnimateTransformElement get last => this[length - 1];

  SVGAnimateTransformElement removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGAnimateTransformElement> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGAnimateTransformElement initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGAnimateTransformElement> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGAnimateTransformElement>[]);

  // -- end List<SVGAnimateTransformElement> mixins.

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

// WARNING: Do not edit - generated code.

/// @domName SVGAnimationElement
class SVGAnimationElement extends SVGElement implements ElementTimeControl, SVGTests, SVGExternalResourcesRequired {
  SVGAnimationElement.internal(): super.internal();


  /** @domName SVGAnimationElement.targetElement */
  SVGElement get targetElement native "SVGAnimationElement_targetElement_Getter";


  /** @domName SVGAnimationElement.getCurrentTime */
  num getCurrentTime() native "SVGAnimationElement_getCurrentTime_Callback";


  /** @domName SVGAnimationElement.getSimpleDuration */
  num getSimpleDuration() native "SVGAnimationElement_getSimpleDuration_Callback";


  /** @domName SVGAnimationElement.getStartTime */
  num getStartTime() native "SVGAnimationElement_getStartTime_Callback";


  /** @domName SVGAnimationElement.beginElement */
  void beginElement() native "SVGAnimationElement_beginElement_Callback";


  /** @domName SVGAnimationElement.beginElementAt */
  void beginElementAt(num offset) native "SVGAnimationElement_beginElementAt_Callback";


  /** @domName SVGAnimationElement.endElement */
  void endElement() native "SVGAnimationElement_endElement_Callback";


  /** @domName SVGAnimationElement.endElementAt */
  void endElementAt(num offset) native "SVGAnimationElement_endElementAt_Callback";


  /** @domName SVGAnimationElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGAnimationElement_externalResourcesRequired_Getter";


  /** @domName SVGAnimationElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGAnimationElement_requiredExtensions_Getter";


  /** @domName SVGAnimationElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGAnimationElement_requiredFeatures_Getter";


  /** @domName SVGAnimationElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGAnimationElement_systemLanguage_Getter";


  /** @domName SVGAnimationElement.hasExtension */
  bool hasExtension(String extension) native "SVGAnimationElement_hasExtension_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGCircleElement
class SVGCircleElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGCircleElement.internal(): super.internal();


  /** @domName SVGCircleElement.cx */
  SVGAnimatedLength get cx native "SVGCircleElement_cx_Getter";


  /** @domName SVGCircleElement.cy */
  SVGAnimatedLength get cy native "SVGCircleElement_cy_Getter";


  /** @domName SVGCircleElement.r */
  SVGAnimatedLength get r native "SVGCircleElement_r_Getter";


  /** @domName SVGCircleElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGCircleElement_externalResourcesRequired_Getter";


  /** @domName SVGCircleElement.xmllang */
  String get xmllang native "SVGCircleElement_xmllang_Getter";


  /** @domName SVGCircleElement.xmllang */
  void set xmllang(String value) native "SVGCircleElement_xmllang_Setter";


  /** @domName SVGCircleElement.xmlspace */
  String get xmlspace native "SVGCircleElement_xmlspace_Getter";


  /** @domName SVGCircleElement.xmlspace */
  void set xmlspace(String value) native "SVGCircleElement_xmlspace_Setter";


  /** @domName SVGCircleElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGCircleElement_farthestViewportElement_Getter";


  /** @domName SVGCircleElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGCircleElement_nearestViewportElement_Getter";


  /** @domName SVGCircleElement.getBBox */
  SVGRect getBBox() native "SVGCircleElement_getBBox_Callback";


  /** @domName SVGCircleElement.getCTM */
  SVGMatrix getCTM() native "SVGCircleElement_getCTM_Callback";


  /** @domName SVGCircleElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGCircleElement_getScreenCTM_Callback";


  /** @domName SVGCircleElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGCircleElement_getTransformToElement_Callback";


  /** @domName SVGCircleElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGCircleElement_className_Getter";


  /** @domName SVGCircleElement.style */
  CSSStyleDeclaration get style native "SVGCircleElement_style_Getter";


  /** @domName SVGCircleElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGCircleElement_getPresentationAttribute_Callback";


  /** @domName SVGCircleElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGCircleElement_requiredExtensions_Getter";


  /** @domName SVGCircleElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGCircleElement_requiredFeatures_Getter";


  /** @domName SVGCircleElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGCircleElement_systemLanguage_Getter";


  /** @domName SVGCircleElement.hasExtension */
  bool hasExtension(String extension) native "SVGCircleElement_hasExtension_Callback";


  /** @domName SVGCircleElement.transform */
  SVGAnimatedTransformList get transform native "SVGCircleElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGClipPathElement
class SVGClipPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGClipPathElement.internal(): super.internal();


  /** @domName SVGClipPathElement.clipPathUnits */
  SVGAnimatedEnumeration get clipPathUnits native "SVGClipPathElement_clipPathUnits_Getter";


  /** @domName SVGClipPathElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGClipPathElement_externalResourcesRequired_Getter";


  /** @domName SVGClipPathElement.xmllang */
  String get xmllang native "SVGClipPathElement_xmllang_Getter";


  /** @domName SVGClipPathElement.xmllang */
  void set xmllang(String value) native "SVGClipPathElement_xmllang_Setter";


  /** @domName SVGClipPathElement.xmlspace */
  String get xmlspace native "SVGClipPathElement_xmlspace_Getter";


  /** @domName SVGClipPathElement.xmlspace */
  void set xmlspace(String value) native "SVGClipPathElement_xmlspace_Setter";


  /** @domName SVGClipPathElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGClipPathElement_farthestViewportElement_Getter";


  /** @domName SVGClipPathElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGClipPathElement_nearestViewportElement_Getter";


  /** @domName SVGClipPathElement.getBBox */
  SVGRect getBBox() native "SVGClipPathElement_getBBox_Callback";


  /** @domName SVGClipPathElement.getCTM */
  SVGMatrix getCTM() native "SVGClipPathElement_getCTM_Callback";


  /** @domName SVGClipPathElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGClipPathElement_getScreenCTM_Callback";


  /** @domName SVGClipPathElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGClipPathElement_getTransformToElement_Callback";


  /** @domName SVGClipPathElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGClipPathElement_className_Getter";


  /** @domName SVGClipPathElement.style */
  CSSStyleDeclaration get style native "SVGClipPathElement_style_Getter";


  /** @domName SVGClipPathElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGClipPathElement_getPresentationAttribute_Callback";


  /** @domName SVGClipPathElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGClipPathElement_requiredExtensions_Getter";


  /** @domName SVGClipPathElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGClipPathElement_requiredFeatures_Getter";


  /** @domName SVGClipPathElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGClipPathElement_systemLanguage_Getter";


  /** @domName SVGClipPathElement.hasExtension */
  bool hasExtension(String extension) native "SVGClipPathElement_hasExtension_Callback";


  /** @domName SVGClipPathElement.transform */
  SVGAnimatedTransformList get transform native "SVGClipPathElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGColor
class SVGColor extends CSSValue {
  SVGColor.internal(): super.internal();

  static const int SVG_COLORTYPE_CURRENTCOLOR = 3;

  static const int SVG_COLORTYPE_RGBCOLOR = 1;

  static const int SVG_COLORTYPE_RGBCOLOR_ICCCOLOR = 2;

  static const int SVG_COLORTYPE_UNKNOWN = 0;


  /** @domName SVGColor.colorType */
  int get colorType native "SVGColor_colorType_Getter";


  /** @domName SVGColor.rgbColor */
  RGBColor get rgbColor native "SVGColor_rgbColor_Getter";


  /** @domName SVGColor.setColor */
  void setColor(int colorType, String rgbColor, String iccColor) native "SVGColor_setColor_Callback";


  /** @domName SVGColor.setRGBColor */
  void setRGBColor(String rgbColor) native "SVGColor_setRGBColor_Callback";


  /** @domName SVGColor.setRGBColorICCColor */
  void setRGBColorICCColor(String rgbColor, String iccColor) native "SVGColor_setRGBColorICCColor_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGComponentTransferFunctionElement
class SVGComponentTransferFunctionElement extends SVGElement {
  SVGComponentTransferFunctionElement.internal(): super.internal();

  static const int SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;

  static const int SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;

  static const int SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;

  static const int SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;

  static const int SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;

  static const int SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;


  /** @domName SVGComponentTransferFunctionElement.amplitude */
  SVGAnimatedNumber get amplitude native "SVGComponentTransferFunctionElement_amplitude_Getter";


  /** @domName SVGComponentTransferFunctionElement.exponent */
  SVGAnimatedNumber get exponent native "SVGComponentTransferFunctionElement_exponent_Getter";


  /** @domName SVGComponentTransferFunctionElement.intercept */
  SVGAnimatedNumber get intercept native "SVGComponentTransferFunctionElement_intercept_Getter";


  /** @domName SVGComponentTransferFunctionElement.offset */
  SVGAnimatedNumber get offset native "SVGComponentTransferFunctionElement_offset_Getter";


  /** @domName SVGComponentTransferFunctionElement.slope */
  SVGAnimatedNumber get slope native "SVGComponentTransferFunctionElement_slope_Getter";


  /** @domName SVGComponentTransferFunctionElement.tableValues */
  SVGAnimatedNumberList get tableValues native "SVGComponentTransferFunctionElement_tableValues_Getter";


  /** @domName SVGComponentTransferFunctionElement.type */
  SVGAnimatedEnumeration get type native "SVGComponentTransferFunctionElement_type_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGCursorElement
class SVGCursorElement extends SVGElement implements SVGURIReference, SVGTests, SVGExternalResourcesRequired {
  SVGCursorElement.internal(): super.internal();


  /** @domName SVGCursorElement.x */
  SVGAnimatedLength get x native "SVGCursorElement_x_Getter";


  /** @domName SVGCursorElement.y */
  SVGAnimatedLength get y native "SVGCursorElement_y_Getter";


  /** @domName SVGCursorElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGCursorElement_externalResourcesRequired_Getter";


  /** @domName SVGCursorElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGCursorElement_requiredExtensions_Getter";


  /** @domName SVGCursorElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGCursorElement_requiredFeatures_Getter";


  /** @domName SVGCursorElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGCursorElement_systemLanguage_Getter";


  /** @domName SVGCursorElement.hasExtension */
  bool hasExtension(String extension) native "SVGCursorElement_hasExtension_Callback";


  /** @domName SVGCursorElement.href */
  SVGAnimatedString get href native "SVGCursorElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGDefsElement
class SVGDefsElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGDefsElement.internal(): super.internal();


  /** @domName SVGDefsElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGDefsElement_externalResourcesRequired_Getter";


  /** @domName SVGDefsElement.xmllang */
  String get xmllang native "SVGDefsElement_xmllang_Getter";


  /** @domName SVGDefsElement.xmllang */
  void set xmllang(String value) native "SVGDefsElement_xmllang_Setter";


  /** @domName SVGDefsElement.xmlspace */
  String get xmlspace native "SVGDefsElement_xmlspace_Getter";


  /** @domName SVGDefsElement.xmlspace */
  void set xmlspace(String value) native "SVGDefsElement_xmlspace_Setter";


  /** @domName SVGDefsElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGDefsElement_farthestViewportElement_Getter";


  /** @domName SVGDefsElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGDefsElement_nearestViewportElement_Getter";


  /** @domName SVGDefsElement.getBBox */
  SVGRect getBBox() native "SVGDefsElement_getBBox_Callback";


  /** @domName SVGDefsElement.getCTM */
  SVGMatrix getCTM() native "SVGDefsElement_getCTM_Callback";


  /** @domName SVGDefsElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGDefsElement_getScreenCTM_Callback";


  /** @domName SVGDefsElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGDefsElement_getTransformToElement_Callback";


  /** @domName SVGDefsElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGDefsElement_className_Getter";


  /** @domName SVGDefsElement.style */
  CSSStyleDeclaration get style native "SVGDefsElement_style_Getter";


  /** @domName SVGDefsElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGDefsElement_getPresentationAttribute_Callback";


  /** @domName SVGDefsElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGDefsElement_requiredExtensions_Getter";


  /** @domName SVGDefsElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGDefsElement_requiredFeatures_Getter";


  /** @domName SVGDefsElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGDefsElement_systemLanguage_Getter";


  /** @domName SVGDefsElement.hasExtension */
  bool hasExtension(String extension) native "SVGDefsElement_hasExtension_Callback";


  /** @domName SVGDefsElement.transform */
  SVGAnimatedTransformList get transform native "SVGDefsElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGDescElement
class SVGDescElement extends SVGElement implements SVGLangSpace, SVGStylable {
  SVGDescElement.internal(): super.internal();


  /** @domName SVGDescElement.xmllang */
  String get xmllang native "SVGDescElement_xmllang_Getter";


  /** @domName SVGDescElement.xmllang */
  void set xmllang(String value) native "SVGDescElement_xmllang_Setter";


  /** @domName SVGDescElement.xmlspace */
  String get xmlspace native "SVGDescElement_xmlspace_Getter";


  /** @domName SVGDescElement.xmlspace */
  void set xmlspace(String value) native "SVGDescElement_xmlspace_Setter";


  /** @domName SVGDescElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGDescElement_className_Getter";


  /** @domName SVGDescElement.style */
  CSSStyleDeclaration get style native "SVGDescElement_style_Getter";


  /** @domName SVGDescElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGDescElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGDocument
class SVGDocument extends Document {
  SVGDocument.internal(): super.internal();


  /** @domName SVGDocument.rootElement */
  SVGSVGElement get rootElement native "SVGDocument_rootElement_Getter";


  /** @domName SVGDocument.createEvent */
  Event $dom_createEvent(String eventType) native "SVGDocument_createEvent_Callback";

}
// Copyright (c) 2011, 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.

class _AttributeClassSet extends _CssClassSet {
  _AttributeClassSet(element) : super(element);

  String $dom_className() => _element.attributes['class'];

  void _write(Set s) {
    _element.attributes['class'] = _formatSet(s);
  }
}

class SVGElement extends Element {
  factory SVGElement.tag(String tag) =>
      _SVGElementFactoryProvider.createSVGElement_tag(tag);
  factory SVGElement.svg(String svg) =>
      _SVGElementFactoryProvider.createSVGElement_svg(svg);

  CssClassSet get classes {
    if (_cssClassSet == null) {
      _cssClassSet = new _AttributeClassSet(_ptr);
    }
    return _cssClassSet;
  }

  List<Element> get elements => new _FilteredElementList(this);

  void set elements(Collection<Element> value) {
    final elements = this.elements;
    elements.clear();
    elements.addAll(value);
  }

  String get outerHTML {
    final container = new Element.tag("div");
    final SVGElement cloned = this.clone(true);
    container.elements.add(cloned);
    return container.innerHTML;
  }

  String get innerHTML {
    final container = new Element.tag("div");
    final SVGElement cloned = this.clone(true);
    container.elements.addAll(cloned.elements);
    return container.innerHTML;
  }

  void set innerHTML(String svg) {
    final container = new Element.tag("div");
    // Wrap the SVG string in <svg> so that SVGElements are created, rather than
    // HTMLElements.
    container.innerHTML = '<svg version="1.1">$svg</svg>';
    this.elements = container.elements[0].elements;
  }

  SVGElement.internal(): super.internal();


  /** @domName SVGElement.id */
  String get id native "SVGElement_id_Getter";


  /** @domName SVGElement.id */
  void set id(String value) native "SVGElement_id_Setter";


  /** @domName SVGElement.ownerSVGElement */
  SVGSVGElement get ownerSVGElement native "SVGElement_ownerSVGElement_Getter";


  /** @domName SVGElement.viewportElement */
  SVGElement get viewportElement native "SVGElement_viewportElement_Getter";


  /** @domName SVGElement.xmlbase */
  String get xmlbase native "SVGElement_xmlbase_Getter";


  /** @domName SVGElement.xmlbase */
  void set xmlbase(String value) native "SVGElement_xmlbase_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGElementInstance
class SVGElementInstance extends EventTarget {
  SVGElementInstance.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  SVGElementInstanceEvents get on =>
    new SVGElementInstanceEvents(this);


  /** @domName SVGElementInstance.childNodes */
  List<SVGElementInstance> get childNodes native "SVGElementInstance_childNodes_Getter";


  /** @domName SVGElementInstance.correspondingElement */
  SVGElement get correspondingElement native "SVGElementInstance_correspondingElement_Getter";


  /** @domName SVGElementInstance.correspondingUseElement */
  SVGUseElement get correspondingUseElement native "SVGElementInstance_correspondingUseElement_Getter";


  /** @domName SVGElementInstance.firstChild */
  SVGElementInstance get firstChild native "SVGElementInstance_firstChild_Getter";


  /** @domName SVGElementInstance.lastChild */
  SVGElementInstance get lastChild native "SVGElementInstance_lastChild_Getter";


  /** @domName SVGElementInstance.nextSibling */
  SVGElementInstance get nextSibling native "SVGElementInstance_nextSibling_Getter";


  /** @domName SVGElementInstance.parentNode */
  SVGElementInstance get parentNode native "SVGElementInstance_parentNode_Getter";


  /** @domName SVGElementInstance.previousSibling */
  SVGElementInstance get previousSibling native "SVGElementInstance_previousSibling_Getter";

}

class SVGElementInstanceEvents extends Events {
  SVGElementInstanceEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get abort => this['abort'];

  EventListenerList get beforeCopy => this['beforecopy'];

  EventListenerList get beforeCut => this['beforecut'];

  EventListenerList get beforePaste => this['beforepaste'];

  EventListenerList get blur => this['blur'];

  EventListenerList get change => this['change'];

  EventListenerList get click => this['click'];

  EventListenerList get contextMenu => this['contextmenu'];

  EventListenerList get copy => this['copy'];

  EventListenerList get cut => this['cut'];

  EventListenerList get doubleClick => this['dblclick'];

  EventListenerList get drag => this['drag'];

  EventListenerList get dragEnd => this['dragend'];

  EventListenerList get dragEnter => this['dragenter'];

  EventListenerList get dragLeave => this['dragleave'];

  EventListenerList get dragOver => this['dragover'];

  EventListenerList get dragStart => this['dragstart'];

  EventListenerList get drop => this['drop'];

  EventListenerList get error => this['error'];

  EventListenerList get focus => this['focus'];

  EventListenerList get input => this['input'];

  EventListenerList get keyDown => this['keydown'];

  EventListenerList get keyPress => this['keypress'];

  EventListenerList get keyUp => this['keyup'];

  EventListenerList get load => this['load'];

  EventListenerList get mouseDown => this['mousedown'];

  EventListenerList get mouseMove => this['mousemove'];

  EventListenerList get mouseOut => this['mouseout'];

  EventListenerList get mouseOver => this['mouseover'];

  EventListenerList get mouseUp => this['mouseup'];

  EventListenerList get mouseWheel => this['mousewheel'];

  EventListenerList get paste => this['paste'];

  EventListenerList get reset => this['reset'];

  EventListenerList get resize => this['resize'];

  EventListenerList get scroll => this['scroll'];

  EventListenerList get search => this['search'];

  EventListenerList get select => this['select'];

  EventListenerList get selectStart => this['selectstart'];

  EventListenerList get submit => this['submit'];

  EventListenerList get unload => this['unload'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SVGEllipseElement
class SVGEllipseElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGEllipseElement.internal(): super.internal();


  /** @domName SVGEllipseElement.cx */
  SVGAnimatedLength get cx native "SVGEllipseElement_cx_Getter";


  /** @domName SVGEllipseElement.cy */
  SVGAnimatedLength get cy native "SVGEllipseElement_cy_Getter";


  /** @domName SVGEllipseElement.rx */
  SVGAnimatedLength get rx native "SVGEllipseElement_rx_Getter";


  /** @domName SVGEllipseElement.ry */
  SVGAnimatedLength get ry native "SVGEllipseElement_ry_Getter";


  /** @domName SVGEllipseElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGEllipseElement_externalResourcesRequired_Getter";


  /** @domName SVGEllipseElement.xmllang */
  String get xmllang native "SVGEllipseElement_xmllang_Getter";


  /** @domName SVGEllipseElement.xmllang */
  void set xmllang(String value) native "SVGEllipseElement_xmllang_Setter";


  /** @domName SVGEllipseElement.xmlspace */
  String get xmlspace native "SVGEllipseElement_xmlspace_Getter";


  /** @domName SVGEllipseElement.xmlspace */
  void set xmlspace(String value) native "SVGEllipseElement_xmlspace_Setter";


  /** @domName SVGEllipseElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGEllipseElement_farthestViewportElement_Getter";


  /** @domName SVGEllipseElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGEllipseElement_nearestViewportElement_Getter";


  /** @domName SVGEllipseElement.getBBox */
  SVGRect getBBox() native "SVGEllipseElement_getBBox_Callback";


  /** @domName SVGEllipseElement.getCTM */
  SVGMatrix getCTM() native "SVGEllipseElement_getCTM_Callback";


  /** @domName SVGEllipseElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGEllipseElement_getScreenCTM_Callback";


  /** @domName SVGEllipseElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGEllipseElement_getTransformToElement_Callback";


  /** @domName SVGEllipseElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGEllipseElement_className_Getter";


  /** @domName SVGEllipseElement.style */
  CSSStyleDeclaration get style native "SVGEllipseElement_style_Getter";


  /** @domName SVGEllipseElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGEllipseElement_getPresentationAttribute_Callback";


  /** @domName SVGEllipseElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGEllipseElement_requiredExtensions_Getter";


  /** @domName SVGEllipseElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGEllipseElement_requiredFeatures_Getter";


  /** @domName SVGEllipseElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGEllipseElement_systemLanguage_Getter";


  /** @domName SVGEllipseElement.hasExtension */
  bool hasExtension(String extension) native "SVGEllipseElement_hasExtension_Callback";


  /** @domName SVGEllipseElement.transform */
  SVGAnimatedTransformList get transform native "SVGEllipseElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGException
class SVGException extends NativeFieldWrapperClass1 {
  SVGException.internal();

  static const int SVG_INVALID_VALUE_ERR = 1;

  static const int SVG_MATRIX_NOT_INVERTABLE = 2;

  static const int SVG_WRONG_TYPE_ERR = 0;


  /** @domName SVGException.code */
  int get code native "SVGException_code_Getter";


  /** @domName SVGException.message */
  String get message native "SVGException_message_Getter";


  /** @domName SVGException.name */
  String get name native "SVGException_name_Getter";


  /** @domName SVGException.toString */
  String toString() native "SVGException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGExternalResourcesRequired
class SVGExternalResourcesRequired extends NativeFieldWrapperClass1 {
  SVGExternalResourcesRequired.internal();


  /** @domName SVGExternalResourcesRequired.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGExternalResourcesRequired_externalResourcesRequired_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEBlendElement
class SVGFEBlendElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEBlendElement.internal(): super.internal();

  static const int SVG_FEBLEND_MODE_DARKEN = 4;

  static const int SVG_FEBLEND_MODE_LIGHTEN = 5;

  static const int SVG_FEBLEND_MODE_MULTIPLY = 2;

  static const int SVG_FEBLEND_MODE_NORMAL = 1;

  static const int SVG_FEBLEND_MODE_SCREEN = 3;

  static const int SVG_FEBLEND_MODE_UNKNOWN = 0;


  /** @domName SVGFEBlendElement.in1 */
  SVGAnimatedString get in1 native "SVGFEBlendElement_in1_Getter";


  /** @domName SVGFEBlendElement.in2 */
  SVGAnimatedString get in2 native "SVGFEBlendElement_in2_Getter";


  /** @domName SVGFEBlendElement.mode */
  SVGAnimatedEnumeration get mode native "SVGFEBlendElement_mode_Getter";


  /** @domName SVGFEBlendElement.height */
  SVGAnimatedLength get height native "SVGFEBlendElement_height_Getter";


  /** @domName SVGFEBlendElement.result */
  SVGAnimatedString get result native "SVGFEBlendElement_result_Getter";


  /** @domName SVGFEBlendElement.width */
  SVGAnimatedLength get width native "SVGFEBlendElement_width_Getter";


  /** @domName SVGFEBlendElement.x */
  SVGAnimatedLength get x native "SVGFEBlendElement_x_Getter";


  /** @domName SVGFEBlendElement.y */
  SVGAnimatedLength get y native "SVGFEBlendElement_y_Getter";


  /** @domName SVGFEBlendElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEBlendElement_className_Getter";


  /** @domName SVGFEBlendElement.style */
  CSSStyleDeclaration get style native "SVGFEBlendElement_style_Getter";


  /** @domName SVGFEBlendElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEBlendElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEColorMatrixElement
class SVGFEColorMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEColorMatrixElement.internal(): super.internal();

  static const int SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;

  static const int SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;

  static const int SVG_FECOLORMATRIX_TYPE_MATRIX = 1;

  static const int SVG_FECOLORMATRIX_TYPE_SATURATE = 2;

  static const int SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;


  /** @domName SVGFEColorMatrixElement.in1 */
  SVGAnimatedString get in1 native "SVGFEColorMatrixElement_in1_Getter";


  /** @domName SVGFEColorMatrixElement.type */
  SVGAnimatedEnumeration get type native "SVGFEColorMatrixElement_type_Getter";


  /** @domName SVGFEColorMatrixElement.values */
  SVGAnimatedNumberList get values native "SVGFEColorMatrixElement_values_Getter";


  /** @domName SVGFEColorMatrixElement.height */
  SVGAnimatedLength get height native "SVGFEColorMatrixElement_height_Getter";


  /** @domName SVGFEColorMatrixElement.result */
  SVGAnimatedString get result native "SVGFEColorMatrixElement_result_Getter";


  /** @domName SVGFEColorMatrixElement.width */
  SVGAnimatedLength get width native "SVGFEColorMatrixElement_width_Getter";


  /** @domName SVGFEColorMatrixElement.x */
  SVGAnimatedLength get x native "SVGFEColorMatrixElement_x_Getter";


  /** @domName SVGFEColorMatrixElement.y */
  SVGAnimatedLength get y native "SVGFEColorMatrixElement_y_Getter";


  /** @domName SVGFEColorMatrixElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEColorMatrixElement_className_Getter";


  /** @domName SVGFEColorMatrixElement.style */
  CSSStyleDeclaration get style native "SVGFEColorMatrixElement_style_Getter";


  /** @domName SVGFEColorMatrixElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEColorMatrixElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEComponentTransferElement
class SVGFEComponentTransferElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEComponentTransferElement.internal(): super.internal();


  /** @domName SVGFEComponentTransferElement.in1 */
  SVGAnimatedString get in1 native "SVGFEComponentTransferElement_in1_Getter";


  /** @domName SVGFEComponentTransferElement.height */
  SVGAnimatedLength get height native "SVGFEComponentTransferElement_height_Getter";


  /** @domName SVGFEComponentTransferElement.result */
  SVGAnimatedString get result native "SVGFEComponentTransferElement_result_Getter";


  /** @domName SVGFEComponentTransferElement.width */
  SVGAnimatedLength get width native "SVGFEComponentTransferElement_width_Getter";


  /** @domName SVGFEComponentTransferElement.x */
  SVGAnimatedLength get x native "SVGFEComponentTransferElement_x_Getter";


  /** @domName SVGFEComponentTransferElement.y */
  SVGAnimatedLength get y native "SVGFEComponentTransferElement_y_Getter";


  /** @domName SVGFEComponentTransferElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEComponentTransferElement_className_Getter";


  /** @domName SVGFEComponentTransferElement.style */
  CSSStyleDeclaration get style native "SVGFEComponentTransferElement_style_Getter";


  /** @domName SVGFEComponentTransferElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEComponentTransferElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFECompositeElement
class SVGFECompositeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFECompositeElement.internal(): super.internal();

  static const int SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;

  static const int SVG_FECOMPOSITE_OPERATOR_ATOP = 4;

  static const int SVG_FECOMPOSITE_OPERATOR_IN = 2;

  static const int SVG_FECOMPOSITE_OPERATOR_OUT = 3;

  static const int SVG_FECOMPOSITE_OPERATOR_OVER = 1;

  static const int SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;

  static const int SVG_FECOMPOSITE_OPERATOR_XOR = 5;


  /** @domName SVGFECompositeElement.in1 */
  SVGAnimatedString get in1 native "SVGFECompositeElement_in1_Getter";


  /** @domName SVGFECompositeElement.in2 */
  SVGAnimatedString get in2 native "SVGFECompositeElement_in2_Getter";


  /** @domName SVGFECompositeElement.k1 */
  SVGAnimatedNumber get k1 native "SVGFECompositeElement_k1_Getter";


  /** @domName SVGFECompositeElement.k2 */
  SVGAnimatedNumber get k2 native "SVGFECompositeElement_k2_Getter";


  /** @domName SVGFECompositeElement.k3 */
  SVGAnimatedNumber get k3 native "SVGFECompositeElement_k3_Getter";


  /** @domName SVGFECompositeElement.k4 */
  SVGAnimatedNumber get k4 native "SVGFECompositeElement_k4_Getter";


  /** @domName SVGFECompositeElement.operator */
  SVGAnimatedEnumeration get operator native "SVGFECompositeElement_operator_Getter";


  /** @domName SVGFECompositeElement.height */
  SVGAnimatedLength get height native "SVGFECompositeElement_height_Getter";


  /** @domName SVGFECompositeElement.result */
  SVGAnimatedString get result native "SVGFECompositeElement_result_Getter";


  /** @domName SVGFECompositeElement.width */
  SVGAnimatedLength get width native "SVGFECompositeElement_width_Getter";


  /** @domName SVGFECompositeElement.x */
  SVGAnimatedLength get x native "SVGFECompositeElement_x_Getter";


  /** @domName SVGFECompositeElement.y */
  SVGAnimatedLength get y native "SVGFECompositeElement_y_Getter";


  /** @domName SVGFECompositeElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFECompositeElement_className_Getter";


  /** @domName SVGFECompositeElement.style */
  CSSStyleDeclaration get style native "SVGFECompositeElement_style_Getter";


  /** @domName SVGFECompositeElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFECompositeElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEConvolveMatrixElement
class SVGFEConvolveMatrixElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEConvolveMatrixElement.internal(): super.internal();

  static const int SVG_EDGEMODE_DUPLICATE = 1;

  static const int SVG_EDGEMODE_NONE = 3;

  static const int SVG_EDGEMODE_UNKNOWN = 0;

  static const int SVG_EDGEMODE_WRAP = 2;


  /** @domName SVGFEConvolveMatrixElement.bias */
  SVGAnimatedNumber get bias native "SVGFEConvolveMatrixElement_bias_Getter";


  /** @domName SVGFEConvolveMatrixElement.divisor */
  SVGAnimatedNumber get divisor native "SVGFEConvolveMatrixElement_divisor_Getter";


  /** @domName SVGFEConvolveMatrixElement.edgeMode */
  SVGAnimatedEnumeration get edgeMode native "SVGFEConvolveMatrixElement_edgeMode_Getter";


  /** @domName SVGFEConvolveMatrixElement.in1 */
  SVGAnimatedString get in1 native "SVGFEConvolveMatrixElement_in1_Getter";


  /** @domName SVGFEConvolveMatrixElement.kernelMatrix */
  SVGAnimatedNumberList get kernelMatrix native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";


  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthX */
  SVGAnimatedNumber get kernelUnitLengthX native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";


  /** @domName SVGFEConvolveMatrixElement.kernelUnitLengthY */
  SVGAnimatedNumber get kernelUnitLengthY native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";


  /** @domName SVGFEConvolveMatrixElement.orderX */
  SVGAnimatedInteger get orderX native "SVGFEConvolveMatrixElement_orderX_Getter";


  /** @domName SVGFEConvolveMatrixElement.orderY */
  SVGAnimatedInteger get orderY native "SVGFEConvolveMatrixElement_orderY_Getter";


  /** @domName SVGFEConvolveMatrixElement.preserveAlpha */
  SVGAnimatedBoolean get preserveAlpha native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";


  /** @domName SVGFEConvolveMatrixElement.targetX */
  SVGAnimatedInteger get targetX native "SVGFEConvolveMatrixElement_targetX_Getter";


  /** @domName SVGFEConvolveMatrixElement.targetY */
  SVGAnimatedInteger get targetY native "SVGFEConvolveMatrixElement_targetY_Getter";


  /** @domName SVGFEConvolveMatrixElement.height */
  SVGAnimatedLength get height native "SVGFEConvolveMatrixElement_height_Getter";


  /** @domName SVGFEConvolveMatrixElement.result */
  SVGAnimatedString get result native "SVGFEConvolveMatrixElement_result_Getter";


  /** @domName SVGFEConvolveMatrixElement.width */
  SVGAnimatedLength get width native "SVGFEConvolveMatrixElement_width_Getter";


  /** @domName SVGFEConvolveMatrixElement.x */
  SVGAnimatedLength get x native "SVGFEConvolveMatrixElement_x_Getter";


  /** @domName SVGFEConvolveMatrixElement.y */
  SVGAnimatedLength get y native "SVGFEConvolveMatrixElement_y_Getter";


  /** @domName SVGFEConvolveMatrixElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEConvolveMatrixElement_className_Getter";


  /** @domName SVGFEConvolveMatrixElement.style */
  CSSStyleDeclaration get style native "SVGFEConvolveMatrixElement_style_Getter";


  /** @domName SVGFEConvolveMatrixElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEConvolveMatrixElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEDiffuseLightingElement
class SVGFEDiffuseLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEDiffuseLightingElement.internal(): super.internal();


  /** @domName SVGFEDiffuseLightingElement.diffuseConstant */
  SVGAnimatedNumber get diffuseConstant native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";


  /** @domName SVGFEDiffuseLightingElement.in1 */
  SVGAnimatedString get in1 native "SVGFEDiffuseLightingElement_in1_Getter";


  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthX */
  SVGAnimatedNumber get kernelUnitLengthX native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";


  /** @domName SVGFEDiffuseLightingElement.kernelUnitLengthY */
  SVGAnimatedNumber get kernelUnitLengthY native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";


  /** @domName SVGFEDiffuseLightingElement.surfaceScale */
  SVGAnimatedNumber get surfaceScale native "SVGFEDiffuseLightingElement_surfaceScale_Getter";


  /** @domName SVGFEDiffuseLightingElement.height */
  SVGAnimatedLength get height native "SVGFEDiffuseLightingElement_height_Getter";


  /** @domName SVGFEDiffuseLightingElement.result */
  SVGAnimatedString get result native "SVGFEDiffuseLightingElement_result_Getter";


  /** @domName SVGFEDiffuseLightingElement.width */
  SVGAnimatedLength get width native "SVGFEDiffuseLightingElement_width_Getter";


  /** @domName SVGFEDiffuseLightingElement.x */
  SVGAnimatedLength get x native "SVGFEDiffuseLightingElement_x_Getter";


  /** @domName SVGFEDiffuseLightingElement.y */
  SVGAnimatedLength get y native "SVGFEDiffuseLightingElement_y_Getter";


  /** @domName SVGFEDiffuseLightingElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEDiffuseLightingElement_className_Getter";


  /** @domName SVGFEDiffuseLightingElement.style */
  CSSStyleDeclaration get style native "SVGFEDiffuseLightingElement_style_Getter";


  /** @domName SVGFEDiffuseLightingElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEDiffuseLightingElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEDisplacementMapElement
class SVGFEDisplacementMapElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEDisplacementMapElement.internal(): super.internal();

  static const int SVG_CHANNEL_A = 4;

  static const int SVG_CHANNEL_B = 3;

  static const int SVG_CHANNEL_G = 2;

  static const int SVG_CHANNEL_R = 1;

  static const int SVG_CHANNEL_UNKNOWN = 0;


  /** @domName SVGFEDisplacementMapElement.in1 */
  SVGAnimatedString get in1 native "SVGFEDisplacementMapElement_in1_Getter";


  /** @domName SVGFEDisplacementMapElement.in2 */
  SVGAnimatedString get in2 native "SVGFEDisplacementMapElement_in2_Getter";


  /** @domName SVGFEDisplacementMapElement.scale */
  SVGAnimatedNumber get scale native "SVGFEDisplacementMapElement_scale_Getter";


  /** @domName SVGFEDisplacementMapElement.xChannelSelector */
  SVGAnimatedEnumeration get xChannelSelector native "SVGFEDisplacementMapElement_xChannelSelector_Getter";


  /** @domName SVGFEDisplacementMapElement.yChannelSelector */
  SVGAnimatedEnumeration get yChannelSelector native "SVGFEDisplacementMapElement_yChannelSelector_Getter";


  /** @domName SVGFEDisplacementMapElement.height */
  SVGAnimatedLength get height native "SVGFEDisplacementMapElement_height_Getter";


  /** @domName SVGFEDisplacementMapElement.result */
  SVGAnimatedString get result native "SVGFEDisplacementMapElement_result_Getter";


  /** @domName SVGFEDisplacementMapElement.width */
  SVGAnimatedLength get width native "SVGFEDisplacementMapElement_width_Getter";


  /** @domName SVGFEDisplacementMapElement.x */
  SVGAnimatedLength get x native "SVGFEDisplacementMapElement_x_Getter";


  /** @domName SVGFEDisplacementMapElement.y */
  SVGAnimatedLength get y native "SVGFEDisplacementMapElement_y_Getter";


  /** @domName SVGFEDisplacementMapElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEDisplacementMapElement_className_Getter";


  /** @domName SVGFEDisplacementMapElement.style */
  CSSStyleDeclaration get style native "SVGFEDisplacementMapElement_style_Getter";


  /** @domName SVGFEDisplacementMapElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEDisplacementMapElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEDistantLightElement
class SVGFEDistantLightElement extends SVGElement {
  SVGFEDistantLightElement.internal(): super.internal();


  /** @domName SVGFEDistantLightElement.azimuth */
  SVGAnimatedNumber get azimuth native "SVGFEDistantLightElement_azimuth_Getter";


  /** @domName SVGFEDistantLightElement.elevation */
  SVGAnimatedNumber get elevation native "SVGFEDistantLightElement_elevation_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEDropShadowElement
class SVGFEDropShadowElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEDropShadowElement.internal(): super.internal();


  /** @domName SVGFEDropShadowElement.dx */
  SVGAnimatedNumber get dx native "SVGFEDropShadowElement_dx_Getter";


  /** @domName SVGFEDropShadowElement.dy */
  SVGAnimatedNumber get dy native "SVGFEDropShadowElement_dy_Getter";


  /** @domName SVGFEDropShadowElement.in1 */
  SVGAnimatedString get in1 native "SVGFEDropShadowElement_in1_Getter";


  /** @domName SVGFEDropShadowElement.stdDeviationX */
  SVGAnimatedNumber get stdDeviationX native "SVGFEDropShadowElement_stdDeviationX_Getter";


  /** @domName SVGFEDropShadowElement.stdDeviationY */
  SVGAnimatedNumber get stdDeviationY native "SVGFEDropShadowElement_stdDeviationY_Getter";


  /** @domName SVGFEDropShadowElement.setStdDeviation */
  void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEDropShadowElement_setStdDeviation_Callback";


  /** @domName SVGFEDropShadowElement.height */
  SVGAnimatedLength get height native "SVGFEDropShadowElement_height_Getter";


  /** @domName SVGFEDropShadowElement.result */
  SVGAnimatedString get result native "SVGFEDropShadowElement_result_Getter";


  /** @domName SVGFEDropShadowElement.width */
  SVGAnimatedLength get width native "SVGFEDropShadowElement_width_Getter";


  /** @domName SVGFEDropShadowElement.x */
  SVGAnimatedLength get x native "SVGFEDropShadowElement_x_Getter";


  /** @domName SVGFEDropShadowElement.y */
  SVGAnimatedLength get y native "SVGFEDropShadowElement_y_Getter";


  /** @domName SVGFEDropShadowElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEDropShadowElement_className_Getter";


  /** @domName SVGFEDropShadowElement.style */
  CSSStyleDeclaration get style native "SVGFEDropShadowElement_style_Getter";


  /** @domName SVGFEDropShadowElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEDropShadowElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEFloodElement
class SVGFEFloodElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEFloodElement.internal(): super.internal();


  /** @domName SVGFEFloodElement.height */
  SVGAnimatedLength get height native "SVGFEFloodElement_height_Getter";


  /** @domName SVGFEFloodElement.result */
  SVGAnimatedString get result native "SVGFEFloodElement_result_Getter";


  /** @domName SVGFEFloodElement.width */
  SVGAnimatedLength get width native "SVGFEFloodElement_width_Getter";


  /** @domName SVGFEFloodElement.x */
  SVGAnimatedLength get x native "SVGFEFloodElement_x_Getter";


  /** @domName SVGFEFloodElement.y */
  SVGAnimatedLength get y native "SVGFEFloodElement_y_Getter";


  /** @domName SVGFEFloodElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEFloodElement_className_Getter";


  /** @domName SVGFEFloodElement.style */
  CSSStyleDeclaration get style native "SVGFEFloodElement_style_Getter";


  /** @domName SVGFEFloodElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEFloodElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEFuncAElement
class SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
  SVGFEFuncAElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEFuncBElement
class SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
  SVGFEFuncBElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEFuncGElement
class SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
  SVGFEFuncGElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEFuncRElement
class SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
  SVGFEFuncRElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEGaussianBlurElement
class SVGFEGaussianBlurElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEGaussianBlurElement.internal(): super.internal();


  /** @domName SVGFEGaussianBlurElement.in1 */
  SVGAnimatedString get in1 native "SVGFEGaussianBlurElement_in1_Getter";


  /** @domName SVGFEGaussianBlurElement.stdDeviationX */
  SVGAnimatedNumber get stdDeviationX native "SVGFEGaussianBlurElement_stdDeviationX_Getter";


  /** @domName SVGFEGaussianBlurElement.stdDeviationY */
  SVGAnimatedNumber get stdDeviationY native "SVGFEGaussianBlurElement_stdDeviationY_Getter";


  /** @domName SVGFEGaussianBlurElement.setStdDeviation */
  void setStdDeviation(num stdDeviationX, num stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";


  /** @domName SVGFEGaussianBlurElement.height */
  SVGAnimatedLength get height native "SVGFEGaussianBlurElement_height_Getter";


  /** @domName SVGFEGaussianBlurElement.result */
  SVGAnimatedString get result native "SVGFEGaussianBlurElement_result_Getter";


  /** @domName SVGFEGaussianBlurElement.width */
  SVGAnimatedLength get width native "SVGFEGaussianBlurElement_width_Getter";


  /** @domName SVGFEGaussianBlurElement.x */
  SVGAnimatedLength get x native "SVGFEGaussianBlurElement_x_Getter";


  /** @domName SVGFEGaussianBlurElement.y */
  SVGAnimatedLength get y native "SVGFEGaussianBlurElement_y_Getter";


  /** @domName SVGFEGaussianBlurElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEGaussianBlurElement_className_Getter";


  /** @domName SVGFEGaussianBlurElement.style */
  CSSStyleDeclaration get style native "SVGFEGaussianBlurElement_style_Getter";


  /** @domName SVGFEGaussianBlurElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEGaussianBlurElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEImageElement
class SVGFEImageElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGFilterPrimitiveStandardAttributes, SVGExternalResourcesRequired {
  SVGFEImageElement.internal(): super.internal();


  /** @domName SVGFEImageElement.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFEImageElement_preserveAspectRatio_Getter";


  /** @domName SVGFEImageElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGFEImageElement_externalResourcesRequired_Getter";


  /** @domName SVGFEImageElement.height */
  SVGAnimatedLength get height native "SVGFEImageElement_height_Getter";


  /** @domName SVGFEImageElement.result */
  SVGAnimatedString get result native "SVGFEImageElement_result_Getter";


  /** @domName SVGFEImageElement.width */
  SVGAnimatedLength get width native "SVGFEImageElement_width_Getter";


  /** @domName SVGFEImageElement.x */
  SVGAnimatedLength get x native "SVGFEImageElement_x_Getter";


  /** @domName SVGFEImageElement.y */
  SVGAnimatedLength get y native "SVGFEImageElement_y_Getter";


  /** @domName SVGFEImageElement.xmllang */
  String get xmllang native "SVGFEImageElement_xmllang_Getter";


  /** @domName SVGFEImageElement.xmllang */
  void set xmllang(String value) native "SVGFEImageElement_xmllang_Setter";


  /** @domName SVGFEImageElement.xmlspace */
  String get xmlspace native "SVGFEImageElement_xmlspace_Getter";


  /** @domName SVGFEImageElement.xmlspace */
  void set xmlspace(String value) native "SVGFEImageElement_xmlspace_Setter";


  /** @domName SVGFEImageElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEImageElement_className_Getter";


  /** @domName SVGFEImageElement.style */
  CSSStyleDeclaration get style native "SVGFEImageElement_style_Getter";


  /** @domName SVGFEImageElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEImageElement_getPresentationAttribute_Callback";


  /** @domName SVGFEImageElement.href */
  SVGAnimatedString get href native "SVGFEImageElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEMergeElement
class SVGFEMergeElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEMergeElement.internal(): super.internal();


  /** @domName SVGFEMergeElement.height */
  SVGAnimatedLength get height native "SVGFEMergeElement_height_Getter";


  /** @domName SVGFEMergeElement.result */
  SVGAnimatedString get result native "SVGFEMergeElement_result_Getter";


  /** @domName SVGFEMergeElement.width */
  SVGAnimatedLength get width native "SVGFEMergeElement_width_Getter";


  /** @domName SVGFEMergeElement.x */
  SVGAnimatedLength get x native "SVGFEMergeElement_x_Getter";


  /** @domName SVGFEMergeElement.y */
  SVGAnimatedLength get y native "SVGFEMergeElement_y_Getter";


  /** @domName SVGFEMergeElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEMergeElement_className_Getter";


  /** @domName SVGFEMergeElement.style */
  CSSStyleDeclaration get style native "SVGFEMergeElement_style_Getter";


  /** @domName SVGFEMergeElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEMergeElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEMergeNodeElement
class SVGFEMergeNodeElement extends SVGElement {
  SVGFEMergeNodeElement.internal(): super.internal();


  /** @domName SVGFEMergeNodeElement.in1 */
  SVGAnimatedString get in1 native "SVGFEMergeNodeElement_in1_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEMorphologyElement
class SVGFEMorphologyElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEMorphologyElement.internal(): super.internal();

  static const int SVG_MORPHOLOGY_OPERATOR_DILATE = 2;

  static const int SVG_MORPHOLOGY_OPERATOR_ERODE = 1;

  static const int SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;


  /** @domName SVGFEMorphologyElement.in1 */
  SVGAnimatedString get in1 native "SVGFEMorphologyElement_in1_Getter";


  /** @domName SVGFEMorphologyElement.operator */
  SVGAnimatedEnumeration get operator native "SVGFEMorphologyElement_operator_Getter";


  /** @domName SVGFEMorphologyElement.radiusX */
  SVGAnimatedNumber get radiusX native "SVGFEMorphologyElement_radiusX_Getter";


  /** @domName SVGFEMorphologyElement.radiusY */
  SVGAnimatedNumber get radiusY native "SVGFEMorphologyElement_radiusY_Getter";


  /** @domName SVGFEMorphologyElement.setRadius */
  void setRadius(num radiusX, num radiusY) native "SVGFEMorphologyElement_setRadius_Callback";


  /** @domName SVGFEMorphologyElement.height */
  SVGAnimatedLength get height native "SVGFEMorphologyElement_height_Getter";


  /** @domName SVGFEMorphologyElement.result */
  SVGAnimatedString get result native "SVGFEMorphologyElement_result_Getter";


  /** @domName SVGFEMorphologyElement.width */
  SVGAnimatedLength get width native "SVGFEMorphologyElement_width_Getter";


  /** @domName SVGFEMorphologyElement.x */
  SVGAnimatedLength get x native "SVGFEMorphologyElement_x_Getter";


  /** @domName SVGFEMorphologyElement.y */
  SVGAnimatedLength get y native "SVGFEMorphologyElement_y_Getter";


  /** @domName SVGFEMorphologyElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEMorphologyElement_className_Getter";


  /** @domName SVGFEMorphologyElement.style */
  CSSStyleDeclaration get style native "SVGFEMorphologyElement_style_Getter";


  /** @domName SVGFEMorphologyElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEMorphologyElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEOffsetElement
class SVGFEOffsetElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFEOffsetElement.internal(): super.internal();


  /** @domName SVGFEOffsetElement.dx */
  SVGAnimatedNumber get dx native "SVGFEOffsetElement_dx_Getter";


  /** @domName SVGFEOffsetElement.dy */
  SVGAnimatedNumber get dy native "SVGFEOffsetElement_dy_Getter";


  /** @domName SVGFEOffsetElement.in1 */
  SVGAnimatedString get in1 native "SVGFEOffsetElement_in1_Getter";


  /** @domName SVGFEOffsetElement.height */
  SVGAnimatedLength get height native "SVGFEOffsetElement_height_Getter";


  /** @domName SVGFEOffsetElement.result */
  SVGAnimatedString get result native "SVGFEOffsetElement_result_Getter";


  /** @domName SVGFEOffsetElement.width */
  SVGAnimatedLength get width native "SVGFEOffsetElement_width_Getter";


  /** @domName SVGFEOffsetElement.x */
  SVGAnimatedLength get x native "SVGFEOffsetElement_x_Getter";


  /** @domName SVGFEOffsetElement.y */
  SVGAnimatedLength get y native "SVGFEOffsetElement_y_Getter";


  /** @domName SVGFEOffsetElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFEOffsetElement_className_Getter";


  /** @domName SVGFEOffsetElement.style */
  CSSStyleDeclaration get style native "SVGFEOffsetElement_style_Getter";


  /** @domName SVGFEOffsetElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFEOffsetElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFEPointLightElement
class SVGFEPointLightElement extends SVGElement {
  SVGFEPointLightElement.internal(): super.internal();


  /** @domName SVGFEPointLightElement.x */
  SVGAnimatedNumber get x native "SVGFEPointLightElement_x_Getter";


  /** @domName SVGFEPointLightElement.y */
  SVGAnimatedNumber get y native "SVGFEPointLightElement_y_Getter";


  /** @domName SVGFEPointLightElement.z */
  SVGAnimatedNumber get z native "SVGFEPointLightElement_z_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFESpecularLightingElement
class SVGFESpecularLightingElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFESpecularLightingElement.internal(): super.internal();


  /** @domName SVGFESpecularLightingElement.in1 */
  SVGAnimatedString get in1 native "SVGFESpecularLightingElement_in1_Getter";


  /** @domName SVGFESpecularLightingElement.specularConstant */
  SVGAnimatedNumber get specularConstant native "SVGFESpecularLightingElement_specularConstant_Getter";


  /** @domName SVGFESpecularLightingElement.specularExponent */
  SVGAnimatedNumber get specularExponent native "SVGFESpecularLightingElement_specularExponent_Getter";


  /** @domName SVGFESpecularLightingElement.surfaceScale */
  SVGAnimatedNumber get surfaceScale native "SVGFESpecularLightingElement_surfaceScale_Getter";


  /** @domName SVGFESpecularLightingElement.height */
  SVGAnimatedLength get height native "SVGFESpecularLightingElement_height_Getter";


  /** @domName SVGFESpecularLightingElement.result */
  SVGAnimatedString get result native "SVGFESpecularLightingElement_result_Getter";


  /** @domName SVGFESpecularLightingElement.width */
  SVGAnimatedLength get width native "SVGFESpecularLightingElement_width_Getter";


  /** @domName SVGFESpecularLightingElement.x */
  SVGAnimatedLength get x native "SVGFESpecularLightingElement_x_Getter";


  /** @domName SVGFESpecularLightingElement.y */
  SVGAnimatedLength get y native "SVGFESpecularLightingElement_y_Getter";


  /** @domName SVGFESpecularLightingElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFESpecularLightingElement_className_Getter";


  /** @domName SVGFESpecularLightingElement.style */
  CSSStyleDeclaration get style native "SVGFESpecularLightingElement_style_Getter";


  /** @domName SVGFESpecularLightingElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFESpecularLightingElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFESpotLightElement
class SVGFESpotLightElement extends SVGElement {
  SVGFESpotLightElement.internal(): super.internal();


  /** @domName SVGFESpotLightElement.limitingConeAngle */
  SVGAnimatedNumber get limitingConeAngle native "SVGFESpotLightElement_limitingConeAngle_Getter";


  /** @domName SVGFESpotLightElement.pointsAtX */
  SVGAnimatedNumber get pointsAtX native "SVGFESpotLightElement_pointsAtX_Getter";


  /** @domName SVGFESpotLightElement.pointsAtY */
  SVGAnimatedNumber get pointsAtY native "SVGFESpotLightElement_pointsAtY_Getter";


  /** @domName SVGFESpotLightElement.pointsAtZ */
  SVGAnimatedNumber get pointsAtZ native "SVGFESpotLightElement_pointsAtZ_Getter";


  /** @domName SVGFESpotLightElement.specularExponent */
  SVGAnimatedNumber get specularExponent native "SVGFESpotLightElement_specularExponent_Getter";


  /** @domName SVGFESpotLightElement.x */
  SVGAnimatedNumber get x native "SVGFESpotLightElement_x_Getter";


  /** @domName SVGFESpotLightElement.y */
  SVGAnimatedNumber get y native "SVGFESpotLightElement_y_Getter";


  /** @domName SVGFESpotLightElement.z */
  SVGAnimatedNumber get z native "SVGFESpotLightElement_z_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFETileElement
class SVGFETileElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFETileElement.internal(): super.internal();


  /** @domName SVGFETileElement.in1 */
  SVGAnimatedString get in1 native "SVGFETileElement_in1_Getter";


  /** @domName SVGFETileElement.height */
  SVGAnimatedLength get height native "SVGFETileElement_height_Getter";


  /** @domName SVGFETileElement.result */
  SVGAnimatedString get result native "SVGFETileElement_result_Getter";


  /** @domName SVGFETileElement.width */
  SVGAnimatedLength get width native "SVGFETileElement_width_Getter";


  /** @domName SVGFETileElement.x */
  SVGAnimatedLength get x native "SVGFETileElement_x_Getter";


  /** @domName SVGFETileElement.y */
  SVGAnimatedLength get y native "SVGFETileElement_y_Getter";


  /** @domName SVGFETileElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFETileElement_className_Getter";


  /** @domName SVGFETileElement.style */
  CSSStyleDeclaration get style native "SVGFETileElement_style_Getter";


  /** @domName SVGFETileElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFETileElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFETurbulenceElement
class SVGFETurbulenceElement extends SVGElement implements SVGFilterPrimitiveStandardAttributes {
  SVGFETurbulenceElement.internal(): super.internal();

  static const int SVG_STITCHTYPE_NOSTITCH = 2;

  static const int SVG_STITCHTYPE_STITCH = 1;

  static const int SVG_STITCHTYPE_UNKNOWN = 0;

  static const int SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;

  static const int SVG_TURBULENCE_TYPE_TURBULENCE = 2;

  static const int SVG_TURBULENCE_TYPE_UNKNOWN = 0;


  /** @domName SVGFETurbulenceElement.baseFrequencyX */
  SVGAnimatedNumber get baseFrequencyX native "SVGFETurbulenceElement_baseFrequencyX_Getter";


  /** @domName SVGFETurbulenceElement.baseFrequencyY */
  SVGAnimatedNumber get baseFrequencyY native "SVGFETurbulenceElement_baseFrequencyY_Getter";


  /** @domName SVGFETurbulenceElement.numOctaves */
  SVGAnimatedInteger get numOctaves native "SVGFETurbulenceElement_numOctaves_Getter";


  /** @domName SVGFETurbulenceElement.seed */
  SVGAnimatedNumber get seed native "SVGFETurbulenceElement_seed_Getter";


  /** @domName SVGFETurbulenceElement.stitchTiles */
  SVGAnimatedEnumeration get stitchTiles native "SVGFETurbulenceElement_stitchTiles_Getter";


  /** @domName SVGFETurbulenceElement.type */
  SVGAnimatedEnumeration get type native "SVGFETurbulenceElement_type_Getter";


  /** @domName SVGFETurbulenceElement.height */
  SVGAnimatedLength get height native "SVGFETurbulenceElement_height_Getter";


  /** @domName SVGFETurbulenceElement.result */
  SVGAnimatedString get result native "SVGFETurbulenceElement_result_Getter";


  /** @domName SVGFETurbulenceElement.width */
  SVGAnimatedLength get width native "SVGFETurbulenceElement_width_Getter";


  /** @domName SVGFETurbulenceElement.x */
  SVGAnimatedLength get x native "SVGFETurbulenceElement_x_Getter";


  /** @domName SVGFETurbulenceElement.y */
  SVGAnimatedLength get y native "SVGFETurbulenceElement_y_Getter";


  /** @domName SVGFETurbulenceElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFETurbulenceElement_className_Getter";


  /** @domName SVGFETurbulenceElement.style */
  CSSStyleDeclaration get style native "SVGFETurbulenceElement_style_Getter";


  /** @domName SVGFETurbulenceElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFETurbulenceElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFilterElement
class SVGFilterElement extends SVGElement implements SVGURIReference, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable {
  SVGFilterElement.internal(): super.internal();


  /** @domName SVGFilterElement.filterResX */
  SVGAnimatedInteger get filterResX native "SVGFilterElement_filterResX_Getter";


  /** @domName SVGFilterElement.filterResY */
  SVGAnimatedInteger get filterResY native "SVGFilterElement_filterResY_Getter";


  /** @domName SVGFilterElement.filterUnits */
  SVGAnimatedEnumeration get filterUnits native "SVGFilterElement_filterUnits_Getter";


  /** @domName SVGFilterElement.height */
  SVGAnimatedLength get height native "SVGFilterElement_height_Getter";


  /** @domName SVGFilterElement.primitiveUnits */
  SVGAnimatedEnumeration get primitiveUnits native "SVGFilterElement_primitiveUnits_Getter";


  /** @domName SVGFilterElement.width */
  SVGAnimatedLength get width native "SVGFilterElement_width_Getter";


  /** @domName SVGFilterElement.x */
  SVGAnimatedLength get x native "SVGFilterElement_x_Getter";


  /** @domName SVGFilterElement.y */
  SVGAnimatedLength get y native "SVGFilterElement_y_Getter";


  /** @domName SVGFilterElement.setFilterRes */
  void setFilterRes(int filterResX, int filterResY) native "SVGFilterElement_setFilterRes_Callback";


  /** @domName SVGFilterElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGFilterElement_externalResourcesRequired_Getter";


  /** @domName SVGFilterElement.xmllang */
  String get xmllang native "SVGFilterElement_xmllang_Getter";


  /** @domName SVGFilterElement.xmllang */
  void set xmllang(String value) native "SVGFilterElement_xmllang_Setter";


  /** @domName SVGFilterElement.xmlspace */
  String get xmlspace native "SVGFilterElement_xmlspace_Getter";


  /** @domName SVGFilterElement.xmlspace */
  void set xmlspace(String value) native "SVGFilterElement_xmlspace_Setter";


  /** @domName SVGFilterElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFilterElement_className_Getter";


  /** @domName SVGFilterElement.style */
  CSSStyleDeclaration get style native "SVGFilterElement_style_Getter";


  /** @domName SVGFilterElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFilterElement_getPresentationAttribute_Callback";


  /** @domName SVGFilterElement.href */
  SVGAnimatedString get href native "SVGFilterElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFilterPrimitiveStandardAttributes
class SVGFilterPrimitiveStandardAttributes extends NativeFieldWrapperClass1 implements SVGStylable {
  SVGFilterPrimitiveStandardAttributes.internal();


  /** @domName SVGFilterPrimitiveStandardAttributes.height */
  SVGAnimatedLength get height native "SVGFilterPrimitiveStandardAttributes_height_Getter";


  /** @domName SVGFilterPrimitiveStandardAttributes.result */
  SVGAnimatedString get result native "SVGFilterPrimitiveStandardAttributes_result_Getter";


  /** @domName SVGFilterPrimitiveStandardAttributes.width */
  SVGAnimatedLength get width native "SVGFilterPrimitiveStandardAttributes_width_Getter";


  /** @domName SVGFilterPrimitiveStandardAttributes.x */
  SVGAnimatedLength get x native "SVGFilterPrimitiveStandardAttributes_x_Getter";


  /** @domName SVGFilterPrimitiveStandardAttributes.y */
  SVGAnimatedLength get y native "SVGFilterPrimitiveStandardAttributes_y_Getter";


  /** @domName SVGFilterPrimitiveStandardAttributes.className */
  SVGAnimatedString get $dom_svgClassName native "SVGFilterPrimitiveStandardAttributes_className_Getter";


  /** @domName SVGFilterPrimitiveStandardAttributes.style */
  CSSStyleDeclaration get style native "SVGFilterPrimitiveStandardAttributes_style_Getter";


  /** @domName SVGFilterPrimitiveStandardAttributes.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGFilterPrimitiveStandardAttributes_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFitToViewBox
class SVGFitToViewBox extends NativeFieldWrapperClass1 {
  SVGFitToViewBox.internal();


  /** @domName SVGFitToViewBox.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGFitToViewBox_preserveAspectRatio_Getter";


  /** @domName SVGFitToViewBox.viewBox */
  SVGAnimatedRect get viewBox native "SVGFitToViewBox_viewBox_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGFontElement
class SVGFontElement extends SVGElement {
  SVGFontElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFontFaceElement
class SVGFontFaceElement extends SVGElement {
  SVGFontFaceElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFontFaceFormatElement
class SVGFontFaceFormatElement extends SVGElement {
  SVGFontFaceFormatElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFontFaceNameElement
class SVGFontFaceNameElement extends SVGElement {
  SVGFontFaceNameElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFontFaceSrcElement
class SVGFontFaceSrcElement extends SVGElement {
  SVGFontFaceSrcElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGFontFaceUriElement
class SVGFontFaceUriElement extends SVGElement {
  SVGFontFaceUriElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGForeignObjectElement
class SVGForeignObjectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGForeignObjectElement.internal(): super.internal();


  /** @domName SVGForeignObjectElement.height */
  SVGAnimatedLength get height native "SVGForeignObjectElement_height_Getter";


  /** @domName SVGForeignObjectElement.width */
  SVGAnimatedLength get width native "SVGForeignObjectElement_width_Getter";


  /** @domName SVGForeignObjectElement.x */
  SVGAnimatedLength get x native "SVGForeignObjectElement_x_Getter";


  /** @domName SVGForeignObjectElement.y */
  SVGAnimatedLength get y native "SVGForeignObjectElement_y_Getter";


  /** @domName SVGForeignObjectElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGForeignObjectElement_externalResourcesRequired_Getter";


  /** @domName SVGForeignObjectElement.xmllang */
  String get xmllang native "SVGForeignObjectElement_xmllang_Getter";


  /** @domName SVGForeignObjectElement.xmllang */
  void set xmllang(String value) native "SVGForeignObjectElement_xmllang_Setter";


  /** @domName SVGForeignObjectElement.xmlspace */
  String get xmlspace native "SVGForeignObjectElement_xmlspace_Getter";


  /** @domName SVGForeignObjectElement.xmlspace */
  void set xmlspace(String value) native "SVGForeignObjectElement_xmlspace_Setter";


  /** @domName SVGForeignObjectElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGForeignObjectElement_farthestViewportElement_Getter";


  /** @domName SVGForeignObjectElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGForeignObjectElement_nearestViewportElement_Getter";


  /** @domName SVGForeignObjectElement.getBBox */
  SVGRect getBBox() native "SVGForeignObjectElement_getBBox_Callback";


  /** @domName SVGForeignObjectElement.getCTM */
  SVGMatrix getCTM() native "SVGForeignObjectElement_getCTM_Callback";


  /** @domName SVGForeignObjectElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGForeignObjectElement_getScreenCTM_Callback";


  /** @domName SVGForeignObjectElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGForeignObjectElement_getTransformToElement_Callback";


  /** @domName SVGForeignObjectElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGForeignObjectElement_className_Getter";


  /** @domName SVGForeignObjectElement.style */
  CSSStyleDeclaration get style native "SVGForeignObjectElement_style_Getter";


  /** @domName SVGForeignObjectElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGForeignObjectElement_getPresentationAttribute_Callback";


  /** @domName SVGForeignObjectElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGForeignObjectElement_requiredExtensions_Getter";


  /** @domName SVGForeignObjectElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGForeignObjectElement_requiredFeatures_Getter";


  /** @domName SVGForeignObjectElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGForeignObjectElement_systemLanguage_Getter";


  /** @domName SVGForeignObjectElement.hasExtension */
  bool hasExtension(String extension) native "SVGForeignObjectElement_hasExtension_Callback";


  /** @domName SVGForeignObjectElement.transform */
  SVGAnimatedTransformList get transform native "SVGForeignObjectElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGGElement
class SVGGElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGGElement.internal(): super.internal();


  /** @domName SVGGElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGGElement_externalResourcesRequired_Getter";


  /** @domName SVGGElement.xmllang */
  String get xmllang native "SVGGElement_xmllang_Getter";


  /** @domName SVGGElement.xmllang */
  void set xmllang(String value) native "SVGGElement_xmllang_Setter";


  /** @domName SVGGElement.xmlspace */
  String get xmlspace native "SVGGElement_xmlspace_Getter";


  /** @domName SVGGElement.xmlspace */
  void set xmlspace(String value) native "SVGGElement_xmlspace_Setter";


  /** @domName SVGGElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGGElement_farthestViewportElement_Getter";


  /** @domName SVGGElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGGElement_nearestViewportElement_Getter";


  /** @domName SVGGElement.getBBox */
  SVGRect getBBox() native "SVGGElement_getBBox_Callback";


  /** @domName SVGGElement.getCTM */
  SVGMatrix getCTM() native "SVGGElement_getCTM_Callback";


  /** @domName SVGGElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGGElement_getScreenCTM_Callback";


  /** @domName SVGGElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGGElement_getTransformToElement_Callback";


  /** @domName SVGGElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGGElement_className_Getter";


  /** @domName SVGGElement.style */
  CSSStyleDeclaration get style native "SVGGElement_style_Getter";


  /** @domName SVGGElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGGElement_getPresentationAttribute_Callback";


  /** @domName SVGGElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGGElement_requiredExtensions_Getter";


  /** @domName SVGGElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGGElement_requiredFeatures_Getter";


  /** @domName SVGGElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGGElement_systemLanguage_Getter";


  /** @domName SVGGElement.hasExtension */
  bool hasExtension(String extension) native "SVGGElement_hasExtension_Callback";


  /** @domName SVGGElement.transform */
  SVGAnimatedTransformList get transform native "SVGGElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGGlyphElement
class SVGGlyphElement extends SVGElement {
  SVGGlyphElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGGlyphRefElement
class SVGGlyphRefElement extends SVGElement implements SVGURIReference, SVGStylable {
  SVGGlyphRefElement.internal(): super.internal();


  /** @domName SVGGlyphRefElement.dx */
  num get dx native "SVGGlyphRefElement_dx_Getter";


  /** @domName SVGGlyphRefElement.dx */
  void set dx(num value) native "SVGGlyphRefElement_dx_Setter";


  /** @domName SVGGlyphRefElement.dy */
  num get dy native "SVGGlyphRefElement_dy_Getter";


  /** @domName SVGGlyphRefElement.dy */
  void set dy(num value) native "SVGGlyphRefElement_dy_Setter";


  /** @domName SVGGlyphRefElement.format */
  String get format native "SVGGlyphRefElement_format_Getter";


  /** @domName SVGGlyphRefElement.format */
  void set format(String value) native "SVGGlyphRefElement_format_Setter";


  /** @domName SVGGlyphRefElement.glyphRef */
  String get glyphRef native "SVGGlyphRefElement_glyphRef_Getter";


  /** @domName SVGGlyphRefElement.glyphRef */
  void set glyphRef(String value) native "SVGGlyphRefElement_glyphRef_Setter";


  /** @domName SVGGlyphRefElement.x */
  num get x native "SVGGlyphRefElement_x_Getter";


  /** @domName SVGGlyphRefElement.x */
  void set x(num value) native "SVGGlyphRefElement_x_Setter";


  /** @domName SVGGlyphRefElement.y */
  num get y native "SVGGlyphRefElement_y_Getter";


  /** @domName SVGGlyphRefElement.y */
  void set y(num value) native "SVGGlyphRefElement_y_Setter";


  /** @domName SVGGlyphRefElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGGlyphRefElement_className_Getter";


  /** @domName SVGGlyphRefElement.style */
  CSSStyleDeclaration get style native "SVGGlyphRefElement_style_Getter";


  /** @domName SVGGlyphRefElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGGlyphRefElement_getPresentationAttribute_Callback";


  /** @domName SVGGlyphRefElement.href */
  SVGAnimatedString get href native "SVGGlyphRefElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGGradientElement
class SVGGradientElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired, SVGStylable {
  SVGGradientElement.internal(): super.internal();

  static const int SVG_SPREADMETHOD_PAD = 1;

  static const int SVG_SPREADMETHOD_REFLECT = 2;

  static const int SVG_SPREADMETHOD_REPEAT = 3;

  static const int SVG_SPREADMETHOD_UNKNOWN = 0;


  /** @domName SVGGradientElement.gradientTransform */
  SVGAnimatedTransformList get gradientTransform native "SVGGradientElement_gradientTransform_Getter";


  /** @domName SVGGradientElement.gradientUnits */
  SVGAnimatedEnumeration get gradientUnits native "SVGGradientElement_gradientUnits_Getter";


  /** @domName SVGGradientElement.spreadMethod */
  SVGAnimatedEnumeration get spreadMethod native "SVGGradientElement_spreadMethod_Getter";


  /** @domName SVGGradientElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGGradientElement_externalResourcesRequired_Getter";


  /** @domName SVGGradientElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGGradientElement_className_Getter";


  /** @domName SVGGradientElement.style */
  CSSStyleDeclaration get style native "SVGGradientElement_style_Getter";


  /** @domName SVGGradientElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGGradientElement_getPresentationAttribute_Callback";


  /** @domName SVGGradientElement.href */
  SVGAnimatedString get href native "SVGGradientElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGHKernElement
class SVGHKernElement extends SVGElement {
  SVGHKernElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGImageElement
class SVGImageElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
  SVGImageElement.internal(): super.internal();


  /** @domName SVGImageElement.height */
  SVGAnimatedLength get height native "SVGImageElement_height_Getter";


  /** @domName SVGImageElement.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGImageElement_preserveAspectRatio_Getter";


  /** @domName SVGImageElement.width */
  SVGAnimatedLength get width native "SVGImageElement_width_Getter";


  /** @domName SVGImageElement.x */
  SVGAnimatedLength get x native "SVGImageElement_x_Getter";


  /** @domName SVGImageElement.y */
  SVGAnimatedLength get y native "SVGImageElement_y_Getter";


  /** @domName SVGImageElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGImageElement_externalResourcesRequired_Getter";


  /** @domName SVGImageElement.xmllang */
  String get xmllang native "SVGImageElement_xmllang_Getter";


  /** @domName SVGImageElement.xmllang */
  void set xmllang(String value) native "SVGImageElement_xmllang_Setter";


  /** @domName SVGImageElement.xmlspace */
  String get xmlspace native "SVGImageElement_xmlspace_Getter";


  /** @domName SVGImageElement.xmlspace */
  void set xmlspace(String value) native "SVGImageElement_xmlspace_Setter";


  /** @domName SVGImageElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGImageElement_farthestViewportElement_Getter";


  /** @domName SVGImageElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGImageElement_nearestViewportElement_Getter";


  /** @domName SVGImageElement.getBBox */
  SVGRect getBBox() native "SVGImageElement_getBBox_Callback";


  /** @domName SVGImageElement.getCTM */
  SVGMatrix getCTM() native "SVGImageElement_getCTM_Callback";


  /** @domName SVGImageElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGImageElement_getScreenCTM_Callback";


  /** @domName SVGImageElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGImageElement_getTransformToElement_Callback";


  /** @domName SVGImageElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGImageElement_className_Getter";


  /** @domName SVGImageElement.style */
  CSSStyleDeclaration get style native "SVGImageElement_style_Getter";


  /** @domName SVGImageElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGImageElement_getPresentationAttribute_Callback";


  /** @domName SVGImageElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGImageElement_requiredExtensions_Getter";


  /** @domName SVGImageElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGImageElement_requiredFeatures_Getter";


  /** @domName SVGImageElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGImageElement_systemLanguage_Getter";


  /** @domName SVGImageElement.hasExtension */
  bool hasExtension(String extension) native "SVGImageElement_hasExtension_Callback";


  /** @domName SVGImageElement.transform */
  SVGAnimatedTransformList get transform native "SVGImageElement_transform_Getter";


  /** @domName SVGImageElement.href */
  SVGAnimatedString get href native "SVGImageElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGLangSpace
class SVGLangSpace extends NativeFieldWrapperClass1 {
  SVGLangSpace.internal();


  /** @domName SVGLangSpace.xmllang */
  String get xmllang native "SVGLangSpace_xmllang_Getter";


  /** @domName SVGLangSpace.xmllang */
  void set xmllang(String value) native "SVGLangSpace_xmllang_Setter";


  /** @domName SVGLangSpace.xmlspace */
  String get xmlspace native "SVGLangSpace_xmlspace_Getter";


  /** @domName SVGLangSpace.xmlspace */
  void set xmlspace(String value) native "SVGLangSpace_xmlspace_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGLength
class SVGLength extends NativeFieldWrapperClass1 {
  SVGLength.internal();

  static const int SVG_LENGTHTYPE_CM = 6;

  static const int SVG_LENGTHTYPE_EMS = 3;

  static const int SVG_LENGTHTYPE_EXS = 4;

  static const int SVG_LENGTHTYPE_IN = 8;

  static const int SVG_LENGTHTYPE_MM = 7;

  static const int SVG_LENGTHTYPE_NUMBER = 1;

  static const int SVG_LENGTHTYPE_PC = 10;

  static const int SVG_LENGTHTYPE_PERCENTAGE = 2;

  static const int SVG_LENGTHTYPE_PT = 9;

  static const int SVG_LENGTHTYPE_PX = 5;

  static const int SVG_LENGTHTYPE_UNKNOWN = 0;


  /** @domName SVGLength.unitType */
  int get unitType native "SVGLength_unitType_Getter";


  /** @domName SVGLength.value */
  num get value native "SVGLength_value_Getter";


  /** @domName SVGLength.value */
  void set value(num value) native "SVGLength_value_Setter";


  /** @domName SVGLength.valueAsString */
  String get valueAsString native "SVGLength_valueAsString_Getter";


  /** @domName SVGLength.valueAsString */
  void set valueAsString(String value) native "SVGLength_valueAsString_Setter";


  /** @domName SVGLength.valueInSpecifiedUnits */
  num get valueInSpecifiedUnits native "SVGLength_valueInSpecifiedUnits_Getter";


  /** @domName SVGLength.valueInSpecifiedUnits */
  void set valueInSpecifiedUnits(num value) native "SVGLength_valueInSpecifiedUnits_Setter";


  /** @domName SVGLength.convertToSpecifiedUnits */
  void convertToSpecifiedUnits(int unitType) native "SVGLength_convertToSpecifiedUnits_Callback";


  /** @domName SVGLength.newValueSpecifiedUnits */
  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGLengthList
class SVGLengthList extends NativeFieldWrapperClass1 implements List<SVGLength> {
  SVGLengthList.internal();


  /** @domName SVGLengthList.numberOfItems */
  int get numberOfItems native "SVGLengthList_numberOfItems_Getter";

  SVGLength operator[](int index) native "SVGLengthList_item_Callback";

  void operator[]=(int index, SVGLength value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGLength> mixins.
  // SVGLength is the element type.

  // From Iterable<SVGLength>:

  Iterator<SVGLength> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGLength>(this);
  }

  // From Collection<SVGLength>:

  void add(SVGLength value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGLength value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGLength> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGLength element) => _Collections.contains(this, element);

  void forEach(void f(SVGLength element)) => _Collections.forEach(this, f);

  Collection map(f(SVGLength element)) => _Collections.map(this, [], f);

  Collection<SVGLength> filter(bool f(SVGLength element)) =>
     _Collections.filter(this, <SVGLength>[], f);

  bool every(bool f(SVGLength element)) => _Collections.every(this, f);

  bool some(bool f(SVGLength element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGLength>:

  void sort([Comparator<SVGLength> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGLength element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGLength element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGLength get last => this[length - 1];

  SVGLength removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGLength> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGLength initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGLength> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGLength>[]);

  // -- end List<SVGLength> mixins.


  /** @domName SVGLengthList.appendItem */
  SVGLength appendItem(SVGLength item) native "SVGLengthList_appendItem_Callback";


  /** @domName SVGLengthList.clear */
  void clear() native "SVGLengthList_clear_Callback";


  /** @domName SVGLengthList.getItem */
  SVGLength getItem(int index) native "SVGLengthList_getItem_Callback";


  /** @domName SVGLengthList.initialize */
  SVGLength initialize(SVGLength item) native "SVGLengthList_initialize_Callback";


  /** @domName SVGLengthList.insertItemBefore */
  SVGLength insertItemBefore(SVGLength item, int index) native "SVGLengthList_insertItemBefore_Callback";


  /** @domName SVGLengthList.removeItem */
  SVGLength removeItem(int index) native "SVGLengthList_removeItem_Callback";


  /** @domName SVGLengthList.replaceItem */
  SVGLength replaceItem(SVGLength item, int index) native "SVGLengthList_replaceItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGLineElement
class SVGLineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGLineElement.internal(): super.internal();


  /** @domName SVGLineElement.x1 */
  SVGAnimatedLength get x1 native "SVGLineElement_x1_Getter";


  /** @domName SVGLineElement.x2 */
  SVGAnimatedLength get x2 native "SVGLineElement_x2_Getter";


  /** @domName SVGLineElement.y1 */
  SVGAnimatedLength get y1 native "SVGLineElement_y1_Getter";


  /** @domName SVGLineElement.y2 */
  SVGAnimatedLength get y2 native "SVGLineElement_y2_Getter";


  /** @domName SVGLineElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGLineElement_externalResourcesRequired_Getter";


  /** @domName SVGLineElement.xmllang */
  String get xmllang native "SVGLineElement_xmllang_Getter";


  /** @domName SVGLineElement.xmllang */
  void set xmllang(String value) native "SVGLineElement_xmllang_Setter";


  /** @domName SVGLineElement.xmlspace */
  String get xmlspace native "SVGLineElement_xmlspace_Getter";


  /** @domName SVGLineElement.xmlspace */
  void set xmlspace(String value) native "SVGLineElement_xmlspace_Setter";


  /** @domName SVGLineElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGLineElement_farthestViewportElement_Getter";


  /** @domName SVGLineElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGLineElement_nearestViewportElement_Getter";


  /** @domName SVGLineElement.getBBox */
  SVGRect getBBox() native "SVGLineElement_getBBox_Callback";


  /** @domName SVGLineElement.getCTM */
  SVGMatrix getCTM() native "SVGLineElement_getCTM_Callback";


  /** @domName SVGLineElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGLineElement_getScreenCTM_Callback";


  /** @domName SVGLineElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGLineElement_getTransformToElement_Callback";


  /** @domName SVGLineElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGLineElement_className_Getter";


  /** @domName SVGLineElement.style */
  CSSStyleDeclaration get style native "SVGLineElement_style_Getter";


  /** @domName SVGLineElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGLineElement_getPresentationAttribute_Callback";


  /** @domName SVGLineElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGLineElement_requiredExtensions_Getter";


  /** @domName SVGLineElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGLineElement_requiredFeatures_Getter";


  /** @domName SVGLineElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGLineElement_systemLanguage_Getter";


  /** @domName SVGLineElement.hasExtension */
  bool hasExtension(String extension) native "SVGLineElement_hasExtension_Callback";


  /** @domName SVGLineElement.transform */
  SVGAnimatedTransformList get transform native "SVGLineElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGLinearGradientElement
class SVGLinearGradientElement extends SVGGradientElement {
  SVGLinearGradientElement.internal(): super.internal();


  /** @domName SVGLinearGradientElement.x1 */
  SVGAnimatedLength get x1 native "SVGLinearGradientElement_x1_Getter";


  /** @domName SVGLinearGradientElement.x2 */
  SVGAnimatedLength get x2 native "SVGLinearGradientElement_x2_Getter";


  /** @domName SVGLinearGradientElement.y1 */
  SVGAnimatedLength get y1 native "SVGLinearGradientElement_y1_Getter";


  /** @domName SVGLinearGradientElement.y2 */
  SVGAnimatedLength get y2 native "SVGLinearGradientElement_y2_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGLocatable
class SVGLocatable extends NativeFieldWrapperClass1 {
  SVGLocatable.internal();


  /** @domName SVGLocatable.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGLocatable_farthestViewportElement_Getter";


  /** @domName SVGLocatable.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGLocatable_nearestViewportElement_Getter";


  /** @domName SVGLocatable.getBBox */
  SVGRect getBBox() native "SVGLocatable_getBBox_Callback";


  /** @domName SVGLocatable.getCTM */
  SVGMatrix getCTM() native "SVGLocatable_getCTM_Callback";


  /** @domName SVGLocatable.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGLocatable_getScreenCTM_Callback";


  /** @domName SVGLocatable.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGLocatable_getTransformToElement_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGMPathElement
class SVGMPathElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired {
  SVGMPathElement.internal(): super.internal();


  /** @domName SVGMPathElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGMPathElement_externalResourcesRequired_Getter";


  /** @domName SVGMPathElement.href */
  SVGAnimatedString get href native "SVGMPathElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGMarkerElement
class SVGMarkerElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable {
  SVGMarkerElement.internal(): super.internal();

  static const int SVG_MARKERUNITS_STROKEWIDTH = 2;

  static const int SVG_MARKERUNITS_UNKNOWN = 0;

  static const int SVG_MARKERUNITS_USERSPACEONUSE = 1;

  static const int SVG_MARKER_ORIENT_ANGLE = 2;

  static const int SVG_MARKER_ORIENT_AUTO = 1;

  static const int SVG_MARKER_ORIENT_UNKNOWN = 0;


  /** @domName SVGMarkerElement.markerHeight */
  SVGAnimatedLength get markerHeight native "SVGMarkerElement_markerHeight_Getter";


  /** @domName SVGMarkerElement.markerUnits */
  SVGAnimatedEnumeration get markerUnits native "SVGMarkerElement_markerUnits_Getter";


  /** @domName SVGMarkerElement.markerWidth */
  SVGAnimatedLength get markerWidth native "SVGMarkerElement_markerWidth_Getter";


  /** @domName SVGMarkerElement.orientAngle */
  SVGAnimatedAngle get orientAngle native "SVGMarkerElement_orientAngle_Getter";


  /** @domName SVGMarkerElement.orientType */
  SVGAnimatedEnumeration get orientType native "SVGMarkerElement_orientType_Getter";


  /** @domName SVGMarkerElement.refX */
  SVGAnimatedLength get refX native "SVGMarkerElement_refX_Getter";


  /** @domName SVGMarkerElement.refY */
  SVGAnimatedLength get refY native "SVGMarkerElement_refY_Getter";


  /** @domName SVGMarkerElement.setOrientToAngle */
  void setOrientToAngle(SVGAngle angle) native "SVGMarkerElement_setOrientToAngle_Callback";


  /** @domName SVGMarkerElement.setOrientToAuto */
  void setOrientToAuto() native "SVGMarkerElement_setOrientToAuto_Callback";


  /** @domName SVGMarkerElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGMarkerElement_externalResourcesRequired_Getter";


  /** @domName SVGMarkerElement.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGMarkerElement_preserveAspectRatio_Getter";


  /** @domName SVGMarkerElement.viewBox */
  SVGAnimatedRect get viewBox native "SVGMarkerElement_viewBox_Getter";


  /** @domName SVGMarkerElement.xmllang */
  String get xmllang native "SVGMarkerElement_xmllang_Getter";


  /** @domName SVGMarkerElement.xmllang */
  void set xmllang(String value) native "SVGMarkerElement_xmllang_Setter";


  /** @domName SVGMarkerElement.xmlspace */
  String get xmlspace native "SVGMarkerElement_xmlspace_Getter";


  /** @domName SVGMarkerElement.xmlspace */
  void set xmlspace(String value) native "SVGMarkerElement_xmlspace_Setter";


  /** @domName SVGMarkerElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGMarkerElement_className_Getter";


  /** @domName SVGMarkerElement.style */
  CSSStyleDeclaration get style native "SVGMarkerElement_style_Getter";


  /** @domName SVGMarkerElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGMarkerElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGMaskElement
class SVGMaskElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired {
  SVGMaskElement.internal(): super.internal();


  /** @domName SVGMaskElement.height */
  SVGAnimatedLength get height native "SVGMaskElement_height_Getter";


  /** @domName SVGMaskElement.maskContentUnits */
  SVGAnimatedEnumeration get maskContentUnits native "SVGMaskElement_maskContentUnits_Getter";


  /** @domName SVGMaskElement.maskUnits */
  SVGAnimatedEnumeration get maskUnits native "SVGMaskElement_maskUnits_Getter";


  /** @domName SVGMaskElement.width */
  SVGAnimatedLength get width native "SVGMaskElement_width_Getter";


  /** @domName SVGMaskElement.x */
  SVGAnimatedLength get x native "SVGMaskElement_x_Getter";


  /** @domName SVGMaskElement.y */
  SVGAnimatedLength get y native "SVGMaskElement_y_Getter";


  /** @domName SVGMaskElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGMaskElement_externalResourcesRequired_Getter";


  /** @domName SVGMaskElement.xmllang */
  String get xmllang native "SVGMaskElement_xmllang_Getter";


  /** @domName SVGMaskElement.xmllang */
  void set xmllang(String value) native "SVGMaskElement_xmllang_Setter";


  /** @domName SVGMaskElement.xmlspace */
  String get xmlspace native "SVGMaskElement_xmlspace_Getter";


  /** @domName SVGMaskElement.xmlspace */
  void set xmlspace(String value) native "SVGMaskElement_xmlspace_Setter";


  /** @domName SVGMaskElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGMaskElement_className_Getter";


  /** @domName SVGMaskElement.style */
  CSSStyleDeclaration get style native "SVGMaskElement_style_Getter";


  /** @domName SVGMaskElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGMaskElement_getPresentationAttribute_Callback";


  /** @domName SVGMaskElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGMaskElement_requiredExtensions_Getter";


  /** @domName SVGMaskElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGMaskElement_requiredFeatures_Getter";


  /** @domName SVGMaskElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGMaskElement_systemLanguage_Getter";


  /** @domName SVGMaskElement.hasExtension */
  bool hasExtension(String extension) native "SVGMaskElement_hasExtension_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGMatrix
class SVGMatrix extends NativeFieldWrapperClass1 {
  SVGMatrix.internal();


  /** @domName SVGMatrix.a */
  num get a native "SVGMatrix_a_Getter";


  /** @domName SVGMatrix.a */
  void set a(num value) native "SVGMatrix_a_Setter";


  /** @domName SVGMatrix.b */
  num get b native "SVGMatrix_b_Getter";


  /** @domName SVGMatrix.b */
  void set b(num value) native "SVGMatrix_b_Setter";


  /** @domName SVGMatrix.c */
  num get c native "SVGMatrix_c_Getter";


  /** @domName SVGMatrix.c */
  void set c(num value) native "SVGMatrix_c_Setter";


  /** @domName SVGMatrix.d */
  num get d native "SVGMatrix_d_Getter";


  /** @domName SVGMatrix.d */
  void set d(num value) native "SVGMatrix_d_Setter";


  /** @domName SVGMatrix.e */
  num get e native "SVGMatrix_e_Getter";


  /** @domName SVGMatrix.e */
  void set e(num value) native "SVGMatrix_e_Setter";


  /** @domName SVGMatrix.f */
  num get f native "SVGMatrix_f_Getter";


  /** @domName SVGMatrix.f */
  void set f(num value) native "SVGMatrix_f_Setter";


  /** @domName SVGMatrix.flipX */
  SVGMatrix flipX() native "SVGMatrix_flipX_Callback";


  /** @domName SVGMatrix.flipY */
  SVGMatrix flipY() native "SVGMatrix_flipY_Callback";


  /** @domName SVGMatrix.inverse */
  SVGMatrix inverse() native "SVGMatrix_inverse_Callback";


  /** @domName SVGMatrix.multiply */
  SVGMatrix multiply(SVGMatrix secondMatrix) native "SVGMatrix_multiply_Callback";


  /** @domName SVGMatrix.rotate */
  SVGMatrix rotate(num angle) native "SVGMatrix_rotate_Callback";


  /** @domName SVGMatrix.rotateFromVector */
  SVGMatrix rotateFromVector(num x, num y) native "SVGMatrix_rotateFromVector_Callback";


  /** @domName SVGMatrix.scale */
  SVGMatrix scale(num scaleFactor) native "SVGMatrix_scale_Callback";


  /** @domName SVGMatrix.scaleNonUniform */
  SVGMatrix scaleNonUniform(num scaleFactorX, num scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";


  /** @domName SVGMatrix.skewX */
  SVGMatrix skewX(num angle) native "SVGMatrix_skewX_Callback";


  /** @domName SVGMatrix.skewY */
  SVGMatrix skewY(num angle) native "SVGMatrix_skewY_Callback";


  /** @domName SVGMatrix.translate */
  SVGMatrix translate(num x, num y) native "SVGMatrix_translate_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGMetadataElement
class SVGMetadataElement extends SVGElement {
  SVGMetadataElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGMissingGlyphElement
class SVGMissingGlyphElement extends SVGElement {
  SVGMissingGlyphElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGNumber
class SVGNumber extends NativeFieldWrapperClass1 {
  SVGNumber.internal();


  /** @domName SVGNumber.value */
  num get value native "SVGNumber_value_Getter";


  /** @domName SVGNumber.value */
  void set value(num value) native "SVGNumber_value_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGNumberList
class SVGNumberList extends NativeFieldWrapperClass1 implements List<SVGNumber> {
  SVGNumberList.internal();


  /** @domName SVGNumberList.numberOfItems */
  int get numberOfItems native "SVGNumberList_numberOfItems_Getter";

  SVGNumber operator[](int index) native "SVGNumberList_item_Callback";

  void operator[]=(int index, SVGNumber value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGNumber> mixins.
  // SVGNumber is the element type.

  // From Iterable<SVGNumber>:

  Iterator<SVGNumber> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGNumber>(this);
  }

  // From Collection<SVGNumber>:

  void add(SVGNumber value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGNumber value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGNumber> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGNumber element) => _Collections.contains(this, element);

  void forEach(void f(SVGNumber element)) => _Collections.forEach(this, f);

  Collection map(f(SVGNumber element)) => _Collections.map(this, [], f);

  Collection<SVGNumber> filter(bool f(SVGNumber element)) =>
     _Collections.filter(this, <SVGNumber>[], f);

  bool every(bool f(SVGNumber element)) => _Collections.every(this, f);

  bool some(bool f(SVGNumber element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGNumber>:

  void sort([Comparator<SVGNumber> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGNumber element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGNumber element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGNumber get last => this[length - 1];

  SVGNumber removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGNumber> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGNumber initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGNumber> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGNumber>[]);

  // -- end List<SVGNumber> mixins.


  /** @domName SVGNumberList.appendItem */
  SVGNumber appendItem(SVGNumber item) native "SVGNumberList_appendItem_Callback";


  /** @domName SVGNumberList.clear */
  void clear() native "SVGNumberList_clear_Callback";


  /** @domName SVGNumberList.getItem */
  SVGNumber getItem(int index) native "SVGNumberList_getItem_Callback";


  /** @domName SVGNumberList.initialize */
  SVGNumber initialize(SVGNumber item) native "SVGNumberList_initialize_Callback";


  /** @domName SVGNumberList.insertItemBefore */
  SVGNumber insertItemBefore(SVGNumber item, int index) native "SVGNumberList_insertItemBefore_Callback";


  /** @domName SVGNumberList.removeItem */
  SVGNumber removeItem(int index) native "SVGNumberList_removeItem_Callback";


  /** @domName SVGNumberList.replaceItem */
  SVGNumber replaceItem(SVGNumber item, int index) native "SVGNumberList_replaceItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPaint
class SVGPaint extends SVGColor {
  SVGPaint.internal(): super.internal();

  static const int SVG_PAINTTYPE_CURRENTCOLOR = 102;

  static const int SVG_PAINTTYPE_NONE = 101;

  static const int SVG_PAINTTYPE_RGBCOLOR = 1;

  static const int SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR = 2;

  static const int SVG_PAINTTYPE_UNKNOWN = 0;

  static const int SVG_PAINTTYPE_URI = 107;

  static const int SVG_PAINTTYPE_URI_CURRENTCOLOR = 104;

  static const int SVG_PAINTTYPE_URI_NONE = 103;

  static const int SVG_PAINTTYPE_URI_RGBCOLOR = 105;

  static const int SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR = 106;


  /** @domName SVGPaint.paintType */
  int get paintType native "SVGPaint_paintType_Getter";


  /** @domName SVGPaint.uri */
  String get uri native "SVGPaint_uri_Getter";


  /** @domName SVGPaint.setPaint */
  void setPaint(int paintType, String uri, String rgbColor, String iccColor) native "SVGPaint_setPaint_Callback";


  /** @domName SVGPaint.setUri */
  void setUri(String uri) native "SVGPaint_setUri_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathElement
class SVGPathElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGPathElement.internal(): super.internal();


  /** @domName SVGPathElement.animatedNormalizedPathSegList */
  SVGPathSegList get animatedNormalizedPathSegList native "SVGPathElement_animatedNormalizedPathSegList_Getter";


  /** @domName SVGPathElement.animatedPathSegList */
  SVGPathSegList get animatedPathSegList native "SVGPathElement_animatedPathSegList_Getter";


  /** @domName SVGPathElement.normalizedPathSegList */
  SVGPathSegList get normalizedPathSegList native "SVGPathElement_normalizedPathSegList_Getter";


  /** @domName SVGPathElement.pathLength */
  SVGAnimatedNumber get pathLength native "SVGPathElement_pathLength_Getter";


  /** @domName SVGPathElement.pathSegList */
  SVGPathSegList get pathSegList native "SVGPathElement_pathSegList_Getter";


  /** @domName SVGPathElement.createSVGPathSegArcAbs */
  SVGPathSegArcAbs createSVGPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegArcRel */
  SVGPathSegArcRel createSVGPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegClosePath */
  SVGPathSegClosePath createSVGPathSegClosePath() native "SVGPathElement_createSVGPathSegClosePath_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicAbs */
  SVGPathSegCurvetoCubicAbs createSVGPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicRel */
  SVGPathSegCurvetoCubicRel createSVGPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs */
  SVGPathSegCurvetoCubicSmoothAbs createSVGPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel */
  SVGPathSegCurvetoCubicSmoothRel createSVGPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticAbs */
  SVGPathSegCurvetoQuadraticAbs createSVGPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticRel */
  SVGPathSegCurvetoQuadraticRel createSVGPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs */
  SVGPathSegCurvetoQuadraticSmoothAbs createSVGPathSegCurvetoQuadraticSmoothAbs(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel */
  SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(num x, num y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegLinetoAbs */
  SVGPathSegLinetoAbs createSVGPathSegLinetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalAbs */
  SVGPathSegLinetoHorizontalAbs createSVGPathSegLinetoHorizontalAbs(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegLinetoHorizontalRel */
  SVGPathSegLinetoHorizontalRel createSVGPathSegLinetoHorizontalRel(num x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegLinetoRel */
  SVGPathSegLinetoRel createSVGPathSegLinetoRel(num x, num y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalAbs */
  SVGPathSegLinetoVerticalAbs createSVGPathSegLinetoVerticalAbs(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegLinetoVerticalRel */
  SVGPathSegLinetoVerticalRel createSVGPathSegLinetoVerticalRel(num y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";


  /** @domName SVGPathElement.createSVGPathSegMovetoAbs */
  SVGPathSegMovetoAbs createSVGPathSegMovetoAbs(num x, num y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";


  /** @domName SVGPathElement.createSVGPathSegMovetoRel */
  SVGPathSegMovetoRel createSVGPathSegMovetoRel(num x, num y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";


  /** @domName SVGPathElement.getPathSegAtLength */
  int getPathSegAtLength(num distance) native "SVGPathElement_getPathSegAtLength_Callback";


  /** @domName SVGPathElement.getPointAtLength */
  SVGPoint getPointAtLength(num distance) native "SVGPathElement_getPointAtLength_Callback";


  /** @domName SVGPathElement.getTotalLength */
  num getTotalLength() native "SVGPathElement_getTotalLength_Callback";


  /** @domName SVGPathElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGPathElement_externalResourcesRequired_Getter";


  /** @domName SVGPathElement.xmllang */
  String get xmllang native "SVGPathElement_xmllang_Getter";


  /** @domName SVGPathElement.xmllang */
  void set xmllang(String value) native "SVGPathElement_xmllang_Setter";


  /** @domName SVGPathElement.xmlspace */
  String get xmlspace native "SVGPathElement_xmlspace_Getter";


  /** @domName SVGPathElement.xmlspace */
  void set xmlspace(String value) native "SVGPathElement_xmlspace_Setter";


  /** @domName SVGPathElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGPathElement_farthestViewportElement_Getter";


  /** @domName SVGPathElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGPathElement_nearestViewportElement_Getter";


  /** @domName SVGPathElement.getBBox */
  SVGRect getBBox() native "SVGPathElement_getBBox_Callback";


  /** @domName SVGPathElement.getCTM */
  SVGMatrix getCTM() native "SVGPathElement_getCTM_Callback";


  /** @domName SVGPathElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGPathElement_getScreenCTM_Callback";


  /** @domName SVGPathElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGPathElement_getTransformToElement_Callback";


  /** @domName SVGPathElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGPathElement_className_Getter";


  /** @domName SVGPathElement.style */
  CSSStyleDeclaration get style native "SVGPathElement_style_Getter";


  /** @domName SVGPathElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGPathElement_getPresentationAttribute_Callback";


  /** @domName SVGPathElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGPathElement_requiredExtensions_Getter";


  /** @domName SVGPathElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGPathElement_requiredFeatures_Getter";


  /** @domName SVGPathElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGPathElement_systemLanguage_Getter";


  /** @domName SVGPathElement.hasExtension */
  bool hasExtension(String extension) native "SVGPathElement_hasExtension_Callback";


  /** @domName SVGPathElement.transform */
  SVGAnimatedTransformList get transform native "SVGPathElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSeg
class SVGPathSeg extends NativeFieldWrapperClass1 {
  SVGPathSeg.internal();

  static const int PATHSEG_ARC_ABS = 10;

  static const int PATHSEG_ARC_REL = 11;

  static const int PATHSEG_CLOSEPATH = 1;

  static const int PATHSEG_CURVETO_CUBIC_ABS = 6;

  static const int PATHSEG_CURVETO_CUBIC_REL = 7;

  static const int PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;

  static const int PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;

  static const int PATHSEG_CURVETO_QUADRATIC_ABS = 8;

  static const int PATHSEG_CURVETO_QUADRATIC_REL = 9;

  static const int PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;

  static const int PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;

  static const int PATHSEG_LINETO_ABS = 4;

  static const int PATHSEG_LINETO_HORIZONTAL_ABS = 12;

  static const int PATHSEG_LINETO_HORIZONTAL_REL = 13;

  static const int PATHSEG_LINETO_REL = 5;

  static const int PATHSEG_LINETO_VERTICAL_ABS = 14;

  static const int PATHSEG_LINETO_VERTICAL_REL = 15;

  static const int PATHSEG_MOVETO_ABS = 2;

  static const int PATHSEG_MOVETO_REL = 3;

  static const int PATHSEG_UNKNOWN = 0;


  /** @domName SVGPathSeg.pathSegType */
  int get pathSegType native "SVGPathSeg_pathSegType_Getter";


  /** @domName SVGPathSeg.pathSegTypeAsLetter */
  String get pathSegTypeAsLetter native "SVGPathSeg_pathSegTypeAsLetter_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegArcAbs
class SVGPathSegArcAbs extends SVGPathSeg {
  SVGPathSegArcAbs.internal(): super.internal();


  /** @domName SVGPathSegArcAbs.angle */
  num get angle native "SVGPathSegArcAbs_angle_Getter";


  /** @domName SVGPathSegArcAbs.angle */
  void set angle(num value) native "SVGPathSegArcAbs_angle_Setter";


  /** @domName SVGPathSegArcAbs.largeArcFlag */
  bool get largeArcFlag native "SVGPathSegArcAbs_largeArcFlag_Getter";


  /** @domName SVGPathSegArcAbs.largeArcFlag */
  void set largeArcFlag(bool value) native "SVGPathSegArcAbs_largeArcFlag_Setter";


  /** @domName SVGPathSegArcAbs.r1 */
  num get r1 native "SVGPathSegArcAbs_r1_Getter";


  /** @domName SVGPathSegArcAbs.r1 */
  void set r1(num value) native "SVGPathSegArcAbs_r1_Setter";


  /** @domName SVGPathSegArcAbs.r2 */
  num get r2 native "SVGPathSegArcAbs_r2_Getter";


  /** @domName SVGPathSegArcAbs.r2 */
  void set r2(num value) native "SVGPathSegArcAbs_r2_Setter";


  /** @domName SVGPathSegArcAbs.sweepFlag */
  bool get sweepFlag native "SVGPathSegArcAbs_sweepFlag_Getter";


  /** @domName SVGPathSegArcAbs.sweepFlag */
  void set sweepFlag(bool value) native "SVGPathSegArcAbs_sweepFlag_Setter";


  /** @domName SVGPathSegArcAbs.x */
  num get x native "SVGPathSegArcAbs_x_Getter";


  /** @domName SVGPathSegArcAbs.x */
  void set x(num value) native "SVGPathSegArcAbs_x_Setter";


  /** @domName SVGPathSegArcAbs.y */
  num get y native "SVGPathSegArcAbs_y_Getter";


  /** @domName SVGPathSegArcAbs.y */
  void set y(num value) native "SVGPathSegArcAbs_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegArcRel
class SVGPathSegArcRel extends SVGPathSeg {
  SVGPathSegArcRel.internal(): super.internal();


  /** @domName SVGPathSegArcRel.angle */
  num get angle native "SVGPathSegArcRel_angle_Getter";


  /** @domName SVGPathSegArcRel.angle */
  void set angle(num value) native "SVGPathSegArcRel_angle_Setter";


  /** @domName SVGPathSegArcRel.largeArcFlag */
  bool get largeArcFlag native "SVGPathSegArcRel_largeArcFlag_Getter";


  /** @domName SVGPathSegArcRel.largeArcFlag */
  void set largeArcFlag(bool value) native "SVGPathSegArcRel_largeArcFlag_Setter";


  /** @domName SVGPathSegArcRel.r1 */
  num get r1 native "SVGPathSegArcRel_r1_Getter";


  /** @domName SVGPathSegArcRel.r1 */
  void set r1(num value) native "SVGPathSegArcRel_r1_Setter";


  /** @domName SVGPathSegArcRel.r2 */
  num get r2 native "SVGPathSegArcRel_r2_Getter";


  /** @domName SVGPathSegArcRel.r2 */
  void set r2(num value) native "SVGPathSegArcRel_r2_Setter";


  /** @domName SVGPathSegArcRel.sweepFlag */
  bool get sweepFlag native "SVGPathSegArcRel_sweepFlag_Getter";


  /** @domName SVGPathSegArcRel.sweepFlag */
  void set sweepFlag(bool value) native "SVGPathSegArcRel_sweepFlag_Setter";


  /** @domName SVGPathSegArcRel.x */
  num get x native "SVGPathSegArcRel_x_Getter";


  /** @domName SVGPathSegArcRel.x */
  void set x(num value) native "SVGPathSegArcRel_x_Setter";


  /** @domName SVGPathSegArcRel.y */
  num get y native "SVGPathSegArcRel_y_Getter";


  /** @domName SVGPathSegArcRel.y */
  void set y(num value) native "SVGPathSegArcRel_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegClosePath
class SVGPathSegClosePath extends SVGPathSeg {
  SVGPathSegClosePath.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoCubicAbs
class SVGPathSegCurvetoCubicAbs extends SVGPathSeg {
  SVGPathSegCurvetoCubicAbs.internal(): super.internal();


  /** @domName SVGPathSegCurvetoCubicAbs.x */
  num get x native "SVGPathSegCurvetoCubicAbs_x_Getter";


  /** @domName SVGPathSegCurvetoCubicAbs.x */
  void set x(num value) native "SVGPathSegCurvetoCubicAbs_x_Setter";


  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
  num get x1 native "SVGPathSegCurvetoCubicAbs_x1_Getter";


  /** @domName SVGPathSegCurvetoCubicAbs.x1 */
  void set x1(num value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";


  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
  num get x2 native "SVGPathSegCurvetoCubicAbs_x2_Getter";


  /** @domName SVGPathSegCurvetoCubicAbs.x2 */
  void set x2(num value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";


  /** @domName SVGPathSegCurvetoCubicAbs.y */
  num get y native "SVGPathSegCurvetoCubicAbs_y_Getter";


  /** @domName SVGPathSegCurvetoCubicAbs.y */
  void set y(num value) native "SVGPathSegCurvetoCubicAbs_y_Setter";


  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
  num get y1 native "SVGPathSegCurvetoCubicAbs_y1_Getter";


  /** @domName SVGPathSegCurvetoCubicAbs.y1 */
  void set y1(num value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";


  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
  num get y2 native "SVGPathSegCurvetoCubicAbs_y2_Getter";


  /** @domName SVGPathSegCurvetoCubicAbs.y2 */
  void set y2(num value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoCubicRel
class SVGPathSegCurvetoCubicRel extends SVGPathSeg {
  SVGPathSegCurvetoCubicRel.internal(): super.internal();


  /** @domName SVGPathSegCurvetoCubicRel.x */
  num get x native "SVGPathSegCurvetoCubicRel_x_Getter";


  /** @domName SVGPathSegCurvetoCubicRel.x */
  void set x(num value) native "SVGPathSegCurvetoCubicRel_x_Setter";


  /** @domName SVGPathSegCurvetoCubicRel.x1 */
  num get x1 native "SVGPathSegCurvetoCubicRel_x1_Getter";


  /** @domName SVGPathSegCurvetoCubicRel.x1 */
  void set x1(num value) native "SVGPathSegCurvetoCubicRel_x1_Setter";


  /** @domName SVGPathSegCurvetoCubicRel.x2 */
  num get x2 native "SVGPathSegCurvetoCubicRel_x2_Getter";


  /** @domName SVGPathSegCurvetoCubicRel.x2 */
  void set x2(num value) native "SVGPathSegCurvetoCubicRel_x2_Setter";


  /** @domName SVGPathSegCurvetoCubicRel.y */
  num get y native "SVGPathSegCurvetoCubicRel_y_Getter";


  /** @domName SVGPathSegCurvetoCubicRel.y */
  void set y(num value) native "SVGPathSegCurvetoCubicRel_y_Setter";


  /** @domName SVGPathSegCurvetoCubicRel.y1 */
  num get y1 native "SVGPathSegCurvetoCubicRel_y1_Getter";


  /** @domName SVGPathSegCurvetoCubicRel.y1 */
  void set y1(num value) native "SVGPathSegCurvetoCubicRel_y1_Setter";


  /** @domName SVGPathSegCurvetoCubicRel.y2 */
  num get y2 native "SVGPathSegCurvetoCubicRel_y2_Getter";


  /** @domName SVGPathSegCurvetoCubicRel.y2 */
  void set y2(num value) native "SVGPathSegCurvetoCubicRel_y2_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoCubicSmoothAbs
class SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {
  SVGPathSegCurvetoCubicSmoothAbs.internal(): super.internal();


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
  num get x native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x */
  void set x(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
  num get x2 native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.x2 */
  void set x2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
  num get y native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y */
  void set y(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
  num get y2 native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothAbs.y2 */
  void set y2(num value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoCubicSmoothRel
class SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {
  SVGPathSegCurvetoCubicSmoothRel.internal(): super.internal();


  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
  num get x native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothRel.x */
  void set x(num value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";


  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
  num get x2 native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothRel.x2 */
  void set x2(num value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";


  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
  num get y native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothRel.y */
  void set y(num value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";


  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
  num get y2 native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";


  /** @domName SVGPathSegCurvetoCubicSmoothRel.y2 */
  void set y2(num value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoQuadraticAbs
class SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {
  SVGPathSegCurvetoQuadraticAbs.internal(): super.internal();


  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
  num get x native "SVGPathSegCurvetoQuadraticAbs_x_Getter";


  /** @domName SVGPathSegCurvetoQuadraticAbs.x */
  void set x(num value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";


  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
  num get x1 native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";


  /** @domName SVGPathSegCurvetoQuadraticAbs.x1 */
  void set x1(num value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";


  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
  num get y native "SVGPathSegCurvetoQuadraticAbs_y_Getter";


  /** @domName SVGPathSegCurvetoQuadraticAbs.y */
  void set y(num value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";


  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
  num get y1 native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";


  /** @domName SVGPathSegCurvetoQuadraticAbs.y1 */
  void set y1(num value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoQuadraticRel
class SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {
  SVGPathSegCurvetoQuadraticRel.internal(): super.internal();


  /** @domName SVGPathSegCurvetoQuadraticRel.x */
  num get x native "SVGPathSegCurvetoQuadraticRel_x_Getter";


  /** @domName SVGPathSegCurvetoQuadraticRel.x */
  void set x(num value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";


  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
  num get x1 native "SVGPathSegCurvetoQuadraticRel_x1_Getter";


  /** @domName SVGPathSegCurvetoQuadraticRel.x1 */
  void set x1(num value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";


  /** @domName SVGPathSegCurvetoQuadraticRel.y */
  num get y native "SVGPathSegCurvetoQuadraticRel_y_Getter";


  /** @domName SVGPathSegCurvetoQuadraticRel.y */
  void set y(num value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";


  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
  num get y1 native "SVGPathSegCurvetoQuadraticRel_y1_Getter";


  /** @domName SVGPathSegCurvetoQuadraticRel.y1 */
  void set y1(num value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoQuadraticSmoothAbs
class SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {
  SVGPathSegCurvetoQuadraticSmoothAbs.internal(): super.internal();


  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
  num get x native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";


  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.x */
  void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";


  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
  num get y native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";


  /** @domName SVGPathSegCurvetoQuadraticSmoothAbs.y */
  void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegCurvetoQuadraticSmoothRel
class SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {
  SVGPathSegCurvetoQuadraticSmoothRel.internal(): super.internal();


  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
  num get x native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";


  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.x */
  void set x(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";


  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
  num get y native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";


  /** @domName SVGPathSegCurvetoQuadraticSmoothRel.y */
  void set y(num value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegLinetoAbs
class SVGPathSegLinetoAbs extends SVGPathSeg {
  SVGPathSegLinetoAbs.internal(): super.internal();


  /** @domName SVGPathSegLinetoAbs.x */
  num get x native "SVGPathSegLinetoAbs_x_Getter";


  /** @domName SVGPathSegLinetoAbs.x */
  void set x(num value) native "SVGPathSegLinetoAbs_x_Setter";


  /** @domName SVGPathSegLinetoAbs.y */
  num get y native "SVGPathSegLinetoAbs_y_Getter";


  /** @domName SVGPathSegLinetoAbs.y */
  void set y(num value) native "SVGPathSegLinetoAbs_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegLinetoHorizontalAbs
class SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {
  SVGPathSegLinetoHorizontalAbs.internal(): super.internal();


  /** @domName SVGPathSegLinetoHorizontalAbs.x */
  num get x native "SVGPathSegLinetoHorizontalAbs_x_Getter";


  /** @domName SVGPathSegLinetoHorizontalAbs.x */
  void set x(num value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegLinetoHorizontalRel
class SVGPathSegLinetoHorizontalRel extends SVGPathSeg {
  SVGPathSegLinetoHorizontalRel.internal(): super.internal();


  /** @domName SVGPathSegLinetoHorizontalRel.x */
  num get x native "SVGPathSegLinetoHorizontalRel_x_Getter";


  /** @domName SVGPathSegLinetoHorizontalRel.x */
  void set x(num value) native "SVGPathSegLinetoHorizontalRel_x_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegLinetoRel
class SVGPathSegLinetoRel extends SVGPathSeg {
  SVGPathSegLinetoRel.internal(): super.internal();


  /** @domName SVGPathSegLinetoRel.x */
  num get x native "SVGPathSegLinetoRel_x_Getter";


  /** @domName SVGPathSegLinetoRel.x */
  void set x(num value) native "SVGPathSegLinetoRel_x_Setter";


  /** @domName SVGPathSegLinetoRel.y */
  num get y native "SVGPathSegLinetoRel_y_Getter";


  /** @domName SVGPathSegLinetoRel.y */
  void set y(num value) native "SVGPathSegLinetoRel_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegLinetoVerticalAbs
class SVGPathSegLinetoVerticalAbs extends SVGPathSeg {
  SVGPathSegLinetoVerticalAbs.internal(): super.internal();


  /** @domName SVGPathSegLinetoVerticalAbs.y */
  num get y native "SVGPathSegLinetoVerticalAbs_y_Getter";


  /** @domName SVGPathSegLinetoVerticalAbs.y */
  void set y(num value) native "SVGPathSegLinetoVerticalAbs_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegLinetoVerticalRel
class SVGPathSegLinetoVerticalRel extends SVGPathSeg {
  SVGPathSegLinetoVerticalRel.internal(): super.internal();


  /** @domName SVGPathSegLinetoVerticalRel.y */
  num get y native "SVGPathSegLinetoVerticalRel_y_Getter";


  /** @domName SVGPathSegLinetoVerticalRel.y */
  void set y(num value) native "SVGPathSegLinetoVerticalRel_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegList
class SVGPathSegList extends NativeFieldWrapperClass1 implements List<SVGPathSeg> {
  SVGPathSegList.internal();


  /** @domName SVGPathSegList.numberOfItems */
  int get numberOfItems native "SVGPathSegList_numberOfItems_Getter";

  SVGPathSeg operator[](int index) native "SVGPathSegList_item_Callback";

  void operator[]=(int index, SVGPathSeg value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGPathSeg> mixins.
  // SVGPathSeg is the element type.

  // From Iterable<SVGPathSeg>:

  Iterator<SVGPathSeg> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGPathSeg>(this);
  }

  // From Collection<SVGPathSeg>:

  void add(SVGPathSeg value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGPathSeg value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGPathSeg> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGPathSeg element) => _Collections.contains(this, element);

  void forEach(void f(SVGPathSeg element)) => _Collections.forEach(this, f);

  Collection map(f(SVGPathSeg element)) => _Collections.map(this, [], f);

  Collection<SVGPathSeg> filter(bool f(SVGPathSeg element)) =>
     _Collections.filter(this, <SVGPathSeg>[], f);

  bool every(bool f(SVGPathSeg element)) => _Collections.every(this, f);

  bool some(bool f(SVGPathSeg element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGPathSeg>:

  void sort([Comparator<SVGPathSeg> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGPathSeg element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGPathSeg element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGPathSeg get last => this[length - 1];

  SVGPathSeg removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGPathSeg> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGPathSeg initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGPathSeg> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGPathSeg>[]);

  // -- end List<SVGPathSeg> mixins.


  /** @domName SVGPathSegList.appendItem */
  SVGPathSeg appendItem(SVGPathSeg newItem) native "SVGPathSegList_appendItem_Callback";


  /** @domName SVGPathSegList.clear */
  void clear() native "SVGPathSegList_clear_Callback";


  /** @domName SVGPathSegList.getItem */
  SVGPathSeg getItem(int index) native "SVGPathSegList_getItem_Callback";


  /** @domName SVGPathSegList.initialize */
  SVGPathSeg initialize(SVGPathSeg newItem) native "SVGPathSegList_initialize_Callback";


  /** @domName SVGPathSegList.insertItemBefore */
  SVGPathSeg insertItemBefore(SVGPathSeg newItem, int index) native "SVGPathSegList_insertItemBefore_Callback";


  /** @domName SVGPathSegList.removeItem */
  SVGPathSeg removeItem(int index) native "SVGPathSegList_removeItem_Callback";


  /** @domName SVGPathSegList.replaceItem */
  SVGPathSeg replaceItem(SVGPathSeg newItem, int index) native "SVGPathSegList_replaceItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegMovetoAbs
class SVGPathSegMovetoAbs extends SVGPathSeg {
  SVGPathSegMovetoAbs.internal(): super.internal();


  /** @domName SVGPathSegMovetoAbs.x */
  num get x native "SVGPathSegMovetoAbs_x_Getter";


  /** @domName SVGPathSegMovetoAbs.x */
  void set x(num value) native "SVGPathSegMovetoAbs_x_Setter";


  /** @domName SVGPathSegMovetoAbs.y */
  num get y native "SVGPathSegMovetoAbs_y_Getter";


  /** @domName SVGPathSegMovetoAbs.y */
  void set y(num value) native "SVGPathSegMovetoAbs_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPathSegMovetoRel
class SVGPathSegMovetoRel extends SVGPathSeg {
  SVGPathSegMovetoRel.internal(): super.internal();


  /** @domName SVGPathSegMovetoRel.x */
  num get x native "SVGPathSegMovetoRel_x_Getter";


  /** @domName SVGPathSegMovetoRel.x */
  void set x(num value) native "SVGPathSegMovetoRel_x_Setter";


  /** @domName SVGPathSegMovetoRel.y */
  num get y native "SVGPathSegMovetoRel_y_Getter";


  /** @domName SVGPathSegMovetoRel.y */
  void set y(num value) native "SVGPathSegMovetoRel_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPatternElement
class SVGPatternElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGFitToViewBox, SVGExternalResourcesRequired {
  SVGPatternElement.internal(): super.internal();


  /** @domName SVGPatternElement.height */
  SVGAnimatedLength get height native "SVGPatternElement_height_Getter";


  /** @domName SVGPatternElement.patternContentUnits */
  SVGAnimatedEnumeration get patternContentUnits native "SVGPatternElement_patternContentUnits_Getter";


  /** @domName SVGPatternElement.patternTransform */
  SVGAnimatedTransformList get patternTransform native "SVGPatternElement_patternTransform_Getter";


  /** @domName SVGPatternElement.patternUnits */
  SVGAnimatedEnumeration get patternUnits native "SVGPatternElement_patternUnits_Getter";


  /** @domName SVGPatternElement.width */
  SVGAnimatedLength get width native "SVGPatternElement_width_Getter";


  /** @domName SVGPatternElement.x */
  SVGAnimatedLength get x native "SVGPatternElement_x_Getter";


  /** @domName SVGPatternElement.y */
  SVGAnimatedLength get y native "SVGPatternElement_y_Getter";


  /** @domName SVGPatternElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGPatternElement_externalResourcesRequired_Getter";


  /** @domName SVGPatternElement.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGPatternElement_preserveAspectRatio_Getter";


  /** @domName SVGPatternElement.viewBox */
  SVGAnimatedRect get viewBox native "SVGPatternElement_viewBox_Getter";


  /** @domName SVGPatternElement.xmllang */
  String get xmllang native "SVGPatternElement_xmllang_Getter";


  /** @domName SVGPatternElement.xmllang */
  void set xmllang(String value) native "SVGPatternElement_xmllang_Setter";


  /** @domName SVGPatternElement.xmlspace */
  String get xmlspace native "SVGPatternElement_xmlspace_Getter";


  /** @domName SVGPatternElement.xmlspace */
  void set xmlspace(String value) native "SVGPatternElement_xmlspace_Setter";


  /** @domName SVGPatternElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGPatternElement_className_Getter";


  /** @domName SVGPatternElement.style */
  CSSStyleDeclaration get style native "SVGPatternElement_style_Getter";


  /** @domName SVGPatternElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGPatternElement_getPresentationAttribute_Callback";


  /** @domName SVGPatternElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGPatternElement_requiredExtensions_Getter";


  /** @domName SVGPatternElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGPatternElement_requiredFeatures_Getter";


  /** @domName SVGPatternElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGPatternElement_systemLanguage_Getter";


  /** @domName SVGPatternElement.hasExtension */
  bool hasExtension(String extension) native "SVGPatternElement_hasExtension_Callback";


  /** @domName SVGPatternElement.href */
  SVGAnimatedString get href native "SVGPatternElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPoint
class SVGPoint extends NativeFieldWrapperClass1 {
  SVGPoint.internal();


  /** @domName SVGPoint.x */
  num get x native "SVGPoint_x_Getter";


  /** @domName SVGPoint.x */
  void set x(num value) native "SVGPoint_x_Setter";


  /** @domName SVGPoint.y */
  num get y native "SVGPoint_y_Getter";


  /** @domName SVGPoint.y */
  void set y(num value) native "SVGPoint_y_Setter";


  /** @domName SVGPoint.matrixTransform */
  SVGPoint matrixTransform(SVGMatrix matrix) native "SVGPoint_matrixTransform_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPointList
class SVGPointList extends NativeFieldWrapperClass1 {
  SVGPointList.internal();


  /** @domName SVGPointList.numberOfItems */
  int get numberOfItems native "SVGPointList_numberOfItems_Getter";


  /** @domName SVGPointList.appendItem */
  SVGPoint appendItem(SVGPoint item) native "SVGPointList_appendItem_Callback";


  /** @domName SVGPointList.clear */
  void clear() native "SVGPointList_clear_Callback";


  /** @domName SVGPointList.getItem */
  SVGPoint getItem(int index) native "SVGPointList_getItem_Callback";


  /** @domName SVGPointList.initialize */
  SVGPoint initialize(SVGPoint item) native "SVGPointList_initialize_Callback";


  /** @domName SVGPointList.insertItemBefore */
  SVGPoint insertItemBefore(SVGPoint item, int index) native "SVGPointList_insertItemBefore_Callback";


  /** @domName SVGPointList.removeItem */
  SVGPoint removeItem(int index) native "SVGPointList_removeItem_Callback";


  /** @domName SVGPointList.replaceItem */
  SVGPoint replaceItem(SVGPoint item, int index) native "SVGPointList_replaceItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPolygonElement
class SVGPolygonElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGPolygonElement.internal(): super.internal();


  /** @domName SVGPolygonElement.animatedPoints */
  SVGPointList get animatedPoints native "SVGPolygonElement_animatedPoints_Getter";


  /** @domName SVGPolygonElement.points */
  SVGPointList get points native "SVGPolygonElement_points_Getter";


  /** @domName SVGPolygonElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolygonElement_externalResourcesRequired_Getter";


  /** @domName SVGPolygonElement.xmllang */
  String get xmllang native "SVGPolygonElement_xmllang_Getter";


  /** @domName SVGPolygonElement.xmllang */
  void set xmllang(String value) native "SVGPolygonElement_xmllang_Setter";


  /** @domName SVGPolygonElement.xmlspace */
  String get xmlspace native "SVGPolygonElement_xmlspace_Getter";


  /** @domName SVGPolygonElement.xmlspace */
  void set xmlspace(String value) native "SVGPolygonElement_xmlspace_Setter";


  /** @domName SVGPolygonElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGPolygonElement_farthestViewportElement_Getter";


  /** @domName SVGPolygonElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGPolygonElement_nearestViewportElement_Getter";


  /** @domName SVGPolygonElement.getBBox */
  SVGRect getBBox() native "SVGPolygonElement_getBBox_Callback";


  /** @domName SVGPolygonElement.getCTM */
  SVGMatrix getCTM() native "SVGPolygonElement_getCTM_Callback";


  /** @domName SVGPolygonElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGPolygonElement_getScreenCTM_Callback";


  /** @domName SVGPolygonElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGPolygonElement_getTransformToElement_Callback";


  /** @domName SVGPolygonElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGPolygonElement_className_Getter";


  /** @domName SVGPolygonElement.style */
  CSSStyleDeclaration get style native "SVGPolygonElement_style_Getter";


  /** @domName SVGPolygonElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGPolygonElement_getPresentationAttribute_Callback";


  /** @domName SVGPolygonElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGPolygonElement_requiredExtensions_Getter";


  /** @domName SVGPolygonElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGPolygonElement_requiredFeatures_Getter";


  /** @domName SVGPolygonElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGPolygonElement_systemLanguage_Getter";


  /** @domName SVGPolygonElement.hasExtension */
  bool hasExtension(String extension) native "SVGPolygonElement_hasExtension_Callback";


  /** @domName SVGPolygonElement.transform */
  SVGAnimatedTransformList get transform native "SVGPolygonElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPolylineElement
class SVGPolylineElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGPolylineElement.internal(): super.internal();


  /** @domName SVGPolylineElement.animatedPoints */
  SVGPointList get animatedPoints native "SVGPolylineElement_animatedPoints_Getter";


  /** @domName SVGPolylineElement.points */
  SVGPointList get points native "SVGPolylineElement_points_Getter";


  /** @domName SVGPolylineElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGPolylineElement_externalResourcesRequired_Getter";


  /** @domName SVGPolylineElement.xmllang */
  String get xmllang native "SVGPolylineElement_xmllang_Getter";


  /** @domName SVGPolylineElement.xmllang */
  void set xmllang(String value) native "SVGPolylineElement_xmllang_Setter";


  /** @domName SVGPolylineElement.xmlspace */
  String get xmlspace native "SVGPolylineElement_xmlspace_Getter";


  /** @domName SVGPolylineElement.xmlspace */
  void set xmlspace(String value) native "SVGPolylineElement_xmlspace_Setter";


  /** @domName SVGPolylineElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGPolylineElement_farthestViewportElement_Getter";


  /** @domName SVGPolylineElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGPolylineElement_nearestViewportElement_Getter";


  /** @domName SVGPolylineElement.getBBox */
  SVGRect getBBox() native "SVGPolylineElement_getBBox_Callback";


  /** @domName SVGPolylineElement.getCTM */
  SVGMatrix getCTM() native "SVGPolylineElement_getCTM_Callback";


  /** @domName SVGPolylineElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGPolylineElement_getScreenCTM_Callback";


  /** @domName SVGPolylineElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGPolylineElement_getTransformToElement_Callback";


  /** @domName SVGPolylineElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGPolylineElement_className_Getter";


  /** @domName SVGPolylineElement.style */
  CSSStyleDeclaration get style native "SVGPolylineElement_style_Getter";


  /** @domName SVGPolylineElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGPolylineElement_getPresentationAttribute_Callback";


  /** @domName SVGPolylineElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGPolylineElement_requiredExtensions_Getter";


  /** @domName SVGPolylineElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGPolylineElement_requiredFeatures_Getter";


  /** @domName SVGPolylineElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGPolylineElement_systemLanguage_Getter";


  /** @domName SVGPolylineElement.hasExtension */
  bool hasExtension(String extension) native "SVGPolylineElement_hasExtension_Callback";


  /** @domName SVGPolylineElement.transform */
  SVGAnimatedTransformList get transform native "SVGPolylineElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGPreserveAspectRatio
class SVGPreserveAspectRatio extends NativeFieldWrapperClass1 {
  SVGPreserveAspectRatio.internal();

  static const int SVG_MEETORSLICE_MEET = 1;

  static const int SVG_MEETORSLICE_SLICE = 2;

  static const int SVG_MEETORSLICE_UNKNOWN = 0;

  static const int SVG_PRESERVEASPECTRATIO_NONE = 1;

  static const int SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;

  static const int SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;

  static const int SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;

  static const int SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;

  static const int SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;

  static const int SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;

  static const int SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;

  static const int SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;

  static const int SVG_PRESERVEASPECTRATIO_XMINYMID = 5;

  static const int SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;


  /** @domName SVGPreserveAspectRatio.align */
  int get align native "SVGPreserveAspectRatio_align_Getter";


  /** @domName SVGPreserveAspectRatio.align */
  void set align(int value) native "SVGPreserveAspectRatio_align_Setter";


  /** @domName SVGPreserveAspectRatio.meetOrSlice */
  int get meetOrSlice native "SVGPreserveAspectRatio_meetOrSlice_Getter";


  /** @domName SVGPreserveAspectRatio.meetOrSlice */
  void set meetOrSlice(int value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGRadialGradientElement
class SVGRadialGradientElement extends SVGGradientElement {
  SVGRadialGradientElement.internal(): super.internal();


  /** @domName SVGRadialGradientElement.cx */
  SVGAnimatedLength get cx native "SVGRadialGradientElement_cx_Getter";


  /** @domName SVGRadialGradientElement.cy */
  SVGAnimatedLength get cy native "SVGRadialGradientElement_cy_Getter";


  /** @domName SVGRadialGradientElement.fr */
  SVGAnimatedLength get fr native "SVGRadialGradientElement_fr_Getter";


  /** @domName SVGRadialGradientElement.fx */
  SVGAnimatedLength get fx native "SVGRadialGradientElement_fx_Getter";


  /** @domName SVGRadialGradientElement.fy */
  SVGAnimatedLength get fy native "SVGRadialGradientElement_fy_Getter";


  /** @domName SVGRadialGradientElement.r */
  SVGAnimatedLength get r native "SVGRadialGradientElement_r_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGRect
class SVGRect extends NativeFieldWrapperClass1 {
  SVGRect.internal();


  /** @domName SVGRect.height */
  num get height native "SVGRect_height_Getter";


  /** @domName SVGRect.height */
  void set height(num value) native "SVGRect_height_Setter";


  /** @domName SVGRect.width */
  num get width native "SVGRect_width_Getter";


  /** @domName SVGRect.width */
  void set width(num value) native "SVGRect_width_Setter";


  /** @domName SVGRect.x */
  num get x native "SVGRect_x_Getter";


  /** @domName SVGRect.x */
  void set x(num value) native "SVGRect_x_Setter";


  /** @domName SVGRect.y */
  num get y native "SVGRect_y_Getter";


  /** @domName SVGRect.y */
  void set y(num value) native "SVGRect_y_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGRectElement
class SVGRectElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGRectElement.internal(): super.internal();


  /** @domName SVGRectElement.height */
  SVGAnimatedLength get height native "SVGRectElement_height_Getter";


  /** @domName SVGRectElement.rx */
  SVGAnimatedLength get rx native "SVGRectElement_rx_Getter";


  /** @domName SVGRectElement.ry */
  SVGAnimatedLength get ry native "SVGRectElement_ry_Getter";


  /** @domName SVGRectElement.width */
  SVGAnimatedLength get width native "SVGRectElement_width_Getter";


  /** @domName SVGRectElement.x */
  SVGAnimatedLength get x native "SVGRectElement_x_Getter";


  /** @domName SVGRectElement.y */
  SVGAnimatedLength get y native "SVGRectElement_y_Getter";


  /** @domName SVGRectElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGRectElement_externalResourcesRequired_Getter";


  /** @domName SVGRectElement.xmllang */
  String get xmllang native "SVGRectElement_xmllang_Getter";


  /** @domName SVGRectElement.xmllang */
  void set xmllang(String value) native "SVGRectElement_xmllang_Setter";


  /** @domName SVGRectElement.xmlspace */
  String get xmlspace native "SVGRectElement_xmlspace_Getter";


  /** @domName SVGRectElement.xmlspace */
  void set xmlspace(String value) native "SVGRectElement_xmlspace_Setter";


  /** @domName SVGRectElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGRectElement_farthestViewportElement_Getter";


  /** @domName SVGRectElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGRectElement_nearestViewportElement_Getter";


  /** @domName SVGRectElement.getBBox */
  SVGRect getBBox() native "SVGRectElement_getBBox_Callback";


  /** @domName SVGRectElement.getCTM */
  SVGMatrix getCTM() native "SVGRectElement_getCTM_Callback";


  /** @domName SVGRectElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGRectElement_getScreenCTM_Callback";


  /** @domName SVGRectElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGRectElement_getTransformToElement_Callback";


  /** @domName SVGRectElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGRectElement_className_Getter";


  /** @domName SVGRectElement.style */
  CSSStyleDeclaration get style native "SVGRectElement_style_Getter";


  /** @domName SVGRectElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGRectElement_getPresentationAttribute_Callback";


  /** @domName SVGRectElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGRectElement_requiredExtensions_Getter";


  /** @domName SVGRectElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGRectElement_requiredFeatures_Getter";


  /** @domName SVGRectElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGRectElement_systemLanguage_Getter";


  /** @domName SVGRectElement.hasExtension */
  bool hasExtension(String extension) native "SVGRectElement_hasExtension_Callback";


  /** @domName SVGRectElement.transform */
  SVGAnimatedTransformList get transform native "SVGRectElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGRenderingIntent
class SVGRenderingIntent extends NativeFieldWrapperClass1 {
  SVGRenderingIntent.internal();

  static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;

  static const int RENDERING_INTENT_AUTO = 1;

  static const int RENDERING_INTENT_PERCEPTUAL = 2;

  static const int RENDERING_INTENT_RELATIVE_COLORIMETRIC = 3;

  static const int RENDERING_INTENT_SATURATION = 4;

  static const int RENDERING_INTENT_UNKNOWN = 0;

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

class SVGSVGElement extends SVGElement implements SVGZoomAndPan, SVGLocatable, SVGLangSpace, SVGTests, SVGStylable, SVGFitToViewBox, SVGExternalResourcesRequired {
  factory SVGSVGElement() => _SVGSVGElementFactoryProvider.createSVGSVGElement();

  SVGSVGElement.internal(): super.internal();


  /** @domName SVGSVGElement.contentScriptType */
  String get contentScriptType native "SVGSVGElement_contentScriptType_Getter";


  /** @domName SVGSVGElement.contentScriptType */
  void set contentScriptType(String value) native "SVGSVGElement_contentScriptType_Setter";


  /** @domName SVGSVGElement.contentStyleType */
  String get contentStyleType native "SVGSVGElement_contentStyleType_Getter";


  /** @domName SVGSVGElement.contentStyleType */
  void set contentStyleType(String value) native "SVGSVGElement_contentStyleType_Setter";


  /** @domName SVGSVGElement.currentScale */
  num get currentScale native "SVGSVGElement_currentScale_Getter";


  /** @domName SVGSVGElement.currentScale */
  void set currentScale(num value) native "SVGSVGElement_currentScale_Setter";


  /** @domName SVGSVGElement.currentTranslate */
  SVGPoint get currentTranslate native "SVGSVGElement_currentTranslate_Getter";


  /** @domName SVGSVGElement.currentView */
  SVGViewSpec get currentView native "SVGSVGElement_currentView_Getter";


  /** @domName SVGSVGElement.height */
  SVGAnimatedLength get height native "SVGSVGElement_height_Getter";


  /** @domName SVGSVGElement.pixelUnitToMillimeterX */
  num get pixelUnitToMillimeterX native "SVGSVGElement_pixelUnitToMillimeterX_Getter";


  /** @domName SVGSVGElement.pixelUnitToMillimeterY */
  num get pixelUnitToMillimeterY native "SVGSVGElement_pixelUnitToMillimeterY_Getter";


  /** @domName SVGSVGElement.screenPixelToMillimeterX */
  num get screenPixelToMillimeterX native "SVGSVGElement_screenPixelToMillimeterX_Getter";


  /** @domName SVGSVGElement.screenPixelToMillimeterY */
  num get screenPixelToMillimeterY native "SVGSVGElement_screenPixelToMillimeterY_Getter";


  /** @domName SVGSVGElement.useCurrentView */
  bool get useCurrentView native "SVGSVGElement_useCurrentView_Getter";


  /** @domName SVGSVGElement.viewport */
  SVGRect get viewport native "SVGSVGElement_viewport_Getter";


  /** @domName SVGSVGElement.width */
  SVGAnimatedLength get width native "SVGSVGElement_width_Getter";


  /** @domName SVGSVGElement.x */
  SVGAnimatedLength get x native "SVGSVGElement_x_Getter";


  /** @domName SVGSVGElement.y */
  SVGAnimatedLength get y native "SVGSVGElement_y_Getter";


  /** @domName SVGSVGElement.animationsPaused */
  bool animationsPaused() native "SVGSVGElement_animationsPaused_Callback";


  /** @domName SVGSVGElement.checkEnclosure */
  bool checkEnclosure(SVGElement element, SVGRect rect) native "SVGSVGElement_checkEnclosure_Callback";


  /** @domName SVGSVGElement.checkIntersection */
  bool checkIntersection(SVGElement element, SVGRect rect) native "SVGSVGElement_checkIntersection_Callback";


  /** @domName SVGSVGElement.createSVGAngle */
  SVGAngle createSVGAngle() native "SVGSVGElement_createSVGAngle_Callback";


  /** @domName SVGSVGElement.createSVGLength */
  SVGLength createSVGLength() native "SVGSVGElement_createSVGLength_Callback";


  /** @domName SVGSVGElement.createSVGMatrix */
  SVGMatrix createSVGMatrix() native "SVGSVGElement_createSVGMatrix_Callback";


  /** @domName SVGSVGElement.createSVGNumber */
  SVGNumber createSVGNumber() native "SVGSVGElement_createSVGNumber_Callback";


  /** @domName SVGSVGElement.createSVGPoint */
  SVGPoint createSVGPoint() native "SVGSVGElement_createSVGPoint_Callback";


  /** @domName SVGSVGElement.createSVGRect */
  SVGRect createSVGRect() native "SVGSVGElement_createSVGRect_Callback";


  /** @domName SVGSVGElement.createSVGTransform */
  SVGTransform createSVGTransform() native "SVGSVGElement_createSVGTransform_Callback";


  /** @domName SVGSVGElement.createSVGTransformFromMatrix */
  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";


  /** @domName SVGSVGElement.deselectAll */
  void deselectAll() native "SVGSVGElement_deselectAll_Callback";


  /** @domName SVGSVGElement.forceRedraw */
  void forceRedraw() native "SVGSVGElement_forceRedraw_Callback";


  /** @domName SVGSVGElement.getCurrentTime */
  num getCurrentTime() native "SVGSVGElement_getCurrentTime_Callback";


  /** @domName SVGSVGElement.getElementById */
  Element getElementById(String elementId) native "SVGSVGElement_getElementById_Callback";


  /** @domName SVGSVGElement.getEnclosureList */
  List<Node> getEnclosureList(SVGRect rect, SVGElement referenceElement) native "SVGSVGElement_getEnclosureList_Callback";


  /** @domName SVGSVGElement.getIntersectionList */
  List<Node> getIntersectionList(SVGRect rect, SVGElement referenceElement) native "SVGSVGElement_getIntersectionList_Callback";


  /** @domName SVGSVGElement.pauseAnimations */
  void pauseAnimations() native "SVGSVGElement_pauseAnimations_Callback";


  /** @domName SVGSVGElement.setCurrentTime */
  void setCurrentTime(num seconds) native "SVGSVGElement_setCurrentTime_Callback";


  /** @domName SVGSVGElement.suspendRedraw */
  int suspendRedraw(int maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";


  /** @domName SVGSVGElement.unpauseAnimations */
  void unpauseAnimations() native "SVGSVGElement_unpauseAnimations_Callback";


  /** @domName SVGSVGElement.unsuspendRedraw */
  void unsuspendRedraw(int suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";


  /** @domName SVGSVGElement.unsuspendRedrawAll */
  void unsuspendRedrawAll() native "SVGSVGElement_unsuspendRedrawAll_Callback";


  /** @domName SVGSVGElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGSVGElement_externalResourcesRequired_Getter";


  /** @domName SVGSVGElement.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSVGElement_preserveAspectRatio_Getter";


  /** @domName SVGSVGElement.viewBox */
  SVGAnimatedRect get viewBox native "SVGSVGElement_viewBox_Getter";


  /** @domName SVGSVGElement.xmllang */
  String get xmllang native "SVGSVGElement_xmllang_Getter";


  /** @domName SVGSVGElement.xmllang */
  void set xmllang(String value) native "SVGSVGElement_xmllang_Setter";


  /** @domName SVGSVGElement.xmlspace */
  String get xmlspace native "SVGSVGElement_xmlspace_Getter";


  /** @domName SVGSVGElement.xmlspace */
  void set xmlspace(String value) native "SVGSVGElement_xmlspace_Setter";


  /** @domName SVGSVGElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGSVGElement_farthestViewportElement_Getter";


  /** @domName SVGSVGElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGSVGElement_nearestViewportElement_Getter";


  /** @domName SVGSVGElement.getBBox */
  SVGRect getBBox() native "SVGSVGElement_getBBox_Callback";


  /** @domName SVGSVGElement.getCTM */
  SVGMatrix getCTM() native "SVGSVGElement_getCTM_Callback";


  /** @domName SVGSVGElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGSVGElement_getScreenCTM_Callback";


  /** @domName SVGSVGElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGSVGElement_getTransformToElement_Callback";


  /** @domName SVGSVGElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGSVGElement_className_Getter";


  /** @domName SVGSVGElement.style */
  CSSStyleDeclaration get style native "SVGSVGElement_style_Getter";


  /** @domName SVGSVGElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGSVGElement_getPresentationAttribute_Callback";


  /** @domName SVGSVGElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGSVGElement_requiredExtensions_Getter";


  /** @domName SVGSVGElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGSVGElement_requiredFeatures_Getter";


  /** @domName SVGSVGElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGSVGElement_systemLanguage_Getter";


  /** @domName SVGSVGElement.hasExtension */
  bool hasExtension(String extension) native "SVGSVGElement_hasExtension_Callback";


  /** @domName SVGSVGElement.zoomAndPan */
  int get zoomAndPan native "SVGSVGElement_zoomAndPan_Getter";


  /** @domName SVGSVGElement.zoomAndPan */
  void set zoomAndPan(int value) native "SVGSVGElement_zoomAndPan_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGScriptElement
class SVGScriptElement extends SVGElement implements SVGURIReference, SVGExternalResourcesRequired {
  SVGScriptElement.internal(): super.internal();


  /** @domName SVGScriptElement.type */
  String get type native "SVGScriptElement_type_Getter";


  /** @domName SVGScriptElement.type */
  void set type(String value) native "SVGScriptElement_type_Setter";


  /** @domName SVGScriptElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGScriptElement_externalResourcesRequired_Getter";


  /** @domName SVGScriptElement.href */
  SVGAnimatedString get href native "SVGScriptElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGSetElement
class SVGSetElement extends SVGAnimationElement {
  SVGSetElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGStopElement
class SVGStopElement extends SVGElement implements SVGStylable {
  SVGStopElement.internal(): super.internal();


  /** @domName SVGStopElement.offset */
  SVGAnimatedNumber get offset native "SVGStopElement_offset_Getter";


  /** @domName SVGStopElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGStopElement_className_Getter";


  /** @domName SVGStopElement.style */
  CSSStyleDeclaration get style native "SVGStopElement_style_Getter";


  /** @domName SVGStopElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGStopElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGStringList
class SVGStringList extends NativeFieldWrapperClass1 implements List<String> {
  SVGStringList.internal();


  /** @domName SVGStringList.numberOfItems */
  int get numberOfItems native "SVGStringList_numberOfItems_Getter";

  String operator[](int index) native "SVGStringList_item_Callback";

  void operator[]=(int index, String value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<String> mixins.
  // String is the element type.

  // From Iterable<String>:

  Iterator<String> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<String>(this);
  }

  // From Collection<String>:

  void add(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<String> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(String element) => _Collections.contains(this, element);

  void forEach(void f(String element)) => _Collections.forEach(this, f);

  Collection map(f(String element)) => _Collections.map(this, [], f);

  Collection<String> filter(bool f(String element)) =>
     _Collections.filter(this, <String>[], f);

  bool every(bool f(String element)) => _Collections.every(this, f);

  bool some(bool f(String element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<String>:

  void sort([Comparator<String> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(String element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(String element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  String get last => this[length - 1];

  String removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [String initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<String> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <String>[]);

  // -- end List<String> mixins.


  /** @domName SVGStringList.appendItem */
  String appendItem(String item) native "SVGStringList_appendItem_Callback";


  /** @domName SVGStringList.clear */
  void clear() native "SVGStringList_clear_Callback";


  /** @domName SVGStringList.getItem */
  String getItem(int index) native "SVGStringList_getItem_Callback";


  /** @domName SVGStringList.initialize */
  String initialize(String item) native "SVGStringList_initialize_Callback";


  /** @domName SVGStringList.insertItemBefore */
  String insertItemBefore(String item, int index) native "SVGStringList_insertItemBefore_Callback";


  /** @domName SVGStringList.removeItem */
  String removeItem(int index) native "SVGStringList_removeItem_Callback";


  /** @domName SVGStringList.replaceItem */
  String replaceItem(String item, int index) native "SVGStringList_replaceItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGStylable
class SVGStylable extends NativeFieldWrapperClass1 {
  SVGStylable.internal();


  /** @domName SVGStylable.className */
  SVGAnimatedString get $dom_svgClassName native "SVGStylable_className_Getter";


  /** @domName SVGStylable.style */
  CSSStyleDeclaration get style native "SVGStylable_style_Getter";


  /** @domName SVGStylable.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGStylable_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGStyleElement
class SVGStyleElement extends SVGElement implements SVGLangSpace {
  SVGStyleElement.internal(): super.internal();


  /** @domName SVGStyleElement.disabled */
  bool get disabled native "SVGStyleElement_disabled_Getter";


  /** @domName SVGStyleElement.disabled */
  void set disabled(bool value) native "SVGStyleElement_disabled_Setter";


  /** @domName SVGStyleElement.media */
  String get media native "SVGStyleElement_media_Getter";


  /** @domName SVGStyleElement.media */
  void set media(String value) native "SVGStyleElement_media_Setter";


  /** @domName SVGStyleElement.title */
  String get title native "SVGStyleElement_title_Getter";


  /** @domName SVGStyleElement.title */
  void set title(String value) native "SVGStyleElement_title_Setter";


  /** @domName SVGStyleElement.type */
  String get type native "SVGStyleElement_type_Getter";


  /** @domName SVGStyleElement.type */
  void set type(String value) native "SVGStyleElement_type_Setter";


  /** @domName SVGStyleElement.xmllang */
  String get xmllang native "SVGStyleElement_xmllang_Getter";


  /** @domName SVGStyleElement.xmllang */
  void set xmllang(String value) native "SVGStyleElement_xmllang_Setter";


  /** @domName SVGStyleElement.xmlspace */
  String get xmlspace native "SVGStyleElement_xmlspace_Getter";


  /** @domName SVGStyleElement.xmlspace */
  void set xmlspace(String value) native "SVGStyleElement_xmlspace_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGSwitchElement
class SVGSwitchElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGTransformable, SVGExternalResourcesRequired {
  SVGSwitchElement.internal(): super.internal();


  /** @domName SVGSwitchElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGSwitchElement_externalResourcesRequired_Getter";


  /** @domName SVGSwitchElement.xmllang */
  String get xmllang native "SVGSwitchElement_xmllang_Getter";


  /** @domName SVGSwitchElement.xmllang */
  void set xmllang(String value) native "SVGSwitchElement_xmllang_Setter";


  /** @domName SVGSwitchElement.xmlspace */
  String get xmlspace native "SVGSwitchElement_xmlspace_Getter";


  /** @domName SVGSwitchElement.xmlspace */
  void set xmlspace(String value) native "SVGSwitchElement_xmlspace_Setter";


  /** @domName SVGSwitchElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGSwitchElement_farthestViewportElement_Getter";


  /** @domName SVGSwitchElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGSwitchElement_nearestViewportElement_Getter";


  /** @domName SVGSwitchElement.getBBox */
  SVGRect getBBox() native "SVGSwitchElement_getBBox_Callback";


  /** @domName SVGSwitchElement.getCTM */
  SVGMatrix getCTM() native "SVGSwitchElement_getCTM_Callback";


  /** @domName SVGSwitchElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGSwitchElement_getScreenCTM_Callback";


  /** @domName SVGSwitchElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGSwitchElement_getTransformToElement_Callback";


  /** @domName SVGSwitchElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGSwitchElement_className_Getter";


  /** @domName SVGSwitchElement.style */
  CSSStyleDeclaration get style native "SVGSwitchElement_style_Getter";


  /** @domName SVGSwitchElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGSwitchElement_getPresentationAttribute_Callback";


  /** @domName SVGSwitchElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGSwitchElement_requiredExtensions_Getter";


  /** @domName SVGSwitchElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGSwitchElement_requiredFeatures_Getter";


  /** @domName SVGSwitchElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGSwitchElement_systemLanguage_Getter";


  /** @domName SVGSwitchElement.hasExtension */
  bool hasExtension(String extension) native "SVGSwitchElement_hasExtension_Callback";


  /** @domName SVGSwitchElement.transform */
  SVGAnimatedTransformList get transform native "SVGSwitchElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGSymbolElement
class SVGSymbolElement extends SVGElement implements SVGLangSpace, SVGFitToViewBox, SVGExternalResourcesRequired, SVGStylable {
  SVGSymbolElement.internal(): super.internal();


  /** @domName SVGSymbolElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGSymbolElement_externalResourcesRequired_Getter";


  /** @domName SVGSymbolElement.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGSymbolElement_preserveAspectRatio_Getter";


  /** @domName SVGSymbolElement.viewBox */
  SVGAnimatedRect get viewBox native "SVGSymbolElement_viewBox_Getter";


  /** @domName SVGSymbolElement.xmllang */
  String get xmllang native "SVGSymbolElement_xmllang_Getter";


  /** @domName SVGSymbolElement.xmllang */
  void set xmllang(String value) native "SVGSymbolElement_xmllang_Setter";


  /** @domName SVGSymbolElement.xmlspace */
  String get xmlspace native "SVGSymbolElement_xmlspace_Getter";


  /** @domName SVGSymbolElement.xmlspace */
  void set xmlspace(String value) native "SVGSymbolElement_xmlspace_Setter";


  /** @domName SVGSymbolElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGSymbolElement_className_Getter";


  /** @domName SVGSymbolElement.style */
  CSSStyleDeclaration get style native "SVGSymbolElement_style_Getter";


  /** @domName SVGSymbolElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGSymbolElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTRefElement
class SVGTRefElement extends SVGTextPositioningElement implements SVGURIReference {
  SVGTRefElement.internal(): super.internal();


  /** @domName SVGTRefElement.href */
  SVGAnimatedString get href native "SVGTRefElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTSpanElement
class SVGTSpanElement extends SVGTextPositioningElement {
  SVGTSpanElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGTests
class SVGTests extends NativeFieldWrapperClass1 {
  SVGTests.internal();


  /** @domName SVGTests.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGTests_requiredExtensions_Getter";


  /** @domName SVGTests.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGTests_requiredFeatures_Getter";


  /** @domName SVGTests.systemLanguage */
  SVGStringList get systemLanguage native "SVGTests_systemLanguage_Getter";


  /** @domName SVGTests.hasExtension */
  bool hasExtension(String extension) native "SVGTests_hasExtension_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTextContentElement
class SVGTextContentElement extends SVGElement implements SVGLangSpace, SVGStylable, SVGTests, SVGExternalResourcesRequired {
  SVGTextContentElement.internal(): super.internal();

  static const int LENGTHADJUST_SPACING = 1;

  static const int LENGTHADJUST_SPACINGANDGLYPHS = 2;

  static const int LENGTHADJUST_UNKNOWN = 0;


  /** @domName SVGTextContentElement.lengthAdjust */
  SVGAnimatedEnumeration get lengthAdjust native "SVGTextContentElement_lengthAdjust_Getter";


  /** @domName SVGTextContentElement.textLength */
  SVGAnimatedLength get textLength native "SVGTextContentElement_textLength_Getter";


  /** @domName SVGTextContentElement.getCharNumAtPosition */
  int getCharNumAtPosition(SVGPoint point) native "SVGTextContentElement_getCharNumAtPosition_Callback";


  /** @domName SVGTextContentElement.getComputedTextLength */
  num getComputedTextLength() native "SVGTextContentElement_getComputedTextLength_Callback";


  /** @domName SVGTextContentElement.getEndPositionOfChar */
  SVGPoint getEndPositionOfChar(int offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";


  /** @domName SVGTextContentElement.getExtentOfChar */
  SVGRect getExtentOfChar(int offset) native "SVGTextContentElement_getExtentOfChar_Callback";


  /** @domName SVGTextContentElement.getNumberOfChars */
  int getNumberOfChars() native "SVGTextContentElement_getNumberOfChars_Callback";


  /** @domName SVGTextContentElement.getRotationOfChar */
  num getRotationOfChar(int offset) native "SVGTextContentElement_getRotationOfChar_Callback";


  /** @domName SVGTextContentElement.getStartPositionOfChar */
  SVGPoint getStartPositionOfChar(int offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";


  /** @domName SVGTextContentElement.getSubStringLength */
  num getSubStringLength(int offset, int length) native "SVGTextContentElement_getSubStringLength_Callback";


  /** @domName SVGTextContentElement.selectSubString */
  void selectSubString(int offset, int length) native "SVGTextContentElement_selectSubString_Callback";


  /** @domName SVGTextContentElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGTextContentElement_externalResourcesRequired_Getter";


  /** @domName SVGTextContentElement.xmllang */
  String get xmllang native "SVGTextContentElement_xmllang_Getter";


  /** @domName SVGTextContentElement.xmllang */
  void set xmllang(String value) native "SVGTextContentElement_xmllang_Setter";


  /** @domName SVGTextContentElement.xmlspace */
  String get xmlspace native "SVGTextContentElement_xmlspace_Getter";


  /** @domName SVGTextContentElement.xmlspace */
  void set xmlspace(String value) native "SVGTextContentElement_xmlspace_Setter";


  /** @domName SVGTextContentElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGTextContentElement_className_Getter";


  /** @domName SVGTextContentElement.style */
  CSSStyleDeclaration get style native "SVGTextContentElement_style_Getter";


  /** @domName SVGTextContentElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGTextContentElement_getPresentationAttribute_Callback";


  /** @domName SVGTextContentElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGTextContentElement_requiredExtensions_Getter";


  /** @domName SVGTextContentElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGTextContentElement_requiredFeatures_Getter";


  /** @domName SVGTextContentElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGTextContentElement_systemLanguage_Getter";


  /** @domName SVGTextContentElement.hasExtension */
  bool hasExtension(String extension) native "SVGTextContentElement_hasExtension_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTextElement
class SVGTextElement extends SVGTextPositioningElement implements SVGTransformable {
  SVGTextElement.internal(): super.internal();


  /** @domName SVGTextElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGTextElement_farthestViewportElement_Getter";


  /** @domName SVGTextElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGTextElement_nearestViewportElement_Getter";


  /** @domName SVGTextElement.getBBox */
  SVGRect getBBox() native "SVGTextElement_getBBox_Callback";


  /** @domName SVGTextElement.getCTM */
  SVGMatrix getCTM() native "SVGTextElement_getCTM_Callback";


  /** @domName SVGTextElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGTextElement_getScreenCTM_Callback";


  /** @domName SVGTextElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGTextElement_getTransformToElement_Callback";


  /** @domName SVGTextElement.transform */
  SVGAnimatedTransformList get transform native "SVGTextElement_transform_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTextPathElement
class SVGTextPathElement extends SVGTextContentElement implements SVGURIReference {
  SVGTextPathElement.internal(): super.internal();

  static const int TEXTPATH_METHODTYPE_ALIGN = 1;

  static const int TEXTPATH_METHODTYPE_STRETCH = 2;

  static const int TEXTPATH_METHODTYPE_UNKNOWN = 0;

  static const int TEXTPATH_SPACINGTYPE_AUTO = 1;

  static const int TEXTPATH_SPACINGTYPE_EXACT = 2;

  static const int TEXTPATH_SPACINGTYPE_UNKNOWN = 0;


  /** @domName SVGTextPathElement.method */
  SVGAnimatedEnumeration get method native "SVGTextPathElement_method_Getter";


  /** @domName SVGTextPathElement.spacing */
  SVGAnimatedEnumeration get spacing native "SVGTextPathElement_spacing_Getter";


  /** @domName SVGTextPathElement.startOffset */
  SVGAnimatedLength get startOffset native "SVGTextPathElement_startOffset_Getter";


  /** @domName SVGTextPathElement.href */
  SVGAnimatedString get href native "SVGTextPathElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTextPositioningElement
class SVGTextPositioningElement extends SVGTextContentElement {
  SVGTextPositioningElement.internal(): super.internal();


  /** @domName SVGTextPositioningElement.dx */
  SVGAnimatedLengthList get dx native "SVGTextPositioningElement_dx_Getter";


  /** @domName SVGTextPositioningElement.dy */
  SVGAnimatedLengthList get dy native "SVGTextPositioningElement_dy_Getter";


  /** @domName SVGTextPositioningElement.rotate */
  SVGAnimatedNumberList get rotate native "SVGTextPositioningElement_rotate_Getter";


  /** @domName SVGTextPositioningElement.x */
  SVGAnimatedLengthList get x native "SVGTextPositioningElement_x_Getter";


  /** @domName SVGTextPositioningElement.y */
  SVGAnimatedLengthList get y native "SVGTextPositioningElement_y_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTitleElement
class SVGTitleElement extends SVGElement implements SVGLangSpace, SVGStylable {
  SVGTitleElement.internal(): super.internal();


  /** @domName SVGTitleElement.xmllang */
  String get xmllang native "SVGTitleElement_xmllang_Getter";


  /** @domName SVGTitleElement.xmllang */
  void set xmllang(String value) native "SVGTitleElement_xmllang_Setter";


  /** @domName SVGTitleElement.xmlspace */
  String get xmlspace native "SVGTitleElement_xmlspace_Getter";


  /** @domName SVGTitleElement.xmlspace */
  void set xmlspace(String value) native "SVGTitleElement_xmlspace_Setter";


  /** @domName SVGTitleElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGTitleElement_className_Getter";


  /** @domName SVGTitleElement.style */
  CSSStyleDeclaration get style native "SVGTitleElement_style_Getter";


  /** @domName SVGTitleElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGTitleElement_getPresentationAttribute_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTransform
class SVGTransform extends NativeFieldWrapperClass1 {
  SVGTransform.internal();

  static const int SVG_TRANSFORM_MATRIX = 1;

  static const int SVG_TRANSFORM_ROTATE = 4;

  static const int SVG_TRANSFORM_SCALE = 3;

  static const int SVG_TRANSFORM_SKEWX = 5;

  static const int SVG_TRANSFORM_SKEWY = 6;

  static const int SVG_TRANSFORM_TRANSLATE = 2;

  static const int SVG_TRANSFORM_UNKNOWN = 0;


  /** @domName SVGTransform.angle */
  num get angle native "SVGTransform_angle_Getter";


  /** @domName SVGTransform.matrix */
  SVGMatrix get matrix native "SVGTransform_matrix_Getter";


  /** @domName SVGTransform.type */
  int get type native "SVGTransform_type_Getter";


  /** @domName SVGTransform.setMatrix */
  void setMatrix(SVGMatrix matrix) native "SVGTransform_setMatrix_Callback";


  /** @domName SVGTransform.setRotate */
  void setRotate(num angle, num cx, num cy) native "SVGTransform_setRotate_Callback";


  /** @domName SVGTransform.setScale */
  void setScale(num sx, num sy) native "SVGTransform_setScale_Callback";


  /** @domName SVGTransform.setSkewX */
  void setSkewX(num angle) native "SVGTransform_setSkewX_Callback";


  /** @domName SVGTransform.setSkewY */
  void setSkewY(num angle) native "SVGTransform_setSkewY_Callback";


  /** @domName SVGTransform.setTranslate */
  void setTranslate(num tx, num ty) native "SVGTransform_setTranslate_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTransformList
class SVGTransformList extends NativeFieldWrapperClass1 implements List<SVGTransform> {
  SVGTransformList.internal();


  /** @domName SVGTransformList.numberOfItems */
  int get numberOfItems native "SVGTransformList_numberOfItems_Getter";

  SVGTransform operator[](int index) native "SVGTransformList_item_Callback";

  void operator[]=(int index, SVGTransform value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGTransform> mixins.
  // SVGTransform is the element type.

  // From Iterable<SVGTransform>:

  Iterator<SVGTransform> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGTransform>(this);
  }

  // From Collection<SVGTransform>:

  void add(SVGTransform value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGTransform value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGTransform> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGTransform element) => _Collections.contains(this, element);

  void forEach(void f(SVGTransform element)) => _Collections.forEach(this, f);

  Collection map(f(SVGTransform element)) => _Collections.map(this, [], f);

  Collection<SVGTransform> filter(bool f(SVGTransform element)) =>
     _Collections.filter(this, <SVGTransform>[], f);

  bool every(bool f(SVGTransform element)) => _Collections.every(this, f);

  bool some(bool f(SVGTransform element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGTransform>:

  void sort([Comparator<SVGTransform> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGTransform element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGTransform element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGTransform get last => this[length - 1];

  SVGTransform removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGTransform> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGTransform initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGTransform> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGTransform>[]);

  // -- end List<SVGTransform> mixins.


  /** @domName SVGTransformList.appendItem */
  SVGTransform appendItem(SVGTransform item) native "SVGTransformList_appendItem_Callback";


  /** @domName SVGTransformList.clear */
  void clear() native "SVGTransformList_clear_Callback";


  /** @domName SVGTransformList.consolidate */
  SVGTransform consolidate() native "SVGTransformList_consolidate_Callback";


  /** @domName SVGTransformList.createSVGTransformFromMatrix */
  SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";


  /** @domName SVGTransformList.getItem */
  SVGTransform getItem(int index) native "SVGTransformList_getItem_Callback";


  /** @domName SVGTransformList.initialize */
  SVGTransform initialize(SVGTransform item) native "SVGTransformList_initialize_Callback";


  /** @domName SVGTransformList.insertItemBefore */
  SVGTransform insertItemBefore(SVGTransform item, int index) native "SVGTransformList_insertItemBefore_Callback";


  /** @domName SVGTransformList.removeItem */
  SVGTransform removeItem(int index) native "SVGTransformList_removeItem_Callback";


  /** @domName SVGTransformList.replaceItem */
  SVGTransform replaceItem(SVGTransform item, int index) native "SVGTransformList_replaceItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGTransformable
class SVGTransformable extends NativeFieldWrapperClass1 implements SVGLocatable {
  SVGTransformable.internal();


  /** @domName SVGTransformable.transform */
  SVGAnimatedTransformList get transform native "SVGTransformable_transform_Getter";


  /** @domName SVGTransformable.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGTransformable_farthestViewportElement_Getter";


  /** @domName SVGTransformable.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGTransformable_nearestViewportElement_Getter";


  /** @domName SVGTransformable.getBBox */
  SVGRect getBBox() native "SVGTransformable_getBBox_Callback";


  /** @domName SVGTransformable.getCTM */
  SVGMatrix getCTM() native "SVGTransformable_getCTM_Callback";


  /** @domName SVGTransformable.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGTransformable_getScreenCTM_Callback";


  /** @domName SVGTransformable.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGTransformable_getTransformToElement_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SVGURIReference
class SVGURIReference extends NativeFieldWrapperClass1 {
  SVGURIReference.internal();


  /** @domName SVGURIReference.href */
  SVGAnimatedString get href native "SVGURIReference_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGUnitTypes
class SVGUnitTypes extends NativeFieldWrapperClass1 {
  SVGUnitTypes.internal();

  static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;

  static const int SVG_UNIT_TYPE_UNKNOWN = 0;

  static const int SVG_UNIT_TYPE_USERSPACEONUSE = 1;

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

// WARNING: Do not edit - generated code.

/// @domName SVGUseElement
class SVGUseElement extends SVGElement implements SVGLangSpace, SVGTests, SVGStylable, SVGURIReference, SVGExternalResourcesRequired, SVGTransformable {
  SVGUseElement.internal(): super.internal();


  /** @domName SVGUseElement.animatedInstanceRoot */
  SVGElementInstance get animatedInstanceRoot native "SVGUseElement_animatedInstanceRoot_Getter";


  /** @domName SVGUseElement.height */
  SVGAnimatedLength get height native "SVGUseElement_height_Getter";


  /** @domName SVGUseElement.instanceRoot */
  SVGElementInstance get instanceRoot native "SVGUseElement_instanceRoot_Getter";


  /** @domName SVGUseElement.width */
  SVGAnimatedLength get width native "SVGUseElement_width_Getter";


  /** @domName SVGUseElement.x */
  SVGAnimatedLength get x native "SVGUseElement_x_Getter";


  /** @domName SVGUseElement.y */
  SVGAnimatedLength get y native "SVGUseElement_y_Getter";


  /** @domName SVGUseElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGUseElement_externalResourcesRequired_Getter";


  /** @domName SVGUseElement.xmllang */
  String get xmllang native "SVGUseElement_xmllang_Getter";


  /** @domName SVGUseElement.xmllang */
  void set xmllang(String value) native "SVGUseElement_xmllang_Setter";


  /** @domName SVGUseElement.xmlspace */
  String get xmlspace native "SVGUseElement_xmlspace_Getter";


  /** @domName SVGUseElement.xmlspace */
  void set xmlspace(String value) native "SVGUseElement_xmlspace_Setter";


  /** @domName SVGUseElement.farthestViewportElement */
  SVGElement get farthestViewportElement native "SVGUseElement_farthestViewportElement_Getter";


  /** @domName SVGUseElement.nearestViewportElement */
  SVGElement get nearestViewportElement native "SVGUseElement_nearestViewportElement_Getter";


  /** @domName SVGUseElement.getBBox */
  SVGRect getBBox() native "SVGUseElement_getBBox_Callback";


  /** @domName SVGUseElement.getCTM */
  SVGMatrix getCTM() native "SVGUseElement_getCTM_Callback";


  /** @domName SVGUseElement.getScreenCTM */
  SVGMatrix getScreenCTM() native "SVGUseElement_getScreenCTM_Callback";


  /** @domName SVGUseElement.getTransformToElement */
  SVGMatrix getTransformToElement(SVGElement element) native "SVGUseElement_getTransformToElement_Callback";


  /** @domName SVGUseElement.className */
  SVGAnimatedString get $dom_svgClassName native "SVGUseElement_className_Getter";


  /** @domName SVGUseElement.style */
  CSSStyleDeclaration get style native "SVGUseElement_style_Getter";


  /** @domName SVGUseElement.getPresentationAttribute */
  CSSValue getPresentationAttribute(String name) native "SVGUseElement_getPresentationAttribute_Callback";


  /** @domName SVGUseElement.requiredExtensions */
  SVGStringList get requiredExtensions native "SVGUseElement_requiredExtensions_Getter";


  /** @domName SVGUseElement.requiredFeatures */
  SVGStringList get requiredFeatures native "SVGUseElement_requiredFeatures_Getter";


  /** @domName SVGUseElement.systemLanguage */
  SVGStringList get systemLanguage native "SVGUseElement_systemLanguage_Getter";


  /** @domName SVGUseElement.hasExtension */
  bool hasExtension(String extension) native "SVGUseElement_hasExtension_Callback";


  /** @domName SVGUseElement.transform */
  SVGAnimatedTransformList get transform native "SVGUseElement_transform_Getter";


  /** @domName SVGUseElement.href */
  SVGAnimatedString get href native "SVGUseElement_href_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGVKernElement
class SVGVKernElement extends SVGElement {
  SVGVKernElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SVGViewElement
class SVGViewElement extends SVGElement implements SVGFitToViewBox, SVGZoomAndPan, SVGExternalResourcesRequired {
  SVGViewElement.internal(): super.internal();


  /** @domName SVGViewElement.viewTarget */
  SVGStringList get viewTarget native "SVGViewElement_viewTarget_Getter";


  /** @domName SVGViewElement.externalResourcesRequired */
  SVGAnimatedBoolean get externalResourcesRequired native "SVGViewElement_externalResourcesRequired_Getter";


  /** @domName SVGViewElement.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewElement_preserveAspectRatio_Getter";


  /** @domName SVGViewElement.viewBox */
  SVGAnimatedRect get viewBox native "SVGViewElement_viewBox_Getter";


  /** @domName SVGViewElement.zoomAndPan */
  int get zoomAndPan native "SVGViewElement_zoomAndPan_Getter";


  /** @domName SVGViewElement.zoomAndPan */
  void set zoomAndPan(int value) native "SVGViewElement_zoomAndPan_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGViewSpec
class SVGViewSpec extends NativeFieldWrapperClass1 {
  SVGViewSpec.internal();


  /** @domName SVGViewSpec.preserveAspectRatio */
  SVGAnimatedPreserveAspectRatio get preserveAspectRatio native "SVGViewSpec_preserveAspectRatio_Getter";


  /** @domName SVGViewSpec.preserveAspectRatioString */
  String get preserveAspectRatioString native "SVGViewSpec_preserveAspectRatioString_Getter";


  /** @domName SVGViewSpec.transform */
  SVGTransformList get transform native "SVGViewSpec_transform_Getter";


  /** @domName SVGViewSpec.transformString */
  String get transformString native "SVGViewSpec_transformString_Getter";


  /** @domName SVGViewSpec.viewBox */
  SVGAnimatedRect get viewBox native "SVGViewSpec_viewBox_Getter";


  /** @domName SVGViewSpec.viewBoxString */
  String get viewBoxString native "SVGViewSpec_viewBoxString_Getter";


  /** @domName SVGViewSpec.viewTarget */
  SVGElement get viewTarget native "SVGViewSpec_viewTarget_Getter";


  /** @domName SVGViewSpec.viewTargetString */
  String get viewTargetString native "SVGViewSpec_viewTargetString_Getter";


  /** @domName SVGViewSpec.zoomAndPan */
  int get zoomAndPan native "SVGViewSpec_zoomAndPan_Getter";


  /** @domName SVGViewSpec.zoomAndPan */
  void set zoomAndPan(int value) native "SVGViewSpec_zoomAndPan_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGZoomAndPan
class SVGZoomAndPan extends NativeFieldWrapperClass1 {
  SVGZoomAndPan.internal();

  static const int SVG_ZOOMANDPAN_DISABLE = 1;

  static const int SVG_ZOOMANDPAN_MAGNIFY = 2;

  static const int SVG_ZOOMANDPAN_UNKNOWN = 0;


  /** @domName SVGZoomAndPan.zoomAndPan */
  int get zoomAndPan native "SVGZoomAndPan_zoomAndPan_Getter";


  /** @domName SVGZoomAndPan.zoomAndPan */
  void set zoomAndPan(int value) native "SVGZoomAndPan_zoomAndPan_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SVGZoomEvent
class SVGZoomEvent extends UIEvent {
  SVGZoomEvent.internal(): super.internal();


  /** @domName SVGZoomEvent.newScale */
  num get newScale native "SVGZoomEvent_newScale_Getter";


  /** @domName SVGZoomEvent.newTranslate */
  SVGPoint get newTranslate native "SVGZoomEvent_newTranslate_Getter";


  /** @domName SVGZoomEvent.previousScale */
  num get previousScale native "SVGZoomEvent_previousScale_Getter";


  /** @domName SVGZoomEvent.previousTranslate */
  SVGPoint get previousTranslate native "SVGZoomEvent_previousTranslate_Getter";


  /** @domName SVGZoomEvent.zoomRectScreen */
  SVGRect get zoomRectScreen native "SVGZoomEvent_zoomRectScreen_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName Screen
class Screen extends NativeFieldWrapperClass1 {
  Screen.internal();


  /** @domName Screen.availHeight */
  int get availHeight native "Screen_availHeight_Getter";


  /** @domName Screen.availLeft */
  int get availLeft native "Screen_availLeft_Getter";


  /** @domName Screen.availTop */
  int get availTop native "Screen_availTop_Getter";


  /** @domName Screen.availWidth */
  int get availWidth native "Screen_availWidth_Getter";


  /** @domName Screen.colorDepth */
  int get colorDepth native "Screen_colorDepth_Getter";


  /** @domName Screen.height */
  int get height native "Screen_height_Getter";


  /** @domName Screen.pixelDepth */
  int get pixelDepth native "Screen_pixelDepth_Getter";


  /** @domName Screen.width */
  int get width native "Screen_width_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLScriptElement
class ScriptElement extends _Element_Merged {

  factory ScriptElement() => _Elements.createScriptElement();
  ScriptElement.internal(): super.internal();


  /** @domName HTMLScriptElement.async */
  bool get async native "HTMLScriptElement_async_Getter";


  /** @domName HTMLScriptElement.async */
  void set async(bool value) native "HTMLScriptElement_async_Setter";


  /** @domName HTMLScriptElement.charset */
  String get charset native "HTMLScriptElement_charset_Getter";


  /** @domName HTMLScriptElement.charset */
  void set charset(String value) native "HTMLScriptElement_charset_Setter";


  /** @domName HTMLScriptElement.crossOrigin */
  String get crossOrigin native "HTMLScriptElement_crossOrigin_Getter";


  /** @domName HTMLScriptElement.crossOrigin */
  void set crossOrigin(String value) native "HTMLScriptElement_crossOrigin_Setter";


  /** @domName HTMLScriptElement.defer */
  bool get defer native "HTMLScriptElement_defer_Getter";


  /** @domName HTMLScriptElement.defer */
  void set defer(bool value) native "HTMLScriptElement_defer_Setter";


  /** @domName HTMLScriptElement.event */
  String get event native "HTMLScriptElement_event_Getter";


  /** @domName HTMLScriptElement.event */
  void set event(String value) native "HTMLScriptElement_event_Setter";


  /** @domName HTMLScriptElement.htmlFor */
  String get htmlFor native "HTMLScriptElement_htmlFor_Getter";


  /** @domName HTMLScriptElement.htmlFor */
  void set htmlFor(String value) native "HTMLScriptElement_htmlFor_Setter";


  /** @domName HTMLScriptElement.src */
  String get src native "HTMLScriptElement_src_Getter";


  /** @domName HTMLScriptElement.src */
  void set src(String value) native "HTMLScriptElement_src_Setter";


  /** @domName HTMLScriptElement.type */
  String get type native "HTMLScriptElement_type_Getter";


  /** @domName HTMLScriptElement.type */
  void set type(String value) native "HTMLScriptElement_type_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName ScriptProcessorNode
class ScriptProcessorNode extends AudioNode implements EventTarget {
  ScriptProcessorNode.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  ScriptProcessorNodeEvents get on =>
    new ScriptProcessorNodeEvents(this);


  /** @domName ScriptProcessorNode.bufferSize */
  int get bufferSize native "ScriptProcessorNode_bufferSize_Getter";

}

class ScriptProcessorNodeEvents extends Events {
  ScriptProcessorNodeEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get audioProcess => this['audioprocess'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName ScriptProfile
class ScriptProfile extends NativeFieldWrapperClass1 {
  ScriptProfile.internal();


  /** @domName ScriptProfile.head */
  ScriptProfileNode get head native "ScriptProfile_head_Getter";


  /** @domName ScriptProfile.title */
  String get title native "ScriptProfile_title_Getter";


  /** @domName ScriptProfile.uid */
  int get uid native "ScriptProfile_uid_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName ScriptProfileNode
class ScriptProfileNode extends NativeFieldWrapperClass1 {
  ScriptProfileNode.internal();


  /** @domName ScriptProfileNode.callUID */
  int get callUID native "ScriptProfileNode_callUID_Getter";


  /** @domName ScriptProfileNode.functionName */
  String get functionName native "ScriptProfileNode_functionName_Getter";


  /** @domName ScriptProfileNode.lineNumber */
  int get lineNumber native "ScriptProfileNode_lineNumber_Getter";


  /** @domName ScriptProfileNode.numberOfCalls */
  int get numberOfCalls native "ScriptProfileNode_numberOfCalls_Getter";


  /** @domName ScriptProfileNode.selfTime */
  num get selfTime native "ScriptProfileNode_selfTime_Getter";


  /** @domName ScriptProfileNode.totalTime */
  num get totalTime native "ScriptProfileNode_totalTime_Getter";


  /** @domName ScriptProfileNode.url */
  String get url native "ScriptProfileNode_url_Getter";


  /** @domName ScriptProfileNode.visible */
  bool get visible native "ScriptProfileNode_visible_Getter";


  /** @domName ScriptProfileNode.children */
  List<ScriptProfileNode> children() native "ScriptProfileNode_children_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLSelectElement
class SelectElement extends _Element_Merged {

  factory SelectElement() => _Elements.createSelectElement();
  SelectElement.internal(): super.internal();


  /** @domName HTMLSelectElement.autofocus */
  bool get autofocus native "HTMLSelectElement_autofocus_Getter";


  /** @domName HTMLSelectElement.autofocus */
  void set autofocus(bool value) native "HTMLSelectElement_autofocus_Setter";


  /** @domName HTMLSelectElement.disabled */
  bool get disabled native "HTMLSelectElement_disabled_Getter";


  /** @domName HTMLSelectElement.disabled */
  void set disabled(bool value) native "HTMLSelectElement_disabled_Setter";


  /** @domName HTMLSelectElement.form */
  FormElement get form native "HTMLSelectElement_form_Getter";


  /** @domName HTMLSelectElement.labels */
  List<Node> get labels native "HTMLSelectElement_labels_Getter";


  /** @domName HTMLSelectElement.length */
  int get length native "HTMLSelectElement_length_Getter";


  /** @domName HTMLSelectElement.length */
  void set length(int value) native "HTMLSelectElement_length_Setter";


  /** @domName HTMLSelectElement.multiple */
  bool get multiple native "HTMLSelectElement_multiple_Getter";


  /** @domName HTMLSelectElement.multiple */
  void set multiple(bool value) native "HTMLSelectElement_multiple_Setter";


  /** @domName HTMLSelectElement.name */
  String get name native "HTMLSelectElement_name_Getter";


  /** @domName HTMLSelectElement.name */
  void set name(String value) native "HTMLSelectElement_name_Setter";


  /** @domName HTMLSelectElement.options */
  HTMLOptionsCollection get options native "HTMLSelectElement_options_Getter";


  /** @domName HTMLSelectElement.required */
  bool get required native "HTMLSelectElement_required_Getter";


  /** @domName HTMLSelectElement.required */
  void set required(bool value) native "HTMLSelectElement_required_Setter";


  /** @domName HTMLSelectElement.selectedIndex */
  int get selectedIndex native "HTMLSelectElement_selectedIndex_Getter";


  /** @domName HTMLSelectElement.selectedIndex */
  void set selectedIndex(int value) native "HTMLSelectElement_selectedIndex_Setter";


  /** @domName HTMLSelectElement.selectedOptions */
  HTMLCollection get selectedOptions native "HTMLSelectElement_selectedOptions_Getter";


  /** @domName HTMLSelectElement.size */
  int get size native "HTMLSelectElement_size_Getter";


  /** @domName HTMLSelectElement.size */
  void set size(int value) native "HTMLSelectElement_size_Setter";


  /** @domName HTMLSelectElement.type */
  String get type native "HTMLSelectElement_type_Getter";


  /** @domName HTMLSelectElement.validationMessage */
  String get validationMessage native "HTMLSelectElement_validationMessage_Getter";


  /** @domName HTMLSelectElement.validity */
  ValidityState get validity native "HTMLSelectElement_validity_Getter";


  /** @domName HTMLSelectElement.value */
  String get value native "HTMLSelectElement_value_Getter";


  /** @domName HTMLSelectElement.value */
  void set value(String value) native "HTMLSelectElement_value_Setter";


  /** @domName HTMLSelectElement.willValidate */
  bool get willValidate native "HTMLSelectElement_willValidate_Getter";


  /** @domName HTMLSelectElement.checkValidity */
  bool checkValidity() native "HTMLSelectElement_checkValidity_Callback";


  /** @domName HTMLSelectElement.item */
  Node item(int index) native "HTMLSelectElement_item_Callback";


  /** @domName HTMLSelectElement.namedItem */
  Node namedItem(String name) native "HTMLSelectElement_namedItem_Callback";


  /** @domName HTMLSelectElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLSelectElement_setCustomValidity_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SessionDescription
class SessionDescription extends NativeFieldWrapperClass1 {

  factory SessionDescription(String sdp) => _SessionDescriptionFactoryProvider.createSessionDescription(sdp);
  SessionDescription.internal();


  /** @domName SessionDescription.addCandidate */
  void addCandidate(IceCandidate candidate) native "SessionDescription_addCandidate_Callback";


  /** @domName SessionDescription.toSdp */
  String toSdp() native "SessionDescription_toSdp_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLShadowElement
class ShadowElement extends _Element_Merged {
  ShadowElement.internal(): super.internal();


  /** @domName HTMLShadowElement.resetStyleInheritance */
  bool get resetStyleInheritance native "HTMLShadowElement_resetStyleInheritance_Getter";


  /** @domName HTMLShadowElement.resetStyleInheritance */
  void set resetStyleInheritance(bool value) native "HTMLShadowElement_resetStyleInheritance_Setter";

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

// WARNING: Do not edit - generated code.

class ShadowRoot extends DocumentFragment {

  factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
  ShadowRoot.internal(): super.internal();


  /** @domName ShadowRoot.activeElement */
  Element get activeElement native "ShadowRoot_activeElement_Getter";


  /** @domName ShadowRoot.applyAuthorStyles */
  bool get applyAuthorStyles native "ShadowRoot_applyAuthorStyles_Getter";


  /** @domName ShadowRoot.applyAuthorStyles */
  void set applyAuthorStyles(bool value) native "ShadowRoot_applyAuthorStyles_Setter";


  /** @domName ShadowRoot.innerHTML */
  String get innerHTML native "ShadowRoot_innerHTML_Getter";


  /** @domName ShadowRoot.innerHTML */
  void set innerHTML(String value) native "ShadowRoot_innerHTML_Setter";


  /** @domName ShadowRoot.resetStyleInheritance */
  bool get resetStyleInheritance native "ShadowRoot_resetStyleInheritance_Getter";


  /** @domName ShadowRoot.resetStyleInheritance */
  void set resetStyleInheritance(bool value) native "ShadowRoot_resetStyleInheritance_Setter";


  /** @domName ShadowRoot.cloneNode */
  Node clone(bool deep) native "ShadowRoot_cloneNode_Callback";


  /** @domName ShadowRoot.getElementById */
  Element $dom_getElementById(String elementId) native "ShadowRoot_getElementById_Callback";


  /** @domName ShadowRoot.getElementsByClassName */
  List<Node> $dom_getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";


  /** @domName ShadowRoot.getElementsByTagName */
  List<Node> $dom_getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";


  /** @domName ShadowRoot.getSelection */
  DOMSelection getSelection() native "ShadowRoot_getSelection_Callback";

  static bool get supported => _Utils.shadowRootSupported(window.document);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SharedWorker
class SharedWorker extends AbstractWorker {

  factory SharedWorker(String scriptURL, [String name]) {
    if (!?name) {
      return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL);
    }
    return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL, name);
  }
  SharedWorker.internal(): super.internal();


  /** @domName SharedWorker.port */
  MessagePort get port native "SharedWorker_port_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SharedWorkerContext
class SharedWorkerContext extends WorkerContext {
  SharedWorkerContext.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  SharedWorkerContextEvents get on =>
    new SharedWorkerContextEvents(this);


  /** @domName SharedWorkerContext.name */
  String get name native "SharedWorkerContext_name_Getter";

}

class SharedWorkerContextEvents extends WorkerContextEvents {
  SharedWorkerContextEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get connect => this['connect'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SourceBuffer
class SourceBuffer extends NativeFieldWrapperClass1 {
  SourceBuffer.internal();


  /** @domName SourceBuffer.buffered */
  TimeRanges get buffered native "SourceBuffer_buffered_Getter";


  /** @domName SourceBuffer.timestampOffset */
  num get timestampOffset native "SourceBuffer_timestampOffset_Getter";


  /** @domName SourceBuffer.timestampOffset */
  void set timestampOffset(num value) native "SourceBuffer_timestampOffset_Setter";


  /** @domName SourceBuffer.abort */
  void abort() native "SourceBuffer_abort_Callback";


  /** @domName SourceBuffer.append */
  void append(Uint8Array data) native "SourceBuffer_append_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SourceBufferList
class SourceBufferList extends EventTarget implements List<SourceBuffer> {
  SourceBufferList.internal(): super.internal();


  /** @domName SourceBufferList.length */
  int get length native "SourceBufferList_length_Getter";

  SourceBuffer operator[](int index) native "SourceBufferList_item_Callback";

  void operator[]=(int index, SourceBuffer value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SourceBuffer> mixins.
  // SourceBuffer is the element type.

  // From Iterable<SourceBuffer>:

  Iterator<SourceBuffer> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SourceBuffer>(this);
  }

  // From Collection<SourceBuffer>:

  void add(SourceBuffer value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SourceBuffer value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SourceBuffer> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SourceBuffer element) => _Collections.contains(this, element);

  void forEach(void f(SourceBuffer element)) => _Collections.forEach(this, f);

  Collection map(f(SourceBuffer element)) => _Collections.map(this, [], f);

  Collection<SourceBuffer> filter(bool f(SourceBuffer element)) =>
     _Collections.filter(this, <SourceBuffer>[], f);

  bool every(bool f(SourceBuffer element)) => _Collections.every(this, f);

  bool some(bool f(SourceBuffer element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SourceBuffer>:

  void sort([Comparator<SourceBuffer> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SourceBuffer element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SourceBuffer element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SourceBuffer get last => this[length - 1];

  SourceBuffer removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SourceBuffer> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SourceBuffer initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SourceBuffer> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SourceBuffer>[]);

  // -- end List<SourceBuffer> mixins.


  /** @domName SourceBufferList.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";


  /** @domName SourceBufferList.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";


  /** @domName SourceBufferList.item */
  SourceBuffer item(int index) native "SourceBufferList_item_Callback";


  /** @domName SourceBufferList.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLSourceElement
class SourceElement extends _Element_Merged {

  factory SourceElement() => _Elements.createSourceElement();
  SourceElement.internal(): super.internal();


  /** @domName HTMLSourceElement.media */
  String get media native "HTMLSourceElement_media_Getter";


  /** @domName HTMLSourceElement.media */
  void set media(String value) native "HTMLSourceElement_media_Setter";


  /** @domName HTMLSourceElement.src */
  String get src native "HTMLSourceElement_src_Getter";


  /** @domName HTMLSourceElement.src */
  void set src(String value) native "HTMLSourceElement_src_Setter";


  /** @domName HTMLSourceElement.type */
  String get type native "HTMLSourceElement_type_Getter";


  /** @domName HTMLSourceElement.type */
  void set type(String value) native "HTMLSourceElement_type_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLSpanElement
class SpanElement extends _Element_Merged {

  factory SpanElement() => _Elements.createSpanElement();
  SpanElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName SpeechGrammar
class SpeechGrammar extends NativeFieldWrapperClass1 {

  factory SpeechGrammar() => _SpeechGrammarFactoryProvider.createSpeechGrammar();
  SpeechGrammar.internal();


  /** @domName SpeechGrammar.src */
  String get src native "SpeechGrammar_src_Getter";


  /** @domName SpeechGrammar.src */
  void set src(String value) native "SpeechGrammar_src_Setter";


  /** @domName SpeechGrammar.weight */
  num get weight native "SpeechGrammar_weight_Getter";


  /** @domName SpeechGrammar.weight */
  void set weight(num value) native "SpeechGrammar_weight_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName SpeechGrammarList
class SpeechGrammarList extends NativeFieldWrapperClass1 implements List<SpeechGrammar> {

  factory SpeechGrammarList() => _SpeechGrammarListFactoryProvider.createSpeechGrammarList();
  SpeechGrammarList.internal();


  /** @domName SpeechGrammarList.length */
  int get length native "SpeechGrammarList_length_Getter";

  SpeechGrammar operator[](int index) native "SpeechGrammarList_item_Callback";

  void operator[]=(int index, SpeechGrammar value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechGrammar> mixins.
  // SpeechGrammar is the element type.

  // From Iterable<SpeechGrammar>:

  Iterator<SpeechGrammar> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SpeechGrammar>(this);
  }

  // From Collection<SpeechGrammar>:

  void add(SpeechGrammar value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechGrammar value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SpeechGrammar> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SpeechGrammar element) => _Collections.contains(this, element);

  void forEach(void f(SpeechGrammar element)) => _Collections.forEach(this, f);

  Collection map(f(SpeechGrammar element)) => _Collections.map(this, [], f);

  Collection<SpeechGrammar> filter(bool f(SpeechGrammar element)) =>
     _Collections.filter(this, <SpeechGrammar>[], f);

  bool every(bool f(SpeechGrammar element)) => _Collections.every(this, f);

  bool some(bool f(SpeechGrammar element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SpeechGrammar>:

  void sort([Comparator<SpeechGrammar> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechGrammar element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechGrammar element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SpeechGrammar get last => this[length - 1];

  SpeechGrammar removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechGrammar> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechGrammar initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechGrammar> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SpeechGrammar>[]);

  // -- end List<SpeechGrammar> mixins.

  void addFromString(/*DOMString*/ string, [/*float*/ weight]) {
    if (?weight) {
      _addFromString_1(string, weight);
      return;
    }
    _addFromString_2(string);
  }


  /** @domName SpeechGrammarList.addFromString_1 */
  void _addFromString_1(string, weight) native "SpeechGrammarList_addFromString_1_Callback";


  /** @domName SpeechGrammarList.addFromString_2 */
  void _addFromString_2(string) native "SpeechGrammarList_addFromString_2_Callback";

  void addFromUri(/*DOMString*/ src, [/*float*/ weight]) {
    if (?weight) {
      _addFromUri_1(src, weight);
      return;
    }
    _addFromUri_2(src);
  }


  /** @domName SpeechGrammarList.addFromUri_1 */
  void _addFromUri_1(src, weight) native "SpeechGrammarList_addFromUri_1_Callback";


  /** @domName SpeechGrammarList.addFromUri_2 */
  void _addFromUri_2(src) native "SpeechGrammarList_addFromUri_2_Callback";


  /** @domName SpeechGrammarList.item */
  SpeechGrammar item(int index) native "SpeechGrammarList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName SpeechInputEvent
class SpeechInputEvent extends Event {
  SpeechInputEvent.internal(): super.internal();


  /** @domName SpeechInputEvent.results */
  List<SpeechInputResult> get results native "SpeechInputEvent_results_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SpeechInputResult
class SpeechInputResult extends NativeFieldWrapperClass1 {
  SpeechInputResult.internal();


  /** @domName SpeechInputResult.confidence */
  num get confidence native "SpeechInputResult_confidence_Getter";


  /** @domName SpeechInputResult.utterance */
  String get utterance native "SpeechInputResult_utterance_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SpeechRecognition
class SpeechRecognition extends EventTarget {

  factory SpeechRecognition() => _SpeechRecognitionFactoryProvider.createSpeechRecognition();
  SpeechRecognition.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  SpeechRecognitionEvents get on =>
    new SpeechRecognitionEvents(this);


  /** @domName SpeechRecognition.continuous */
  bool get continuous native "SpeechRecognition_continuous_Getter";


  /** @domName SpeechRecognition.continuous */
  void set continuous(bool value) native "SpeechRecognition_continuous_Setter";


  /** @domName SpeechRecognition.grammars */
  SpeechGrammarList get grammars native "SpeechRecognition_grammars_Getter";


  /** @domName SpeechRecognition.grammars */
  void set grammars(SpeechGrammarList value) native "SpeechRecognition_grammars_Setter";


  /** @domName SpeechRecognition.interimResults */
  bool get interimResults native "SpeechRecognition_interimResults_Getter";


  /** @domName SpeechRecognition.interimResults */
  void set interimResults(bool value) native "SpeechRecognition_interimResults_Setter";


  /** @domName SpeechRecognition.lang */
  String get lang native "SpeechRecognition_lang_Getter";


  /** @domName SpeechRecognition.lang */
  void set lang(String value) native "SpeechRecognition_lang_Setter";


  /** @domName SpeechRecognition.maxAlternatives */
  int get maxAlternatives native "SpeechRecognition_maxAlternatives_Getter";


  /** @domName SpeechRecognition.maxAlternatives */
  void set maxAlternatives(int value) native "SpeechRecognition_maxAlternatives_Setter";


  /** @domName SpeechRecognition.abort */
  void abort() native "SpeechRecognition_abort_Callback";


  /** @domName SpeechRecognition.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";


  /** @domName SpeechRecognition.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "SpeechRecognition_dispatchEvent_Callback";


  /** @domName SpeechRecognition.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";


  /** @domName SpeechRecognition.start */
  void start() native "SpeechRecognition_start_Callback";


  /** @domName SpeechRecognition.stop */
  void stop() native "SpeechRecognition_stop_Callback";

}

class SpeechRecognitionEvents extends Events {
  SpeechRecognitionEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get audioEnd => this['audioend'];

  EventListenerList get audioStart => this['audiostart'];

  EventListenerList get end => this['end'];

  EventListenerList get error => this['error'];

  EventListenerList get noMatch => this['nomatch'];

  EventListenerList get result => this['result'];

  EventListenerList get soundEnd => this['soundend'];

  EventListenerList get soundStart => this['soundstart'];

  EventListenerList get speechEnd => this['speechend'];

  EventListenerList get speechStart => this['speechstart'];

  EventListenerList get start => this['start'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SpeechRecognitionAlternative
class SpeechRecognitionAlternative extends NativeFieldWrapperClass1 {
  SpeechRecognitionAlternative.internal();


  /** @domName SpeechRecognitionAlternative.confidence */
  num get confidence native "SpeechRecognitionAlternative_confidence_Getter";


  /** @domName SpeechRecognitionAlternative.transcript */
  String get transcript native "SpeechRecognitionAlternative_transcript_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SpeechRecognitionError
class SpeechRecognitionError extends Event {
  SpeechRecognitionError.internal(): super.internal();

  static const int ABORTED = 2;

  static const int AUDIO_CAPTURE = 3;

  static const int BAD_GRAMMAR = 7;

  static const int LANGUAGE_NOT_SUPPORTED = 8;

  static const int NETWORK = 4;

  static const int NOT_ALLOWED = 5;

  static const int NO_SPEECH = 1;

  static const int OTHER = 0;

  static const int SERVICE_NOT_ALLOWED = 6;


  /** @domName SpeechRecognitionError.code */
  int get code native "SpeechRecognitionError_code_Getter";


  /** @domName SpeechRecognitionError.message */
  String get message native "SpeechRecognitionError_message_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SpeechRecognitionEvent
class SpeechRecognitionEvent extends Event {
  SpeechRecognitionEvent.internal(): super.internal();


  /** @domName SpeechRecognitionEvent.result */
  SpeechRecognitionResult get result native "SpeechRecognitionEvent_result_Getter";


  /** @domName SpeechRecognitionEvent.resultHistory */
  List<SpeechRecognitionResult> get resultHistory native "SpeechRecognitionEvent_resultHistory_Getter";


  /** @domName SpeechRecognitionEvent.resultIndex */
  int get resultIndex native "SpeechRecognitionEvent_resultIndex_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName SpeechRecognitionResult
class SpeechRecognitionResult extends NativeFieldWrapperClass1 {
  SpeechRecognitionResult.internal();


  /** @domName SpeechRecognitionResult.emma */
  Document get emma native "SpeechRecognitionResult_emma_Getter";


  /** @domName SpeechRecognitionResult.final */
  bool get finalValue native "SpeechRecognitionResult_final_Getter";


  /** @domName SpeechRecognitionResult.length */
  int get length native "SpeechRecognitionResult_length_Getter";


  /** @domName SpeechRecognitionResult.item */
  SpeechRecognitionAlternative item(int index) native "SpeechRecognitionResult_item_Callback";

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

class Storage extends NativeFieldWrapperClass1 implements Map<String, String>  {

  // TODO(nweiz): update this when maps support lazy iteration
  bool containsValue(String value) => values.some((e) => e == value);

  bool containsKey(String key) => $dom_getItem(key) != null;

  String operator [](String key) => $dom_getItem(key);

  void operator []=(String key, String value) => $dom_setItem(key, value);

  String putIfAbsent(String key, String ifAbsent()) {
    if (!containsKey(key)) this[key] = ifAbsent();
    return this[key];
  }

  String remove(String key) {
    final value = this[key];
    $dom_removeItem(key);
    return value;
  }

  void clear() => $dom_clear();

  void forEach(void f(String key, String value)) {
    for (var i = 0; true; i++) {
      final key = $dom_key(i);
      if (key == null) return;

      f(key, this[key]);
    }
  }

  Collection<String> get keys {
    final keys = [];
    forEach((k, v) => keys.add(k));
    return keys;
  }

  Collection<String> get values {
    final values = [];
    forEach((k, v) => values.add(v));
    return values;
  }

  int get length => $dom_length;

  bool get isEmpty => $dom_key(0) == null;
  Storage.internal();


  /** @domName Storage.length */
  int get $dom_length native "Storage_length_Getter";


  /** @domName Storage.clear */
  void $dom_clear() native "Storage_clear_Callback";


  /** @domName Storage.getItem */
  String $dom_getItem(String key) native "Storage_getItem_Callback";


  /** @domName Storage.key */
  String $dom_key(int index) native "Storage_key_Callback";


  /** @domName Storage.removeItem */
  void $dom_removeItem(String key) native "Storage_removeItem_Callback";


  /** @domName Storage.setItem */
  void $dom_setItem(String key, String data) native "Storage_setItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName StorageEvent
class StorageEvent extends Event {
  StorageEvent.internal(): super.internal();


  /** @domName StorageEvent.key */
  String get key native "StorageEvent_key_Getter";


  /** @domName StorageEvent.newValue */
  String get newValue native "StorageEvent_newValue_Getter";


  /** @domName StorageEvent.oldValue */
  String get oldValue native "StorageEvent_oldValue_Getter";


  /** @domName StorageEvent.storageArea */
  Storage get storageArea native "StorageEvent_storageArea_Getter";


  /** @domName StorageEvent.url */
  String get url native "StorageEvent_url_Getter";


  /** @domName StorageEvent.initStorageEvent */
  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native "StorageEvent_initStorageEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName StorageInfo
class StorageInfo extends NativeFieldWrapperClass1 {
  StorageInfo.internal();

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;


  /** @domName StorageInfo.queryUsageAndQuota */
  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_queryUsageAndQuota_Callback";


  /** @domName StorageInfo.requestQuota */
  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_requestQuota_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.


typedef void StorageInfoUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName HTMLStyleElement
class StyleElement extends _Element_Merged {

  factory StyleElement() => _Elements.createStyleElement();
  StyleElement.internal(): super.internal();


  /** @domName HTMLStyleElement.disabled */
  bool get disabled native "HTMLStyleElement_disabled_Getter";


  /** @domName HTMLStyleElement.disabled */
  void set disabled(bool value) native "HTMLStyleElement_disabled_Setter";


  /** @domName HTMLStyleElement.media */
  String get media native "HTMLStyleElement_media_Getter";


  /** @domName HTMLStyleElement.media */
  void set media(String value) native "HTMLStyleElement_media_Setter";


  /** @domName HTMLStyleElement.scoped */
  bool get scoped native "HTMLStyleElement_scoped_Getter";


  /** @domName HTMLStyleElement.scoped */
  void set scoped(bool value) native "HTMLStyleElement_scoped_Setter";


  /** @domName HTMLStyleElement.sheet */
  StyleSheet get sheet native "HTMLStyleElement_sheet_Getter";


  /** @domName HTMLStyleElement.type */
  String get type native "HTMLStyleElement_type_Getter";


  /** @domName HTMLStyleElement.type */
  void set type(String value) native "HTMLStyleElement_type_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName StyleMedia
class StyleMedia extends NativeFieldWrapperClass1 {
  StyleMedia.internal();


  /** @domName StyleMedia.type */
  String get type native "StyleMedia_type_Getter";


  /** @domName StyleMedia.matchMedium */
  bool matchMedium(String mediaquery) native "StyleMedia_matchMedium_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName StyleSheet
class StyleSheet extends NativeFieldWrapperClass1 {
  StyleSheet.internal();


  /** @domName StyleSheet.disabled */
  bool get disabled native "StyleSheet_disabled_Getter";


  /** @domName StyleSheet.disabled */
  void set disabled(bool value) native "StyleSheet_disabled_Setter";


  /** @domName StyleSheet.href */
  String get href native "StyleSheet_href_Getter";


  /** @domName StyleSheet.media */
  MediaList get media native "StyleSheet_media_Getter";


  /** @domName StyleSheet.ownerNode */
  Node get ownerNode native "StyleSheet_ownerNode_Getter";


  /** @domName StyleSheet.parentStyleSheet */
  StyleSheet get parentStyleSheet native "StyleSheet_parentStyleSheet_Getter";


  /** @domName StyleSheet.title */
  String get title native "StyleSheet_title_Getter";


  /** @domName StyleSheet.type */
  String get type native "StyleSheet_type_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTableCaptionElement
class TableCaptionElement extends _Element_Merged {

  factory TableCaptionElement() => _Elements.createTableCaptionElement();
  TableCaptionElement.internal(): super.internal();


  /** @domName HTMLTableCaptionElement.align */
  String get align native "HTMLTableCaptionElement_align_Getter";


  /** @domName HTMLTableCaptionElement.align */
  void set align(String value) native "HTMLTableCaptionElement_align_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTableCellElement
class TableCellElement extends _Element_Merged {

  factory TableCellElement() => _Elements.createTableCellElement();
  TableCellElement.internal(): super.internal();


  /** @domName HTMLTableCellElement.abbr */
  String get abbr native "HTMLTableCellElement_abbr_Getter";


  /** @domName HTMLTableCellElement.abbr */
  void set abbr(String value) native "HTMLTableCellElement_abbr_Setter";


  /** @domName HTMLTableCellElement.align */
  String get align native "HTMLTableCellElement_align_Getter";


  /** @domName HTMLTableCellElement.align */
  void set align(String value) native "HTMLTableCellElement_align_Setter";


  /** @domName HTMLTableCellElement.axis */
  String get axis native "HTMLTableCellElement_axis_Getter";


  /** @domName HTMLTableCellElement.axis */
  void set axis(String value) native "HTMLTableCellElement_axis_Setter";


  /** @domName HTMLTableCellElement.bgColor */
  String get bgColor native "HTMLTableCellElement_bgColor_Getter";


  /** @domName HTMLTableCellElement.bgColor */
  void set bgColor(String value) native "HTMLTableCellElement_bgColor_Setter";


  /** @domName HTMLTableCellElement.cellIndex */
  int get cellIndex native "HTMLTableCellElement_cellIndex_Getter";


  /** @domName HTMLTableCellElement.ch */
  String get ch native "HTMLTableCellElement_ch_Getter";


  /** @domName HTMLTableCellElement.ch */
  void set ch(String value) native "HTMLTableCellElement_ch_Setter";


  /** @domName HTMLTableCellElement.chOff */
  String get chOff native "HTMLTableCellElement_chOff_Getter";


  /** @domName HTMLTableCellElement.chOff */
  void set chOff(String value) native "HTMLTableCellElement_chOff_Setter";


  /** @domName HTMLTableCellElement.colSpan */
  int get colSpan native "HTMLTableCellElement_colSpan_Getter";


  /** @domName HTMLTableCellElement.colSpan */
  void set colSpan(int value) native "HTMLTableCellElement_colSpan_Setter";


  /** @domName HTMLTableCellElement.headers */
  String get headers native "HTMLTableCellElement_headers_Getter";


  /** @domName HTMLTableCellElement.headers */
  void set headers(String value) native "HTMLTableCellElement_headers_Setter";


  /** @domName HTMLTableCellElement.height */
  String get height native "HTMLTableCellElement_height_Getter";


  /** @domName HTMLTableCellElement.height */
  void set height(String value) native "HTMLTableCellElement_height_Setter";


  /** @domName HTMLTableCellElement.noWrap */
  bool get noWrap native "HTMLTableCellElement_noWrap_Getter";


  /** @domName HTMLTableCellElement.noWrap */
  void set noWrap(bool value) native "HTMLTableCellElement_noWrap_Setter";


  /** @domName HTMLTableCellElement.rowSpan */
  int get rowSpan native "HTMLTableCellElement_rowSpan_Getter";


  /** @domName HTMLTableCellElement.rowSpan */
  void set rowSpan(int value) native "HTMLTableCellElement_rowSpan_Setter";


  /** @domName HTMLTableCellElement.scope */
  String get scope native "HTMLTableCellElement_scope_Getter";


  /** @domName HTMLTableCellElement.scope */
  void set scope(String value) native "HTMLTableCellElement_scope_Setter";


  /** @domName HTMLTableCellElement.vAlign */
  String get vAlign native "HTMLTableCellElement_vAlign_Getter";


  /** @domName HTMLTableCellElement.vAlign */
  void set vAlign(String value) native "HTMLTableCellElement_vAlign_Setter";


  /** @domName HTMLTableCellElement.width */
  String get width native "HTMLTableCellElement_width_Getter";


  /** @domName HTMLTableCellElement.width */
  void set width(String value) native "HTMLTableCellElement_width_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTableColElement
class TableColElement extends _Element_Merged {

  factory TableColElement() => _Elements.createTableColElement();
  TableColElement.internal(): super.internal();


  /** @domName HTMLTableColElement.align */
  String get align native "HTMLTableColElement_align_Getter";


  /** @domName HTMLTableColElement.align */
  void set align(String value) native "HTMLTableColElement_align_Setter";


  /** @domName HTMLTableColElement.ch */
  String get ch native "HTMLTableColElement_ch_Getter";


  /** @domName HTMLTableColElement.ch */
  void set ch(String value) native "HTMLTableColElement_ch_Setter";


  /** @domName HTMLTableColElement.chOff */
  String get chOff native "HTMLTableColElement_chOff_Getter";


  /** @domName HTMLTableColElement.chOff */
  void set chOff(String value) native "HTMLTableColElement_chOff_Setter";


  /** @domName HTMLTableColElement.span */
  int get span native "HTMLTableColElement_span_Getter";


  /** @domName HTMLTableColElement.span */
  void set span(int value) native "HTMLTableColElement_span_Setter";


  /** @domName HTMLTableColElement.vAlign */
  String get vAlign native "HTMLTableColElement_vAlign_Getter";


  /** @domName HTMLTableColElement.vAlign */
  void set vAlign(String value) native "HTMLTableColElement_vAlign_Setter";


  /** @domName HTMLTableColElement.width */
  String get width native "HTMLTableColElement_width_Getter";


  /** @domName HTMLTableColElement.width */
  void set width(String value) native "HTMLTableColElement_width_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTableElement
class TableElement extends _Element_Merged {

  factory TableElement() => _Elements.createTableElement();
  TableElement.internal(): super.internal();


  /** @domName HTMLTableElement.align */
  String get align native "HTMLTableElement_align_Getter";


  /** @domName HTMLTableElement.align */
  void set align(String value) native "HTMLTableElement_align_Setter";


  /** @domName HTMLTableElement.bgColor */
  String get bgColor native "HTMLTableElement_bgColor_Getter";


  /** @domName HTMLTableElement.bgColor */
  void set bgColor(String value) native "HTMLTableElement_bgColor_Setter";


  /** @domName HTMLTableElement.border */
  String get border native "HTMLTableElement_border_Getter";


  /** @domName HTMLTableElement.border */
  void set border(String value) native "HTMLTableElement_border_Setter";


  /** @domName HTMLTableElement.caption */
  TableCaptionElement get caption native "HTMLTableElement_caption_Getter";


  /** @domName HTMLTableElement.caption */
  void set caption(TableCaptionElement value) native "HTMLTableElement_caption_Setter";


  /** @domName HTMLTableElement.cellPadding */
  String get cellPadding native "HTMLTableElement_cellPadding_Getter";


  /** @domName HTMLTableElement.cellPadding */
  void set cellPadding(String value) native "HTMLTableElement_cellPadding_Setter";


  /** @domName HTMLTableElement.cellSpacing */
  String get cellSpacing native "HTMLTableElement_cellSpacing_Getter";


  /** @domName HTMLTableElement.cellSpacing */
  void set cellSpacing(String value) native "HTMLTableElement_cellSpacing_Setter";


  /** @domName HTMLTableElement.frame */
  String get frame native "HTMLTableElement_frame_Getter";


  /** @domName HTMLTableElement.frame */
  void set frame(String value) native "HTMLTableElement_frame_Setter";


  /** @domName HTMLTableElement.rows */
  HTMLCollection get rows native "HTMLTableElement_rows_Getter";


  /** @domName HTMLTableElement.rules */
  String get rules native "HTMLTableElement_rules_Getter";


  /** @domName HTMLTableElement.rules */
  void set rules(String value) native "HTMLTableElement_rules_Setter";


  /** @domName HTMLTableElement.summary */
  String get summary native "HTMLTableElement_summary_Getter";


  /** @domName HTMLTableElement.summary */
  void set summary(String value) native "HTMLTableElement_summary_Setter";


  /** @domName HTMLTableElement.tBodies */
  HTMLCollection get tBodies native "HTMLTableElement_tBodies_Getter";


  /** @domName HTMLTableElement.tFoot */
  TableSectionElement get tFoot native "HTMLTableElement_tFoot_Getter";


  /** @domName HTMLTableElement.tFoot */
  void set tFoot(TableSectionElement value) native "HTMLTableElement_tFoot_Setter";


  /** @domName HTMLTableElement.tHead */
  TableSectionElement get tHead native "HTMLTableElement_tHead_Getter";


  /** @domName HTMLTableElement.tHead */
  void set tHead(TableSectionElement value) native "HTMLTableElement_tHead_Setter";


  /** @domName HTMLTableElement.width */
  String get width native "HTMLTableElement_width_Getter";


  /** @domName HTMLTableElement.width */
  void set width(String value) native "HTMLTableElement_width_Setter";


  /** @domName HTMLTableElement.createCaption */
  Element createCaption() native "HTMLTableElement_createCaption_Callback";


  /** @domName HTMLTableElement.createTBody */
  Element createTBody() native "HTMLTableElement_createTBody_Callback";


  /** @domName HTMLTableElement.createTFoot */
  Element createTFoot() native "HTMLTableElement_createTFoot_Callback";


  /** @domName HTMLTableElement.createTHead */
  Element createTHead() native "HTMLTableElement_createTHead_Callback";


  /** @domName HTMLTableElement.deleteCaption */
  void deleteCaption() native "HTMLTableElement_deleteCaption_Callback";


  /** @domName HTMLTableElement.deleteRow */
  void deleteRow(int index) native "HTMLTableElement_deleteRow_Callback";


  /** @domName HTMLTableElement.deleteTFoot */
  void deleteTFoot() native "HTMLTableElement_deleteTFoot_Callback";


  /** @domName HTMLTableElement.deleteTHead */
  void deleteTHead() native "HTMLTableElement_deleteTHead_Callback";


  /** @domName HTMLTableElement.insertRow */
  Element insertRow(int index) native "HTMLTableElement_insertRow_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTableRowElement
class TableRowElement extends _Element_Merged {

  factory TableRowElement() => _Elements.createTableRowElement();
  TableRowElement.internal(): super.internal();


  /** @domName HTMLTableRowElement.align */
  String get align native "HTMLTableRowElement_align_Getter";


  /** @domName HTMLTableRowElement.align */
  void set align(String value) native "HTMLTableRowElement_align_Setter";


  /** @domName HTMLTableRowElement.bgColor */
  String get bgColor native "HTMLTableRowElement_bgColor_Getter";


  /** @domName HTMLTableRowElement.bgColor */
  void set bgColor(String value) native "HTMLTableRowElement_bgColor_Setter";


  /** @domName HTMLTableRowElement.cells */
  HTMLCollection get cells native "HTMLTableRowElement_cells_Getter";


  /** @domName HTMLTableRowElement.ch */
  String get ch native "HTMLTableRowElement_ch_Getter";


  /** @domName HTMLTableRowElement.ch */
  void set ch(String value) native "HTMLTableRowElement_ch_Setter";


  /** @domName HTMLTableRowElement.chOff */
  String get chOff native "HTMLTableRowElement_chOff_Getter";


  /** @domName HTMLTableRowElement.chOff */
  void set chOff(String value) native "HTMLTableRowElement_chOff_Setter";


  /** @domName HTMLTableRowElement.rowIndex */
  int get rowIndex native "HTMLTableRowElement_rowIndex_Getter";


  /** @domName HTMLTableRowElement.sectionRowIndex */
  int get sectionRowIndex native "HTMLTableRowElement_sectionRowIndex_Getter";


  /** @domName HTMLTableRowElement.vAlign */
  String get vAlign native "HTMLTableRowElement_vAlign_Getter";


  /** @domName HTMLTableRowElement.vAlign */
  void set vAlign(String value) native "HTMLTableRowElement_vAlign_Setter";


  /** @domName HTMLTableRowElement.deleteCell */
  void deleteCell(int index) native "HTMLTableRowElement_deleteCell_Callback";


  /** @domName HTMLTableRowElement.insertCell */
  Element insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTableSectionElement
class TableSectionElement extends _Element_Merged {
  TableSectionElement.internal(): super.internal();


  /** @domName HTMLTableSectionElement.align */
  String get align native "HTMLTableSectionElement_align_Getter";


  /** @domName HTMLTableSectionElement.align */
  void set align(String value) native "HTMLTableSectionElement_align_Setter";


  /** @domName HTMLTableSectionElement.ch */
  String get ch native "HTMLTableSectionElement_ch_Getter";


  /** @domName HTMLTableSectionElement.ch */
  void set ch(String value) native "HTMLTableSectionElement_ch_Setter";


  /** @domName HTMLTableSectionElement.chOff */
  String get chOff native "HTMLTableSectionElement_chOff_Getter";


  /** @domName HTMLTableSectionElement.chOff */
  void set chOff(String value) native "HTMLTableSectionElement_chOff_Setter";


  /** @domName HTMLTableSectionElement.rows */
  HTMLCollection get rows native "HTMLTableSectionElement_rows_Getter";


  /** @domName HTMLTableSectionElement.vAlign */
  String get vAlign native "HTMLTableSectionElement_vAlign_Getter";


  /** @domName HTMLTableSectionElement.vAlign */
  void set vAlign(String value) native "HTMLTableSectionElement_vAlign_Setter";


  /** @domName HTMLTableSectionElement.deleteRow */
  void deleteRow(int index) native "HTMLTableSectionElement_deleteRow_Callback";


  /** @domName HTMLTableSectionElement.insertRow */
  Element insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";

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

// WARNING: Do not edit - generated code.

class Text extends CharacterData {
  factory Text(String data) => _TextFactoryProvider.createText(data);
  Text.internal(): super.internal();


  /** @domName Text.wholeText */
  String get wholeText native "Text_wholeText_Getter";


  /** @domName Text.replaceWholeText */
  Text replaceWholeText(String content) native "Text_replaceWholeText_Callback";


  /** @domName Text.splitText */
  Text splitText(int offset) native "Text_splitText_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTextAreaElement
class TextAreaElement extends _Element_Merged {

  factory TextAreaElement() => _Elements.createTextAreaElement();
  TextAreaElement.internal(): super.internal();


  /** @domName HTMLTextAreaElement.autofocus */
  bool get autofocus native "HTMLTextAreaElement_autofocus_Getter";


  /** @domName HTMLTextAreaElement.autofocus */
  void set autofocus(bool value) native "HTMLTextAreaElement_autofocus_Setter";


  /** @domName HTMLTextAreaElement.cols */
  int get cols native "HTMLTextAreaElement_cols_Getter";


  /** @domName HTMLTextAreaElement.cols */
  void set cols(int value) native "HTMLTextAreaElement_cols_Setter";


  /** @domName HTMLTextAreaElement.defaultValue */
  String get defaultValue native "HTMLTextAreaElement_defaultValue_Getter";


  /** @domName HTMLTextAreaElement.defaultValue */
  void set defaultValue(String value) native "HTMLTextAreaElement_defaultValue_Setter";


  /** @domName HTMLTextAreaElement.dirName */
  String get dirName native "HTMLTextAreaElement_dirName_Getter";


  /** @domName HTMLTextAreaElement.dirName */
  void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";


  /** @domName HTMLTextAreaElement.disabled */
  bool get disabled native "HTMLTextAreaElement_disabled_Getter";


  /** @domName HTMLTextAreaElement.disabled */
  void set disabled(bool value) native "HTMLTextAreaElement_disabled_Setter";


  /** @domName HTMLTextAreaElement.form */
  FormElement get form native "HTMLTextAreaElement_form_Getter";


  /** @domName HTMLTextAreaElement.labels */
  List<Node> get labels native "HTMLTextAreaElement_labels_Getter";


  /** @domName HTMLTextAreaElement.maxLength */
  int get maxLength native "HTMLTextAreaElement_maxLength_Getter";


  /** @domName HTMLTextAreaElement.maxLength */
  void set maxLength(int value) native "HTMLTextAreaElement_maxLength_Setter";


  /** @domName HTMLTextAreaElement.name */
  String get name native "HTMLTextAreaElement_name_Getter";


  /** @domName HTMLTextAreaElement.name */
  void set name(String value) native "HTMLTextAreaElement_name_Setter";


  /** @domName HTMLTextAreaElement.placeholder */
  String get placeholder native "HTMLTextAreaElement_placeholder_Getter";


  /** @domName HTMLTextAreaElement.placeholder */
  void set placeholder(String value) native "HTMLTextAreaElement_placeholder_Setter";


  /** @domName HTMLTextAreaElement.readOnly */
  bool get readOnly native "HTMLTextAreaElement_readOnly_Getter";


  /** @domName HTMLTextAreaElement.readOnly */
  void set readOnly(bool value) native "HTMLTextAreaElement_readOnly_Setter";


  /** @domName HTMLTextAreaElement.required */
  bool get required native "HTMLTextAreaElement_required_Getter";


  /** @domName HTMLTextAreaElement.required */
  void set required(bool value) native "HTMLTextAreaElement_required_Setter";


  /** @domName HTMLTextAreaElement.rows */
  int get rows native "HTMLTextAreaElement_rows_Getter";


  /** @domName HTMLTextAreaElement.rows */
  void set rows(int value) native "HTMLTextAreaElement_rows_Setter";


  /** @domName HTMLTextAreaElement.selectionDirection */
  String get selectionDirection native "HTMLTextAreaElement_selectionDirection_Getter";


  /** @domName HTMLTextAreaElement.selectionDirection */
  void set selectionDirection(String value) native "HTMLTextAreaElement_selectionDirection_Setter";


  /** @domName HTMLTextAreaElement.selectionEnd */
  int get selectionEnd native "HTMLTextAreaElement_selectionEnd_Getter";


  /** @domName HTMLTextAreaElement.selectionEnd */
  void set selectionEnd(int value) native "HTMLTextAreaElement_selectionEnd_Setter";


  /** @domName HTMLTextAreaElement.selectionStart */
  int get selectionStart native "HTMLTextAreaElement_selectionStart_Getter";


  /** @domName HTMLTextAreaElement.selectionStart */
  void set selectionStart(int value) native "HTMLTextAreaElement_selectionStart_Setter";


  /** @domName HTMLTextAreaElement.textLength */
  int get textLength native "HTMLTextAreaElement_textLength_Getter";


  /** @domName HTMLTextAreaElement.type */
  String get type native "HTMLTextAreaElement_type_Getter";


  /** @domName HTMLTextAreaElement.validationMessage */
  String get validationMessage native "HTMLTextAreaElement_validationMessage_Getter";


  /** @domName HTMLTextAreaElement.validity */
  ValidityState get validity native "HTMLTextAreaElement_validity_Getter";


  /** @domName HTMLTextAreaElement.value */
  String get value native "HTMLTextAreaElement_value_Getter";


  /** @domName HTMLTextAreaElement.value */
  void set value(String value) native "HTMLTextAreaElement_value_Setter";


  /** @domName HTMLTextAreaElement.willValidate */
  bool get willValidate native "HTMLTextAreaElement_willValidate_Getter";


  /** @domName HTMLTextAreaElement.wrap */
  String get wrap native "HTMLTextAreaElement_wrap_Getter";


  /** @domName HTMLTextAreaElement.wrap */
  void set wrap(String value) native "HTMLTextAreaElement_wrap_Setter";


  /** @domName HTMLTextAreaElement.checkValidity */
  bool checkValidity() native "HTMLTextAreaElement_checkValidity_Callback";


  /** @domName HTMLTextAreaElement.select */
  void select() native "HTMLTextAreaElement_select_Callback";


  /** @domName HTMLTextAreaElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";

  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
      _setRangeText_1(replacement);
      return;
    }
    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
      _setRangeText_2(replacement, start, end, selectionMode);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName HTMLTextAreaElement.setRangeText_1 */
  void _setRangeText_1(replacement) native "HTMLTextAreaElement_setRangeText_1_Callback";


  /** @domName HTMLTextAreaElement.setRangeText_2 */
  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_2_Callback";

  void setSelectionRange(/*long*/ start, /*long*/ end, [/*DOMString*/ direction]) {
    if (?direction) {
      _setSelectionRange_1(start, end, direction);
      return;
    }
    _setSelectionRange_2(start, end);
  }


  /** @domName HTMLTextAreaElement.setSelectionRange_1 */
  void _setSelectionRange_1(start, end, direction) native "HTMLTextAreaElement_setSelectionRange_1_Callback";


  /** @domName HTMLTextAreaElement.setSelectionRange_2 */
  void _setSelectionRange_2(start, end) native "HTMLTextAreaElement_setSelectionRange_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName TextEvent
class TextEvent extends UIEvent {
  TextEvent.internal(): super.internal();


  /** @domName TextEvent.data */
  String get data native "TextEvent_data_Getter";


  /** @domName TextEvent.initTextEvent */
  void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native "TextEvent_initTextEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName TextMetrics
class TextMetrics extends NativeFieldWrapperClass1 {
  TextMetrics.internal();


  /** @domName TextMetrics.width */
  num get width native "TextMetrics_width_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName TextTrack
class TextTrack extends EventTarget {
  TextTrack.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  TextTrackEvents get on =>
    new TextTrackEvents(this);


  /** @domName TextTrack.activeCues */
  TextTrackCueList get activeCues native "TextTrack_activeCues_Getter";


  /** @domName TextTrack.cues */
  TextTrackCueList get cues native "TextTrack_cues_Getter";


  /** @domName TextTrack.kind */
  String get kind native "TextTrack_kind_Getter";


  /** @domName TextTrack.label */
  String get label native "TextTrack_label_Getter";


  /** @domName TextTrack.language */
  String get language native "TextTrack_language_Getter";


  /** @domName TextTrack.mode */
  String get mode native "TextTrack_mode_Getter";


  /** @domName TextTrack.mode */
  void set mode(String value) native "TextTrack_mode_Setter";


  /** @domName TextTrack.addCue */
  void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";


  /** @domName TextTrack.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";


  /** @domName TextTrack.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "TextTrack_dispatchEvent_Callback";


  /** @domName TextTrack.removeCue */
  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";


  /** @domName TextTrack.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";

}

class TextTrackEvents extends Events {
  TextTrackEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get cueChange => this['cuechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName TextTrackCue
class TextTrackCue extends EventTarget {

  factory TextTrackCue(num startTime, num endTime, String text) => _TextTrackCueFactoryProvider.createTextTrackCue(startTime, endTime, text);
  TextTrackCue.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  TextTrackCueEvents get on =>
    new TextTrackCueEvents(this);


  /** @domName TextTrackCue.align */
  String get align native "TextTrackCue_align_Getter";


  /** @domName TextTrackCue.align */
  void set align(String value) native "TextTrackCue_align_Setter";


  /** @domName TextTrackCue.endTime */
  num get endTime native "TextTrackCue_endTime_Getter";


  /** @domName TextTrackCue.endTime */
  void set endTime(num value) native "TextTrackCue_endTime_Setter";


  /** @domName TextTrackCue.id */
  String get id native "TextTrackCue_id_Getter";


  /** @domName TextTrackCue.id */
  void set id(String value) native "TextTrackCue_id_Setter";


  /** @domName TextTrackCue.line */
  int get line native "TextTrackCue_line_Getter";


  /** @domName TextTrackCue.line */
  void set line(int value) native "TextTrackCue_line_Setter";


  /** @domName TextTrackCue.pauseOnExit */
  bool get pauseOnExit native "TextTrackCue_pauseOnExit_Getter";


  /** @domName TextTrackCue.pauseOnExit */
  void set pauseOnExit(bool value) native "TextTrackCue_pauseOnExit_Setter";


  /** @domName TextTrackCue.position */
  int get position native "TextTrackCue_position_Getter";


  /** @domName TextTrackCue.position */
  void set position(int value) native "TextTrackCue_position_Setter";


  /** @domName TextTrackCue.size */
  int get size native "TextTrackCue_size_Getter";


  /** @domName TextTrackCue.size */
  void set size(int value) native "TextTrackCue_size_Setter";


  /** @domName TextTrackCue.snapToLines */
  bool get snapToLines native "TextTrackCue_snapToLines_Getter";


  /** @domName TextTrackCue.snapToLines */
  void set snapToLines(bool value) native "TextTrackCue_snapToLines_Setter";


  /** @domName TextTrackCue.startTime */
  num get startTime native "TextTrackCue_startTime_Getter";


  /** @domName TextTrackCue.startTime */
  void set startTime(num value) native "TextTrackCue_startTime_Setter";


  /** @domName TextTrackCue.text */
  String get text native "TextTrackCue_text_Getter";


  /** @domName TextTrackCue.text */
  void set text(String value) native "TextTrackCue_text_Setter";


  /** @domName TextTrackCue.track */
  TextTrack get track native "TextTrackCue_track_Getter";


  /** @domName TextTrackCue.vertical */
  String get vertical native "TextTrackCue_vertical_Getter";


  /** @domName TextTrackCue.vertical */
  void set vertical(String value) native "TextTrackCue_vertical_Setter";


  /** @domName TextTrackCue.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_addEventListener_Callback";


  /** @domName TextTrackCue.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "TextTrackCue_dispatchEvent_Callback";


  /** @domName TextTrackCue.getCueAsHTML */
  DocumentFragment getCueAsHTML() native "TextTrackCue_getCueAsHTML_Callback";


  /** @domName TextTrackCue.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";

}

class TextTrackCueEvents extends Events {
  TextTrackCueEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get enter => this['enter'];

  EventListenerList get exit => this['exit'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName TextTrackCueList
class TextTrackCueList extends NativeFieldWrapperClass1 implements List<TextTrackCue> {
  TextTrackCueList.internal();


  /** @domName TextTrackCueList.length */
  int get length native "TextTrackCueList_length_Getter";

  TextTrackCue operator[](int index) native "TextTrackCueList_item_Callback";

  void operator[]=(int index, TextTrackCue value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<TextTrackCue> mixins.
  // TextTrackCue is the element type.

  // From Iterable<TextTrackCue>:

  Iterator<TextTrackCue> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<TextTrackCue>(this);
  }

  // From Collection<TextTrackCue>:

  void add(TextTrackCue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(TextTrackCue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<TextTrackCue> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(TextTrackCue element) => _Collections.contains(this, element);

  void forEach(void f(TextTrackCue element)) => _Collections.forEach(this, f);

  Collection map(f(TextTrackCue element)) => _Collections.map(this, [], f);

  Collection<TextTrackCue> filter(bool f(TextTrackCue element)) =>
     _Collections.filter(this, <TextTrackCue>[], f);

  bool every(bool f(TextTrackCue element)) => _Collections.every(this, f);

  bool some(bool f(TextTrackCue element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<TextTrackCue>:

  void sort([Comparator<TextTrackCue> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(TextTrackCue element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(TextTrackCue element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  TextTrackCue get last => this[length - 1];

  TextTrackCue removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<TextTrackCue> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [TextTrackCue initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<TextTrackCue> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <TextTrackCue>[]);

  // -- end List<TextTrackCue> mixins.


  /** @domName TextTrackCueList.getCueById */
  TextTrackCue getCueById(String id) native "TextTrackCueList_getCueById_Callback";


  /** @domName TextTrackCueList.item */
  TextTrackCue item(int index) native "TextTrackCueList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName TextTrackList
class TextTrackList extends EventTarget implements List<TextTrack> {
  TextTrackList.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  TextTrackListEvents get on =>
    new TextTrackListEvents(this);


  /** @domName TextTrackList.length */
  int get length native "TextTrackList_length_Getter";

  TextTrack operator[](int index) native "TextTrackList_item_Callback";

  void operator[]=(int index, TextTrack value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<TextTrack> mixins.
  // TextTrack is the element type.

  // From Iterable<TextTrack>:

  Iterator<TextTrack> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<TextTrack>(this);
  }

  // From Collection<TextTrack>:

  void add(TextTrack value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(TextTrack value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<TextTrack> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(TextTrack element) => _Collections.contains(this, element);

  void forEach(void f(TextTrack element)) => _Collections.forEach(this, f);

  Collection map(f(TextTrack element)) => _Collections.map(this, [], f);

  Collection<TextTrack> filter(bool f(TextTrack element)) =>
     _Collections.filter(this, <TextTrack>[], f);

  bool every(bool f(TextTrack element)) => _Collections.every(this, f);

  bool some(bool f(TextTrack element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<TextTrack>:

  void sort([Comparator<TextTrack> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(TextTrack element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(TextTrack element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  TextTrack get last => this[length - 1];

  TextTrack removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<TextTrack> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [TextTrack initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<TextTrack> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <TextTrack>[]);

  // -- end List<TextTrack> mixins.


  /** @domName TextTrackList.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_addEventListener_Callback";


  /** @domName TextTrackList.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "TextTrackList_dispatchEvent_Callback";


  /** @domName TextTrackList.item */
  TextTrack item(int index) native "TextTrackList_item_Callback";


  /** @domName TextTrackList.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";

}

class TextTrackListEvents extends Events {
  TextTrackListEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get addTrack => this['addtrack'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName TimeRanges
class TimeRanges extends NativeFieldWrapperClass1 {
  TimeRanges.internal();


  /** @domName TimeRanges.length */
  int get length native "TimeRanges_length_Getter";


  /** @domName TimeRanges.end */
  num end(int index) native "TimeRanges_end_Callback";


  /** @domName TimeRanges.start */
  num start(int index) native "TimeRanges_start_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName HTMLTitleElement
class TitleElement extends _Element_Merged {

  factory TitleElement() => _Elements.createTitleElement();
  TitleElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName Touch
class Touch extends NativeFieldWrapperClass1 {
  Touch.internal();


  /** @domName Touch.clientX */
  int get clientX native "Touch_clientX_Getter";


  /** @domName Touch.clientY */
  int get clientY native "Touch_clientY_Getter";


  /** @domName Touch.identifier */
  int get identifier native "Touch_identifier_Getter";


  /** @domName Touch.pageX */
  int get pageX native "Touch_pageX_Getter";


  /** @domName Touch.pageY */
  int get pageY native "Touch_pageY_Getter";


  /** @domName Touch.screenX */
  int get screenX native "Touch_screenX_Getter";


  /** @domName Touch.screenY */
  int get screenY native "Touch_screenY_Getter";


  /** @domName Touch.target */
  EventTarget get target native "Touch_target_Getter";


  /** @domName Touch.webkitForce */
  num get webkitForce native "Touch_webkitForce_Getter";


  /** @domName Touch.webkitRadiusX */
  int get webkitRadiusX native "Touch_webkitRadiusX_Getter";


  /** @domName Touch.webkitRadiusY */
  int get webkitRadiusY native "Touch_webkitRadiusY_Getter";


  /** @domName Touch.webkitRotationAngle */
  num get webkitRotationAngle native "Touch_webkitRotationAngle_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName TouchEvent
class TouchEvent extends UIEvent {
  TouchEvent.internal(): super.internal();


  /** @domName TouchEvent.altKey */
  bool get altKey native "TouchEvent_altKey_Getter";


  /** @domName TouchEvent.changedTouches */
  TouchList get changedTouches native "TouchEvent_changedTouches_Getter";


  /** @domName TouchEvent.ctrlKey */
  bool get ctrlKey native "TouchEvent_ctrlKey_Getter";


  /** @domName TouchEvent.metaKey */
  bool get metaKey native "TouchEvent_metaKey_Getter";


  /** @domName TouchEvent.shiftKey */
  bool get shiftKey native "TouchEvent_shiftKey_Getter";


  /** @domName TouchEvent.targetTouches */
  TouchList get targetTouches native "TouchEvent_targetTouches_Getter";


  /** @domName TouchEvent.touches */
  TouchList get touches native "TouchEvent_touches_Getter";


  /** @domName TouchEvent.initTouchEvent */
  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "TouchEvent_initTouchEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName TouchList
class TouchList extends NativeFieldWrapperClass1 implements List<Touch> {
  TouchList.internal();


  /** @domName TouchList.length */
  int get length native "TouchList_length_Getter";

  Touch operator[](int index) native "TouchList_item_Callback";

  void operator[]=(int index, Touch value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Touch> mixins.
  // Touch is the element type.

  // From Iterable<Touch>:

  Iterator<Touch> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Touch>(this);
  }

  // From Collection<Touch>:

  void add(Touch value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Touch value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Touch> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Touch element) => _Collections.contains(this, element);

  void forEach(void f(Touch element)) => _Collections.forEach(this, f);

  Collection map(f(Touch element)) => _Collections.map(this, [], f);

  Collection<Touch> filter(bool f(Touch element)) =>
     _Collections.filter(this, <Touch>[], f);

  bool every(bool f(Touch element)) => _Collections.every(this, f);

  bool some(bool f(Touch element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Touch>:

  void sort([Comparator<Touch> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Touch element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Touch element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Touch get last => this[length - 1];

  Touch removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Touch> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Touch initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Touch> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Touch>[]);

  // -- end List<Touch> mixins.


  /** @domName TouchList.item */
  Touch item(int index) native "TouchList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLTrackElement
class TrackElement extends _Element_Merged {

  factory TrackElement() => _Elements.createTrackElement();
  TrackElement.internal(): super.internal();

  static const int ERROR = 3;

  static const int LOADED = 2;

  static const int LOADING = 1;

  static const int NONE = 0;


  /** @domName HTMLTrackElement.default */
  bool get defaultValue native "HTMLTrackElement_default_Getter";


  /** @domName HTMLTrackElement.default */
  void set defaultValue(bool value) native "HTMLTrackElement_default_Setter";


  /** @domName HTMLTrackElement.kind */
  String get kind native "HTMLTrackElement_kind_Getter";


  /** @domName HTMLTrackElement.kind */
  void set kind(String value) native "HTMLTrackElement_kind_Setter";


  /** @domName HTMLTrackElement.label */
  String get label native "HTMLTrackElement_label_Getter";


  /** @domName HTMLTrackElement.label */
  void set label(String value) native "HTMLTrackElement_label_Setter";


  /** @domName HTMLTrackElement.readyState */
  int get readyState native "HTMLTrackElement_readyState_Getter";


  /** @domName HTMLTrackElement.src */
  String get src native "HTMLTrackElement_src_Getter";


  /** @domName HTMLTrackElement.src */
  void set src(String value) native "HTMLTrackElement_src_Setter";


  /** @domName HTMLTrackElement.srclang */
  String get srclang native "HTMLTrackElement_srclang_Getter";


  /** @domName HTMLTrackElement.srclang */
  void set srclang(String value) native "HTMLTrackElement_srclang_Setter";


  /** @domName HTMLTrackElement.track */
  TextTrack get track native "HTMLTrackElement_track_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName TrackEvent
class TrackEvent extends Event {
  TrackEvent.internal(): super.internal();


  /** @domName TrackEvent.track */
  Object get track native "TrackEvent_track_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitTransitionEvent
class TransitionEvent extends Event {
  TransitionEvent.internal(): super.internal();


  /** @domName WebKitTransitionEvent.elapsedTime */
  num get elapsedTime native "WebKitTransitionEvent_elapsedTime_Getter";


  /** @domName WebKitTransitionEvent.propertyName */
  String get propertyName native "WebKitTransitionEvent_propertyName_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName TreeWalker
class TreeWalker extends NativeFieldWrapperClass1 {
  TreeWalker.internal();


  /** @domName TreeWalker.currentNode */
  Node get currentNode native "TreeWalker_currentNode_Getter";


  /** @domName TreeWalker.currentNode */
  void set currentNode(Node value) native "TreeWalker_currentNode_Setter";


  /** @domName TreeWalker.expandEntityReferences */
  bool get expandEntityReferences native "TreeWalker_expandEntityReferences_Getter";


  /** @domName TreeWalker.filter */
  NodeFilter get filter native "TreeWalker_filter_Getter";


  /** @domName TreeWalker.root */
  Node get root native "TreeWalker_root_Getter";


  /** @domName TreeWalker.whatToShow */
  int get whatToShow native "TreeWalker_whatToShow_Getter";


  /** @domName TreeWalker.firstChild */
  Node firstChild() native "TreeWalker_firstChild_Callback";


  /** @domName TreeWalker.lastChild */
  Node lastChild() native "TreeWalker_lastChild_Callback";


  /** @domName TreeWalker.nextNode */
  Node nextNode() native "TreeWalker_nextNode_Callback";


  /** @domName TreeWalker.nextSibling */
  Node nextSibling() native "TreeWalker_nextSibling_Callback";


  /** @domName TreeWalker.parentNode */
  Node parentNode() native "TreeWalker_parentNode_Callback";


  /** @domName TreeWalker.previousNode */
  Node previousNode() native "TreeWalker_previousNode_Callback";


  /** @domName TreeWalker.previousSibling */
  Node previousSibling() native "TreeWalker_previousSibling_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName UIEvent
class UIEvent extends Event {
  UIEvent.internal(): super.internal();


  /** @domName UIEvent.charCode */
  int get charCode native "UIEvent_charCode_Getter";


  /** @domName UIEvent.detail */
  int get detail native "UIEvent_detail_Getter";


  /** @domName UIEvent.keyCode */
  int get keyCode native "UIEvent_keyCode_Getter";


  /** @domName UIEvent.layerX */
  int get layerX native "UIEvent_layerX_Getter";


  /** @domName UIEvent.layerY */
  int get layerY native "UIEvent_layerY_Getter";


  /** @domName UIEvent.pageX */
  int get pageX native "UIEvent_pageX_Getter";


  /** @domName UIEvent.pageY */
  int get pageY native "UIEvent_pageY_Getter";


  /** @domName UIEvent.view */
  Window get view native "UIEvent_view_Getter";


  /** @domName UIEvent.which */
  int get which native "UIEvent_which_Getter";


  /** @domName UIEvent.initUIEvent */
  void initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native "UIEvent_initUIEvent_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLUListElement
class UListElement extends _Element_Merged {

  factory UListElement() => _Elements.createUListElement();
  UListElement.internal(): super.internal();


  /** @domName HTMLUListElement.compact */
  bool get compact native "HTMLUListElement_compact_Getter";


  /** @domName HTMLUListElement.compact */
  void set compact(bool value) native "HTMLUListElement_compact_Setter";


  /** @domName HTMLUListElement.type */
  String get type native "HTMLUListElement_type_Getter";


  /** @domName HTMLUListElement.type */
  void set type(String value) native "HTMLUListElement_type_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName Uint16Array
class Uint16Array extends ArrayBufferView implements List<int> {

  factory Uint16Array(int length) =>
    _TypedArrayFactoryProvider.createUint16Array(length);

  factory Uint16Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint16Array_fromList(list);

  factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint16Array_fromBuffer(buffer, byteOffset, length);
  Uint16Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 2;


  /** @domName Uint16Array.length */
  int get length native "Uint16Array_length_Getter";


  /** @domName Uint16Array.numericIndexGetter */
  int operator[](int index) native "Uint16Array_numericIndexGetter_Callback";


  /** @domName Uint16Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint16Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(int element) => _Collections.contains(this, element);

  void forEach(void f(int element)) => _Collections.forEach(this, f);

  Collection map(f(int element)) => _Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     _Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => _Collections.every(this, f);

  bool some(bool f(int element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:

  void sort([Comparator<int> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  int get last => this[length - 1];

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Uint16Array.setElements */
  void setElements(Object array, [int offset]) native "Uint16Array_setElements_Callback";

  Uint16Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint16Array.subarray_1 */
  Uint16Array _subarray_1(start, end) native "Uint16Array_subarray_1_Callback";


  /** @domName Uint16Array.subarray_2 */
  Uint16Array _subarray_2(start) native "Uint16Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Uint32Array
class Uint32Array extends ArrayBufferView implements List<int> {

  factory Uint32Array(int length) =>
    _TypedArrayFactoryProvider.createUint32Array(length);

  factory Uint32Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint32Array_fromList(list);

  factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint32Array_fromBuffer(buffer, byteOffset, length);
  Uint32Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 4;


  /** @domName Uint32Array.length */
  int get length native "Uint32Array_length_Getter";


  /** @domName Uint32Array.numericIndexGetter */
  int operator[](int index) native "Uint32Array_numericIndexGetter_Callback";


  /** @domName Uint32Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint32Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(int element) => _Collections.contains(this, element);

  void forEach(void f(int element)) => _Collections.forEach(this, f);

  Collection map(f(int element)) => _Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     _Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => _Collections.every(this, f);

  bool some(bool f(int element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:

  void sort([Comparator<int> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  int get last => this[length - 1];

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Uint32Array.setElements */
  void setElements(Object array, [int offset]) native "Uint32Array_setElements_Callback";

  Uint32Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint32Array.subarray_1 */
  Uint32Array _subarray_1(start, end) native "Uint32Array_subarray_1_Callback";


  /** @domName Uint32Array.subarray_2 */
  Uint32Array _subarray_2(start) native "Uint32Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Uint8Array
class Uint8Array extends ArrayBufferView implements List<int> {

  factory Uint8Array(int length) =>
    _TypedArrayFactoryProvider.createUint8Array(length);

  factory Uint8Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint8Array_fromList(list);

  factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint8Array_fromBuffer(buffer, byteOffset, length);
  Uint8Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 1;


  /** @domName Uint8Array.length */
  int get length native "Uint8Array_length_Getter";


  /** @domName Uint8Array.numericIndexGetter */
  int operator[](int index) native "Uint8Array_numericIndexGetter_Callback";


  /** @domName Uint8Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint8Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(int element) => _Collections.contains(this, element);

  void forEach(void f(int element)) => _Collections.forEach(this, f);

  Collection map(f(int element)) => _Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     _Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => _Collections.every(this, f);

  bool some(bool f(int element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:

  void sort([Comparator<int> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  int get last => this[length - 1];

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Uint8Array.setElements */
  void setElements(Object array, [int offset]) native "Uint8Array_setElements_Callback";

  Uint8Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint8Array.subarray_1 */
  Uint8Array _subarray_1(start, end) native "Uint8Array_subarray_1_Callback";


  /** @domName Uint8Array.subarray_2 */
  Uint8Array _subarray_2(start) native "Uint8Array_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName Uint8ClampedArray
class Uint8ClampedArray extends Uint8Array {

  factory Uint8ClampedArray(int length) =>
    _TypedArrayFactoryProvider.createUint8ClampedArray(length);

  factory Uint8ClampedArray.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint8ClampedArray_fromList(list);

  factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);
  Uint8ClampedArray.internal(): super.internal();


  /** @domName Uint8ClampedArray.length */
  int get length native "Uint8ClampedArray_length_Getter";


  /** @domName Uint8ClampedArray.numericIndexGetter */
  int operator[](int index) native "Uint8ClampedArray_numericIndexGetter_Callback";


  /** @domName Uint8ClampedArray.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint8ClampedArray_numericIndexSetter_Callback";


  /** @domName Uint8ClampedArray.setElements */
  void setElements(Object array, [int offset]) native "Uint8ClampedArray_setElements_Callback";

  Uint8ClampedArray subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint8ClampedArray.subarray_1 */
  Uint8ClampedArray _subarray_1(start, end) native "Uint8ClampedArray_subarray_1_Callback";


  /** @domName Uint8ClampedArray.subarray_2 */
  Uint8ClampedArray _subarray_2(start) native "Uint8ClampedArray_subarray_2_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLUnknownElement
class UnknownElement extends _Element_Merged {
  UnknownElement.internal(): super.internal();

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

// WARNING: Do not edit - generated code.

/// @domName URL
class Url extends NativeFieldWrapperClass1 {
  Url.internal();

  static String createObjectUrl(blob_OR_source_OR_stream) {
    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_1(blob_OR_source_OR_stream);
    }
    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_2(blob_OR_source_OR_stream);
    }
    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_3(blob_OR_source_OR_stream);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName DOMURL.createObjectURL_1 */
  static String _createObjectURL_1(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_1_Callback";


  /** @domName DOMURL.createObjectURL_2 */
  static String _createObjectURL_2(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_2_Callback";


  /** @domName DOMURL.createObjectURL_3 */
  static String _createObjectURL_3(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_3_Callback";


  /** @domName DOMURL.revokeObjectURL */
  static void revokeObjectUrl(String url) native "DOMURL_revokeObjectURL_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName ValidityState
class ValidityState extends NativeFieldWrapperClass1 {
  ValidityState.internal();


  /** @domName ValidityState.customError */
  bool get customError native "ValidityState_customError_Getter";


  /** @domName ValidityState.patternMismatch */
  bool get patternMismatch native "ValidityState_patternMismatch_Getter";


  /** @domName ValidityState.rangeOverflow */
  bool get rangeOverflow native "ValidityState_rangeOverflow_Getter";


  /** @domName ValidityState.rangeUnderflow */
  bool get rangeUnderflow native "ValidityState_rangeUnderflow_Getter";


  /** @domName ValidityState.stepMismatch */
  bool get stepMismatch native "ValidityState_stepMismatch_Getter";


  /** @domName ValidityState.tooLong */
  bool get tooLong native "ValidityState_tooLong_Getter";


  /** @domName ValidityState.typeMismatch */
  bool get typeMismatch native "ValidityState_typeMismatch_Getter";


  /** @domName ValidityState.valid */
  bool get valid native "ValidityState_valid_Getter";


  /** @domName ValidityState.valueMissing */
  bool get valueMissing native "ValidityState_valueMissing_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLVideoElement
class VideoElement extends MediaElement {

  factory VideoElement() => _Elements.createVideoElement();
  VideoElement.internal(): super.internal();


  /** @domName HTMLVideoElement.height */
  int get height native "HTMLVideoElement_height_Getter";


  /** @domName HTMLVideoElement.height */
  void set height(int value) native "HTMLVideoElement_height_Setter";


  /** @domName HTMLVideoElement.poster */
  String get poster native "HTMLVideoElement_poster_Getter";


  /** @domName HTMLVideoElement.poster */
  void set poster(String value) native "HTMLVideoElement_poster_Setter";


  /** @domName HTMLVideoElement.videoHeight */
  int get videoHeight native "HTMLVideoElement_videoHeight_Getter";


  /** @domName HTMLVideoElement.videoWidth */
  int get videoWidth native "HTMLVideoElement_videoWidth_Getter";


  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
  int get webkitDecodedFrameCount native "HTMLVideoElement_webkitDecodedFrameCount_Getter";


  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
  bool get webkitDisplayingFullscreen native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";


  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
  int get webkitDroppedFrameCount native "HTMLVideoElement_webkitDroppedFrameCount_Getter";


  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
  bool get webkitSupportsFullscreen native "HTMLVideoElement_webkitSupportsFullscreen_Getter";


  /** @domName HTMLVideoElement.width */
  int get width native "HTMLVideoElement_width_Getter";


  /** @domName HTMLVideoElement.width */
  void set width(int value) native "HTMLVideoElement_width_Setter";


  /** @domName HTMLVideoElement.webkitEnterFullScreen */
  void webkitEnterFullScreen() native "HTMLVideoElement_webkitEnterFullScreen_Callback";


  /** @domName HTMLVideoElement.webkitEnterFullscreen */
  void webkitEnterFullscreen() native "HTMLVideoElement_webkitEnterFullscreen_Callback";


  /** @domName HTMLVideoElement.webkitExitFullScreen */
  void webkitExitFullScreen() native "HTMLVideoElement_webkitExitFullScreen_Callback";


  /** @domName HTMLVideoElement.webkitExitFullscreen */
  void webkitExitFullscreen() native "HTMLVideoElement_webkitExitFullscreen_Callback";

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

// WARNING: Do not edit - generated code.


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

// WARNING: Do not edit - generated code.

/// @domName WaveShaperNode
class WaveShaperNode extends AudioNode {
  WaveShaperNode.internal(): super.internal();


  /** @domName WaveShaperNode.curve */
  Float32Array get curve native "WaveShaperNode_curve_Getter";


  /** @domName WaveShaperNode.curve */
  void set curve(Float32Array value) native "WaveShaperNode_curve_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName WaveTable
class WaveTable extends NativeFieldWrapperClass1 {
  WaveTable.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLActiveInfo
class WebGLActiveInfo extends NativeFieldWrapperClass1 {
  WebGLActiveInfo.internal();


  /** @domName WebGLActiveInfo.name */
  String get name native "WebGLActiveInfo_name_Getter";


  /** @domName WebGLActiveInfo.size */
  int get size native "WebGLActiveInfo_size_Getter";


  /** @domName WebGLActiveInfo.type */
  int get type native "WebGLActiveInfo_type_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName WebGLBuffer
class WebGLBuffer extends NativeFieldWrapperClass1 {
  WebGLBuffer.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLCompressedTextureS3TC
class WebGLCompressedTextureS3TC extends NativeFieldWrapperClass1 {
  WebGLCompressedTextureS3TC.internal();

  static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;

  static const int COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;

  static const int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;

  static const int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;

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

// WARNING: Do not edit - generated code.

/// @domName WebGLContextAttributes
class WebGLContextAttributes extends NativeFieldWrapperClass1 {
  WebGLContextAttributes.internal();


  /** @domName WebGLContextAttributes.alpha */
  bool get alpha native "WebGLContextAttributes_alpha_Getter";


  /** @domName WebGLContextAttributes.alpha */
  void set alpha(bool value) native "WebGLContextAttributes_alpha_Setter";


  /** @domName WebGLContextAttributes.antialias */
  bool get antialias native "WebGLContextAttributes_antialias_Getter";


  /** @domName WebGLContextAttributes.antialias */
  void set antialias(bool value) native "WebGLContextAttributes_antialias_Setter";


  /** @domName WebGLContextAttributes.depth */
  bool get depth native "WebGLContextAttributes_depth_Getter";


  /** @domName WebGLContextAttributes.depth */
  void set depth(bool value) native "WebGLContextAttributes_depth_Setter";


  /** @domName WebGLContextAttributes.premultipliedAlpha */
  bool get premultipliedAlpha native "WebGLContextAttributes_premultipliedAlpha_Getter";


  /** @domName WebGLContextAttributes.premultipliedAlpha */
  void set premultipliedAlpha(bool value) native "WebGLContextAttributes_premultipliedAlpha_Setter";


  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
  bool get preserveDrawingBuffer native "WebGLContextAttributes_preserveDrawingBuffer_Getter";


  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
  void set preserveDrawingBuffer(bool value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";


  /** @domName WebGLContextAttributes.stencil */
  bool get stencil native "WebGLContextAttributes_stencil_Getter";


  /** @domName WebGLContextAttributes.stencil */
  void set stencil(bool value) native "WebGLContextAttributes_stencil_Setter";

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

// WARNING: Do not edit - generated code.

/// @domName WebGLContextEvent
class WebGLContextEvent extends Event {
  WebGLContextEvent.internal(): super.internal();


  /** @domName WebGLContextEvent.statusMessage */
  String get statusMessage native "WebGLContextEvent_statusMessage_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName WebGLDebugRendererInfo
class WebGLDebugRendererInfo extends NativeFieldWrapperClass1 {
  WebGLDebugRendererInfo.internal();

  static const int UNMASKED_RENDERER_WEBGL = 0x9246;

  static const int UNMASKED_VENDOR_WEBGL = 0x9245;

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

// WARNING: Do not edit - generated code.

/// @domName WebGLDebugShaders
class WebGLDebugShaders extends NativeFieldWrapperClass1 {
  WebGLDebugShaders.internal();


  /** @domName WebGLDebugShaders.getTranslatedShaderSource */
  String getTranslatedShaderSource(WebGLShader shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WebGLDepthTexture
class WebGLDepthTexture extends NativeFieldWrapperClass1 {
  WebGLDepthTexture.internal();

  static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;

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

// WARNING: Do not edit - generated code.

/// @domName WebGLFramebuffer
class WebGLFramebuffer extends NativeFieldWrapperClass1 {
  WebGLFramebuffer.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLLoseContext
class WebGLLoseContext extends NativeFieldWrapperClass1 {
  WebGLLoseContext.internal();


  /** @domName WebGLLoseContext.loseContext */
  void loseContext() native "WebGLLoseContext_loseContext_Callback";


  /** @domName WebGLLoseContext.restoreContext */
  void restoreContext() native "WebGLLoseContext_restoreContext_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WebGLProgram
class WebGLProgram extends NativeFieldWrapperClass1 {
  WebGLProgram.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLRenderbuffer
class WebGLRenderbuffer extends NativeFieldWrapperClass1 {
  WebGLRenderbuffer.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLRenderingContext
class WebGLRenderingContext extends CanvasRenderingContext {
  WebGLRenderingContext.internal(): super.internal();

  static const int ACTIVE_ATTRIBUTES = 0x8B89;

  static const int ACTIVE_TEXTURE = 0x84E0;

  static const int ACTIVE_UNIFORMS = 0x8B86;

  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;

  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;

  static const int ALPHA = 0x1906;

  static const int ALPHA_BITS = 0x0D55;

  static const int ALWAYS = 0x0207;

  static const int ARRAY_BUFFER = 0x8892;

  static const int ARRAY_BUFFER_BINDING = 0x8894;

  static const int ATTACHED_SHADERS = 0x8B85;

  static const int BACK = 0x0405;

  static const int BLEND = 0x0BE2;

  static const int BLEND_COLOR = 0x8005;

  static const int BLEND_DST_ALPHA = 0x80CA;

  static const int BLEND_DST_RGB = 0x80C8;

  static const int BLEND_EQUATION = 0x8009;

  static const int BLEND_EQUATION_ALPHA = 0x883D;

  static const int BLEND_EQUATION_RGB = 0x8009;

  static const int BLEND_SRC_ALPHA = 0x80CB;

  static const int BLEND_SRC_RGB = 0x80C9;

  static const int BLUE_BITS = 0x0D54;

  static const int BOOL = 0x8B56;

  static const int BOOL_VEC2 = 0x8B57;

  static const int BOOL_VEC3 = 0x8B58;

  static const int BOOL_VEC4 = 0x8B59;

  static const int BROWSER_DEFAULT_WEBGL = 0x9244;

  static const int BUFFER_SIZE = 0x8764;

  static const int BUFFER_USAGE = 0x8765;

  static const int BYTE = 0x1400;

  static const int CCW = 0x0901;

  static const int CLAMP_TO_EDGE = 0x812F;

  static const int COLOR_ATTACHMENT0 = 0x8CE0;

  static const int COLOR_BUFFER_BIT = 0x00004000;

  static const int COLOR_CLEAR_VALUE = 0x0C22;

  static const int COLOR_WRITEMASK = 0x0C23;

  static const int COMPILE_STATUS = 0x8B81;

  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;

  static const int CONSTANT_ALPHA = 0x8003;

  static const int CONSTANT_COLOR = 0x8001;

  static const int CONTEXT_LOST_WEBGL = 0x9242;

  static const int CULL_FACE = 0x0B44;

  static const int CULL_FACE_MODE = 0x0B45;

  static const int CURRENT_PROGRAM = 0x8B8D;

  static const int CURRENT_VERTEX_ATTRIB = 0x8626;

  static const int CW = 0x0900;

  static const int DECR = 0x1E03;

  static const int DECR_WRAP = 0x8508;

  static const int DELETE_STATUS = 0x8B80;

  static const int DEPTH_ATTACHMENT = 0x8D00;

  static const int DEPTH_BITS = 0x0D56;

  static const int DEPTH_BUFFER_BIT = 0x00000100;

  static const int DEPTH_CLEAR_VALUE = 0x0B73;

  static const int DEPTH_COMPONENT = 0x1902;

  static const int DEPTH_COMPONENT16 = 0x81A5;

  static const int DEPTH_FUNC = 0x0B74;

  static const int DEPTH_RANGE = 0x0B70;

  static const int DEPTH_STENCIL = 0x84F9;

  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;

  static const int DEPTH_TEST = 0x0B71;

  static const int DEPTH_WRITEMASK = 0x0B72;

  static const int DITHER = 0x0BD0;

  static const int DONT_CARE = 0x1100;

  static const int DST_ALPHA = 0x0304;

  static const int DST_COLOR = 0x0306;

  static const int DYNAMIC_DRAW = 0x88E8;

  static const int ELEMENT_ARRAY_BUFFER = 0x8893;

  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;

  static const int EQUAL = 0x0202;

  static const int FASTEST = 0x1101;

  static const int FLOAT = 0x1406;

  static const int FLOAT_MAT2 = 0x8B5A;

  static const int FLOAT_MAT3 = 0x8B5B;

  static const int FLOAT_MAT4 = 0x8B5C;

  static const int FLOAT_VEC2 = 0x8B50;

  static const int FLOAT_VEC3 = 0x8B51;

  static const int FLOAT_VEC4 = 0x8B52;

  static const int FRAGMENT_SHADER = 0x8B30;

  static const int FRAMEBUFFER = 0x8D40;

  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;

  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;

  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;

  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;

  static const int FRAMEBUFFER_BINDING = 0x8CA6;

  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;

  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;

  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;

  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;

  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;

  static const int FRONT = 0x0404;

  static const int FRONT_AND_BACK = 0x0408;

  static const int FRONT_FACE = 0x0B46;

  static const int FUNC_ADD = 0x8006;

  static const int FUNC_REVERSE_SUBTRACT = 0x800B;

  static const int FUNC_SUBTRACT = 0x800A;

  static const int GENERATE_MIPMAP_HINT = 0x8192;

  static const int GEQUAL = 0x0206;

  static const int GREATER = 0x0204;

  static const int GREEN_BITS = 0x0D53;

  static const int HIGH_FLOAT = 0x8DF2;

  static const int HIGH_INT = 0x8DF5;

  static const int INCR = 0x1E02;

  static const int INCR_WRAP = 0x8507;

  static const int INT = 0x1404;

  static const int INT_VEC2 = 0x8B53;

  static const int INT_VEC3 = 0x8B54;

  static const int INT_VEC4 = 0x8B55;

  static const int INVALID_ENUM = 0x0500;

  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;

  static const int INVALID_OPERATION = 0x0502;

  static const int INVALID_VALUE = 0x0501;

  static const int INVERT = 0x150A;

  static const int KEEP = 0x1E00;

  static const int LEQUAL = 0x0203;

  static const int LESS = 0x0201;

  static const int LINEAR = 0x2601;

  static const int LINEAR_MIPMAP_LINEAR = 0x2703;

  static const int LINEAR_MIPMAP_NEAREST = 0x2701;

  static const int LINES = 0x0001;

  static const int LINE_LOOP = 0x0002;

  static const int LINE_STRIP = 0x0003;

  static const int LINE_WIDTH = 0x0B21;

  static const int LINK_STATUS = 0x8B82;

  static const int LOW_FLOAT = 0x8DF0;

  static const int LOW_INT = 0x8DF3;

  static const int LUMINANCE = 0x1909;

  static const int LUMINANCE_ALPHA = 0x190A;

  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;

  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;

  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;

  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;

  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;

  static const int MAX_TEXTURE_SIZE = 0x0D33;

  static const int MAX_VARYING_VECTORS = 0x8DFC;

  static const int MAX_VERTEX_ATTRIBS = 0x8869;

  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;

  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;

  static const int MAX_VIEWPORT_DIMS = 0x0D3A;

  static const int MEDIUM_FLOAT = 0x8DF1;

  static const int MEDIUM_INT = 0x8DF4;

  static const int MIRRORED_REPEAT = 0x8370;

  static const int NEAREST = 0x2600;

  static const int NEAREST_MIPMAP_LINEAR = 0x2702;

  static const int NEAREST_MIPMAP_NEAREST = 0x2700;

  static const int NEVER = 0x0200;

  static const int NICEST = 0x1102;

  static const int NONE = 0;

  static const int NOTEQUAL = 0x0205;

  static const int NO_ERROR = 0;

  static const int ONE = 1;

  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;

  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;

  static const int ONE_MINUS_DST_ALPHA = 0x0305;

  static const int ONE_MINUS_DST_COLOR = 0x0307;

  static const int ONE_MINUS_SRC_ALPHA = 0x0303;

  static const int ONE_MINUS_SRC_COLOR = 0x0301;

  static const int OUT_OF_MEMORY = 0x0505;

  static const int PACK_ALIGNMENT = 0x0D05;

  static const int POINTS = 0x0000;

  static const int POLYGON_OFFSET_FACTOR = 0x8038;

  static const int POLYGON_OFFSET_FILL = 0x8037;

  static const int POLYGON_OFFSET_UNITS = 0x2A00;

  static const int RED_BITS = 0x0D52;

  static const int RENDERBUFFER = 0x8D41;

  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;

  static const int RENDERBUFFER_BINDING = 0x8CA7;

  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;

  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;

  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;

  static const int RENDERBUFFER_HEIGHT = 0x8D43;

  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;

  static const int RENDERBUFFER_RED_SIZE = 0x8D50;

  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;

  static const int RENDERBUFFER_WIDTH = 0x8D42;

  static const int RENDERER = 0x1F01;

  static const int REPEAT = 0x2901;

  static const int REPLACE = 0x1E01;

  static const int RGB = 0x1907;

  static const int RGB565 = 0x8D62;

  static const int RGB5_A1 = 0x8057;

  static const int RGBA = 0x1908;

  static const int RGBA4 = 0x8056;

  static const int SAMPLER_2D = 0x8B5E;

  static const int SAMPLER_CUBE = 0x8B60;

  static const int SAMPLES = 0x80A9;

  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;

  static const int SAMPLE_BUFFERS = 0x80A8;

  static const int SAMPLE_COVERAGE = 0x80A0;

  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;

  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;

  static const int SCISSOR_BOX = 0x0C10;

  static const int SCISSOR_TEST = 0x0C11;

  static const int SHADER_TYPE = 0x8B4F;

  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;

  static const int SHORT = 0x1402;

  static const int SRC_ALPHA = 0x0302;

  static const int SRC_ALPHA_SATURATE = 0x0308;

  static const int SRC_COLOR = 0x0300;

  static const int STATIC_DRAW = 0x88E4;

  static const int STENCIL_ATTACHMENT = 0x8D20;

  static const int STENCIL_BACK_FAIL = 0x8801;

  static const int STENCIL_BACK_FUNC = 0x8800;

  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;

  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;

  static const int STENCIL_BACK_REF = 0x8CA3;

  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;

  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;

  static const int STENCIL_BITS = 0x0D57;

  static const int STENCIL_BUFFER_BIT = 0x00000400;

  static const int STENCIL_CLEAR_VALUE = 0x0B91;

  static const int STENCIL_FAIL = 0x0B94;

  static const int STENCIL_FUNC = 0x0B92;

  static const int STENCIL_INDEX = 0x1901;

  static const int STENCIL_INDEX8 = 0x8D48;

  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;

  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;

  static const int STENCIL_REF = 0x0B97;

  static const int STENCIL_TEST = 0x0B90;

  static const int STENCIL_VALUE_MASK = 0x0B93;

  static const int STENCIL_WRITEMASK = 0x0B98;

  static const int STREAM_DRAW = 0x88E0;

  static const int SUBPIXEL_BITS = 0x0D50;

  static const int TEXTURE = 0x1702;

  static const int TEXTURE0 = 0x84C0;

  static const int TEXTURE1 = 0x84C1;

  static const int TEXTURE10 = 0x84CA;

  static const int TEXTURE11 = 0x84CB;

  static const int TEXTURE12 = 0x84CC;

  static const int TEXTURE13 = 0x84CD;

  static const int TEXTURE14 = 0x84CE;

  static const int TEXTURE15 = 0x84CF;

  static const int TEXTURE16 = 0x84D0;

  static const int TEXTURE17 = 0x84D1;

  static const int TEXTURE18 = 0x84D2;

  static const int TEXTURE19 = 0x84D3;

  static const int TEXTURE2 = 0x84C2;

  static const int TEXTURE20 = 0x84D4;

  static const int TEXTURE21 = 0x84D5;

  static const int TEXTURE22 = 0x84D6;

  static const int TEXTURE23 = 0x84D7;

  static const int TEXTURE24 = 0x84D8;

  static const int TEXTURE25 = 0x84D9;

  static const int TEXTURE26 = 0x84DA;

  static const int TEXTURE27 = 0x84DB;

  static const int TEXTURE28 = 0x84DC;

  static const int TEXTURE29 = 0x84DD;

  static const int TEXTURE3 = 0x84C3;

  static const int TEXTURE30 = 0x84DE;

  static const int TEXTURE31 = 0x84DF;

  static const int TEXTURE4 = 0x84C4;

  static const int TEXTURE5 = 0x84C5;

  static const int TEXTURE6 = 0x84C6;

  static const int TEXTURE7 = 0x84C7;

  static const int TEXTURE8 = 0x84C8;

  static const int TEXTURE9 = 0x84C9;

  static const int TEXTURE_2D = 0x0DE1;

  static const int TEXTURE_BINDING_2D = 0x8069;

  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;

  static const int TEXTURE_CUBE_MAP = 0x8513;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;

  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;

  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;

  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;

  static const int TEXTURE_MAG_FILTER = 0x2800;

  static const int TEXTURE_MIN_FILTER = 0x2801;

  static const int TEXTURE_WRAP_S = 0x2802;

  static const int TEXTURE_WRAP_T = 0x2803;

  static const int TRIANGLES = 0x0004;

  static const int TRIANGLE_FAN = 0x0006;

  static const int TRIANGLE_STRIP = 0x0005;

  static const int UNPACK_ALIGNMENT = 0x0CF5;

  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;

  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;

  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;

  static const int UNSIGNED_BYTE = 0x1401;

  static const int UNSIGNED_INT = 0x1405;

  static const int UNSIGNED_SHORT = 0x1403;

  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;

  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;

  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;

  static const int VALIDATE_STATUS = 0x8B83;

  static const int VENDOR = 0x1F00;

  static const int VERSION = 0x1F02;

  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;

  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;

  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;

  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;

  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;

  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;

  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;

  static const int VERTEX_SHADER = 0x8B31;

  static const int VIEWPORT = 0x0BA2;

  static const int ZERO = 0;


  /** @domName WebGLRenderingContext.drawingBufferHeight */
  int get drawingBufferHeight native "WebGLRenderingContext_drawingBufferHeight_Getter";


  /** @domName WebGLRenderingContext.drawingBufferWidth */
  int get drawingBufferWidth native "WebGLRenderingContext_drawingBufferWidth_Getter";


  /** @domName WebGLRenderingContext.activeTexture */
  void activeTexture(int texture) native "WebGLRenderingContext_activeTexture_Callback";


  /** @domName WebGLRenderingContext.attachShader */
  void attachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_attachShader_Callback";


  /** @domName WebGLRenderingContext.bindAttribLocation */
  void bindAttribLocation(WebGLProgram program, int index, String name) native "WebGLRenderingContext_bindAttribLocation_Callback";


  /** @domName WebGLRenderingContext.bindBuffer */
  void bindBuffer(int target, WebGLBuffer buffer) native "WebGLRenderingContext_bindBuffer_Callback";


  /** @domName WebGLRenderingContext.bindFramebuffer */
  void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";


  /** @domName WebGLRenderingContext.bindRenderbuffer */
  void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.bindTexture */
  void bindTexture(int target, WebGLTexture texture) native "WebGLRenderingContext_bindTexture_Callback";


  /** @domName WebGLRenderingContext.blendColor */
  void blendColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_blendColor_Callback";


  /** @domName WebGLRenderingContext.blendEquation */
  void blendEquation(int mode) native "WebGLRenderingContext_blendEquation_Callback";


  /** @domName WebGLRenderingContext.blendEquationSeparate */
  void blendEquationSeparate(int modeRGB, int modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";


  /** @domName WebGLRenderingContext.blendFunc */
  void blendFunc(int sfactor, int dfactor) native "WebGLRenderingContext_blendFunc_Callback";


  /** @domName WebGLRenderingContext.blendFuncSeparate */
  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";

  void bufferData(/*unsigned long*/ target, data_OR_size, /*unsigned long*/ usage) {
    if ((target is int || target == null) && (data_OR_size is ArrayBuffer || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_1(target, data_OR_size, usage);
      return;
    }
    if ((target is int || target == null) && (data_OR_size is ArrayBufferView || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_2(target, data_OR_size, usage);
      return;
    }
    if ((target is int || target == null) && (data_OR_size is int || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_3(target, data_OR_size, usage);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.bufferData_1 */
  void _bufferData_1(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_1_Callback";


  /** @domName WebGLRenderingContext.bufferData_2 */
  void _bufferData_2(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_2_Callback";


  /** @domName WebGLRenderingContext.bufferData_3 */
  void _bufferData_3(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_3_Callback";

  void bufferSubData(/*unsigned long*/ target, /*long long*/ offset, data) {
    if ((target is int || target == null) && (offset is int || offset == null) && (data is ArrayBuffer || data == null)) {
      _bufferSubData_1(target, offset, data);
      return;
    }
    if ((target is int || target == null) && (offset is int || offset == null) && (data is ArrayBufferView || data == null)) {
      _bufferSubData_2(target, offset, data);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.bufferSubData_1 */
  void _bufferSubData_1(target, offset, data) native "WebGLRenderingContext_bufferSubData_1_Callback";


  /** @domName WebGLRenderingContext.bufferSubData_2 */
  void _bufferSubData_2(target, offset, data) native "WebGLRenderingContext_bufferSubData_2_Callback";


  /** @domName WebGLRenderingContext.checkFramebufferStatus */
  int checkFramebufferStatus(int target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";


  /** @domName WebGLRenderingContext.clear */
  void clear(int mask) native "WebGLRenderingContext_clear_Callback";


  /** @domName WebGLRenderingContext.clearColor */
  void clearColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_clearColor_Callback";


  /** @domName WebGLRenderingContext.clearDepth */
  void clearDepth(num depth) native "WebGLRenderingContext_clearDepth_Callback";


  /** @domName WebGLRenderingContext.clearStencil */
  void clearStencil(int s) native "WebGLRenderingContext_clearStencil_Callback";


  /** @domName WebGLRenderingContext.colorMask */
  void colorMask(bool red, bool green, bool blue, bool alpha) native "WebGLRenderingContext_colorMask_Callback";


  /** @domName WebGLRenderingContext.compileShader */
  void compileShader(WebGLShader shader) native "WebGLRenderingContext_compileShader_Callback";


  /** @domName WebGLRenderingContext.compressedTexImage2D */
  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) native "WebGLRenderingContext_compressedTexImage2D_Callback";


  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";


  /** @domName WebGLRenderingContext.copyTexImage2D */
  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native "WebGLRenderingContext_copyTexImage2D_Callback";


  /** @domName WebGLRenderingContext.copyTexSubImage2D */
  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";


  /** @domName WebGLRenderingContext.createBuffer */
  WebGLBuffer createBuffer() native "WebGLRenderingContext_createBuffer_Callback";


  /** @domName WebGLRenderingContext.createFramebuffer */
  WebGLFramebuffer createFramebuffer() native "WebGLRenderingContext_createFramebuffer_Callback";


  /** @domName WebGLRenderingContext.createProgram */
  WebGLProgram createProgram() native "WebGLRenderingContext_createProgram_Callback";


  /** @domName WebGLRenderingContext.createRenderbuffer */
  WebGLRenderbuffer createRenderbuffer() native "WebGLRenderingContext_createRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.createShader */
  WebGLShader createShader(int type) native "WebGLRenderingContext_createShader_Callback";


  /** @domName WebGLRenderingContext.createTexture */
  WebGLTexture createTexture() native "WebGLRenderingContext_createTexture_Callback";


  /** @domName WebGLRenderingContext.cullFace */
  void cullFace(int mode) native "WebGLRenderingContext_cullFace_Callback";


  /** @domName WebGLRenderingContext.deleteBuffer */
  void deleteBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_deleteBuffer_Callback";


  /** @domName WebGLRenderingContext.deleteFramebuffer */
  void deleteFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";


  /** @domName WebGLRenderingContext.deleteProgram */
  void deleteProgram(WebGLProgram program) native "WebGLRenderingContext_deleteProgram_Callback";


  /** @domName WebGLRenderingContext.deleteRenderbuffer */
  void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.deleteShader */
  void deleteShader(WebGLShader shader) native "WebGLRenderingContext_deleteShader_Callback";


  /** @domName WebGLRenderingContext.deleteTexture */
  void deleteTexture(WebGLTexture texture) native "WebGLRenderingContext_deleteTexture_Callback";


  /** @domName WebGLRenderingContext.depthFunc */
  void depthFunc(int func) native "WebGLRenderingContext_depthFunc_Callback";


  /** @domName WebGLRenderingContext.depthMask */
  void depthMask(bool flag) native "WebGLRenderingContext_depthMask_Callback";


  /** @domName WebGLRenderingContext.depthRange */
  void depthRange(num zNear, num zFar) native "WebGLRenderingContext_depthRange_Callback";


  /** @domName WebGLRenderingContext.detachShader */
  void detachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_detachShader_Callback";


  /** @domName WebGLRenderingContext.disable */
  void disable(int cap) native "WebGLRenderingContext_disable_Callback";


  /** @domName WebGLRenderingContext.disableVertexAttribArray */
  void disableVertexAttribArray(int index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";


  /** @domName WebGLRenderingContext.drawArrays */
  void drawArrays(int mode, int first, int count) native "WebGLRenderingContext_drawArrays_Callback";


  /** @domName WebGLRenderingContext.drawElements */
  void drawElements(int mode, int count, int type, int offset) native "WebGLRenderingContext_drawElements_Callback";


  /** @domName WebGLRenderingContext.enable */
  void enable(int cap) native "WebGLRenderingContext_enable_Callback";


  /** @domName WebGLRenderingContext.enableVertexAttribArray */
  void enableVertexAttribArray(int index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";


  /** @domName WebGLRenderingContext.finish */
  void finish() native "WebGLRenderingContext_finish_Callback";


  /** @domName WebGLRenderingContext.flush */
  void flush() native "WebGLRenderingContext_flush_Callback";


  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.framebufferTexture2D */
  void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native "WebGLRenderingContext_framebufferTexture2D_Callback";


  /** @domName WebGLRenderingContext.frontFace */
  void frontFace(int mode) native "WebGLRenderingContext_frontFace_Callback";


  /** @domName WebGLRenderingContext.generateMipmap */
  void generateMipmap(int target) native "WebGLRenderingContext_generateMipmap_Callback";


  /** @domName WebGLRenderingContext.getActiveAttrib */
  WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveAttrib_Callback";


  /** @domName WebGLRenderingContext.getActiveUniform */
  WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveUniform_Callback";


  /** @domName WebGLRenderingContext.getAttachedShaders */
  void getAttachedShaders(WebGLProgram program) native "WebGLRenderingContext_getAttachedShaders_Callback";


  /** @domName WebGLRenderingContext.getAttribLocation */
  int getAttribLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getAttribLocation_Callback";


  /** @domName WebGLRenderingContext.getBufferParameter */
  Object getBufferParameter(int target, int pname) native "WebGLRenderingContext_getBufferParameter_Callback";


  /** @domName WebGLRenderingContext.getContextAttributes */
  WebGLContextAttributes getContextAttributes() native "WebGLRenderingContext_getContextAttributes_Callback";


  /** @domName WebGLRenderingContext.getError */
  int getError() native "WebGLRenderingContext_getError_Callback";


  /** @domName WebGLRenderingContext.getExtension */
  Object getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";


  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";


  /** @domName WebGLRenderingContext.getParameter */
  Object getParameter(int pname) native "WebGLRenderingContext_getParameter_Callback";


  /** @domName WebGLRenderingContext.getProgramInfoLog */
  String getProgramInfoLog(WebGLProgram program) native "WebGLRenderingContext_getProgramInfoLog_Callback";


  /** @domName WebGLRenderingContext.getProgramParameter */
  Object getProgramParameter(WebGLProgram program, int pname) native "WebGLRenderingContext_getProgramParameter_Callback";


  /** @domName WebGLRenderingContext.getRenderbufferParameter */
  Object getRenderbufferParameter(int target, int pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";


  /** @domName WebGLRenderingContext.getShaderInfoLog */
  String getShaderInfoLog(WebGLShader shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";


  /** @domName WebGLRenderingContext.getShaderParameter */
  Object getShaderParameter(WebGLShader shader, int pname) native "WebGLRenderingContext_getShaderParameter_Callback";


  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
  WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";


  /** @domName WebGLRenderingContext.getShaderSource */
  String getShaderSource(WebGLShader shader) native "WebGLRenderingContext_getShaderSource_Callback";


  /** @domName WebGLRenderingContext.getSupportedExtensions */
  List<String> getSupportedExtensions() native "WebGLRenderingContext_getSupportedExtensions_Callback";


  /** @domName WebGLRenderingContext.getTexParameter */
  Object getTexParameter(int target, int pname) native "WebGLRenderingContext_getTexParameter_Callback";


  /** @domName WebGLRenderingContext.getUniform */
  Object getUniform(WebGLProgram program, WebGLUniformLocation location) native "WebGLRenderingContext_getUniform_Callback";


  /** @domName WebGLRenderingContext.getUniformLocation */
  WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getUniformLocation_Callback";


  /** @domName WebGLRenderingContext.getVertexAttrib */
  Object getVertexAttrib(int index, int pname) native "WebGLRenderingContext_getVertexAttrib_Callback";


  /** @domName WebGLRenderingContext.getVertexAttribOffset */
  int getVertexAttribOffset(int index, int pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";


  /** @domName WebGLRenderingContext.hint */
  void hint(int target, int mode) native "WebGLRenderingContext_hint_Callback";


  /** @domName WebGLRenderingContext.isBuffer */
  bool isBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_isBuffer_Callback";


  /** @domName WebGLRenderingContext.isContextLost */
  bool isContextLost() native "WebGLRenderingContext_isContextLost_Callback";


  /** @domName WebGLRenderingContext.isEnabled */
  bool isEnabled(int cap) native "WebGLRenderingContext_isEnabled_Callback";


  /** @domName WebGLRenderingContext.isFramebuffer */
  bool isFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";


  /** @domName WebGLRenderingContext.isProgram */
  bool isProgram(WebGLProgram program) native "WebGLRenderingContext_isProgram_Callback";


  /** @domName WebGLRenderingContext.isRenderbuffer */
  bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.isShader */
  bool isShader(WebGLShader shader) native "WebGLRenderingContext_isShader_Callback";


  /** @domName WebGLRenderingContext.isTexture */
  bool isTexture(WebGLTexture texture) native "WebGLRenderingContext_isTexture_Callback";


  /** @domName WebGLRenderingContext.lineWidth */
  void lineWidth(num width) native "WebGLRenderingContext_lineWidth_Callback";


  /** @domName WebGLRenderingContext.linkProgram */
  void linkProgram(WebGLProgram program) native "WebGLRenderingContext_linkProgram_Callback";


  /** @domName WebGLRenderingContext.pixelStorei */
  void pixelStorei(int pname, int param) native "WebGLRenderingContext_pixelStorei_Callback";


  /** @domName WebGLRenderingContext.polygonOffset */
  void polygonOffset(num factor, num units) native "WebGLRenderingContext_polygonOffset_Callback";


  /** @domName WebGLRenderingContext.readPixels */
  void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) native "WebGLRenderingContext_readPixels_Callback";


  /** @domName WebGLRenderingContext.releaseShaderCompiler */
  void releaseShaderCompiler() native "WebGLRenderingContext_releaseShaderCompiler_Callback";


  /** @domName WebGLRenderingContext.renderbufferStorage */
  void renderbufferStorage(int target, int internalformat, int width, int height) native "WebGLRenderingContext_renderbufferStorage_Callback";


  /** @domName WebGLRenderingContext.sampleCoverage */
  void sampleCoverage(num value, bool invert) native "WebGLRenderingContext_sampleCoverage_Callback";


  /** @domName WebGLRenderingContext.scissor */
  void scissor(int x, int y, int width, int height) native "WebGLRenderingContext_scissor_Callback";


  /** @domName WebGLRenderingContext.shaderSource */
  void shaderSource(WebGLShader shader, String string) native "WebGLRenderingContext_shaderSource_Callback";


  /** @domName WebGLRenderingContext.stencilFunc */
  void stencilFunc(int func, int ref, int mask) native "WebGLRenderingContext_stencilFunc_Callback";


  /** @domName WebGLRenderingContext.stencilFuncSeparate */
  void stencilFuncSeparate(int face, int func, int ref, int mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";


  /** @domName WebGLRenderingContext.stencilMask */
  void stencilMask(int mask) native "WebGLRenderingContext_stencilMask_Callback";


  /** @domName WebGLRenderingContext.stencilMaskSeparate */
  void stencilMaskSeparate(int face, int mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";


  /** @domName WebGLRenderingContext.stencilOp */
  void stencilOp(int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOp_Callback";


  /** @domName WebGLRenderingContext.stencilOpSeparate */
  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";

  void texImage2D(/*unsigned long*/ target, /*long*/ level, /*unsigned long*/ internalformat, /*long*/ format_OR_width, /*long*/ height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [/*unsigned long*/ format, /*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (format is int || format == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels == null)) {
      _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.texImage2D_1 */
  void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_1_Callback";


  /** @domName WebGLRenderingContext.texImage2D_2 */
  void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_2_Callback";


  /** @domName WebGLRenderingContext.texImage2D_3 */
  void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_3_Callback";


  /** @domName WebGLRenderingContext.texImage2D_4 */
  void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_4_Callback";


  /** @domName WebGLRenderingContext.texImage2D_5 */
  void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_5_Callback";


  /** @domName WebGLRenderingContext.texParameterf */
  void texParameterf(int target, int pname, num param) native "WebGLRenderingContext_texParameterf_Callback";


  /** @domName WebGLRenderingContext.texParameteri */
  void texParameteri(int target, int pname, int param) native "WebGLRenderingContext_texParameteri_Callback";

  void texSubImage2D(/*unsigned long*/ target, /*long*/ level, /*long*/ xoffset, /*long*/ yoffset, /*long*/ format_OR_width, /*long*/ height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [/*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels == null)) {
      _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.texSubImage2D_1 */
  void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_1_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_2 */
  void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_2_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_3 */
  void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_3_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_4 */
  void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_4_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_5 */
  void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_5_Callback";


  /** @domName WebGLRenderingContext.uniform1f */
  void uniform1f(WebGLUniformLocation location, num x) native "WebGLRenderingContext_uniform1f_Callback";


  /** @domName WebGLRenderingContext.uniform1fv */
  void uniform1fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform1fv_Callback";


  /** @domName WebGLRenderingContext.uniform1i */
  void uniform1i(WebGLUniformLocation location, int x) native "WebGLRenderingContext_uniform1i_Callback";


  /** @domName WebGLRenderingContext.uniform1iv */
  void uniform1iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform1iv_Callback";


  /** @domName WebGLRenderingContext.uniform2f */
  void uniform2f(WebGLUniformLocation location, num x, num y) native "WebGLRenderingContext_uniform2f_Callback";


  /** @domName WebGLRenderingContext.uniform2fv */
  void uniform2fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform2fv_Callback";


  /** @domName WebGLRenderingContext.uniform2i */
  void uniform2i(WebGLUniformLocation location, int x, int y) native "WebGLRenderingContext_uniform2i_Callback";


  /** @domName WebGLRenderingContext.uniform2iv */
  void uniform2iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform2iv_Callback";


  /** @domName WebGLRenderingContext.uniform3f */
  void uniform3f(WebGLUniformLocation location, num x, num y, num z) native "WebGLRenderingContext_uniform3f_Callback";


  /** @domName WebGLRenderingContext.uniform3fv */
  void uniform3fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform3fv_Callback";


  /** @domName WebGLRenderingContext.uniform3i */
  void uniform3i(WebGLUniformLocation location, int x, int y, int z) native "WebGLRenderingContext_uniform3i_Callback";


  /** @domName WebGLRenderingContext.uniform3iv */
  void uniform3iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform3iv_Callback";


  /** @domName WebGLRenderingContext.uniform4f */
  void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native "WebGLRenderingContext_uniform4f_Callback";


  /** @domName WebGLRenderingContext.uniform4fv */
  void uniform4fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform4fv_Callback";


  /** @domName WebGLRenderingContext.uniform4i */
  void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native "WebGLRenderingContext_uniform4i_Callback";


  /** @domName WebGLRenderingContext.uniform4iv */
  void uniform4iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform4iv_Callback";


  /** @domName WebGLRenderingContext.uniformMatrix2fv */
  void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";


  /** @domName WebGLRenderingContext.uniformMatrix3fv */
  void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";


  /** @domName WebGLRenderingContext.uniformMatrix4fv */
  void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";


  /** @domName WebGLRenderingContext.useProgram */
  void useProgram(WebGLProgram program) native "WebGLRenderingContext_useProgram_Callback";


  /** @domName WebGLRenderingContext.validateProgram */
  void validateProgram(WebGLProgram program) native "WebGLRenderingContext_validateProgram_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib1f */
  void vertexAttrib1f(int indx, num x) native "WebGLRenderingContext_vertexAttrib1f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib1fv */
  void vertexAttrib1fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib2f */
  void vertexAttrib2f(int indx, num x, num y) native "WebGLRenderingContext_vertexAttrib2f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib2fv */
  void vertexAttrib2fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib3f */
  void vertexAttrib3f(int indx, num x, num y, num z) native "WebGLRenderingContext_vertexAttrib3f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib3fv */
  void vertexAttrib3fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib4f */
  void vertexAttrib4f(int indx, num x, num y, num z, num w) native "WebGLRenderingContext_vertexAttrib4f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib4fv */
  void vertexAttrib4fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttribPointer */
  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";


  /** @domName WebGLRenderingContext.viewport */
  void viewport(int x, int y, int width, int height) native "WebGLRenderingContext_viewport_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WebGLShader
class WebGLShader extends NativeFieldWrapperClass1 {
  WebGLShader.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLShaderPrecisionFormat
class WebGLShaderPrecisionFormat extends NativeFieldWrapperClass1 {
  WebGLShaderPrecisionFormat.internal();


  /** @domName WebGLShaderPrecisionFormat.precision */
  int get precision native "WebGLShaderPrecisionFormat_precision_Getter";


  /** @domName WebGLShaderPrecisionFormat.rangeMax */
  int get rangeMax native "WebGLShaderPrecisionFormat_rangeMax_Getter";


  /** @domName WebGLShaderPrecisionFormat.rangeMin */
  int get rangeMin native "WebGLShaderPrecisionFormat_rangeMin_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName WebGLTexture
class WebGLTexture extends NativeFieldWrapperClass1 {
  WebGLTexture.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLUniformLocation
class WebGLUniformLocation extends NativeFieldWrapperClass1 {
  WebGLUniformLocation.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebGLVertexArrayObjectOES
class WebGLVertexArrayObjectOES extends NativeFieldWrapperClass1 {
  WebGLVertexArrayObjectOES.internal();

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

// WARNING: Do not edit - generated code.

/// @domName WebKitCSSFilterValue
class WebKitCSSFilterValue extends _CSSValueList {
  WebKitCSSFilterValue.internal(): super.internal();

  static const int CSS_FILTER_BLUR = 10;

  static const int CSS_FILTER_BRIGHTNESS = 8;

  static const int CSS_FILTER_CONTRAST = 9;

  static const int CSS_FILTER_CUSTOM = 12;

  static const int CSS_FILTER_DROP_SHADOW = 11;

  static const int CSS_FILTER_GRAYSCALE = 2;

  static const int CSS_FILTER_HUE_ROTATE = 5;

  static const int CSS_FILTER_INVERT = 6;

  static const int CSS_FILTER_OPACITY = 7;

  static const int CSS_FILTER_REFERENCE = 1;

  static const int CSS_FILTER_SATURATE = 4;

  static const int CSS_FILTER_SEPIA = 3;


  /** @domName WebKitCSSFilterValue.operationType */
  int get operationType native "WebKitCSSFilterValue_operationType_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName WebKitNamedFlow
class WebKitNamedFlow extends EventTarget {
  WebKitNamedFlow.internal(): super.internal();


  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
  int get firstEmptyRegionIndex native "WebKitNamedFlow_firstEmptyRegionIndex_Getter";


  /** @domName WebKitNamedFlow.name */
  String get name native "WebKitNamedFlow_name_Getter";


  /** @domName WebKitNamedFlow.overset */
  bool get overset native "WebKitNamedFlow_overset_Getter";


  /** @domName WebKitNamedFlow.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";


  /** @domName WebKitNamedFlow.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";


  /** @domName WebKitNamedFlow.getContent */
  List<Node> getContent() native "WebKitNamedFlow_getContent_Callback";


  /** @domName WebKitNamedFlow.getRegions */
  List<Node> getRegions() native "WebKitNamedFlow_getRegions_Callback";


  /** @domName WebKitNamedFlow.getRegionsByContent */
  List<Node> getRegionsByContent(Node contentNode) native "WebKitNamedFlow_getRegionsByContent_Callback";


  /** @domName WebKitNamedFlow.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_removeEventListener_Callback";

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

// WARNING: Do not edit - generated code.

class WebSocket extends EventTarget {
  factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
  WebSocket.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  WebSocketEvents get on =>
    new WebSocketEvents(this);

  static const int CLOSED = 3;

  static const int CLOSING = 2;

  static const int CONNECTING = 0;

  static const int OPEN = 1;


  /** @domName WebSocket.URL */
  String get URL native "WebSocket_URL_Getter";


  /** @domName WebSocket.binaryType */
  String get binaryType native "WebSocket_binaryType_Getter";


  /** @domName WebSocket.binaryType */
  void set binaryType(String value) native "WebSocket_binaryType_Setter";


  /** @domName WebSocket.bufferedAmount */
  int get bufferedAmount native "WebSocket_bufferedAmount_Getter";


  /** @domName WebSocket.extensions */
  String get extensions native "WebSocket_extensions_Getter";


  /** @domName WebSocket.protocol */
  String get protocol native "WebSocket_protocol_Getter";


  /** @domName WebSocket.readyState */
  int get readyState native "WebSocket_readyState_Getter";


  /** @domName WebSocket.url */
  String get url native "WebSocket_url_Getter";


  /** @domName WebSocket.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";

  void close([/*unsigned short*/ code, /*DOMString*/ reason]) {
    if (?reason) {
      _close_1(code, reason);
      return;
    }
    if (?code) {
      _close_2(code);
      return;
    }
    _close_3();
  }


  /** @domName WebSocket.close_1 */
  void _close_1(code, reason) native "WebSocket_close_1_Callback";


  /** @domName WebSocket.close_2 */
  void _close_2(code) native "WebSocket_close_2_Callback";


  /** @domName WebSocket.close_3 */
  void _close_3() native "WebSocket_close_3_Callback";


  /** @domName WebSocket.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "WebSocket_dispatchEvent_Callback";


  /** @domName WebSocket.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";


  /** @domName WebSocket.send */
  void send(data) native "WebSocket_send_Callback";

}

class WebSocketEvents extends Events {
  WebSocketEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get close => this['close'];

  EventListenerList get error => this['error'];

  EventListenerList get message => this['message'];

  EventListenerList get open => this['open'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class WheelEvent extends MouseEvent {
  WheelEvent.internal(): super.internal();


  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
  bool get webkitDirectionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";


  /** @domName WheelEvent.wheelDeltaX */
  int get $dom_wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";


  /** @domName WheelEvent.wheelDeltaY */
  int get $dom_wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";


  /** @domName WheelEvent.initWebKitWheelEvent */
  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";


  /** @domName WheelEvent.deltaX */
  num get deltaX => $dom_wheelDeltaX;
  /** @domName WheelEvent.deltaY */
  num get deltaY => $dom_wheelDeltaY;
  /** @domName WheelEvent.deltaMode */
  int get deltaMode => 0;

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

// WARNING: Do not edit - generated code.

/// @domName Worker
class Worker extends AbstractWorker {

  factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
  Worker.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  WorkerEvents get on =>
    new WorkerEvents(this);


  /** @domName Worker.postMessage */
  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native "Worker_postMessage_Callback";


  /** @domName Worker.terminate */
  void terminate() native "Worker_terminate_Callback";

}

class WorkerEvents extends AbstractWorkerEvents {
  WorkerEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get message => this['message'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName WorkerContext
class WorkerContext extends EventTarget {
  WorkerContext.internal(): super.internal();

  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  WorkerContextEvents get on =>
    new WorkerContextEvents(this);

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;


  /** @domName WorkerContext.indexedDB */
  IDBFactory get indexedDB native "WorkerContext_indexedDB_Getter";


  /** @domName WorkerContext.location */
  WorkerLocation get location native "WorkerContext_location_Getter";


  /** @domName WorkerContext.navigator */
  WorkerNavigator get navigator native "WorkerContext_navigator_Getter";


  /** @domName WorkerContext.self */
  WorkerContext get self native "WorkerContext_self_Getter";


  /** @domName WorkerContext.webkitIndexedDB */
  IDBFactory get webkitIndexedDB native "WorkerContext_webkitIndexedDB_Getter";


  /** @domName WorkerContext.webkitNotifications */
  NotificationCenter get webkitNotifications native "WorkerContext_webkitNotifications_Getter";


  /** @domName WorkerContext.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_addEventListener_Callback";


  /** @domName WorkerContext.clearInterval */
  void clearInterval(int handle) native "WorkerContext_clearInterval_Callback";


  /** @domName WorkerContext.clearTimeout */
  void clearTimeout(int handle) native "WorkerContext_clearTimeout_Callback";


  /** @domName WorkerContext.close */
  void close() native "WorkerContext_close_Callback";


  /** @domName WorkerContext.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "WorkerContext_dispatchEvent_Callback";


  /** @domName WorkerContext.importScripts */
  void importScripts() native "WorkerContext_importScripts_Callback";


  /** @domName WorkerContext.openDatabase */
  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabase_Callback";


  /** @domName WorkerContext.openDatabaseSync */
  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabaseSync_Callback";


  /** @domName WorkerContext.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_removeEventListener_Callback";


  /** @domName WorkerContext.setInterval */
  int setInterval(TimeoutHandler handler, int timeout) native "WorkerContext_setInterval_Callback";


  /** @domName WorkerContext.setTimeout */
  int setTimeout(TimeoutHandler handler, int timeout) native "WorkerContext_setTimeout_Callback";


  /** @domName WorkerContext.webkitRequestFileSystem */
  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native "WorkerContext_webkitRequestFileSystem_Callback";


  /** @domName WorkerContext.webkitRequestFileSystemSync */
  DOMFileSystemSync webkitRequestFileSystemSync(int type, int size) native "WorkerContext_webkitRequestFileSystemSync_Callback";


  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
  EntrySync webkitResolveLocalFileSystemSyncURL(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";


  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
  void webkitResolveLocalFileSystemURL(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";

}

class WorkerContextEvents extends Events {
  WorkerContextEvents(EventTarget _ptr) : super(_ptr);

  EventListenerList get error => this['error'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName WorkerLocation
class WorkerLocation extends NativeFieldWrapperClass1 {
  WorkerLocation.internal();


  /** @domName WorkerLocation.hash */
  String get hash native "WorkerLocation_hash_Getter";


  /** @domName WorkerLocation.host */
  String get host native "WorkerLocation_host_Getter";


  /** @domName WorkerLocation.hostname */
  String get hostname native "WorkerLocation_hostname_Getter";


  /** @domName WorkerLocation.href */
  String get href native "WorkerLocation_href_Getter";


  /** @domName WorkerLocation.pathname */
  String get pathname native "WorkerLocation_pathname_Getter";


  /** @domName WorkerLocation.port */
  String get port native "WorkerLocation_port_Getter";


  /** @domName WorkerLocation.protocol */
  String get protocol native "WorkerLocation_protocol_Getter";


  /** @domName WorkerLocation.search */
  String get search native "WorkerLocation_search_Getter";


  /** @domName WorkerLocation.toString */
  String toString() native "WorkerLocation_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName WorkerNavigator
class WorkerNavigator extends NativeFieldWrapperClass1 {
  WorkerNavigator.internal();


  /** @domName WorkerNavigator.appName */
  String get appName native "WorkerNavigator_appName_Getter";


  /** @domName WorkerNavigator.appVersion */
  String get appVersion native "WorkerNavigator_appVersion_Getter";


  /** @domName WorkerNavigator.onLine */
  bool get onLine native "WorkerNavigator_onLine_Getter";


  /** @domName WorkerNavigator.platform */
  String get platform native "WorkerNavigator_platform_Getter";


  /** @domName WorkerNavigator.userAgent */
  String get userAgent native "WorkerNavigator_userAgent_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName XMLSerializer
class XMLSerializer extends NativeFieldWrapperClass1 {

  factory XMLSerializer() => _XMLSerializerFactoryProvider.createXMLSerializer();
  XMLSerializer.internal();


  /** @domName XMLSerializer.serializeToString */
  String serializeToString(Node node) native "XMLSerializer_serializeToString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName XPathEvaluator
class XPathEvaluator extends NativeFieldWrapperClass1 {

  factory XPathEvaluator() => _XPathEvaluatorFactoryProvider.createXPathEvaluator();
  XPathEvaluator.internal();


  /** @domName XPathEvaluator.createExpression */
  XPathExpression createExpression(String expression, XPathNSResolver resolver) native "XPathEvaluator_createExpression_Callback";


  /** @domName XPathEvaluator.createNSResolver */
  XPathNSResolver createNSResolver(Node nodeResolver) native "XPathEvaluator_createNSResolver_Callback";


  /** @domName XPathEvaluator.evaluate */
  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native "XPathEvaluator_evaluate_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName XPathException
class XPathException extends NativeFieldWrapperClass1 {
  XPathException.internal();

  static const int INVALID_EXPRESSION_ERR = 51;

  static const int TYPE_ERR = 52;


  /** @domName XPathException.code */
  int get code native "XPathException_code_Getter";


  /** @domName XPathException.message */
  String get message native "XPathException_message_Getter";


  /** @domName XPathException.name */
  String get name native "XPathException_name_Getter";


  /** @domName XPathException.toString */
  String toString() native "XPathException_toString_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName XPathExpression
class XPathExpression extends NativeFieldWrapperClass1 {
  XPathExpression.internal();


  /** @domName XPathExpression.evaluate */
  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native "XPathExpression_evaluate_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName XPathNSResolver
class XPathNSResolver extends NativeFieldWrapperClass1 {
  XPathNSResolver.internal();


  /** @domName XPathNSResolver.lookupNamespaceURI */
  String lookupNamespaceURI(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName XPathResult
class XPathResult extends NativeFieldWrapperClass1 {
  XPathResult.internal();

  static const int ANY_TYPE = 0;

  static const int ANY_UNORDERED_NODE_TYPE = 8;

  static const int BOOLEAN_TYPE = 3;

  static const int FIRST_ORDERED_NODE_TYPE = 9;

  static const int NUMBER_TYPE = 1;

  static const int ORDERED_NODE_ITERATOR_TYPE = 5;

  static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;

  static const int STRING_TYPE = 2;

  static const int UNORDERED_NODE_ITERATOR_TYPE = 4;

  static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;


  /** @domName XPathResult.booleanValue */
  bool get booleanValue native "XPathResult_booleanValue_Getter";


  /** @domName XPathResult.invalidIteratorState */
  bool get invalidIteratorState native "XPathResult_invalidIteratorState_Getter";


  /** @domName XPathResult.numberValue */
  num get numberValue native "XPathResult_numberValue_Getter";


  /** @domName XPathResult.resultType */
  int get resultType native "XPathResult_resultType_Getter";


  /** @domName XPathResult.singleNodeValue */
  Node get singleNodeValue native "XPathResult_singleNodeValue_Getter";


  /** @domName XPathResult.snapshotLength */
  int get snapshotLength native "XPathResult_snapshotLength_Getter";


  /** @domName XPathResult.stringValue */
  String get stringValue native "XPathResult_stringValue_Getter";


  /** @domName XPathResult.iterateNext */
  Node iterateNext() native "XPathResult_iterateNext_Callback";


  /** @domName XPathResult.snapshotItem */
  Node snapshotItem(int index) native "XPathResult_snapshotItem_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName XSLTProcessor
class XSLTProcessor extends NativeFieldWrapperClass1 {

  factory XSLTProcessor() => _XSLTProcessorFactoryProvider.createXSLTProcessor();
  XSLTProcessor.internal();


  /** @domName XSLTProcessor.clearParameters */
  void clearParameters() native "XSLTProcessor_clearParameters_Callback";


  /** @domName XSLTProcessor.getParameter */
  String getParameter(String namespaceURI, String localName) native "XSLTProcessor_getParameter_Callback";


  /** @domName XSLTProcessor.importStylesheet */
  void importStylesheet(Node stylesheet) native "XSLTProcessor_importStylesheet_Callback";


  /** @domName XSLTProcessor.removeParameter */
  void removeParameter(String namespaceURI, String localName) native "XSLTProcessor_removeParameter_Callback";


  /** @domName XSLTProcessor.reset */
  void reset() native "XSLTProcessor_reset_Callback";


  /** @domName XSLTProcessor.setParameter */
  void setParameter(String namespaceURI, String localName, String value) native "XSLTProcessor_setParameter_Callback";


  /** @domName XSLTProcessor.transformToDocument */
  Document transformToDocument(Node source) native "XSLTProcessor_transformToDocument_Callback";


  /** @domName XSLTProcessor.transformToFragment */
  DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";

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

class _ArrayBufferFactoryProvider {
  static ArrayBuffer createArrayBuffer(int length) native "ArrayBuffer_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _AudioElementFactoryProvider {
  static AudioElement createAudioElement([String src]) native "HTMLAudioElement_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _BlobFactoryProvider {
  static Blob createBlob(List blobParts, [String type, String endings]) native "Blob_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _CSSMatrixFactoryProvider {
  static CSSMatrix createCSSMatrix([String cssValue]) native "WebKitCSSMatrix_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName CSSRuleList
class _CSSRuleList extends NativeFieldWrapperClass1 implements List<CSSRule> {
  _CSSRuleList.internal();


  /** @domName CSSRuleList.length */
  int get length native "CSSRuleList_length_Getter";

  CSSRule operator[](int index) native "CSSRuleList_item_Callback";

  void operator[]=(int index, CSSRule value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<CSSRule> mixins.
  // CSSRule is the element type.

  // From Iterable<CSSRule>:

  Iterator<CSSRule> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<CSSRule>(this);
  }

  // From Collection<CSSRule>:

  void add(CSSRule value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(CSSRule value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<CSSRule> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(CSSRule element) => _Collections.contains(this, element);

  void forEach(void f(CSSRule element)) => _Collections.forEach(this, f);

  Collection map(f(CSSRule element)) => _Collections.map(this, [], f);

  Collection<CSSRule> filter(bool f(CSSRule element)) =>
     _Collections.filter(this, <CSSRule>[], f);

  bool every(bool f(CSSRule element)) => _Collections.every(this, f);

  bool some(bool f(CSSRule element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<CSSRule>:

  void sort([Comparator<CSSRule> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(CSSRule element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(CSSRule element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  CSSRule get last => this[length - 1];

  CSSRule removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<CSSRule> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [CSSRule initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<CSSRule> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <CSSRule>[]);

  // -- end List<CSSRule> mixins.


  /** @domName CSSRuleList.item */
  CSSRule item(int index) native "CSSRuleList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName CSSValueList
class _CSSValueList extends CSSValue implements List<CSSValue> {
  _CSSValueList.internal(): super.internal();


  /** @domName CSSValueList.length */
  int get length native "CSSValueList_length_Getter";

  CSSValue operator[](int index) native "CSSValueList_item_Callback";

  void operator[]=(int index, CSSValue value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<CSSValue> mixins.
  // CSSValue is the element type.

  // From Iterable<CSSValue>:

  Iterator<CSSValue> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<CSSValue>(this);
  }

  // From Collection<CSSValue>:

  void add(CSSValue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(CSSValue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<CSSValue> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(CSSValue element) => _Collections.contains(this, element);

  void forEach(void f(CSSValue element)) => _Collections.forEach(this, f);

  Collection map(f(CSSValue element)) => _Collections.map(this, [], f);

  Collection<CSSValue> filter(bool f(CSSValue element)) =>
     _Collections.filter(this, <CSSValue>[], f);

  bool every(bool f(CSSValue element)) => _Collections.every(this, f);

  bool some(bool f(CSSValue element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<CSSValue>:

  void sort([Comparator<CSSValue> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(CSSValue element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(CSSValue element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  CSSValue get last => this[length - 1];

  CSSValue removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<CSSValue> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [CSSValue initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<CSSValue> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <CSSValue>[]);

  // -- end List<CSSValue> mixins.


  /** @domName CSSValueList.item */
  CSSValue item(int index) native "CSSValueList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName ClientRectList
class _ClientRectList extends NativeFieldWrapperClass1 implements List<ClientRect> {
  _ClientRectList.internal();


  /** @domName ClientRectList.length */
  int get length native "ClientRectList_length_Getter";

  ClientRect operator[](int index) native "ClientRectList_item_Callback";

  void operator[]=(int index, ClientRect value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<ClientRect> mixins.
  // ClientRect is the element type.

  // From Iterable<ClientRect>:

  Iterator<ClientRect> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<ClientRect>(this);
  }

  // From Collection<ClientRect>:

  void add(ClientRect value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(ClientRect value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<ClientRect> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(ClientRect element) => _Collections.contains(this, element);

  void forEach(void f(ClientRect element)) => _Collections.forEach(this, f);

  Collection map(f(ClientRect element)) => _Collections.map(this, [], f);

  Collection<ClientRect> filter(bool f(ClientRect element)) =>
     _Collections.filter(this, <ClientRect>[], f);

  bool every(bool f(ClientRect element)) => _Collections.every(this, f);

  bool some(bool f(ClientRect element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<ClientRect>:

  void sort([Comparator<ClientRect> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(ClientRect element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(ClientRect element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  ClientRect get last => this[length - 1];

  ClientRect removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [ClientRect initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<ClientRect> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <ClientRect>[]);

  // -- end List<ClientRect> mixins.


  /** @domName ClientRectList.item */
  ClientRect item(int index) native "ClientRectList_item_Callback";

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

class _DOMParserFactoryProvider {
  static DOMParser createDOMParser() native "DOMParser_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName DOMStringList
class _DOMStringList extends NativeFieldWrapperClass1 implements List<String> {
  _DOMStringList.internal();


  /** @domName DOMStringList.length */
  int get length native "DOMStringList_length_Getter";

  String operator[](int index) native "DOMStringList_item_Callback";

  void operator[]=(int index, String value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<String> mixins.
  // String is the element type.

  // From Iterable<String>:

  Iterator<String> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<String>(this);
  }

  // From Collection<String>:

  void add(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<String> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  // contains() defined by IDL.

  void forEach(void f(String element)) => _Collections.forEach(this, f);

  Collection map(f(String element)) => _Collections.map(this, [], f);

  Collection<String> filter(bool f(String element)) =>
     _Collections.filter(this, <String>[], f);

  bool every(bool f(String element)) => _Collections.every(this, f);

  bool some(bool f(String element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<String>:

  void sort([Comparator<String> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(String element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(String element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  String get last => this[length - 1];

  String removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [String initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<String> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <String>[]);

  // -- end List<String> mixins.


  /** @domName DOMStringList.contains */
  bool contains(String string) native "DOMStringList_contains_Callback";


  /** @domName DOMStringList.item */
  String item(int index) native "DOMStringList_item_Callback";

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

class _DataViewFactoryProvider {
  static DataView createDataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) native "DataView_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName HTMLDocument
class _Document_Merged extends Document {
  _Document_Merged.internal(): super.internal();


  /** @domName HTMLDocument.activeElement */
  Element get activeElement native "HTMLDocument_activeElement_Getter";

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

// WARNING: Do not edit - generated code.

/// @domName HTMLElement
class _Element_Merged extends Element {
  _Element_Merged.internal(): super.internal();


  /** @domName HTMLElement.children */
  HTMLCollection get $dom_children native "HTMLElement_children_Getter";


  /** @domName HTMLElement.contentEditable */
  String get contentEditable native "HTMLElement_contentEditable_Getter";


  /** @domName HTMLElement.contentEditable */
  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";


  /** @domName HTMLElement.dir */
  String get dir native "HTMLElement_dir_Getter";


  /** @domName HTMLElement.dir */
  void set dir(String value) native "HTMLElement_dir_Setter";


  /** @domName HTMLElement.draggable */
  bool get draggable native "HTMLElement_draggable_Getter";


  /** @domName HTMLElement.draggable */
  void set draggable(bool value) native "HTMLElement_draggable_Setter";


  /** @domName HTMLElement.hidden */
  bool get hidden native "HTMLElement_hidden_Getter";


  /** @domName HTMLElement.hidden */
  void set hidden(bool value) native "HTMLElement_hidden_Setter";


  /** @domName HTMLElement.id */
  String get id native "HTMLElement_id_Getter";


  /** @domName HTMLElement.id */
  void set id(String value) native "HTMLElement_id_Setter";


  /** @domName HTMLElement.innerHTML */
  String get innerHTML native "HTMLElement_innerHTML_Getter";


  /** @domName HTMLElement.innerHTML */
  void set innerHTML(String value) native "HTMLElement_innerHTML_Setter";


  /** @domName HTMLElement.isContentEditable */
  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";


  /** @domName HTMLElement.lang */
  String get lang native "HTMLElement_lang_Getter";


  /** @domName HTMLElement.lang */
  void set lang(String value) native "HTMLElement_lang_Setter";


  /** @domName HTMLElement.outerHTML */
  String get outerHTML native "HTMLElement_outerHTML_Getter";


  /** @domName HTMLElement.spellcheck */
  bool get spellcheck native "HTMLElement_spellcheck_Getter";


  /** @domName HTMLElement.spellcheck */
  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";


  /** @domName HTMLElement.tabIndex */
  int get tabIndex native "HTMLElement_tabIndex_Getter";


  /** @domName HTMLElement.tabIndex */
  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";


  /** @domName HTMLElement.title */
  String get title native "HTMLElement_title_Getter";


  /** @domName HTMLElement.title */
  void set title(String value) native "HTMLElement_title_Setter";


  /** @domName HTMLElement.translate */
  bool get translate native "HTMLElement_translate_Getter";


  /** @domName HTMLElement.translate */
  void set translate(bool value) native "HTMLElement_translate_Setter";


  /** @domName HTMLElement.webkitdropzone */
  String get webkitdropzone native "HTMLElement_webkitdropzone_Getter";


  /** @domName HTMLElement.webkitdropzone */
  void set webkitdropzone(String value) native "HTMLElement_webkitdropzone_Setter";


  /** @domName HTMLElement.click */
  void click() native "HTMLElement_click_Callback";


  /** @domName HTMLElement.insertAdjacentElement */
  Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";


  /** @domName HTMLElement.insertAdjacentHTML */
  void insertAdjacentHTML(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";


  /** @domName HTMLElement.insertAdjacentText */
  void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";

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


class _Elements {


  static AnchorElement createAnchorElement([String href]) {
    AnchorElement _e = document.$dom_createElement("a");
    if (href != null) _e.href = href;
    return _e;
  }

  static AreaElement createAreaElement() {
    AreaElement _e = document.$dom_createElement("area");
    return _e;
  }

  static BRElement createBRElement() {
    BRElement _e = document.$dom_createElement("br");
    return _e;
  }

  static BaseElement createBaseElement() {
    BaseElement _e = document.$dom_createElement("base");
    return _e;
  }

  static BodyElement createBodyElement() {
    BodyElement _e = document.$dom_createElement("body");
    return _e;
  }

  static ButtonElement createButtonElement() {
    ButtonElement _e = document.$dom_createElement("button");
    return _e;
  }

  static CanvasElement createCanvasElement([int width, int height]) {
    CanvasElement _e = document.$dom_createElement("canvas");
    if (width != null) _e.width = width;
    if (height != null) _e.height = height;
    return _e;
  }

  static ContentElement createContentElement() {
    ContentElement _e = document.$dom_createElement("content");
    return _e;
  }

  static DListElement createDListElement() {
    DListElement _e = document.$dom_createElement("dl");
    return _e;
  }

  static DataListElement createDataListElement() {
    DataListElement _e = document.$dom_createElement("datalist");
    return _e;
  }

  static DetailsElement createDetailsElement() {
    DetailsElement _e = document.$dom_createElement("details");
    return _e;
  }

  static DivElement createDivElement() {
    DivElement _e = document.$dom_createElement("div");
    return _e;
  }

  static EmbedElement createEmbedElement() {
    EmbedElement _e = document.$dom_createElement("embed");
    return _e;
  }

  static FieldSetElement createFieldSetElement() {
    FieldSetElement _e = document.$dom_createElement("fieldset");
    return _e;
  }

  static FormElement createFormElement() {
    FormElement _e = document.$dom_createElement("form");
    return _e;
  }

  static HRElement createHRElement() {
    HRElement _e = document.$dom_createElement("hr");
    return _e;
  }

  static HeadElement createHeadElement() {
    HeadElement _e = document.$dom_createElement("head");
    return _e;
  }

  static HeadingElement createHeadingElement_h1() {
    HeadingElement _e = document.$dom_createElement("h1");
    return _e;
  }

  static HeadingElement createHeadingElement_h2() {
    HeadingElement _e = document.$dom_createElement("h2");
    return _e;
  }

  static HeadingElement createHeadingElement_h3() {
    HeadingElement _e = document.$dom_createElement("h3");
    return _e;
  }

  static HeadingElement createHeadingElement_h4() {
    HeadingElement _e = document.$dom_createElement("h4");
    return _e;
  }

  static HeadingElement createHeadingElement_h5() {
    HeadingElement _e = document.$dom_createElement("h5");
    return _e;
  }

  static HeadingElement createHeadingElement_h6() {
    HeadingElement _e = document.$dom_createElement("h6");
    return _e;
  }

  static HtmlElement createHtmlElement() {
    HtmlElement _e = document.$dom_createElement("html");
    return _e;
  }

  static IFrameElement createIFrameElement() {
    IFrameElement _e = document.$dom_createElement("iframe");
    return _e;
  }

  static ImageElement createImageElement([String src, int width, int height]) {
    ImageElement _e = document.$dom_createElement("img");
    if (src != null) _e.src = src;
    if (width != null) _e.width = width;
    if (height != null) _e.height = height;
    return _e;
  }

  static InputElement createInputElement([String type]) {
    InputElement _e = document.$dom_createElement("input");
    if (type != null) _e.type = type;
    return _e;
  }

  static KeygenElement createKeygenElement() {
    KeygenElement _e = document.$dom_createElement("keygen");
    return _e;
  }

  static LIElement createLIElement() {
    LIElement _e = document.$dom_createElement("li");
    return _e;
  }

  static LabelElement createLabelElement() {
    LabelElement _e = document.$dom_createElement("label");
    return _e;
  }

  static LegendElement createLegendElement() {
    LegendElement _e = document.$dom_createElement("legend");
    return _e;
  }

  static LinkElement createLinkElement() {
    LinkElement _e = document.$dom_createElement("link");
    return _e;
  }

  static MapElement createMapElement() {
    MapElement _e = document.$dom_createElement("map");
    return _e;
  }

  static MenuElement createMenuElement() {
    MenuElement _e = document.$dom_createElement("menu");
    return _e;
  }

  static MeterElement createMeterElement() {
    MeterElement _e = document.$dom_createElement("meter");
    return _e;
  }

  static OListElement createOListElement() {
    OListElement _e = document.$dom_createElement("ol");
    return _e;
  }

  static ObjectElement createObjectElement() {
    ObjectElement _e = document.$dom_createElement("object");
    return _e;
  }

  static OptGroupElement createOptGroupElement() {
    OptGroupElement _e = document.$dom_createElement("optgroup");
    return _e;
  }

  static OutputElement createOutputElement() {
    OutputElement _e = document.$dom_createElement("output");
    return _e;
  }

  static ParagraphElement createParagraphElement() {
    ParagraphElement _e = document.$dom_createElement("p");
    return _e;
  }

  static ParamElement createParamElement() {
    ParamElement _e = document.$dom_createElement("param");
    return _e;
  }

  static PreElement createPreElement() {
    PreElement _e = document.$dom_createElement("pre");
    return _e;
  }

  static ProgressElement createProgressElement() {
    ProgressElement _e = document.$dom_createElement("progress");
    return _e;
  }

  static ScriptElement createScriptElement() {
    ScriptElement _e = document.$dom_createElement("script");
    return _e;
  }

  static SelectElement createSelectElement() {
    SelectElement _e = document.$dom_createElement("select");
    return _e;
  }

  static SourceElement createSourceElement() {
    SourceElement _e = document.$dom_createElement("source");
    return _e;
  }

  static SpanElement createSpanElement() {
    SpanElement _e = document.$dom_createElement("span");
    return _e;
  }

  static StyleElement createStyleElement() {
    StyleElement _e = document.$dom_createElement("style");
    return _e;
  }

  static TableCaptionElement createTableCaptionElement() {
    TableCaptionElement _e = document.$dom_createElement("caption");
    return _e;
  }

  static TableCellElement createTableCellElement() {
    TableCellElement _e = document.$dom_createElement("td");
    return _e;
  }

  static TableColElement createTableColElement() {
    TableColElement _e = document.$dom_createElement("col");
    return _e;
  }

  static TableElement createTableElement() {
    TableElement _e = document.$dom_createElement("table");
    return _e;
  }

  static TableRowElement createTableRowElement() {
    TableRowElement _e = document.$dom_createElement("tr");
    return _e;
  }

  static TextAreaElement createTextAreaElement() {
    TextAreaElement _e = document.$dom_createElement("textarea");
    return _e;
  }

  static TitleElement createTitleElement() {
    TitleElement _e = document.$dom_createElement("title");
    return _e;
  }

  static TrackElement createTrackElement() {
    TrackElement _e = document.$dom_createElement("track");
    return _e;
  }

  static UListElement createUListElement() {
    UListElement _e = document.$dom_createElement("ul");
    return _e;
  }

  static VideoElement createVideoElement() {
    VideoElement _e = document.$dom_createElement("video");
    return _e;
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName EntryArray
class _EntryArray extends NativeFieldWrapperClass1 implements List<Entry> {
  _EntryArray.internal();


  /** @domName EntryArray.length */
  int get length native "EntryArray_length_Getter";

  Entry operator[](int index) native "EntryArray_item_Callback";

  void operator[]=(int index, Entry value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Entry> mixins.
  // Entry is the element type.

  // From Iterable<Entry>:

  Iterator<Entry> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Entry>(this);
  }

  // From Collection<Entry>:

  void add(Entry value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Entry value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Entry> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Entry element) => _Collections.contains(this, element);

  void forEach(void f(Entry element)) => _Collections.forEach(this, f);

  Collection map(f(Entry element)) => _Collections.map(this, [], f);

  Collection<Entry> filter(bool f(Entry element)) =>
     _Collections.filter(this, <Entry>[], f);

  bool every(bool f(Entry element)) => _Collections.every(this, f);

  bool some(bool f(Entry element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Entry>:

  void sort([Comparator<Entry> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Entry element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Entry element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Entry get last => this[length - 1];

  Entry removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Entry initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Entry> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Entry>[]);

  // -- end List<Entry> mixins.


  /** @domName EntryArray.item */
  Entry item(int index) native "EntryArray_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName EntryArraySync
class _EntryArraySync extends NativeFieldWrapperClass1 implements List<EntrySync> {
  _EntryArraySync.internal();


  /** @domName EntryArraySync.length */
  int get length native "EntryArraySync_length_Getter";

  EntrySync operator[](int index) native "EntryArraySync_item_Callback";

  void operator[]=(int index, EntrySync value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<EntrySync> mixins.
  // EntrySync is the element type.

  // From Iterable<EntrySync>:

  Iterator<EntrySync> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<EntrySync>(this);
  }

  // From Collection<EntrySync>:

  void add(EntrySync value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(EntrySync value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<EntrySync> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(EntrySync element) => _Collections.contains(this, element);

  void forEach(void f(EntrySync element)) => _Collections.forEach(this, f);

  Collection map(f(EntrySync element)) => _Collections.map(this, [], f);

  Collection<EntrySync> filter(bool f(EntrySync element)) =>
     _Collections.filter(this, <EntrySync>[], f);

  bool every(bool f(EntrySync element)) => _Collections.every(this, f);

  bool some(bool f(EntrySync element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<EntrySync>:

  void sort([Comparator<EntrySync> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(EntrySync element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(EntrySync element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  EntrySync get last => this[length - 1];

  EntrySync removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<EntrySync> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <EntrySync>[]);

  // -- end List<EntrySync> mixins.


  /** @domName EntryArraySync.item */
  EntrySync item(int index) native "EntryArraySync_item_Callback";

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

class _EventSourceFactoryProvider {
  static EventSource createEventSource(String scriptUrl) native "EventSource_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName FileList
class _FileList extends NativeFieldWrapperClass1 implements List<File> {
  _FileList.internal();


  /** @domName FileList.length */
  int get length native "FileList_length_Getter";

  File operator[](int index) native "FileList_item_Callback";

  void operator[]=(int index, File value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<File> mixins.
  // File is the element type.

  // From Iterable<File>:

  Iterator<File> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<File>(this);
  }

  // From Collection<File>:

  void add(File value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(File value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<File> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(File element) => _Collections.contains(this, element);

  void forEach(void f(File element)) => _Collections.forEach(this, f);

  Collection map(f(File element)) => _Collections.map(this, [], f);

  Collection<File> filter(bool f(File element)) =>
     _Collections.filter(this, <File>[], f);

  bool every(bool f(File element)) => _Collections.every(this, f);

  bool some(bool f(File element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<File>:

  void sort([Comparator<File> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(File element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(File element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  File get last => this[length - 1];

  File removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [File initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<File> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <File>[]);

  // -- end List<File> mixins.


  /** @domName FileList.item */
  File item(int index) native "FileList_item_Callback";

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

class _FileReaderFactoryProvider {
  static FileReader createFileReader() native "FileReader_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _FileReaderSyncFactoryProvider {
  static FileReaderSync createFileReaderSync() native "FileReaderSync_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _FormDataFactoryProvider {
  static FormData createFormData([FormElement form]) native "DOMFormData_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName GamepadList
class _GamepadList extends NativeFieldWrapperClass1 implements List<Gamepad> {
  _GamepadList.internal();


  /** @domName GamepadList.length */
  int get length native "GamepadList_length_Getter";

  Gamepad operator[](int index) native "GamepadList_item_Callback";

  void operator[]=(int index, Gamepad value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Gamepad> mixins.
  // Gamepad is the element type.

  // From Iterable<Gamepad>:

  Iterator<Gamepad> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Gamepad>(this);
  }

  // From Collection<Gamepad>:

  void add(Gamepad value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Gamepad value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Gamepad> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Gamepad element) => _Collections.contains(this, element);

  void forEach(void f(Gamepad element)) => _Collections.forEach(this, f);

  Collection map(f(Gamepad element)) => _Collections.map(this, [], f);

  Collection<Gamepad> filter(bool f(Gamepad element)) =>
     _Collections.filter(this, <Gamepad>[], f);

  bool every(bool f(Gamepad element)) => _Collections.every(this, f);

  bool some(bool f(Gamepad element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Gamepad>:

  void sort([Comparator<Gamepad> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Gamepad element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Gamepad element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Gamepad get last => this[length - 1];

  Gamepad removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Gamepad initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Gamepad> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Gamepad>[]);

  // -- end List<Gamepad> mixins.


  /** @domName GamepadList.item */
  Gamepad item(int index) native "GamepadList_item_Callback";

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

class _HttpRequestFactoryProvider {
  static HttpRequest createHttpRequest() => _createHttpRequest();
  static HttpRequest _createHttpRequest() native "XMLHttpRequest_constructor_Callback";

  static HttpRequest createHttpRequest_get(String url,
                                     onSuccess(HttpRequest request)) =>
      _HttpRequestUtils.get(url, onSuccess, false);

  static HttpRequest createHttpRequest_getWithCredentials(String url,
                                     onSuccess(HttpRequest request)) =>
      _HttpRequestUtils.get(url, onSuccess, true);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _IceCandidateFactoryProvider {
  static IceCandidate createIceCandidate(String label, String candidateLine) native "IceCandidate_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _MediaControllerFactoryProvider {
  static MediaController createMediaController() native "MediaController_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _MediaSourceFactoryProvider {
  static MediaSource createMediaSource() native "MediaSource_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _MediaStreamFactoryProvider {
  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) native "MediaStream_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName MediaStreamList
class _MediaStreamList extends NativeFieldWrapperClass1 implements List<MediaStream> {
  _MediaStreamList.internal();


  /** @domName MediaStreamList.length */
  int get length native "MediaStreamList_length_Getter";

  MediaStream operator[](int index) native "MediaStreamList_item_Callback";

  void operator[]=(int index, MediaStream value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<MediaStream> mixins.
  // MediaStream is the element type.

  // From Iterable<MediaStream>:

  Iterator<MediaStream> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<MediaStream>(this);
  }

  // From Collection<MediaStream>:

  void add(MediaStream value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(MediaStream value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<MediaStream> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(MediaStream element) => _Collections.contains(this, element);

  void forEach(void f(MediaStream element)) => _Collections.forEach(this, f);

  Collection map(f(MediaStream element)) => _Collections.map(this, [], f);

  Collection<MediaStream> filter(bool f(MediaStream element)) =>
     _Collections.filter(this, <MediaStream>[], f);

  bool every(bool f(MediaStream element)) => _Collections.every(this, f);

  bool some(bool f(MediaStream element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<MediaStream>:

  void sort([Comparator<MediaStream> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(MediaStream element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(MediaStream element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  MediaStream get last => this[length - 1];

  MediaStream removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [MediaStream initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<MediaStream> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <MediaStream>[]);

  // -- end List<MediaStream> mixins.


  /** @domName MediaStreamList.item */
  MediaStream item(int index) native "MediaStreamList_item_Callback";

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

class _MessageChannelFactoryProvider {
  static MessageChannel createMessageChannel() native "MessageChannel_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _MutationObserverFactoryProvider {
  static MutationObserver createMutationObserver(MutationCallback callback) native "MutationObserver_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _NotificationFactoryProvider {
  static Notification createNotification(String title, [Map options]) native "Notification_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _OptionElementFactoryProvider {
  static OptionElement createOptionElement([String data, String value, bool defaultSelected, bool selected]) native "HTMLOptionElement_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _PeerConnection00FactoryProvider {
  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) native "PeerConnection00_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _RTCIceCandidateFactoryProvider {
  static RTCIceCandidate createRTCIceCandidate(Map dictionary) native "RTCIceCandidate_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _RTCPeerConnectionFactoryProvider {
  static RTCPeerConnection createRTCPeerConnection(Map rtcIceServers, [Map mediaConstraints]) native "RTCPeerConnection_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _RTCSessionDescriptionFactoryProvider {
  static RTCSessionDescription createRTCSessionDescription(Map dictionary) native "RTCSessionDescription_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SVGElementInstanceList
class _SVGElementInstanceList extends NativeFieldWrapperClass1 implements List<SVGElementInstance> {
  _SVGElementInstanceList.internal();


  /** @domName SVGElementInstanceList.length */
  int get length native "SVGElementInstanceList_length_Getter";

  SVGElementInstance operator[](int index) native "SVGElementInstanceList_item_Callback";

  void operator[]=(int index, SVGElementInstance value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SVGElementInstance> mixins.
  // SVGElementInstance is the element type.

  // From Iterable<SVGElementInstance>:

  Iterator<SVGElementInstance> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SVGElementInstance>(this);
  }

  // From Collection<SVGElementInstance>:

  void add(SVGElementInstance value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SVGElementInstance value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SVGElementInstance> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SVGElementInstance element) => _Collections.contains(this, element);

  void forEach(void f(SVGElementInstance element)) => _Collections.forEach(this, f);

  Collection map(f(SVGElementInstance element)) => _Collections.map(this, [], f);

  Collection<SVGElementInstance> filter(bool f(SVGElementInstance element)) =>
     _Collections.filter(this, <SVGElementInstance>[], f);

  bool every(bool f(SVGElementInstance element)) => _Collections.every(this, f);

  bool some(bool f(SVGElementInstance element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SVGElementInstance>:

  void sort([Comparator<SVGElementInstance> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SVGElementInstance element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SVGElementInstance element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SVGElementInstance get last => this[length - 1];

  SVGElementInstance removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SVGElementInstance> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SVGElementInstance initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SVGElementInstance> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SVGElementInstance>[]);

  // -- end List<SVGElementInstance> mixins.


  /** @domName SVGElementInstanceList.item */
  SVGElementInstance item(int index) native "SVGElementInstanceList_item_Callback";

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

class _SessionDescriptionFactoryProvider {
  static SessionDescription createSessionDescription(String sdp) native "SessionDescription_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _ShadowRootFactoryProvider {
  static ShadowRoot createShadowRoot(Element host) native "ShadowRoot_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _SharedWorkerFactoryProvider {
  static SharedWorker createSharedWorker(String scriptURL, [String name]) native "SharedWorker_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _SpeechGrammarFactoryProvider {
  static SpeechGrammar createSpeechGrammar() native "SpeechGrammar_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _SpeechGrammarListFactoryProvider {
  static SpeechGrammarList createSpeechGrammarList() native "SpeechGrammarList_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SpeechInputResultList
class _SpeechInputResultList extends NativeFieldWrapperClass1 implements List<SpeechInputResult> {
  _SpeechInputResultList.internal();


  /** @domName SpeechInputResultList.length */
  int get length native "SpeechInputResultList_length_Getter";

  SpeechInputResult operator[](int index) native "SpeechInputResultList_item_Callback";

  void operator[]=(int index, SpeechInputResult value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechInputResult> mixins.
  // SpeechInputResult is the element type.

  // From Iterable<SpeechInputResult>:

  Iterator<SpeechInputResult> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SpeechInputResult>(this);
  }

  // From Collection<SpeechInputResult>:

  void add(SpeechInputResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechInputResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SpeechInputResult> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SpeechInputResult element) => _Collections.contains(this, element);

  void forEach(void f(SpeechInputResult element)) => _Collections.forEach(this, f);

  Collection map(f(SpeechInputResult element)) => _Collections.map(this, [], f);

  Collection<SpeechInputResult> filter(bool f(SpeechInputResult element)) =>
     _Collections.filter(this, <SpeechInputResult>[], f);

  bool every(bool f(SpeechInputResult element)) => _Collections.every(this, f);

  bool some(bool f(SpeechInputResult element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SpeechInputResult>:

  void sort([Comparator<SpeechInputResult> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechInputResult element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechInputResult element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SpeechInputResult get last => this[length - 1];

  SpeechInputResult removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechInputResult initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechInputResult> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SpeechInputResult>[]);

  // -- end List<SpeechInputResult> mixins.


  /** @domName SpeechInputResultList.item */
  SpeechInputResult item(int index) native "SpeechInputResultList_item_Callback";

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

class _SpeechRecognitionFactoryProvider {
  static SpeechRecognition createSpeechRecognition() native "SpeechRecognition_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName SpeechRecognitionResultList
class _SpeechRecognitionResultList extends NativeFieldWrapperClass1 implements List<SpeechRecognitionResult> {
  _SpeechRecognitionResultList.internal();


  /** @domName SpeechRecognitionResultList.length */
  int get length native "SpeechRecognitionResultList_length_Getter";

  SpeechRecognitionResult operator[](int index) native "SpeechRecognitionResultList_item_Callback";

  void operator[]=(int index, SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechRecognitionResult> mixins.
  // SpeechRecognitionResult is the element type.

  // From Iterable<SpeechRecognitionResult>:

  Iterator<SpeechRecognitionResult> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<SpeechRecognitionResult>(this);
  }

  // From Collection<SpeechRecognitionResult>:

  void add(SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SpeechRecognitionResult> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(SpeechRecognitionResult element) => _Collections.contains(this, element);

  void forEach(void f(SpeechRecognitionResult element)) => _Collections.forEach(this, f);

  Collection map(f(SpeechRecognitionResult element)) => _Collections.map(this, [], f);

  Collection<SpeechRecognitionResult> filter(bool f(SpeechRecognitionResult element)) =>
     _Collections.filter(this, <SpeechRecognitionResult>[], f);

  bool every(bool f(SpeechRecognitionResult element)) => _Collections.every(this, f);

  bool some(bool f(SpeechRecognitionResult element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SpeechRecognitionResult>:

  void sort([Comparator<SpeechRecognitionResult> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechRecognitionResult element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechRecognitionResult element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  SpeechRecognitionResult get last => this[length - 1];

  SpeechRecognitionResult removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechRecognitionResult initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <SpeechRecognitionResult>[]);

  // -- end List<SpeechRecognitionResult> mixins.


  /** @domName SpeechRecognitionResultList.item */
  SpeechRecognitionResult item(int index) native "SpeechRecognitionResultList_item_Callback";

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

// WARNING: Do not edit - generated code.

/// @domName StyleSheetList
class _StyleSheetList extends NativeFieldWrapperClass1 implements List<StyleSheet> {
  _StyleSheetList.internal();


  /** @domName StyleSheetList.length */
  int get length native "StyleSheetList_length_Getter";

  StyleSheet operator[](int index) native "StyleSheetList_item_Callback";

  void operator[]=(int index, StyleSheet value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<StyleSheet> mixins.
  // StyleSheet is the element type.

  // From Iterable<StyleSheet>:

  Iterator<StyleSheet> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<StyleSheet>(this);
  }

  // From Collection<StyleSheet>:

  void add(StyleSheet value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(StyleSheet value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<StyleSheet> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(StyleSheet element) => _Collections.contains(this, element);

  void forEach(void f(StyleSheet element)) => _Collections.forEach(this, f);

  Collection map(f(StyleSheet element)) => _Collections.map(this, [], f);

  Collection<StyleSheet> filter(bool f(StyleSheet element)) =>
     _Collections.filter(this, <StyleSheet>[], f);

  bool every(bool f(StyleSheet element)) => _Collections.every(this, f);

  bool some(bool f(StyleSheet element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<StyleSheet>:

  void sort([Comparator<StyleSheet> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(StyleSheet element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(StyleSheet element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  StyleSheet get last => this[length - 1];

  StyleSheet removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [StyleSheet initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<StyleSheet> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <StyleSheet>[]);

  // -- end List<StyleSheet> mixins.


  /** @domName StyleSheetList.item */
  StyleSheet item(int index) native "StyleSheetList_item_Callback";

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

class _TextTrackCueFactoryProvider {
  static TextTrackCue createTextTrackCue(num startTime, num endTime, String text) native "TextTrackCue_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/// @domName WebKitAnimationList
class _WebKitAnimationList extends NativeFieldWrapperClass1 implements List<Animation> {
  _WebKitAnimationList.internal();


  /** @domName WebKitAnimationList.length */
  int get length native "WebKitAnimationList_length_Getter";

  Animation operator[](int index) native "WebKitAnimationList_item_Callback";

  void operator[]=(int index, Animation value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Animation> mixins.
  // Animation is the element type.

  // From Iterable<Animation>:

  Iterator<Animation> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new _FixedSizeListIterator<Animation>(this);
  }

  // From Collection<Animation>:

  void add(Animation value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Animation value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Animation> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  bool contains(Animation element) => _Collections.contains(this, element);

  void forEach(void f(Animation element)) => _Collections.forEach(this, f);

  Collection map(f(Animation element)) => _Collections.map(this, [], f);

  Collection<Animation> filter(bool f(Animation element)) =>
     _Collections.filter(this, <Animation>[], f);

  bool every(bool f(Animation element)) => _Collections.every(this, f);

  bool some(bool f(Animation element)) => _Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Animation>:

  void sort([Comparator<Animation> compare = Comparable.compare]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Animation element, [int start = 0]) =>
      _Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Animation element, [int start]) {
    if (start == null) start = length - 1;
    return _Lists.lastIndexOf(this, element, start);
  }

  Animation get last => this[length - 1];

  Animation removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Animation> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Animation initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Animation> getRange(int start, int rangeLength) =>
      _Lists.getRange(this, start, rangeLength, <Animation>[]);

  // -- end List<Animation> mixins.


  /** @domName WebKitAnimationList.item */
  Animation item(int index) native "WebKitAnimationList_item_Callback";

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

class _WorkerFactoryProvider {
  static Worker createWorker(String scriptUrl) native "Worker_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _XMLSerializerFactoryProvider {
  static XMLSerializer createXMLSerializer() native "XMLSerializer_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _XPathEvaluatorFactoryProvider {
  static XPathEvaluator createXPathEvaluator() native "XPathEvaluator_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _XSLTProcessorFactoryProvider {
  static XSLTProcessor createXSLTProcessor() native "XSLTProcessor_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

abstract class Window {
  // Fields.
  Location get location;
  History get history;

  bool get closed;
  Window get opener;
  Window get parent;
  Window get top;

  // Methods.
  void focus();
  void blur();
  void close();
  void postMessage(var message, String targetOrigin, [List messagePorts = null]);
}

abstract class Location {
  void set href(String val);
}

abstract class History {
  void back();
  void forward();
  void go(int distance);
}
// Copyright (c) 2011, 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.

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

/**
 * Defines the keycode values for keys that are returned by 
 * KeyboardEvent.keyCode.
 * 
 * Important note: There is substantial divergence in how different browsers
 * handle keycodes and their variants in different locales/keyboard layouts. We
 * provide these constants to help make code processing keys more readable.
 */
abstract class KeyCode {
  // These constant names were borrowed from Closure's Keycode enumeration
  // class.
  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keycodes.js.source.html  
  static final int WIN_KEY_FF_LINUX = 0;
  static final int MAC_ENTER = 3;
  static final int BACKSPACE = 8;
  static final int TAB = 9;
  /** NUM_CENTER is also NUMLOCK for FF and Safari on Mac. */
  static final int NUM_CENTER = 12;
  static final int ENTER = 13;
  static final int SHIFT = 16;
  static final int CTRL = 17;
  static final int ALT = 18;
  static final int PAUSE = 19;
  static final int CAPS_LOCK = 20;
  static final int ESC = 27;
  static final int SPACE = 32;
  static final int PAGE_UP = 33;
  static final int PAGE_DOWN = 34;
  static final int END = 35;
  static final int HOME = 36;
  static final int LEFT = 37;
  static final int UP = 38;
  static final int RIGHT = 39;
  static final int DOWN = 40;
  static final int NUM_NORTH_EAST = 33;
  static final int NUM_SOUTH_EAST = 34;
  static final int NUM_SOUTH_WEST = 35;
  static final int NUM_NORTH_WEST = 36;
  static final int NUM_WEST = 37;
  static final int NUM_NORTH = 38;
  static final int NUM_EAST = 39;
  static final int NUM_SOUTH = 40;
  static final int PRINT_SCREEN = 44;
  static final int INSERT = 45;
  static final int NUM_INSERT = 45;
  static final int DELETE = 46;
  static final int NUM_DELETE = 46;
  static final int ZERO = 48;
  static final int ONE = 49;
  static final int TWO = 50;
  static final int THREE = 51;
  static final int FOUR = 52;
  static final int FIVE = 53;
  static final int SIX = 54;
  static final int SEVEN = 55;
  static final int EIGHT = 56;
  static final int NINE = 57;
  static final int FF_SEMICOLON = 59;
  static final int FF_EQUALS = 61;
  /**
   * CAUTION: The question mark is for US-keyboard layouts. It varies
   * for other locales and keyboard layouts.
   */
  static final int QUESTION_MARK = 63;
  static final int A = 65;
  static final int B = 66;
  static final int C = 67;
  static final int D = 68;
  static final int E = 69;
  static final int F = 70;
  static final int G = 71;
  static final int H = 72;
  static final int I = 73;
  static final int J = 74;
  static final int K = 75;
  static final int L = 76;
  static final int M = 77;
  static final int N = 78;
  static final int O = 79;
  static final int P = 80;
  static final int Q = 81;
  static final int R = 82;
  static final int S = 83;
  static final int T = 84;
  static final int U = 85;
  static final int V = 86;
  static final int W = 87;
  static final int X = 88;
  static final int Y = 89;
  static final int Z = 90;
  static final int META = 91;
  static final int WIN_KEY_LEFT = 91;
  static final int WIN_KEY_RIGHT = 92;
  static final int CONTEXT_MENU = 93;
  static final int NUM_ZERO = 96;
  static final int NUM_ONE = 97;
  static final int NUM_TWO = 98;
  static final int NUM_THREE = 99;
  static final int NUM_FOUR = 100;
  static final int NUM_FIVE = 101;
  static final int NUM_SIX = 102;
  static final int NUM_SEVEN = 103;
  static final int NUM_EIGHT = 104;
  static final int NUM_NINE = 105;
  static final int NUM_MULTIPLY = 106;
  static final int NUM_PLUS = 107;
  static final int NUM_MINUS = 109;
  static final int NUM_PERIOD = 110;
  static final int NUM_DIVISION = 111;
  static final int F1 = 112;
  static final int F2 = 113;
  static final int F3 = 114;
  static final int F4 = 115;
  static final int F5 = 116;
  static final int F6 = 117;
  static final int F7 = 118;
  static final int F8 = 119;
  static final int F9 = 120;
  static final int F10 = 121;
  static final int F11 = 122;
  static final int F12 = 123;
  static final int NUMLOCK = 144;
  static final int SCROLL_LOCK = 145;

  // OS-specific media keys like volume controls and browser controls.
  static final int FIRST_MEDIA_KEY = 166;
  static final int LAST_MEDIA_KEY = 183;

  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int SEMICOLON = 186;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int DASH = 189;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int EQUALS = 187;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int COMMA = 188;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int PERIOD = 190;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int SLASH = 191;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int APOSTROPHE = 192;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int TILDE = 192;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int SINGLE_QUOTE = 222;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int OPEN_SQUARE_BRACKET = 219;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int BACKSLASH = 220;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static final int CLOSE_SQUARE_BRACKET = 221;
  static final int WIN_KEY = 224;
  static final int MAC_FF_META = 224;
  static final int WIN_IME = 229;
}
// Copyright (c) 2011, 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.

/**
 * Defines the standard key locations returned by
 * KeyboardEvent.getKeyLocation.
 */
abstract class KeyLocation {

  /**
   * The event key is not distinguished as the left or right version
   * of the key, and did not originate from the numeric keypad (or did not
   * originate with a virtual key corresponding to the numeric keypad).
   */
  static const int STANDARD = 0;

  /**
   * The event key is in the left key location.
   */
  static const int LEFT = 1;

  /**
   * The event key is in the right key location.
   */
  static const int RIGHT = 2;

  /**
   * The event key originated on the numeric keypad or with a virtual key
   * corresponding to the numeric keypad.
   */
  static const int NUMPAD = 3;

  /**
   * The event key originated on a mobile device, either on a physical
   * keypad or a virtual keyboard.
   */
  static const int MOBILE = 4;

  /**
   * The event key originated on a game controller or a joystick on a mobile
   * device.
   */
  static const int JOYSTICK = 5;
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/**
 * Defines the standard keyboard identifier names for keys that are returned
 * by KeyEvent.getKeyboardIdentifier when the key does not have a direct
 * unicode mapping.
 */
abstract class KeyName {

  /** The Accept (Commit, OK) key */
  static const String ACCEPT = "Accept";

  /** The Add key */
  static const String ADD = "Add";

  /** The Again key */
  static const String AGAIN = "Again";

  /** The All Candidates key */
  static const String ALL_CANDIDATES = "AllCandidates";

  /** The Alphanumeric key */
  static const String ALPHANUMERIC = "Alphanumeric";

  /** The Alt (Menu) key */
  static const String ALT = "Alt";

  /** The Alt-Graph key */
  static const String ALT_GRAPH = "AltGraph";

  /** The Application key */
  static const String APPS = "Apps";

  /** The ATTN key */
  static const String ATTN = "Attn";

  /** The Browser Back key */
  static const String BROWSER_BACK = "BrowserBack";

  /** The Browser Favorites key */
  static const String BROWSER_FAVORTIES = "BrowserFavorites";

  /** The Browser Forward key */
  static const String BROWSER_FORWARD = "BrowserForward";

  /** The Browser Home key */
  static const String BROWSER_NAME = "BrowserHome";

  /** The Browser Refresh key */
  static const String BROWSER_REFRESH = "BrowserRefresh";

  /** The Browser Search key */
  static const String BROWSER_SEARCH = "BrowserSearch";

  /** The Browser Stop key */
  static const String BROWSER_STOP = "BrowserStop";

  /** The Camera key */
  static const String CAMERA = "Camera";

  /** The Caps Lock (Capital) key */
  static const String CAPS_LOCK = "CapsLock";

  /** The Clear key */
  static const String CLEAR = "Clear";

  /** The Code Input key */
  static const String CODE_INPUT = "CodeInput";

  /** The Compose key */
  static const String COMPOSE = "Compose";

  /** The Control (Ctrl) key */
  static const String CONTROL = "Control";

  /** The Crsel key */
  static const String CRSEL = "Crsel";

  /** The Convert key */
  static const String CONVERT = "Convert";

  /** The Copy key */
  static const String COPY = "Copy";

  /** The Cut key */
  static const String CUT = "Cut";

  /** The Decimal key */
  static const String DECIMAL = "Decimal";

  /** The Divide key */
  static const String DIVIDE = "Divide";

  /** The Down Arrow key */
  static const String DOWN = "Down";

  /** The diagonal Down-Left Arrow key */
  static const String DOWN_LEFT = "DownLeft";

  /** The diagonal Down-Right Arrow key */
  static const String DOWN_RIGHT = "DownRight";

  /** The Eject key */
  static const String EJECT = "Eject";

  /** The End key */
  static const String END = "End";

  /**
   * The Enter key. Note: This key value must also be used for the Return
   *  (Macintosh numpad) key
   */
  static const String ENTER = "Enter";

  /** The Erase EOF key */
  static const String ERASE_EOF= "EraseEof";

  /** The Execute key */
  static const String EXECUTE = "Execute";

  /** The Exsel key */
  static const String EXSEL = "Exsel";

  /** The Function switch key */
  static const String FN = "Fn";

  /** The F1 key */
  static const String F1 = "F1";

  /** The F2 key */
  static const String F2 = "F2";

  /** The F3 key */
  static const String F3 = "F3";

  /** The F4 key */
  static const String F4 = "F4";

  /** The F5 key */
  static const String F5 = "F5";

  /** The F6 key */
  static const String F6 = "F6";

  /** The F7 key */
  static const String F7 = "F7";

  /** The F8 key */
  static const String F8 = "F8";

  /** The F9 key */
  static const String F9 = "F9";

  /** The F10 key */
  static const String F10 = "F10";

  /** The F11 key */
  static const String F11 = "F11";

  /** The F12 key */
  static const String F12 = "F12";

  /** The F13 key */
  static const String F13 = "F13";

  /** The F14 key */
  static const String F14 = "F14";

  /** The F15 key */
  static const String F15 = "F15";

  /** The F16 key */
  static const String F16 = "F16";

  /** The F17 key */
  static const String F17 = "F17";

  /** The F18 key */
  static const String F18 = "F18";

  /** The F19 key */
  static const String F19 = "F19";

  /** The F20 key */
  static const String F20 = "F20";

  /** The F21 key */
  static const String F21 = "F21";

  /** The F22 key */
  static const String F22 = "F22";

  /** The F23 key */
  static const String F23 = "F23";

  /** The F24 key */
  static const String F24 = "F24";

  /** The Final Mode (Final) key used on some asian keyboards */
  static const String FINAL_MODE = "FinalMode";

  /** The Find key */
  static const String FIND = "Find";

  /** The Full-Width Characters key */
  static const String FULL_WIDTH = "FullWidth";

  /** The Half-Width Characters key */
  static const String HALF_WIDTH = "HalfWidth";

  /** The Hangul (Korean characters) Mode key */
  static const String HANGUL_MODE = "HangulMode";

  /** The Hanja (Korean characters) Mode key */
  static const String HANJA_MODE = "HanjaMode";

  /** The Help key */
  static const String HELP = "Help";

  /** The Hiragana (Japanese Kana characters) key */
  static const String HIRAGANA = "Hiragana";

  /** The Home key */
  static const String HOME = "Home";

  /** The Insert (Ins) key */
  static const String INSERT = "Insert";

  /** The Japanese-Hiragana key */
  static const String JAPANESE_HIRAGANA = "JapaneseHiragana";

  /** The Japanese-Katakana key */
  static const String JAPANESE_KATAKANA = "JapaneseKatakana";

  /** The Japanese-Romaji key */
  static const String JAPANESE_ROMAJI = "JapaneseRomaji";

  /** The Junja Mode key */
  static const String JUNJA_MODE = "JunjaMode";

  /** The Kana Mode (Kana Lock) key */
  static const String KANA_MODE = "KanaMode";

  /**
   * The Kanji (Japanese name for ideographic characters of Chinese origin)
   * Mode key
   */
  static const String KANJI_MODE = "KanjiMode";

  /** The Katakana (Japanese Kana characters) key */
  static const String KATAKANA = "Katakana";

  /** The Start Application One key */
  static const String LAUNCH_APPLICATION_1 = "LaunchApplication1";

  /** The Start Application Two key */
  static const String LAUNCH_APPLICATION_2 = "LaunchApplication2";

  /** The Start Mail key */
  static const String LAUNCH_MAIL = "LaunchMail";

  /** The Left Arrow key */
  static const String LEFT = "Left";

  /** The Menu key */
  static const String MENU = "Menu";

  /**
   * The Meta key. Note: This key value shall be also used for the Apple
   * Command key
   */
  static const String META = "Meta";

  /** The Media Next Track key */
  static const String MEDIA_NEXT_TRACK = "MediaNextTrack";

  /** The Media Play Pause key */
  static const String MEDIA_PAUSE_PLAY = "MediaPlayPause";

  /** The Media Previous Track key */
  static const String MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";

  /** The Media Stop key */
  static const String MEDIA_STOP = "MediaStop";

  /** The Mode Change key */
  static const String MODE_CHANGE = "ModeChange";

  /** The Next Candidate function key */
  static const String NEXT_CANDIDATE = "NextCandidate";

  /** The Nonconvert (Don't Convert) key */
  static const String NON_CONVERT = "Nonconvert";

  /** The Number Lock key */
  static const String NUM_LOCK = "NumLock";

  /** The Page Down (Next) key */
  static const String PAGE_DOWN = "PageDown";

  /** The Page Up key */
  static const String PAGE_UP = "PageUp";

  /** The Paste key */
  static const String PASTE = "Paste";

  /** The Pause key */
  static const String PAUSE = "Pause";

  /** The Play key */
  static const String PLAY = "Play";

  /**
   * The Power key. Note: Some devices may not expose this key to the
   * operating environment
   */
  static const String POWER = "Power";

  /** The Previous Candidate function key */
  static const String PREVIOUS_CANDIDATE = "PreviousCandidate";

  /** The Print Screen (PrintScrn, SnapShot) key */
  static const String PRINT_SCREEN = "PrintScreen";

  /** The Process key */
  static const String PROCESS = "Process";

  /** The Props key */
  static const String PROPS = "Props";

  /** The Right Arrow key */
  static const String RIGHT = "Right";

  /** The Roman Characters function key */
  static const String ROMAN_CHARACTERS = "RomanCharacters";

  /** The Scroll Lock key */
  static const String SCROLL = "Scroll";

  /** The Select key */
  static const String SELECT = "Select";

  /** The Select Media key */
  static const String SELECT_MEDIA = "SelectMedia";

  /** The Separator key */
  static const String SEPARATOR = "Separator";

  /** The Shift key */
  static const String SHIFT = "Shift";

  /** The Soft1 key */
  static const String SOFT_1 = "Soft1";

  /** The Soft2 key */
  static const String SOFT_2 = "Soft2";

  /** The Soft3 key */
  static const String SOFT_3 = "Soft3";

  /** The Soft4 key */
  static const String SOFT_4 = "Soft4";

  /** The Stop key */
  static const String STOP = "Stop";

  /** The Subtract key */
  static const String SUBTRACT = "Subtract";

  /** The Symbol Lock key */
  static const String SYMBOL_LOCK = "SymbolLock";

  /** The Up Arrow key */
  static const String UP = "Up";

  /** The diagonal Up-Left Arrow key */
  static const String UP_LEFT = "UpLeft";

  /** The diagonal Up-Right Arrow key */
  static const String UP_RIGHT = "UpRight";

  /** The Undo key */
  static const String UNDO = "Undo";

  /** The Volume Down key */
  static const String VOLUME_DOWN = "VolumeDown";

  /** The Volume Mute key */
  static const String VOLUMN_MUTE = "VolumeMute";

  /** The Volume Up key */
  static const String VOLUMN_UP = "VolumeUp";

  /** The Windows Logo key */
  static const String WIN = "Win";

  /** The Zoom key */
  static const String ZOOM = "Zoom";

  /**
   * The Backspace (Back) key. Note: This key value shall be also used for the
   * key labeled 'delete' MacOS keyboards when not modified by the 'Fn' key
   */
  static const String BACKSPACE = "Backspace";

  /** The Horizontal Tabulation (Tab) key */
  static const String TAB = "Tab";

  /** The Cancel key */
  static const String CANCEL = "Cancel";

  /** The Escape (Esc) key */
  static const String ESC = "Esc";

  /** The Space (Spacebar) key:   */
  static const String SPACEBAR = "Spacebar";

  /**
   * The Delete (Del) Key. Note: This key value shall be also used for the key
   * labeled 'delete' MacOS keyboards when modified by the 'Fn' key
   */
  static const String DEL = "Del";

  /** The Combining Grave Accent (Greek Varia, Dead Grave) key */
  static const String DEAD_GRAVE = "DeadGrave";

  /**
   * The Combining Acute Accent (Stress Mark, Greek Oxia, Tonos, Dead Eacute)
   * key
   */
  static const String DEAD_EACUTE = "DeadEacute";

  /** The Combining Circumflex Accent (Hat, Dead Circumflex) key */
  static const String DEAD_CIRCUMFLEX = "DeadCircumflex";

  /** The Combining Tilde (Dead Tilde) key */
  static const String DEAD_TILDE = "DeadTilde";

  /** The Combining Macron (Long, Dead Macron) key */
  static const String DEAD_MACRON = "DeadMacron";

  /** The Combining Breve (Short, Dead Breve) key */
  static const String DEAD_BREVE = "DeadBreve";

  /** The Combining Dot Above (Derivative, Dead Above Dot) key */
  static const String DEAD_ABOVE_DOT = "DeadAboveDot";

  /**
   * The Combining Diaeresis (Double Dot Abode, Umlaut, Greek Dialytika,
   * Double Derivative, Dead Diaeresis) key
   */
  static const String DEAD_UMLAUT = "DeadUmlaut";

  /** The Combining Ring Above (Dead Above Ring) key */
  static const String DEAD_ABOVE_RING = "DeadAboveRing";

  /** The Combining Double Acute Accent (Dead Doubleacute) key */
  static const String DEAD_DOUBLEACUTE = "DeadDoubleacute";

  /** The Combining Caron (Hacek, V Above, Dead Caron) key */
  static const String DEAD_CARON = "DeadCaron";

  /** The Combining Cedilla (Dead Cedilla) key */
  static const String DEAD_CEDILLA = "DeadCedilla";

  /** The Combining Ogonek (Nasal Hook, Dead Ogonek) key */
  static const String DEAD_OGONEK = "DeadOgonek";

  /**
   * The Combining Greek Ypogegrammeni (Greek Non-Spacing Iota Below, Iota
   * Subscript, Dead Iota) key
   */
  static const String DEAD_IOTA = "DeadIota";

  /**
   * The Combining Katakana-Hiragana Voiced Sound Mark (Dead Voiced Sound) key
   */
  static const String DEAD_VOICED_SOUND = "DeadVoicedSound";

  /**
   * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
   * Sound) key
   */
  static const String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";

  /**
   * Key value used when an implementation is unable to identify another key
   * value, due to either hardware, platform, or software constraints
   */
  static const String UNIDENTIFIED = "Unidentified";
}
// Copyright (c) 2011, 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.

/**
 * Contains the set of standard values returned by HTMLDocument.getReadyState.
 */
abstract class ReadyState {
  /**
   * Indicates the document is still loading and parsing.
   */
  static const String LOADING = "loading";

  /**
   * Indicates the document is finished parsing but is still loading
   * subresources.
   */
  static const String INTERACTIVE = "interactive";

  /**
   * Indicates the document and all subresources have been loaded.
   */
  static const String COMPLETE = "complete";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// TODO(antonm): support not DOM isolates too.
class _Timer implements Timer {
  final canceller;

  _Timer(this.canceller);

  void cancel() { canceller(); }
}

get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool repeating) {
  var maker;
  var canceller;
  if (repeating) {
    maker = window.setInterval;
    canceller = window.clearInterval;
  } else {
    maker = window.setTimeout;
    canceller = window.clearTimeout;
  }
  Timer timer;
  final int id = maker(() { callback(timer); }, milliSeconds);
  timer = new _Timer(() { canceller(id); });
  return timer;
};
// Copyright (c) 2011, 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.

/**
 * The [Collections] class implements static methods useful when
 * writing a class that implements [Collection] and the [iterator]
 * method.
 */
class _Collections {
  static bool contains(Iterable<Object> iterable, Object element) {
    for (final e in iterable) {
      if (e == element) return true;
    }
    return false;
  }

  static void forEach(Iterable<Object> iterable, void f(Object o)) {
    for (final e in iterable) {
      f(e);
    }
  }

  static List map(Iterable<Object> source,
                  List<Object> destination,
                  f(o)) {
    for (final e in source) {
      destination.add(f(e));
    }
    return destination;
  }

  static bool some(Iterable<Object> iterable, bool f(Object o)) {
    for (final e in iterable) {
      if (f(e)) return true;
    }
    return false;
  }

  static bool every(Iterable<Object> iterable, bool f(Object o)) {
    for (final e in iterable) {
      if (!f(e)) return false;
    }
    return true;
  }

  static List filter(Iterable<Object> source,
                     List<Object> destination,
                     bool f(o)) {
    for (final e in source) {
      if (f(e)) destination.add(e);
    }
    return destination;
  }

  static bool isEmpty(Iterable<Object> iterable) {
    return !iterable.iterator().hasNext;
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _HttpRequestUtils {

  // Helper for factory HttpRequest.get
  static HttpRequest get(String url,
                            onSuccess(HttpRequest request),
                            bool withCredentials) {
    final request = new HttpRequest();
    request.open('GET', url, true);

    request.withCredentials = withCredentials;

    // Status 0 is for local XHR request.
    request.on.readyStateChange.add((e) {
      if (request.readyState == HttpRequest.DONE &&
          (request.status == 200 || request.status == 0)) {
        onSuccess(request);
      }
    });

    request.send();

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

class _CustomEventFactoryProvider {
  static CustomEvent createCustomEvent(String type, [bool canBubble = true,
      bool cancelable = true, Object detail = null]) {
    final CustomEvent e = document.$dom_createEvent("CustomEvent");
    e.$dom_initCustomEvent(type, canBubble, cancelable, detail);
    return e;
  }
}

class _EventFactoryProvider {
  static Event createEvent(String type, [bool canBubble = true,
      bool cancelable = true]) {
    final Event e = document.$dom_createEvent("Event");
    e.$dom_initEvent(type, canBubble, cancelable);
    return e;
  }
}

class _MouseEventFactoryProvider {
  static MouseEvent createMouseEvent(String type, Window view, int detail,
      int screenX, int screenY, int clientX, int clientY, int button,
      [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
      bool altKey = false, bool shiftKey = false, bool metaKey = false,
      EventTarget relatedTarget = null]) {
    final e = document.$dom_createEvent("MouseEvent");
    e.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
        button, relatedTarget);
    return e;
  }
}

class _CSSStyleDeclarationFactoryProvider {
  static CSSStyleDeclaration createCSSStyleDeclaration_css(String css) {
    final style = new Element.tag('div').style;
    style.cssText = css;
    return style;
  }

  static CSSStyleDeclaration createCSSStyleDeclaration() {
    return new CSSStyleDeclaration.css('');
  }
}

class _DocumentFragmentFactoryProvider {
  /** @domName Document.createDocumentFragment */
  static DocumentFragment createDocumentFragment() =>
      document.createDocumentFragment();

  static DocumentFragment createDocumentFragment_html(String html) {
    final fragment = new DocumentFragment();
    fragment.innerHTML = html;
    return fragment;
  }

  // TODO(nweiz): enable this when XML is ported.
  // factory DocumentFragment.xml(String xml) {
  //   final fragment = new DocumentFragment();
  //   final e = new XMLElement.tag("xml");
  //   e.innerHTML = xml;
  //
  //   // Copy list first since we don't want liveness during iteration.
  //   final List nodes = new List.from(e.nodes);
  //   fragment.nodes.addAll(nodes);
  //   return fragment;
  // }

  static DocumentFragment createDocumentFragment_svg(String svg) {
    final fragment = new DocumentFragment();
    final e = new SVGSVGElement();
    e.innerHTML = svg;

    // Copy list first since we don't want liveness during iteration.
    final List nodes = new List.from(e.nodes);
    fragment.nodes.addAll(nodes);
    return fragment;
  }
}

class _SVGElementFactoryProvider {
  static SVGElement createSVGElement_tag(String tag) {
    final Element temp =
      document.$dom_createElementNS("http://www.w3.org/2000/svg", tag);
    return temp;
  }

  static SVGElement createSVGElement_svg(String svg) {
    Element parentTag;
    final match = _START_TAG_REGEXP.firstMatch(svg);
    if (match != null && match.group(1).toLowerCase() == 'svg') {
      parentTag = new Element.tag('div');
    } else {
      parentTag = new SVGSVGElement();
    }

    parentTag.innerHTML = svg;
    if (parentTag.elements.length == 1) return parentTag.elements.removeLast();

    throw new ArgumentError(
        'SVG had ${parentTag.elements.length} '
        'top-level elements but 1 expected');
  }
}

class _SVGSVGElementFactoryProvider {
  static SVGSVGElement createSVGSVGElement() {
    final el = new SVGElement.tag("svg");
    // The SVG spec requires the version attribute to match the spec version
    el.attributes['version'] = "1.1";
    return el;
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _AudioContextFactoryProvider {
  static AudioContext createAudioContext() => _createAudioContext();
  static _createAudioContext([int numberOfChannels,
                              int numberOfFrames,
                              int sampleRate])
      native "AudioContext_constructor_Callback";
}

class _IDBKeyRangeFactoryProvider {

  static IDBKeyRange createIDBKeyRange_only(/*IDBKey*/ value) =>
      IDBKeyRange.only_(value);

  static IDBKeyRange createIDBKeyRange_lowerBound(
      /*IDBKey*/ bound, [bool open = false]) =>
      IDBKeyRange.lowerBound_(bound, open);

  static IDBKeyRange createIDBKeyRange_upperBound(
      /*IDBKey*/ bound, [bool open = false]) =>
      IDBKeyRange.upperBound_(bound, open);

  static IDBKeyRange createIDBKeyRange_bound(
      /*IDBKey*/ lower, /*IDBKey*/ upper,
      [bool lowerOpen = false, bool upperOpen = false]) =>
      IDBKeyRange.bound_(lower, upper, lowerOpen, upperOpen);
}

class _TypedArrayFactoryProvider {
  static Float32Array createFloat32Array(int length) => _F32(length);
  static Float32Array createFloat32Array_fromList(List<num> list) =>
      _F32(ensureNative(list));
  static Float32Array createFloat32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _F32(buffer, byteOffset, length);
  static _F32(arg0, [arg1, arg2]) native "Float32Array_constructor_Callback";

  static Float64Array createFloat64Array(int length) => _F64(length);
  static Float64Array createFloat64Array_fromList(List<num> list) =>
      _F64(ensureNative(list));
  static Float64Array createFloat64Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _F64(buffer, byteOffset, length);
  static _F64(arg0, [arg1, arg2]) native "Float64Array_constructor_Callback";

  static Int8Array createInt8Array(int length) => _I8(length);
  static Int8Array createInt8Array_fromList(List<num> list) =>
      _I8(ensureNative(list));
  static Int8Array createInt8Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I8(buffer, byteOffset, length);
  static _I8(arg0, [arg1, arg2]) native "Int8Array_constructor_Callback";

  static Int16Array createInt16Array(int length) => _I16(length);
  static Int16Array createInt16Array_fromList(List<num> list) =>
      _I16(ensureNative(list));
  static Int16Array createInt16Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I16(buffer, byteOffset, length);
  static _I16(arg0, [arg1, arg2]) native "Int16Array_constructor_Callback";

  static Int32Array createInt32Array(int length) => _I32(length);
  static Int32Array createInt32Array_fromList(List<num> list) =>
      _I32(ensureNative(list));
  static Int32Array createInt32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I32(buffer, byteOffset, length);
  static _I32(arg0, [arg1, arg2]) native "Int32Array_constructor_Callback";

  static Uint8Array createUint8Array(int length) => _U8(length);
  static Uint8Array createUint8Array_fromList(List<num> list) =>
      _U8(ensureNative(list));
  static Uint8Array createUint8Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U8(buffer, byteOffset, length);
  static _U8(arg0, [arg1, arg2]) native "Uint8Array_constructor_Callback";

  static Uint16Array createUint16Array(int length) => _U16(length);
  static Uint16Array createUint16Array_fromList(List<num> list) =>
      _U16(ensureNative(list));
  static Uint16Array createUint16Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U16(buffer, byteOffset, length);
  static _U16(arg0, [arg1, arg2]) native "Uint16Array_constructor_Callback";

  static Uint32Array createUint32Array(int length) => _U32(length);
  static Uint32Array createUint32Array_fromList(List<num> list) =>
      _U32(ensureNative(list));
  static Uint32Array createUint32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U32(buffer, byteOffset, length);
  static _U32(arg0, [arg1, arg2]) native "Uint32Array_constructor_Callback";

  static Uint8ClampedArray createUint8ClampedArray(int length) => _U8C(length);
  static Uint8ClampedArray createUint8ClampedArrayUint8ClampedArray_fromList(
      List<num> list) => _U8C(ensureNative(list));
  static Uint8ClampedArray createUint8ClampedArrayUint8ClampedArray_fromBuffer(
      ArrayBuffer buffer, [int byteOffset = 0, int length]) =>
      _U8C(buffer, byteOffset, length);
  static _U8C(arg0, [arg1, arg2]) native "Uint8ClampedArray_constructor_Callback";

  static ensureNative(List list) => list;  // TODO: make sure.
}

class _PointFactoryProvider {
  static Point createPoint(num x, num y) => _createWebKitPoint(x, y);
  static _createWebKitPoint(num x, num y) native "WebKitPoint_constructor_Callback";
}

class _WebSocketFactoryProvider {
  static WebSocket createWebSocket(String url) => _createWebSocket(url);
  static _createWebSocket(String url) native "WebSocket_constructor_Callback";
}

class _TextFactoryProvider {
  static Text createText(String data) => document.$dom_createTextNode(data);
}
// Copyright (c) 2011, 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.

/**
 * Utils for device detection.
 */
class _Device {
  /**
   * Gets the browser's user agent. Using this function allows tests to inject
   * the user agent.
   * Returns the user agent.
   */
  static String get userAgent => window.navigator.userAgent;

  /**
   * Determines if the current device is running Opera.
   */
  static bool get isOpera => userAgent.contains("Opera", 0);

  /**
   * Determines if the current device is running Internet Explorer.
   */
  static bool get isIE => !isOpera && userAgent.contains("MSIE", 0);

  /**
   * Determines if the current device is running Firefox.
   */
  static bool get isFirefox => userAgent.contains("Firefox", 0);

  /**
   * Determines if the current device is running WebKit.
   */
  static bool get isWebKit => !isOpera && userAgent.contains("WebKit", 0);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

_serialize(var message) {
  return new _JsSerializer().traverse(message);
}

class _JsSerializer extends _Serializer {

  visitSendPortSync(SendPortSync x) {
    if (x is _JsSendPortSync) return visitJsSendPortSync(x);
    if (x is _LocalSendPortSync) return visitLocalSendPortSync(x);
    if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x);
    throw "Unknown port type $x";
  }

  visitJsSendPortSync(_JsSendPortSync x) {
    return [ 'sendport', 'nativejs', x._id ];
  }

  visitLocalSendPortSync(_LocalSendPortSync x) {
    return [ 'sendport', 'dart',
             ReceivePortSync._isolateId, x._receivePort._portId ];
  }

  visitRemoteSendPortSync(_RemoteSendPortSync x) {
    return [ 'sendport', 'dart',
             x._receivePort._isolateId, x._receivePort._portId ];
  }
}

_deserialize(var message) {
  return new _JsDeserializer().deserialize(message);
}


class _JsDeserializer extends _Deserializer {

  static const _UNSPECIFIED = const Object();

  deserializeSendPort(List x) {
    String tag = x[1];
    switch (tag) {
      case 'nativejs':
        num id = x[2];
        return new _JsSendPortSync(id);
      case 'dart':
        num isolateId = x[2];
        num portId = x[3];
        return ReceivePortSync._lookup(isolateId, portId);
      default:
        throw 'Illegal SendPortSync type: $tag';
    }
  }
}

// The receiver is JS.
class _JsSendPortSync implements SendPortSync {

  num _id;
  _JsSendPortSync(this._id);

  callSync(var message) {
    var serialized = _serialize(message);
    var result = _callPortSync(_id, serialized);
    return _deserialize(result);
  }

}

// TODO(vsm): Differentiate between Dart2Js and Dartium isolates.
// The receiver is a different Dart isolate, compiled to JS.
class _RemoteSendPortSync implements SendPortSync {

  int _isolateId;
  int _portId;
  _RemoteSendPortSync(this._isolateId, this._portId);

  callSync(var message) {
    var serialized = _serialize(message);
    var result = _call(_isolateId, _portId, serialized);
    return _deserialize(result);
  }

  static _call(int isolateId, int portId, var message) {
    var target = 'dart-port-$isolateId-$portId'; 
    // TODO(vsm): Make this re-entrant.
    // TODO(vsm): Set this up set once, on the first call.
    var source = '$target-result';
    var result = null;
    var listener = (Event e) {
      result = JSON.parse(_getPortSyncEventData(e));
    };
    window.on[source].add(listener);
    _dispatchEvent(target, [source, message]);
    window.on[source].remove(listener);
    return result;
  }
}

// The receiver is in the same Dart isolate, compiled to JS.
class _LocalSendPortSync implements SendPortSync {

  ReceivePortSync _receivePort;

  _LocalSendPortSync._internal(this._receivePort);

  callSync(var message) {
    // TODO(vsm): Do a more efficient deep copy.
    var copy = _deserialize(_serialize(message));
    var result = _receivePort._callback(copy);
    return _deserialize(_serialize(result));
  }
}

// TODO(vsm): Move this to dart:isolate.  This will take some
// refactoring as there are dependences here on the DOM.  Users
// interact with this class (or interface if we change it) directly -
// new ReceivePortSync.  I think most of the DOM logic could be
// delayed until the corresponding SendPort is registered on the
// window.

// A Dart ReceivePortSync (tagged 'dart' when serialized) is
// identifiable / resolvable by the combination of its isolateid and
// portid.  When a corresponding SendPort is used within the same
// isolate, the _portMap below can be used to obtain the
// ReceivePortSync directly.  Across isolates (or from JS), an
// EventListener can be used to communicate with the port indirectly.
class ReceivePortSync {

  static Map<int, ReceivePortSync> _portMap;
  static int _portIdCount;
  static int _cachedIsolateId;

  num _portId;
  Function _callback;
  EventListener _listener;

  ReceivePortSync() {
    if (_portIdCount == null) {
      _portIdCount = 0;
      _portMap = new Map<int, ReceivePortSync>();
    }
    _portId = _portIdCount++;
    _portMap[_portId] = this;
  }

  static int get _isolateId {
    // TODO(vsm): Make this coherent with existing isolate code.
    if (_cachedIsolateId == null) {
      _cachedIsolateId = _getNewIsolateId();      
    }
    return _cachedIsolateId;
  }

  static String _getListenerName(isolateId, portId) =>
      'dart-port-$isolateId-$portId'; 
  String get _listenerName => _getListenerName(_isolateId, _portId);

  void receive(callback(var message)) {
    _callback = callback;
    if (_listener == null) {
      _listener = (Event e) {
        var data = JSON.parse(_getPortSyncEventData(e));
        var replyTo = data[0];
        var message = _deserialize(data[1]);
        var result = _callback(message);
        _dispatchEvent(replyTo, _serialize(result));
      };
      window.on[_listenerName].add(_listener);
    }
  }

  void close() {
    _portMap.remove(_portId);
    if (_listener != null) window.on[_listenerName].remove(_listener);
  }

  SendPortSync toSendPort() {
    return new _LocalSendPortSync._internal(this);
  }

  static SendPortSync _lookup(int isolateId, int portId) {
    if (isolateId == _isolateId) {
      return _portMap[portId].toSendPort();
    } else {
      return new _RemoteSendPortSync(isolateId, portId);
    }
  }
}

get _isolateId => ReceivePortSync._isolateId;

void _dispatchEvent(String receiver, var message) {
  var event = new CustomEvent(receiver, false, false, JSON.stringify(message));
  window.$dom_dispatchEvent(event);
}

String _getPortSyncEventData(CustomEvent event) => event.detail;
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

typedef Object ComputeValue();

class _MeasurementRequest<T> {
  final ComputeValue computeValue;
  final Completer<T> completer;
  Object value;
  bool exception = false;
  _MeasurementRequest(this.computeValue, this.completer);
}

typedef void _MeasurementCallback();


/**
 * This class attempts to invoke a callback as soon as the current event stack
 * unwinds, but before the browser repaints.
 */
abstract class _MeasurementScheduler {
  bool _nextMeasurementFrameScheduled = false;
  _MeasurementCallback _callback;

  _MeasurementScheduler(this._callback);

  /**
   * Creates the best possible measurement scheduler for the current platform.
   */
  factory _MeasurementScheduler.best(_MeasurementCallback callback) {
    if (_isMutationObserverSupported()) {
      return new _MutationObserverScheduler(callback);
    }
    return new _PostMessageScheduler(callback);
  }

  /**
   * Schedules a measurement callback if one has not been scheduled already.
   */
  void maybeSchedule() {
    if (this._nextMeasurementFrameScheduled) {
      return;
    }
    this._nextMeasurementFrameScheduled = true;
    this._schedule();
  }

  /**
   * Does the actual scheduling of the callback.
   */
  void _schedule();

  /**
   * Handles the measurement callback and forwards it if necessary.
   */
  void _onCallback() {
    // Ignore spurious messages.
    if (!_nextMeasurementFrameScheduled) {
      return;
    }
    _nextMeasurementFrameScheduled = false;
    this._callback();
  }
}

/**
 * Scheduler which uses window.postMessage to schedule events.
 */
class _PostMessageScheduler extends _MeasurementScheduler {
  const _MEASUREMENT_MESSAGE = "DART-MEASURE";

  _PostMessageScheduler(_MeasurementCallback callback): super(callback) {
      // Messages from other windows do not cause a security risk as
      // all we care about is that _handleMessage is called
      // after the current event loop is unwound and calling the function is
      // a noop when zero requests are pending.
      window.on.message.add(this._handleMessage);
  }

  void _schedule() {
    window.postMessage(_MEASUREMENT_MESSAGE, "*");
  }

  _handleMessage(e) {
    this._onCallback();
  }
}

/**
 * Scheduler which uses a MutationObserver to schedule events.
 */
class _MutationObserverScheduler extends _MeasurementScheduler {
  MutationObserver _observer;
  Element _dummy;

  _MutationObserverScheduler(_MeasurementCallback callback): super(callback) {
    // Mutation events get fired as soon as the current event stack is unwound
    // so we just make a dummy event and listen for that.
    _observer = new MutationObserver(this._handleMutation);
    _dummy = new DivElement();
    _observer.observe(_dummy, attributes: true);
  }

  void _schedule() {
    // Toggle it to trigger the mutation event.
    _dummy.hidden = !_dummy.hidden;
  }

  _handleMutation(List<MutationRecord> mutations, MutationObserver observer) {
    this._onCallback();
  }
}


List<_MeasurementRequest> _pendingRequests;
List<TimeoutHandler> _pendingMeasurementFrameCallbacks;
_MeasurementScheduler _measurementScheduler = null;

void _maybeScheduleMeasurementFrame() {
  if (_measurementScheduler == null) {
    _measurementScheduler =
      new _MeasurementScheduler.best(_completeMeasurementFutures);
  }
  _measurementScheduler.maybeSchedule();
}

/**
 * Registers a [callback] which is called after the next batch of measurements
 * completes. Even if no measurements completed, the callback is triggered
 * when they would have completed to avoid confusing bugs if it happened that
 * no measurements were actually requested.
 */
void _addMeasurementFrameCallback(TimeoutHandler callback) {
  if (_pendingMeasurementFrameCallbacks == null) {
    _pendingMeasurementFrameCallbacks = <TimeoutHandler>[];
    _maybeScheduleMeasurementFrame();
  }
  _pendingMeasurementFrameCallbacks.add(callback);
}

/**
 * Returns a [Future] whose value will be the result of evaluating
 * [computeValue] during the next safe measurement interval.
 * The next safe measurement interval is after the current event loop has
 * unwound but before the browser has rendered the page.
 * It is important that the [computeValue] function only queries the html
 * layout and html in any way.
 */
Future _createMeasurementFuture(ComputeValue computeValue,
                                Completer completer) {
  if (_pendingRequests == null) {
    _pendingRequests = <_MeasurementRequest>[];
    _maybeScheduleMeasurementFrame();
  }
  _pendingRequests.add(new _MeasurementRequest(computeValue, completer));
  return completer.future;
}

/**
 * Complete all pending measurement futures evaluating them in a single batch
 * so that the the browser is guaranteed to avoid multiple layouts.
 */
void _completeMeasurementFutures() {
  // We must compute all new values before fulfilling the futures as
  // the onComplete callbacks for the futures could modify the DOM making
  // subsequent measurement calculations expensive to compute.
  if (_pendingRequests != null) {
    for (_MeasurementRequest request in _pendingRequests) {
      try {
        request.value = request.computeValue();
      } catch (e) {
        request.value = e;
        request.exception = true;
      }
    }
  }

  final completedRequests = _pendingRequests;
  final readyMeasurementFrameCallbacks = _pendingMeasurementFrameCallbacks;
  _pendingRequests = null;
  _pendingMeasurementFrameCallbacks = null;
  if (completedRequests != null) {
    for (_MeasurementRequest request in completedRequests) {
      if (request.exception) {
        request.completer.completeException(request.value);
      } else {
        request.completer.complete(request.value);
      }
    }
  }

  if (readyMeasurementFrameCallbacks != null) {
    for (TimeoutHandler handler in readyMeasurementFrameCallbacks) {
      // TODO(jacobr): wrap each call to a handler in a try-catch block.
      handler();
    }
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Patch file for the dart:isolate library.

/********************************************************
  Inserted from lib/isolate/serialization.dart
 ********************************************************/

class _MessageTraverserVisitedMap {

  operator[](var object) => null;
  void operator[]=(var object, var info) { }

  void reset() { }
  void cleanup() { }

}

/** Abstract visitor for dart objects that can be sent as isolate messages. */
class _MessageTraverser {

  _MessageTraverserVisitedMap _visited;
  _MessageTraverser() : _visited = new _MessageTraverserVisitedMap();

  /** Visitor's entry point. */
  traverse(var x) {
    if (isPrimitive(x)) return visitPrimitive(x);
    _visited.reset();
    var result;
    try {
      result = _dispatch(x);
    } finally {
      _visited.cleanup();
    }
    return result;
  }

  _dispatch(var x) {
    if (isPrimitive(x)) return visitPrimitive(x);
    if (x is List) return visitList(x);
    if (x is Map) return visitMap(x);
    if (x is SendPort) return visitSendPort(x);
    if (x is SendPortSync) return visitSendPortSync(x);

    // Overridable fallback.
    return visitObject(x);
  }

  abstract visitPrimitive(x);
  abstract visitList(List x);
  abstract visitMap(Map x);
  abstract visitSendPort(SendPort x);
  abstract visitSendPortSync(SendPortSync x);

  visitObject(Object x) {
    // TODO(floitsch): make this a real exception. (which one)?
    throw "Message serialization: Illegal value $x passed";
  }

  static bool isPrimitive(x) {
    return (x == null) || (x is String) || (x is num) || (x is bool);
  }
}


/** A visitor that recursively copies a message. */
class _Copier extends _MessageTraverser {

  visitPrimitive(x) => x;

  List visitList(List list) {
    List copy = _visited[list];
    if (copy != null) return copy;

    int len = list.length;

    // TODO(floitsch): we loose the generic type of the List.
    copy = new List(len);
    _visited[list] = copy;
    for (int i = 0; i < len; i++) {
      copy[i] = _dispatch(list[i]);
    }
    return copy;
  }

  Map visitMap(Map map) {
    Map copy = _visited[map];
    if (copy != null) return copy;

    // TODO(floitsch): we loose the generic type of the map.
    copy = new Map();
    _visited[map] = copy;
    map.forEach((key, val) {
      copy[_dispatch(key)] = _dispatch(val);
    });
    return copy;
  }

}

/** Visitor that serializes a message as a JSON array. */
class _Serializer extends _MessageTraverser {
  int _nextFreeRefId = 0;

  visitPrimitive(x) => x;

  visitList(List list) {
    int copyId = _visited[list];
    if (copyId != null) return ['ref', copyId];

    int id = _nextFreeRefId++;
    _visited[list] = id;
    var jsArray = _serializeList(list);
    // TODO(floitsch): we are losing the generic type.
    return ['list', id, jsArray];
  }

  visitMap(Map map) {
    int copyId = _visited[map];
    if (copyId != null) return ['ref', copyId];

    int id = _nextFreeRefId++;
    _visited[map] = id;
    var keys = _serializeList(map.keys);
    var values = _serializeList(map.values);
    // TODO(floitsch): we are losing the generic type.
    return ['map', id, keys, values];
  }

  _serializeList(List list) {
    int len = list.length;
    var result = new List(len);
    for (int i = 0; i < len; i++) {
      result[i] = _dispatch(list[i]);
    }
    return result;
  }
}

/** Deserializes arrays created with [_Serializer]. */
class _Deserializer {
  Map<int, dynamic> _deserialized;

  _Deserializer();

  static bool isPrimitive(x) {
    return (x == null) || (x is String) || (x is num) || (x is bool);
  }

  deserialize(x) {
    if (isPrimitive(x)) return x;
    // TODO(floitsch): this should be new HashMap<int, dynamic>()
    _deserialized = new HashMap();
    return _deserializeHelper(x);
  }

  _deserializeHelper(x) {
    if (isPrimitive(x)) return x;
    assert(x is List);
    switch (x[0]) {
      case 'ref': return _deserializeRef(x);
      case 'list': return _deserializeList(x);
      case 'map': return _deserializeMap(x);
      case 'sendport': return deserializeSendPort(x);
      default: return deserializeObject(x);
    }
  }

  _deserializeRef(List x) {
    int id = x[1];
    var result = _deserialized[id];
    assert(result != null);
    return result;
  }

  List _deserializeList(List x) {
    int id = x[1];
    // We rely on the fact that Dart-lists are directly mapped to Js-arrays.
    List dartList = x[2];
    _deserialized[id] = dartList;
    int len = dartList.length;
    for (int i = 0; i < len; i++) {
      dartList[i] = _deserializeHelper(dartList[i]);
    }
    return dartList;
  }

  Map _deserializeMap(List x) {
    Map result = new Map();
    int id = x[1];
    _deserialized[id] = result;
    List keys = x[2];
    List values = x[3];
    int len = keys.length;
    assert(len == values.length);
    for (int i = 0; i < len; i++) {
      var key = _deserializeHelper(keys[i]);
      var value = _deserializeHelper(values[i]);
      result[key] = value;
    }
    return result;
  }

  abstract deserializeSendPort(List x);

  deserializeObject(List x) {
    // TODO(floitsch): Use real exception (which one?).
    throw "Unexpected serialized object";
  }
}

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

/**
 * Checks to see if the mutation observer API is supported on the current
 * platform.
 */
bool _isMutationObserverSupported() {
  return true;
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// TODO(rnystrom): add a way to supress public classes from DartDoc output.
// TODO(jacobr): we can remove this class now that we are using the $dom_
// convention for deprecated methods rather than truly private methods.
/**
 * This class is intended for testing purposes only.
 */
class Testing {
  static void addEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
    target.$dom_addEventListener(type, listener, useCapture);
  }
  static void removeEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
    target.$dom_removeEventListener(type, listener, useCapture);
  }

}// Copyright (c) 2011, 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.

// Iterator for arrays with fixed size.
class _FixedSizeListIterator<T> extends _VariableSizeListIterator<T> {
  _FixedSizeListIterator(List<T> array)
      : super(array),
        _length = array.length;

  bool get hasNext => _length > _pos;

  final int _length;  // Cache array length for faster access.
}

// Iterator for arrays with variable size.
class _VariableSizeListIterator<T> implements Iterator<T> {
  _VariableSizeListIterator(List<T> array)
      : _array = array,
        _pos = 0;

  bool get hasNext => _array.length > _pos;

  T next() {
    if (!hasNext) {
      throw new StateError("No more elements");
    }
    return _array[_pos++];
  }

  final List<T> _array;
  int _pos;
}
// Copyright (c) 2011, 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.

class _Lists {

  /**
   * Returns the index in the array [a] of the given [element], starting
   * the search at index [startIndex] to [endIndex] (exclusive).
   * Returns -1 if [element] is not found.
   */
  static int indexOf(List a,
                     Object element,
                     int startIndex,
                     int endIndex) {
    if (startIndex >= a.length) {
      return -1;
    }
    if (startIndex < 0) {
      startIndex = 0;
    }
    for (int i = startIndex; i < endIndex; i++) {
      if (a[i] == element) {
        return i;
      }
    }
    return -1;
  }

  /**
   * Returns the last index in the array [a] of the given [element], starting
   * the search at index [startIndex] to 0.
   * Returns -1 if [element] is not found.
   */
  static int lastIndexOf(List a, Object element, int startIndex) {
    if (startIndex < 0) {
      return -1;
    }
    if (startIndex >= a.length) {
      startIndex = a.length - 1;
    }
    for (int i = startIndex; i >= 0; i--) {
      if (a[i] == element) {
        return i;
      }
    }
    return -1;
  }

  /**
   * Returns a sub list copy of this list, from [start] to
   * [:start + length:].
   * Returns an empty list if [length] is 0.
   * Throws an [ArgumentError] if [length] is negative.
   * Throws a [RangeError] if [start] or [:start + length:] are out of range.
   */
  static List getRange(List a, int start, int length, List accumulator) {
    if (length < 0) throw new ArgumentError('length');
    if (start < 0) throw new RangeError.value(start);
    int end = start + length;
    if (end > a.length) throw new RangeError.value(end);
    for (int i = start; i < end; i++) {
      accumulator.add(a[i]);
    }
    return accumulator;
  }
}
// Copyright (c) 2011, 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.

// This API is exploratory.
spawnDomFunction(Function topLevelFunction) => _Utils.spawnDomFunctionImpl(topLevelFunction);

// testRunner implementation.
// FIXME: provide a separate lib for testRunner.

var _testRunner;

TestRunner get testRunner {
  if (_testRunner == null)
    _testRunner = new TestRunner._(_NPObject.retrieve("testRunner"));
  return _testRunner;
}

class TestRunner {
  final _NPObject _npObject;

  TestRunner._(this._npObject);

  display() => _npObject.invoke('display');
  dumpAsText() => _npObject.invoke('dumpAsText');
  notifyDone() => _npObject.invoke('notifyDone');
  setCanOpenWindows() => _npObject.invoke('setCanOpenWindows');
  waitUntilDone() => _npObject.invoke('waitUntilDone');
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

class _Utils {
  static List convertToList(List list) {
    // FIXME: [possible optimization]: do not copy the array if Dart_IsArray is fine w/ it.
    final length = list.length;
    List result = new List(length);
    result.setRange(0, length, list);
    return result;
  }

  static List convertMapToList(Map map) {
    List result = [];
    map.forEach((k, v) => result.addAll([k, v]));
    return result;
  }

  static void populateMap(Map result, List list) {
    for (int i = 0; i < list.length; i += 2) {
      result[list[i]] = list[i + 1];
    }
  }

  static bool isMap(obj) => obj is Map;

  static Map createMap() => {};

  static makeUnimplementedError(String fileName, int lineNo) {
    return new UnsupportedError('[info: $fileName:$lineNo]');
  }

  static window() native "Utils_window";
  static print(String message) native "Utils_print";
  static SendPort spawnDomFunctionImpl(Function topLevelFunction) native "Utils_spawnDomFunction";
  static int _getNewIsolateId() native "Utils_getNewIsolateId";
  static bool shadowRootSupported(Document document) native "Utils_shadowRootSupported";
}

class _NPObject extends NativeFieldWrapperClass1 {
  _NPObject.internal();
  static _NPObject retrieve(String key) native "NPObject_retrieve";
  property(String propertyName) native "NPObject_property";
  invoke(String methodName, [List args = null]) native "NPObject_invoke";
}

class _DOMWindowCrossFrame extends NativeFieldWrapperClass1 implements Window {
  _DOMWindowCrossFrame.internal();

  // Fields.
  History get history() native "DOMWindow_history_cross_frame_Getter";
  Location get location() native "DOMWindow_location_cross_frame_Getter";
  bool get closed() native "DOMWindow_closed_Getter";
  int get length() native "DOMWindow_length_Getter";
  Window get opener() native "DOMWindow_opener_Getter";
  Window get parent() native "DOMWindow_parent_Getter";
  Window get top() native "DOMWindow_top_Getter";

  // Methods.
  void focus() native "DOMWindow_focus_Callback";
  void blur() native "DOMWindow_blur_Callback";
  void close() native "DOMWindow_close_Callback";
  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";

  // Implementation support.
  String get typeName => "DOMWindow";
}

class _HistoryCrossFrame extends NativeFieldWrapperClass1 implements History {
  _HistoryCrossFrame.internal();

  // Methods.
  void back() native "History_back_Callback";
  void forward() native "History_forward_Callback";
  void go(int distance) native "History_go_Callback";

  // Implementation support.
  String get typeName => "History";
}

class _LocationCrossFrame extends NativeFieldWrapperClass1 implements Location {
  _LocationCrossFrame.internal();

  // Fields.
  void set href(String) native "Location_href_Setter";

  // Implementation support.
  String get typeName => "Location";
}

class _DOMStringMap extends NativeFieldWrapperClass1 implements Map<String, String> {
  _DOMStringMap.internal();

  bool containsValue(String value) => Maps.containsValue(this, value);
  bool containsKey(String key) native "DOMStringMap_containsKey_Callback";
  String operator [](String key) native "DOMStringMap_item_Callback";
  void operator []=(String key, String value) native "DOMStringMap_setItem_Callback";
  String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
  String remove(String key) native "DOMStringMap_remove_Callback";
  void clear() => Maps.clear(this);
  void forEach(void f(String key, String value)) => Maps.forEach(this, f);
  Collection<String> get keys native "DOMStringMap_getKeys_Callback";
  Collection<String> get values => Maps.getValues(this);
  int get length => Maps.length(this);
  bool get isEmpty => Maps.isEmpty(this);
}

get _printClosure => (s) {
  try {
    window.console.log(s);
  } catch (_) {
    _Utils.print(s);
  }
};
