// Generated by dart2js, the Dart to JavaScript compiler.
// The code supports the following hooks:
// dartPrint(message)   - if this function is defined it is called
//                        instead of the Dart [print] method.
// dartMainRunner(main) - if this function is defined, the Dart [main]
//                        method will not be invoked directly.
//                        Instead, a closure that will invoke [main] is
//                        passed to [dartMainRunner].
function Isolate() {}
init();

var $ = Isolate.$isolateProperties;
var $$ = {};

// Classes
$$.ListIterable = {"": "IterableBase;",
  get$iterator: function(_) {
    return $.ListIterator$(this);
  },
  forEach$1: function(_, action) {
    var $length, i;
    $length = this.get$length(this);
    if (typeof $length !== "number")
      return this.forEach$1$bailout1(1, action, $length);
    for (i = 0; i < $length; ++i) {
      action.call$1(this.elementAt$1(this, i));
      if ($length !== this.get$length(this))
        throw $.wrapException($.ConcurrentModificationError$(this));
    }
  },
  forEach$1$bailout1: function(state0, action, $length) {
    var t1, i;
    for (t1 = $.getInterceptor($length), i = 0; $.JSNumber_methods.$lt(i, $length); ++i) {
      action.call$1(this.elementAt$1(this, i));
      if (t1.$eq($length, this.get$length(this)) !== true)
        throw $.wrapException($.ConcurrentModificationError$(this));
    }
  },
  get$isEmpty: function(_) {
    return $.$eq(this.get$length(this), 0);
  },
  skip$1: function(_, count) {
    return $.SubListIterable$(this, count, null);
  },
  toList$1$growable: function(_, growable) {
    var result, i, t1;
    if (growable === true) {
      result = $.List_List($);
      $.JSArray_methods.set$length(result, this.get$length(this));
    } else
      result = $.List_List(this.get$length(this));
    for (i = 0; $.JSNumber_methods.$lt(i, this.get$length(this)); ++i) {
      t1 = this.elementAt$1(this, i);
      if (i >= result.length)
        throw $.ioore(i);
      result[i] = t1;
    }
    return result;
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  $asIterable: function() {
    return null;
  }
};

$$.SubListIterable = {"": "ListIterable;_iterable,_start,_endOrLength",
  get$_endIndex: function() {
    var $length, t1;
    $length = $.get$length$asx(this._iterable);
    t1 = this._endOrLength;
    if (t1 == null || $.JSNull_methods.$gt(t1, $length))
      return $length;
    return t1;
  },
  get$_startIndex: function() {
    var $length, t1;
    $length = $.get$length$asx(this._iterable);
    t1 = this._start;
    if ($.JSNumber_methods.$gt(t1, $length))
      return $length;
    return t1;
  },
  get$length: function(_) {
    var $length, t1, t2;
    $length = $.get$length$asx(this._iterable);
    if (typeof $length !== "number")
      return this.get$length$bailout2(1, $length);
    t1 = this._start;
    if (t1 >= $length)
      return 0;
    t2 = this._endOrLength;
    if (t2 == null || $.JSNull_methods.$ge(t2, $length))
      return $length - t1;
    return $.JSNull_methods.$sub(t2, t1);
  },
  get$length$bailout2: function(state0, $length) {
    var t1, t2;
    t1 = this._start;
    if ($.JSNumber_methods.$ge(t1, $length))
      return 0;
    t2 = this._endOrLength;
    if (t2 == null || $.JSNull_methods.$ge(t2, $length))
      return $.$sub$n($length, t1);
    return $.JSNull_methods.$sub(t2, t1);
  },
  elementAt$1: function(_, index) {
    var t1, realIndex;
    if (typeof index !== "number")
      return this.elementAt$1$bailout2(1, index);
    t1 = this.get$_startIndex();
    if (typeof t1 !== "number")
      return this.elementAt$1$bailout2(2, index, t1);
    realIndex = t1 + index;
    if (!(index < 0)) {
      t1 = this.get$_endIndex();
      if (typeof t1 !== "number")
        return this.elementAt$1$bailout2(3, index, t1, realIndex);
      t1 = realIndex >= t1;
    } else
      t1 = true;
    if (t1)
      throw $.wrapException($.RangeError$range(index, 0, this.get$length(this)));
    return $.elementAt$1$ax(this._iterable, realIndex);
  },
  elementAt$1$bailout2: function(state0, index, t1, realIndex) {
    switch (state0) {
      case 0:
      case 1:
        state0 = 0;
        t1 = this.get$_startIndex();
      case 2:
        state0 = 0;
        realIndex = $.$add$ns(t1, index);
      case 3:
        if (state0 === 3 || state0 === 0 && !$.$lt$n(index, 0))
          switch (state0) {
            case 0:
              t1 = this.get$_endIndex();
            case 3:
              state0 = 0;
              t1 = $.$ge$n(realIndex, t1);
          }
        else
          t1 = true;
        if (t1)
          throw $.wrapException($.RangeError$range(index, 0, this.get$length(this)));
        return $.elementAt$1$ax(this._iterable, realIndex);
    }
  },
  skip$1: function(_, count) {
    if (count < 0)
      throw $.wrapException($.ArgumentError$(count));
    return $.SubListIterable$(this._iterable, this._start + count, this._endOrLength);
  },
  $asIterable: function() {
    return null;
  }
};

$$.ListIterator = {"": "Object;_iterable,_liblib$_length,_index,_liblib$_current",
  get$current: function() {
    return this._liblib$_current;
  },
  moveNext$0: function() {
    var t1, t2, t3;
    t1 = this._liblib$_length;
    t2 = this._iterable;
    if ($.$eq(t1, $.get$length$asx(t2)) !== true)
      throw $.wrapException($.ConcurrentModificationError$(t2));
    t3 = this._index;
    if (t3 === t1) {
      this._liblib$_current = null;
      return false;
    }
    this._liblib$_current = $.elementAt$1$ax(t2, t3);
    this._index = this._index + 1;
    return true;
  }
};

$$.MappedIterable = {"": "IterableBase;_iterable,_f",
  _f$1: function(arg0) {
    return this._f.call$1(arg0);
  },
  get$iterator: function(_) {
    var t1 = this._iterable;
    return $.MappedIterator$(t1.get$iterator(t1), this._f);
  },
  get$length: function(_) {
    var t1 = this._iterable;
    return t1.get$length(t1);
  },
  get$isEmpty: function(_) {
    var t1 = this._iterable;
    return t1.get$isEmpty(t1);
  },
  elementAt$1: function(_, index) {
    var t1 = this._iterable;
    return this._f$1(t1.elementAt$1(t1, index));
  },
  $asIterable: function() {
    return function (S, T) { return [T]; };
  }
};

$$.MappedIterator = {"": "Iterator;_liblib$_current,_iterator,_f",
  _f$1: function(arg0) {
    return this._f.call$1(arg0);
  },
  moveNext$0: function() {
    var t1 = this._iterator;
    if (t1.moveNext$0() === true) {
      this._liblib$_current = this._f$1(t1.get$current());
      return true;
    }
    this._liblib$_current = null;
    return false;
  },
  get$current: function() {
    return this._liblib$_current;
  }
};

$$.WhereIterable = {"": "IterableBase;_iterable,_f",
  get$iterator: function(_) {
    var t1 = this._iterable;
    return $.WhereIterator$(t1.get$iterator(t1), this._f);
  },
  $asIterable: function() {
    return null;
  }
};

$$.WhereIterator = {"": "Iterator;_iterator,_f",
  _f$1: function(arg0) {
    return this._f.call$1(arg0);
  },
  moveNext$0: function() {
    for (var t1 = this._iterator; t1.moveNext$0() === true;)
      if (this._f$1(t1.get$current()) === true)
        return true;
    return false;
  },
  get$current: function() {
    return this._iterator.get$current();
  }
};

$$.SkipIterable = {"": "IterableBase;_iterable,_skipCount",
  skip$1: function(_, n) {
    if (typeof n !== "number" || Math.floor(n) !== n || n < 0)
      throw $.wrapException($.ArgumentError$(n));
    return $.SkipIterable$(this._iterable, $.$add$ns(this._skipCount, n));
  },
  get$iterator: function(_) {
    return $.SkipIterator$($.get$iterator$ax(this._iterable), this._skipCount);
  },
  SkipIterable$2: function(_iterable, _skipCount) {
    var t1 = this._skipCount;
    if (typeof t1 !== "number" || Math.floor(t1) !== t1 || $.$lt$n(t1, 0))
      throw $.wrapException($.ArgumentError$(t1));
  },
  $asIterable: function() {
    return null;
  }
};

$$.SkipIterator = {"": "Iterator;_iterator,_skipCount",
  moveNext$0: function() {
    var t1, i, t2;
    t1 = this._iterator;
    i = 0;
    while (true) {
      t2 = this._skipCount;
      if (typeof t2 !== "number")
        return this.moveNext$0$bailout1(1, t1, i, t2);
      if (!(i < t2))
        break;
      t1.moveNext$0();
      ++i;
    }
    this._skipCount = 0;
    return t1.moveNext$0();
  },
  moveNext$0$bailout1: function(state0, t1, i, t2) {
    switch (state0) {
      case 0:
        t1 = this._iterator;
        i = 0;
      case 1:
        L0:
          while (true)
            switch (state0) {
              case 0:
                t2 = this._skipCount;
              case 1:
                state0 = 0;
                if (!$.JSNumber_methods.$lt(i, t2))
                  break L0;
                t1.moveNext$0();
                ++i;
            }
        this._skipCount = 0;
        return t1.moveNext$0();
    }
  },
  get$current: function() {
    return this._iterator.get$current();
  },
  SkipIterator$2: function(_iterator, _skipCount) {
  }
};

$$.ToString__emitPair_anon = {"": "Closure;box_0,result_1,visiting_2",
  call$2: function(k, v) {
    var t1, t2;
    t1 = this.box_0;
    if (!t1.first_0)
      this.result_1.write$1(", ");
    t1.first_0 = false;
    t1 = this.result_1;
    t2 = this.visiting_2;
    $.ToString__emitObject(k, t1, t2);
    t1.write$1(": ");
    $.ToString__emitObject(v, t1, t2);
  }
};

$$.HashMap_values_anon = {"": "Closure;this_0",
  call$1: function(each) {
    return $.$index$asx(this.this_0, each);
  }
};

$$.HashMap_addAll_anon = {"": "Closure;this_0",
  call$2: function(key, value) {
    $.$indexSet$ax(this.this_0, key, value);
  }
};

$$.HashMapKeyIterable = {"": "IterableBase;_map",
  get$length: function(_) {
    return this._map._liblib0$_length;
  },
  get$isEmpty: function(_) {
    return this._map._liblib0$_length === 0;
  },
  get$iterator: function(_) {
    var t1 = this._map;
    return $.HashMapKeyIterator$(t1, t1._computeKeys$0());
  },
  forEach$1: function(_, f) {
    var t1, keys, $length, i;
    t1 = this._map;
    keys = t1._computeKeys$0();
    for ($length = keys.length, i = 0; i < $length; ++i) {
      f.call$1(keys[i]);
      if (keys !== t1._keys)
        throw $.wrapException($.ConcurrentModificationError$(t1));
    }
  },
  $asIterable: function() {
    return null;
  }
};

$$.HashMapKeyIterator = {"": "Object;_map,_keys,_offset,_liblib0$_current",
  get$current: function() {
    return this._liblib0$_current;
  },
  moveNext$0: function() {
    var keys, offset, t1;
    keys = this._keys;
    offset = this._offset;
    t1 = this._map;
    if (keys !== t1._keys)
      throw $.wrapException($.ConcurrentModificationError$(t1));
    else if (offset >= keys.length) {
      this._liblib0$_current = null;
      return false;
    } else {
      this._liblib0$_current = keys[offset];
      this._offset = offset + 1;
      return true;
    }
  }
};

$$.LinkedHashMap_values_anon = {"": "Closure;this_0",
  call$1: function(each) {
    return $.$index$asx(this.this_0, each);
  }
};

$$.LinkedHashMap_addAll_anon = {"": "Closure;this_0",
  call$2: function(key, value) {
    $.$indexSet$ax(this.this_0, key, value);
  }
};

$$.LinkedHashMapCell = {"": "Object;_key<,_value@,_next@,_previous@"};

$$.LinkedHashMapKeyIterable = {"": "IterableBase;_map",
  get$length: function(_) {
    return this._map._liblib0$_length;
  },
  get$isEmpty: function(_) {
    return this._map._liblib0$_length === 0;
  },
  get$iterator: function(_) {
    var t1 = this._map;
    return $.LinkedHashMapKeyIterator$(t1, t1._modifications);
  },
  forEach$1: function(_, f) {
    var t1, cell, modifications;
    t1 = this._map;
    cell = t1._first;
    modifications = t1._modifications;
    for (; cell != null;) {
      f.call$1(cell.get$_key());
      if (modifications !== t1._modifications)
        throw $.wrapException($.ConcurrentModificationError$(t1));
      cell = cell.get$_next();
    }
  },
  $asIterable: function() {
    return null;
  }
};

$$.LinkedHashMapKeyIterator = {"": "Object;_map,_modifications,_cell,_liblib0$_current",
  get$current: function() {
    return this._liblib0$_current;
  },
  moveNext$0: function() {
    var t1 = this._map;
    if (this._modifications !== t1._modifications)
      throw $.wrapException($.ConcurrentModificationError$(t1));
    else {
      t1 = this._cell;
      if (t1 == null) {
        this._liblib0$_current = null;
        return false;
      } else {
        this._liblib0$_current = t1.get$_key();
        this._cell = this._cell.get$_next();
        return true;
      }
    }
  },
  LinkedHashMapKeyIterator$2: function(_map, _modifications) {
    this._cell = this._map._first;
  }
};

$$.LinkedHashSetCell = {"": "Object;_element<,_next@,_previous@"};

$$.LinkedHashSetIterator = {"": "Object;_set,_modifications,_cell,_liblib0$_current",
  get$current: function() {
    return this._liblib0$_current;
  },
  moveNext$0: function() {
    var t1 = this._set;
    if (this._modifications !== t1._modifications)
      throw $.wrapException($.ConcurrentModificationError$(t1));
    else {
      t1 = this._cell;
      if (t1 == null) {
        this._liblib0$_current = null;
        return false;
      } else {
        this._liblib0$_current = t1.get$_element();
        this._cell = this._cell.get$_next();
        return true;
      }
    }
  },
  LinkedHashSetIterator$2: function(_set, _modifications) {
    this._cell = this._set._first;
  }
};

$$.Function__toMangledNames_anon = {"": "Closure;result_0",
  call$2: function(symbol, value) {
    var t1 = this.result_0;
    t1.$indexSet(t1, symbol.get$_name(), value);
  }
};

$$.NoSuchMethodError_toString_anon = {"": "Closure;box_0",
  call$2: function(key, value) {
    var t1 = this.box_0;
    if ($.$gt$n(t1.i_1, 0))
      t1.sb_0.write$1(", ");
    t1.sb_0.write$1(key);
    t1.sb_0.write$1(": ");
    t1.sb_0.write$1($.Error_safeToString(value));
    t1.i_1 = $.$add$ns(t1.i_1, 1);
  }
};

$$.Interceptor = {"": "Object;",
  $eq: function(receiver, other) {
    return receiver === other;
  },
  get$hashCode: function(receiver) {
    return $.Primitives_objectHashCode(receiver);
  },
  toString$0: function(receiver) {
    return "Instance of '" + $.S($.Primitives_objectTypeName(receiver)) + "'";
  }
};

$$.JSFunction = {"": "Interceptor;",
  toString$0: function(receiver) {
    return "Closure";
  }
};

$$.JSBool = {"": "Interceptor;",
  toString$0: function(receiver) {
    return String(receiver);
  },
  get$hashCode: function(receiver) {
    return receiver ? 519018 : 218159;
  },
  $isbool: true
};

$$.JSNull = {"": "Interceptor;",
  $eq: function(receiver, other) {
    return null == other;
  },
  toString$0: function(receiver) {
    return "null";
  },
  get$hashCode: function(receiver) {
    return 0;
  }
};

$$.CloseToken = {"": "Object;", $isCloseToken: true};

$$.JsIsolateSink = {"": "EventSink;_isClosed,_port<",
  add$1: function(_, message) {
    $.send$1$x(this._port, message);
  },
  $eq: function(_, other) {
    if (other == null)
      return false;
    return typeof other === "object" && other !== null && !!$.getInterceptor(other).$isIsolateSink && $.$eq(this._port, other.get$_port()) === true;
  },
  get$hashCode: function(_) {
    return $.$add$ns($.get$hashCode$(this._port), 499);
  },
  $isJsIsolateSink: true,
  $asIsolateSink: null,
  $isIsolateSink: true
};

$$._Manager = {"": "Object;nextIsolateId@,currentManagerId,nextManagerId,currentContext<,rootContext,topEventLoop<,fromCommandLine,isWorker<,supportsWorkers,isolates,mainManager,managers",
  get$useWorkers: function() {
    return this.supportsWorkers;
  },
  get$needSerialization: function() {
    return this.get$useWorkers();
  },
  _nativeDetectEnvironment$0: function() {
    var t1, t2;
    t1 = $.get$globalWindow() == null;
    this.isWorker = t1 && $.get$globalPostMessageDefined() === true;
    if (this.isWorker !== true)
      t2 = $.get$globalWorker() != null && $.get$IsolateNatives_thisScript() != null;
    else
      t2 = true;
    this.supportsWorkers = t2;
    this.fromCommandLine = t1 && this.isWorker !== true;
  },
  _nativeInitWorkerMessageHandler$0: function() {
    var $function = function (e) { $.IsolateNatives__processWorkerMessage.call$2(this.mainManager, e); };
    $.get$globalThis().onmessage = $function;
    $.get$globalThis().dartPrint = function (object) {};
  },
  maybeCloseWorker$0: function() {
    if (this.isWorker === true) {
      var t1 = this.isolates;
      t1 = t1.get$isEmpty(t1) && this.topEventLoop.activeTimerCount === 0;
    } else
      t1 = false;
    if (t1) {
      t1 = this.mainManager;
      t1.postMessage$1(t1, $._serializeMessage($.makeLiteralMap(["command", "close"])));
    }
  },
  _Manager$0: function() {
    this._nativeDetectEnvironment$0();
    this.topEventLoop = $._EventLoop$();
    this.isolates = $.Map_Map();
    this.managers = $.Map_Map();
    if (this.isWorker === true) {
      this.mainManager = $._MainManagerStub$();
      this._nativeInitWorkerMessageHandler$0();
    }
  }
};

$$._IsolateContext = {"": "Object;id*,ports,isolateStatics",
  eval$1: function(code) {
    var old, result;
    old = $globalState.currentContext;
    $globalState.currentContext = this;
    $ = this.isolateStatics;
    result = null;
    try {
      result = code.call$0();
    } finally {
      $globalState.currentContext = old;
      if (old != null)
        old._setGlobals$0();
    }
    return result;
  },
  _setGlobals$0: function() {
    $ = this.isolateStatics;
  },
  lookup$1: function(portId) {
    var t1 = this.ports;
    return t1.$index(t1, portId);
  },
  register$2: function(_, portId, port) {
    var t1;
    if (this.ports.containsKey$1(portId) === true)
      throw $.wrapException($._ExceptionImplementation$("Registry: ports must be registered only once."));
    t1 = this.ports;
    t1.$indexSet(t1, portId, port);
    t1 = $globalState.isolates;
    t1.$indexSet(t1, this.id, this);
  },
  unregister$1: function(portId) {
    var t1 = this.ports;
    t1.remove$1(t1, portId);
    t1 = this.ports;
    if (t1.get$isEmpty(t1)) {
      t1 = $globalState.isolates;
      t1.remove$1(t1, this.id);
    }
  },
  _IsolateContext$0: function() {
    var t1, t2;
    t1 = $._globalState();
    t2 = t1.get$nextIsolateId();
    t1.set$nextIsolateId(t2 + 1);
    this.id = t2;
    this.ports = $.Map_Map();
    this.isolateStatics = new Isolate();
  }
};

$$._EventLoop = {"": "Object;events,activeTimerCount",
  enqueue$3: function(isolate, fn, msg) {
    this.events.addLast$1($._IsolateEvent$(isolate, fn, msg));
  },
  dequeue$0: function() {
    var t1 = this.events;
    if (t1.get$isEmpty(t1))
      return;
    return t1.removeFirst$0();
  },
  checkOpenReceivePortsFromCommandLine$0: function() {
    if ($globalState.rootContext != null)
      if ($globalState.isolates.containsKey$1($globalState.rootContext.id) === true)
        if ($globalState.fromCommandLine === true) {
          var t1 = $globalState.rootContext.ports;
          t1 = t1.get$isEmpty(t1);
        } else
          t1 = false;
      else
        t1 = false;
    else
      t1 = false;
    if (t1)
      throw $.wrapException($._ExceptionImplementation$("Program exited with open ReceivePorts."));
  },
  runIteration$0: function() {
    var $event = this.dequeue$0();
    if ($event == null) {
      this.checkOpenReceivePortsFromCommandLine$0();
      $globalState.maybeCloseWorker$0();
      return false;
    }
    $event.process$0();
    return true;
  },
  _runHelper$0: function() {
    if ($.get$globalWindow() != null)
      new $._EventLoop__runHelper_next(this).call$0();
    else
      for (; this.runIteration$0();)
        ;
  },
  run$0: function() {
    var e, trace, exception, t1;
    if ($globalState.isWorker !== true)
      this._runHelper$0();
    else
      try {
        this._runHelper$0();
      } catch (exception) {
        t1 = $.unwrapException(exception);
        e = t1;
        trace = $.getTraceFromException(exception);
        t1 = $globalState.mainManager;
        t1.postMessage$1(t1, $._serializeMessage($.makeLiteralMap(["command", "error", "msg", $.S(e) + "\n" + $.S(trace)])));
      }

  }
};

$$._EventLoop__runHelper_next = {"": "Closure;this_0",
  call$0: function() {
    if (!this.this_0.runIteration$0())
      return;
    $.Timer_run(this);
  }
};

$$._IsolateEvent = {"": "Object;isolate,fn,message",
  process$0: function() {
    this.isolate.eval$1(this.fn);
  }
};

$$._MainManagerStub = {"": "Object;",
  get$id: function(_) {
    return 0;
  },
  set$id: function(_, i) {
    throw $.wrapException($.UnimplementedError$(null));
  },
  postMessage$1: function(_, msg) {
    $.get$globalThis().postMessage(msg);
  },
  terminate$0: function(_) {
  }
};

$$.IsolateNatives__processWorkerMessage_anon = {"": "Closure;entryPoint_0,replyTo_1",
  call$0: function() {
    var t1, t2;
    t1 = this.entryPoint_0;
    t2 = this.replyTo_1;
    $.lazyPort = $.ReceivePortImpl$();
    $.send$2$x(t2, "spawned", $._Isolate_port().toSendPort$0());
    t1.call$0();
  }
};

$$._BaseSendPort = {"": "Object;_isolateId<",
  _checkReplyTo$1: function(replyTo) {
    if (replyTo != null && (typeof replyTo !== "object" || replyTo === null || !$.getInterceptor(replyTo).$is_NativeJsSendPort) && (typeof replyTo !== "object" || replyTo === null || !$.getInterceptor(replyTo).$is_WorkerSendPort) && true)
      throw $.wrapException($._ExceptionImplementation$("SendPort.send: Illegal replyTo port type"));
  },
  call$1: function(message) {
    var completer, port;
    completer = $._CompleterImpl$();
    port = $.ReceivePortImpl$();
    this.send$2(this, message, port.toSendPort$0());
    port.receive$1(new $._BaseSendPort_call_anon(completer, port));
    return completer.future;
  },
  $isSendPort: true
};

$$._BaseSendPort_call_anon = {"": "Closure;completer_0,port_1",
  call$2: function(value, ignoreReplyTo) {
    var t1 = this.port_1;
    t1.close$0(t1);
    t1 = this.completer_0;
    if (typeof value === "object" && value !== null && !!$.getInterceptor(value).$isException)
      t1.completeError$1(value);
    else
      t1.complete$1(t1, value);
  }
};

$$._NativeJsSendPort = {"": "_BaseSendPort;_receivePort<,_isolateId",
  send$2: function(_, message, replyTo) {
    $._waitForPendingPorts([message, replyTo], new $._NativeJsSendPort_send_anon(this, message, replyTo));
  },
  send$1: function($receiver, message) {
    return this.send$2($receiver, message, null);
  },
  $eq: function(_, other) {
    if (other == null)
      return false;
    return typeof other === "object" && other !== null && !!$.getInterceptor(other).$is_NativeJsSendPort && $.$eq(this._receivePort, other._receivePort) === true;
  },
  get$hashCode: function(_) {
    return this._receivePort.get$_id();
  },
  $is_NativeJsSendPort: true,
  $isSendPort: true
};

$$._NativeJsSendPort_send_anon = {"": "Closure;this_1,message_2,replyTo_3",
  call$0: function() {
    var t1, t2, t3, t4, isolate, shouldSerialize, msg;
    t1 = {};
    t2 = this.this_1;
    t3 = this.replyTo_3;
    t2._checkReplyTo$1(t3);
    t4 = $globalState.isolates;
    isolate = t4.$index(t4, t2.get$_isolateId());
    if (isolate == null)
      return;
    if (t2.get$_receivePort().get$_callback() == null)
      return;
    shouldSerialize = $globalState.currentContext != null && $.$eq($.get$id$x($globalState.currentContext), t2.get$_isolateId()) !== true;
    msg = this.message_2;
    t1.msg_0 = msg;
    t1.reply_1 = t3;
    if (shouldSerialize) {
      t1.msg_0 = $._serializeMessage(t1.msg_0);
      t1.reply_1 = $._serializeMessage(t1.reply_1);
    }
    $globalState.topEventLoop.enqueue$3(isolate, new $._NativeJsSendPort_send__anon(t1, t2, shouldSerialize), "receive " + $.S(msg));
  }
};

$$._NativeJsSendPort_send__anon = {"": "Closure;box_0,this_4,shouldSerialize_5",
  call$0: function() {
    var t1, t2;
    t1 = this.this_4;
    if (t1.get$_receivePort().get$_callback() != null) {
      if (this.shouldSerialize_5) {
        t2 = this.box_0;
        t2.msg_0 = $._deserializeMessage(t2.msg_0);
        t2.reply_1 = $._deserializeMessage(t2.reply_1);
      }
      t1 = t1.get$_receivePort();
      t2 = this.box_0;
      t1._callback$2(t2.msg_0, t2.reply_1);
    }
  }
};

$$._WorkerSendPort = {"": "_BaseSendPort;_workerId<,_receivePortId,_isolateId",
  send$2: function(_, message, replyTo) {
    $._waitForPendingPorts([message, replyTo], new $._WorkerSendPort_send_anon(this, message, replyTo));
  },
  send$1: function($receiver, message) {
    return this.send$2($receiver, message, null);
  },
  $eq: function(_, other) {
    var t1;
    if (other == null)
      return false;
    if (typeof other === "object" && other !== null && !!$.getInterceptor(other).$is_WorkerSendPort)
      t1 = $.$eq(this._workerId, other._workerId) === true && $.$eq(this._isolateId, other._isolateId) === true && $.$eq(this._receivePortId, other._receivePortId) === true;
    else
      t1 = false;
    return t1;
  },
  get$hashCode: function(_) {
    var t1, t2, t3;
    t1 = $.$shl$n(this._workerId, 16);
    t2 = $.$shl$n(this._isolateId, 8);
    t3 = this._receivePortId;
    if (typeof t3 !== "number")
      throw $.iae(t3);
    return (t1 ^ t2 ^ t3) >>> 0;
  },
  $is_WorkerSendPort: true,
  $isSendPort: true
};

$$._WorkerSendPort_send_anon = {"": "Closure;this_0,message_1,replyTo_2",
  call$0: function() {
    var t1, t2, workerMessage, manager;
    t1 = this.this_0;
    t2 = this.replyTo_2;
    t1._checkReplyTo$1(t2);
    workerMessage = $._serializeMessage($.makeLiteralMap(["command", "message", "port", t1, "msg", this.message_1, "replyTo", t2]));
    if ($globalState.isWorker === true) {
      t1 = $globalState.mainManager;
      t1.postMessage$1(t1, workerMessage);
    } else {
      t2 = $globalState.managers;
      manager = t2.$index(t2, t1.get$_workerId());
      if (manager != null)
        $.postMessage$1$x(manager, workerMessage);
    }
  }
};

$$.ReceivePortImpl = {"": "Object;_id<,_callback<",
  _callback$2: function(arg0, arg1) {
    return this._callback.call$2(arg0, arg1);
  },
  receive$1: function(onMessage) {
    this._callback = onMessage;
  },
  close$0: function(_) {
    this._callback = null;
    $globalState.currentContext.unregister$1(this._id);
  },
  toSendPort$0: function() {
    return $._NativeJsSendPort$(this, $.get$id$x($globalState.currentContext));
  },
  ReceivePortImpl$0: function() {
    $.register$2$x($._globalState().get$currentContext(), this._id, this);
  }
};

$$._waitForPendingPorts_anon = {"": "Closure;callback_0",
  call$1: function(_) {
    return this.callback_0.call$0();
  }
};

$$._PendingSendPortFinder = {"": "_MessageTraverser;ports,_visited",
  visitPrimitive$1: function(x) {
  },
  visitList$1: function(list) {
    var t1 = this._visited;
    if (t1.$index(t1, list) != null)
      return;
    t1 = this._visited;
    t1.$indexSet(t1, list, true);
    $.forEach$1$ax(list, new $._PendingSendPortFinder_visitList_anon(this));
  },
  visitMap$1: function(map) {
    var t1 = this._visited;
    if (t1.$index(t1, map) != null)
      return;
    t1 = this._visited;
    t1.$indexSet(t1, map, true);
    $.forEach$1$ax(map.get$values(map), new $._PendingSendPortFinder_visitMap_anon(this));
  },
  visitSendPort$1: function(port) {
    if (false)
      this.ports.push(port.get$_futurePort());
  },
  visitIsolateSink$1: function(sink) {
    var t1 = sink._port;
    if (false)
      this.ports.push(t1.get$_futurePort());
  },
  visitCloseToken$1: function(token) {
  },
  _PendingSendPortFinder$0: function() {
    this._visited = $._JsVisitedMap$();
  }
};

$$._PendingSendPortFinder_visitList_anon = {"": "Closure;this_0",
  call$1: function(e) {
    return this.this_0._dispatch$1(e);
  }
};

$$._PendingSendPortFinder_visitMap_anon = {"": "Closure;this_0",
  call$1: function(e) {
    return this.this_0._dispatch$1(e);
  }
};

$$._JsSerializer = {"": "_Serializer;_nextFreeRefId,_visited",
  visitSendPort$1: function(x) {
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$is_NativeJsSendPort)
      return ["sendport", $globalState.currentManagerId, x._isolateId, x._receivePort.get$_id()];
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$is_WorkerSendPort)
      return ["sendport", x._workerId, x._isolateId, x._receivePortId];
    throw $.wrapException("Illegal underlying port " + $.S(x));
  },
  visitIsolateSink$1: function(sink) {
    var isClosed = sink._isClosed;
    return ["isolateSink", this.visitSendPort$1(sink._port), isClosed];
  },
  visitCloseToken$1: function(token) {
    return ["closeToken"];
  },
  _JsSerializer$0: function() {
    this._visited = $._JsVisitedMap$();
  }
};

$$._JsCopier = {"": "_Copier;_visited",
  visitSendPort$1: function(x) {
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$is_NativeJsSendPort)
      return $._NativeJsSendPort$(x._receivePort, x._isolateId);
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$is_WorkerSendPort)
      return $._WorkerSendPort$(x._workerId, x._isolateId, x._receivePortId);
    throw $.wrapException("Illegal underlying port " + $.S(this.get$p()));
  },
  visitIsolateSink$1: function(sink) {
    var isClosed, result;
    isClosed = sink._isClosed;
    result = $.JsIsolateSink$fromPort(this.visitSendPort$1(sink._port));
    result._isClosed = isClosed;
    return result;
  },
  visitCloseToken$1: function(token) {
    return token;
  },
  _JsCopier$0: function() {
    this._visited = $._JsVisitedMap$();
  }
};

$$._JsDeserializer = {"": "_Deserializer;_deserialized",
  deserializeSendPort$1: function(list) {
    var t1, managerId, isolateId, receivePortId, isolate, receivePort;
    t1 = $.getInterceptor$asx(list);
    managerId = t1.$index(list, 1);
    isolateId = t1.$index(list, 2);
    receivePortId = t1.$index(list, 3);
    if ($.$eq(managerId, $globalState.currentManagerId) === true) {
      t1 = $globalState.isolates;
      isolate = t1.$index(t1, isolateId);
      if (isolate == null)
        return;
      receivePort = isolate.lookup$1(receivePortId);
      if (receivePort == null)
        return;
      return $._NativeJsSendPort$(receivePort, isolateId);
    } else
      return $._WorkerSendPort$(managerId, isolateId, receivePortId);
  },
  deserializeIsolateSink$1: function(list) {
    var t1, port, isClosed, result;
    t1 = $.getInterceptor$asx(list);
    port = this.deserializeSendPort$1(t1.$index(list, 1));
    isClosed = t1.$index(list, 2);
    result = $.JsIsolateSink$fromPort(port);
    result._isClosed = isClosed;
    return result;
  },
  deserializeCloseToken$1: function(list) {
    return $.C_CloseToken;
  }
};

$$._JsVisitedMap = {"": "Object;tagged",
  $index: function(_, object) {
    return object.__MessageTraverser__attached_info__;
  },
  $indexSet: function(_, object, info) {
    $.add$1$ax(this.tagged, object);
    object.__MessageTraverser__attached_info__ = info;
  },
  reset$0: function(_) {
    this.tagged = $.List_List($);
  },
  cleanup$0: function() {
    var $length, i;
    for ($length = $.get$length$asx(this.tagged), i = 0; i < $length; ++i)
      $.$index$asx(this.tagged, i).__MessageTraverser__attached_info__ = null;
    this.tagged = null;
  }
};

$$._MessageTraverserVisitedMap = {"": "Object;",
  $index: function(_, object) {
    return;
  },
  $indexSet: function(_, object, info) {
  },
  reset$0: function(_) {
  },
  cleanup$0: function() {
  }
};

$$._MessageTraverser = {"": "Object;",
  traverse$1: function(x) {
    var result, t1;
    t1 = x;
    if (t1 == null || typeof t1 === "string" || typeof t1 === "number" || typeof t1 === "boolean")
      return this.visitPrimitive$1(x);
    t1 = this._visited;
    t1.reset$0(t1);
    result = null;
    try {
      result = this._dispatch$1(x);
    } finally {
      this._visited.cleanup$0();
    }
    return result;
  },
  _dispatch$1: function(x) {
    if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
      return this.visitPrimitive$1(x);
    if (typeof x === "object" && x !== null && (x.constructor === Array || $.getInterceptor(x).$isList()))
      return this.visitList$1(x);
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$isMap)
      return this.visitMap$1(x);
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$isSendPort)
      return this.visitSendPort$1(x);
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$isJsIsolateSink)
      return this.visitIsolateSink$1(x);
    if (typeof x === "object" && x !== null && !!$.getInterceptor(x).$isCloseToken)
      return this.visitCloseToken$1(x);
    $.throwExpression("Message serialization: Illegal value " + $.S(x) + " passed");
    return;
  }
};

$$._Copier = {"": "_MessageTraverser;",
  visitPrimitive$1: function(x) {
    return x;
  },
  visitList$1: function(list) {
    var t1, copy, len, i;
    if (typeof list !== "string" && (typeof list !== "object" || list === null || list.constructor !== Array && !$.getInterceptor(list).$isJavaScriptIndexingBehavior()))
      return this.visitList$1$bailout1(1, list);
    t1 = this._visited;
    copy = t1.$index(t1, list);
    if (copy != null)
      return copy;
    len = list.length;
    copy = $.List_List(len);
    t1 = this._visited;
    t1.$indexSet(t1, list, copy);
    for (i = 0; i < len; ++i) {
      if (i >= list.length)
        throw $.ioore(i);
      copy[i] = this._dispatch$1(list[i]);
    }
    return copy;
  },
  visitList$1$bailout1: function(state0, list) {
    var t1, copy, len, t2, i, t3;
    t1 = this._visited;
    copy = t1.$index(t1, list);
    if (copy != null)
      return copy;
    t1 = $.getInterceptor$asx(list);
    len = t1.get$length(list);
    copy = $.List_List(len);
    t2 = this._visited;
    t2.$indexSet(t2, list, copy);
    for (t2 = copy.length, i = 0; $.JSNumber_methods.$lt(i, len); ++i) {
      t3 = this._dispatch$1(t1.$index(list, i));
      if (i >= t2)
        throw $.ioore(i);
      copy[i] = t3;
    }
    return copy;
  },
  visitMap$1: function(map) {
    var t1, t2;
    t1 = {};
    t2 = this._visited;
    t1.copy_0 = t2.$index(t2, map);
    t2 = t1.copy_0;
    if (t2 != null)
      return t2;
    t1.copy_0 = $.HashMap$();
    t2 = this._visited;
    t2.$indexSet(t2, map, t1.copy_0);
    map.forEach$1(map, new $._Copier_visitMap_anon(t1, this));
    return t1.copy_0;
  }
};

$$._Copier_visitMap_anon = {"": "Closure;box_0,this_1",
  call$2: function(key, val) {
    var t1, t2;
    t1 = this.box_0.copy_0;
    t2 = this.this_1;
    $.$indexSet$ax(t1, t2._dispatch$1(key), t2._dispatch$1(val));
  }
};

$$._Serializer = {"": "_MessageTraverser;",
  visitPrimitive$1: function(x) {
    return x;
  },
  visitList$1: function(list) {
    var t1, copyId, id;
    t1 = this._visited;
    copyId = t1.$index(t1, list);
    if (copyId != null)
      return ["ref", copyId];
    id = this._nextFreeRefId;
    this._nextFreeRefId = id + 1;
    t1 = this._visited;
    t1.$indexSet(t1, list, id);
    return ["list", id, this._serializeList$1(list)];
  },
  visitMap$1: function(map) {
    var t1, copyId, id;
    t1 = this._visited;
    copyId = t1.$index(t1, map);
    if (copyId != null)
      return ["ref", copyId];
    id = this._nextFreeRefId;
    this._nextFreeRefId = id + 1;
    t1 = this._visited;
    t1.$indexSet(t1, map, id);
    return ["map", id, this._serializeList$1($.toList$0$ax(map.get$keys())), this._serializeList$1($.toList$0$ax(map.get$values(map)))];
  },
  _serializeList$1: function(list) {
    var len, result, i;
    if (typeof list !== "string" && (typeof list !== "object" || list === null || list.constructor !== Array && !$.getInterceptor(list).$isJavaScriptIndexingBehavior()))
      return this._serializeList$1$bailout(1, list);
    len = list.length;
    result = $.List_List(len);
    for (i = 0; i < len; ++i) {
      if (i >= list.length)
        throw $.ioore(i);
      result[i] = this._dispatch$1(list[i]);
    }
    return result;
  },
  _serializeList$1$bailout: function(state0, list) {
    var t1, len, result, t2, i, t3;
    t1 = $.getInterceptor$asx(list);
    len = t1.get$length(list);
    result = $.List_List(len);
    for (t2 = result.length, i = 0; $.JSNumber_methods.$lt(i, len); ++i) {
      t3 = this._dispatch$1(t1.$index(list, i));
      if (i >= t2)
        throw $.ioore(i);
      result[i] = t3;
    }
    return result;
  }
};

$$._Deserializer = {"": "Object;",
  deserialize$1: function(x) {
    if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
      return x;
    this._deserialized = $.HashMap$();
    return this._deserializeHelper$1(x);
  },
  _deserializeHelper$1: function(x) {
    var t1, id;
    t1 = $.getInterceptor(x);
    if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
      return x;
    switch (t1.$index(x, 0)) {
      case "ref":
        id = t1.$index(x, 1);
        t1 = this._deserialized;
        return t1.$index(t1, id);
      case "list":
        return this._deserializeList$1(x);
      case "map":
        return this._deserializeMap$1(x);
      case "sendport":
        return this.deserializeSendPort$1(x);
      case "isolateSink":
        return this.deserializeIsolateSink$1(x);
      case "closeToken":
        return this.deserializeCloseToken$1(x);
      default:
        $.throwExpression("Unexpected serialized object");
        return;
    }
  },
  _deserializeList$1: function(x) {
    var t1, id, dartList, t2, len, i;
    t1 = $.getInterceptor$asx(x);
    id = t1.$index(x, 1);
    dartList = t1.$index(x, 2);
    if (typeof dartList !== "object" || dartList === null || (dartList.constructor !== Array || !!dartList.immutable$list) && !$.getInterceptor(dartList).$isJavaScriptIndexingBehavior())
      return this._deserializeList$1$bailout(1, dartList, id);
    t2 = this._deserialized;
    t2.$indexSet(t2, id, dartList);
    len = dartList.length;
    for (i = 0; i < len; ++i) {
      if (i >= dartList.length)
        throw $.ioore(i);
      t1 = this._deserializeHelper$1(dartList[i]);
      if (i >= dartList.length)
        throw $.ioore(i);
      dartList[i] = t1;
    }
    return dartList;
  },
  _deserializeList$1$bailout: function(state0, dartList, id) {
    var t2, len, i;
    t2 = this._deserialized;
    t2.$indexSet(t2, id, dartList);
    t2 = $.getInterceptor$asx(dartList);
    len = t2.get$length(dartList);
    for (i = 0; $.JSNumber_methods.$lt(i, len); ++i)
      t2.$indexSet(dartList, i, this._deserializeHelper$1(t2.$index(dartList, i)));
    return dartList;
  },
  _deserializeMap$1: function(x) {
    var result, t1, id, t2, keys, values, len, i, key;
    result = $.HashMap$();
    t1 = $.getInterceptor$asx(x);
    id = t1.$index(x, 1);
    t2 = this._deserialized;
    t2.$indexSet(t2, id, result);
    keys = t1.$index(x, 2);
    if (typeof keys !== "string" && (typeof keys !== "object" || keys === null || keys.constructor !== Array && !$.getInterceptor(keys).$isJavaScriptIndexingBehavior()))
      return this._deserializeMap$1$bailout(1, x, result, keys, t1);
    values = t1.$index(x, 3);
    if (typeof values !== "string" && (typeof values !== "object" || values === null || values.constructor !== Array && !$.getInterceptor(values).$isJavaScriptIndexingBehavior()))
      return this._deserializeMap$1$bailout(2, 0, result, keys, 0, values);
    len = keys.length;
    for (i = 0; i < len; ++i) {
      if (i >= keys.length)
        throw $.ioore(i);
      key = this._deserializeHelper$1(keys[i]);
      if (i >= values.length)
        throw $.ioore(i);
      result.$indexSet(result, key, this._deserializeHelper$1(values[i]));
    }
    return result;
  },
  _deserializeMap$1$bailout: function(state0, x, result, keys, t1, values) {
    switch (state0) {
      case 0:
        result = $.HashMap$();
        t1 = $.getInterceptor$asx(x);
        id = t1.$index(x, 1);
        t2 = this._deserialized;
        t2.$indexSet(t2, id, result);
        keys = t1.$index(x, 2);
      case 1:
        state0 = 0;
        values = t1.$index(x, 3);
      case 2:
        var id, t2, t3, len, i;
        state0 = 0;
        t3 = $.getInterceptor$asx(keys);
        len = t3.get$length(keys);
        for (t1 = $.getInterceptor$asx(values), i = 0; $.JSNumber_methods.$lt(i, len); ++i)
          result.$indexSet(result, this._deserializeHelper$1(t3.$index(keys, i)), this._deserializeHelper$1(t1.$index(values, i)));
        return result;
    }
  }
};

$$.TimerImpl = {"": "Object;_once,_inEventLoop,_handle?",
  cancel$0: function() {
    if ($.get$globalThis().setTimeout != null) {
      if (this._inEventLoop)
        throw $.wrapException($.UnsupportedError$("Timer in event loop cannot be canceled."));
      if (this._handle == null)
        return;
      var t1 = $globalState.topEventLoop;
      t1.activeTimerCount = t1.activeTimerCount - 1;
      if (this._once)
        $.get$globalThis().clearTimeout(this._handle);
      else
        $.get$globalThis().clearInterval(this._handle);
      this._handle = null;
    } else
      throw $.wrapException($.UnsupportedError$("Canceling a timer."));
  },
  TimerImpl$2: function(milliseconds, callback) {
    var t1;
    if (milliseconds === 0)
      t1 = $.hasTimer() !== true || $._globalState().get$isWorker() === true;
    else
      t1 = false;
    if (t1) {
      $._globalState().get$topEventLoop().enqueue$3($._globalState().get$currentContext(), callback, "timer");
      this._inEventLoop = true;
    } else if ($.hasTimer() === true) {
      t1 = $._globalState().get$topEventLoop();
      t1.activeTimerCount = t1.activeTimerCount + 1;
      t1 = new $.internalCallback(this, callback);
      this._handle = $.get$globalThis().setTimeout($.convertDartClosureToJS(t1, 0), milliseconds);
    } else
      throw $.wrapException($.UnsupportedError$("Timer greater than 0."));
  },
  TimerImpl$periodic$2: function(milliseconds, callback) {
    var t1;
    if ($.hasTimer() === true) {
      t1 = $._globalState().get$topEventLoop();
      t1.activeTimerCount = t1.activeTimerCount + 1;
      this._handle = $.get$globalThis().setInterval($.convertDartClosureToJS(new $.anon(this, callback), 0), milliseconds);
    } else
      throw $.wrapException($.UnsupportedError$("Periodic timer."));
  }
};

$$.internalCallback = {"": "Closure;this_0,callback_1",
  call$0: function() {
    this.callback_1.call$0();
    this.this_0.set$_handle(null);
    var t1 = $globalState.topEventLoop;
    t1.activeTimerCount = t1.activeTimerCount - 1;
  }
};

$$.anon = {"": "Closure;this_0,callback_1",
  call$0: function() {
    this.callback_1.call$1(this.this_0);
  }
};

$$.JSArray = {"": "Interceptor;",
  add$1: function(receiver, value) {
    if (!!receiver.fixed$length)
      $.throwExpression($.UnsupportedError$("add"));
    receiver.push(value);
  },
  removeLast$0: function(receiver) {
    if (!!receiver.fixed$length)
      $.throwExpression($.UnsupportedError$("removeLast"));
    if (receiver.length === 0)
      throw $.wrapException($.RangeError$value(-1));
    return receiver.pop();
  },
  remove$1: function(receiver, element) {
    var i;
    if (!!receiver.fixed$length)
      $.throwExpression($.UnsupportedError$("remove"));
    for (i = 0; i < receiver.length; ++i) {
      if (i >= receiver.length || false)
        $.throwExpression($.RangeError$value(i));
      if ($.$eq(receiver[i], element) === true) {
        receiver.splice(i, 1);
        return;
      }
    }
  },
  addAll$1: function(receiver, collection) {
    var t1, t2;
    for (t1 = $.get$iterator$ax(collection); t1.moveNext$0() === true;) {
      t2 = t1.get$current();
      if (!!receiver.fixed$length)
        $.throwExpression($.UnsupportedError$("add"));
      receiver.push(t2);
    }
  },
  forEach$1: function(receiver, f) {
    var t1;
    for (t1 = this.get$iterator(receiver); t1.moveNext$0();)
      f.call$1(t1.get$current());
    return;
  },
  join$1: function(receiver, separator) {
    var t1, list, i, t2;
    t1 = receiver.length;
    list = $.List_List(t1);
    for (i = 0; i < receiver.length; ++i) {
      if (i >= receiver.length || false)
        $.throwExpression($.RangeError$value(i));
      t2 = $.S(receiver[i]);
      if (i >= t1)
        throw $.ioore(i);
      list[i] = t2;
    }
    return list.join(separator);
  },
  skip$1: function(receiver, n) {
    return $.SubListIterable$(receiver, n, null);
  },
  fold$2: function(receiver, initialValue, combine) {
    var t1;
    for (t1 = this.get$iterator(receiver); t1.moveNext$0();)
      initialValue = combine.call$2(initialValue, t1.get$current());
    return initialValue;
  },
  elementAt$1: function(receiver, index) {
    var t1;
    if (typeof index !== "number" || Math.floor(index) !== index)
      $.throwExpression($.ArgumentError$(index));
    t1 = $.getInterceptor$n(index);
    if (t1.$ge(index, receiver.length) || t1.$lt(index, 0))
      $.throwExpression($.RangeError$value(index));
    return receiver[index];
  },
  sublist$2: function(receiver, start, end) {
    if (typeof end !== "number")
      return this.sublist$2$bailout(1, start, end, receiver);
    if (start == null)
      $.throwExpression($.ArgumentError$(null));
    if (typeof start !== "number" || Math.floor(start) !== start)
      throw $.wrapException($.ArgumentError$(start));
    if (start < 0 || start > receiver.length)
      throw $.wrapException($.RangeError$range(start, 0, receiver.length));
    if (typeof end !== "number" || Math.floor(end) !== end)
      throw $.wrapException($.ArgumentError$(end));
    if (end < start || end > receiver.length)
      throw $.wrapException($.RangeError$range(end, start, receiver.length));
    if (start === end)
      return [];
    return receiver.slice(start, end);
  },
  sublist$2$bailout: function(state0, start, end, receiver) {
    if (start == null)
      $.throwExpression($.ArgumentError$(null));
    if (typeof start !== "number" || Math.floor(start) !== start)
      throw $.wrapException($.ArgumentError$(start));
    if (start < 0 || start > receiver.length)
      throw $.wrapException($.RangeError$range(start, 0, receiver.length));
    if (end == null)
      end = receiver.length;
    else {
      if (typeof end !== "number" || Math.floor(end) !== end)
        throw $.wrapException($.ArgumentError$(end));
      if (end < start || end > receiver.length)
        throw $.wrapException($.RangeError$range(end, start, receiver.length));
    }
    if (start === end)
      return [];
    return receiver.slice(start, end);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  get$first: function(receiver) {
    if (receiver.length > 0)
      return receiver[0];
    throw $.wrapException($.StateError$("No elements"));
  },
  get$last: function(receiver) {
    var t1 = receiver.length;
    if (t1 > 0)
      return receiver[t1 - 1];
    throw $.wrapException($.StateError$("No elements"));
  },
  setRange$4: function(receiver, start, end, iterable, skipCount) {
    if (!!receiver.immutable$list)
      $.throwExpression($.UnsupportedError$("set range"));
    $.IterableMixinWorkaround_setRangeList(receiver, start, end, iterable, skipCount);
  },
  get$isEmpty: function(receiver) {
    return receiver.length === 0;
  },
  toString$0: function(receiver) {
    var result = $.StringBuffer$("");
    $.ToString__emitValue(receiver, result, $.List_List($));
    return result.toString$0(result);
  },
  toList$1$growable: function(receiver, growable) {
    return $.List_List$from(receiver, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$iterator: function(receiver) {
    return $.ListIterator$(receiver);
  },
  get$hashCode: function(receiver) {
    return $.Primitives_objectHashCode(receiver);
  },
  get$length: function(receiver) {
    return receiver.length;
  },
  set$length: function(receiver, newLength) {
    if (typeof newLength !== "number" || Math.floor(newLength) !== newLength)
      throw $.wrapException($.ArgumentError$(newLength));
    if (newLength < 0)
      throw $.wrapException($.RangeError$value(newLength));
    $.checkGrowable(receiver, "set length");
    receiver.length = newLength;
  },
  $index: function(receiver, index) {
    if (typeof index !== "number" || Math.floor(index) !== index)
      throw $.wrapException($.ArgumentError$(index));
    if (index >= receiver.length || index < 0)
      throw $.wrapException($.RangeError$value(index));
    return receiver[index];
  },
  $indexSet: function(receiver, index, value) {
    if (!!receiver.immutable$list)
      $.throwExpression($.UnsupportedError$("indexed set"));
    if (typeof index !== "number" || Math.floor(index) !== index)
      throw $.wrapException($.ArgumentError$(index));
    if (index >= receiver.length || index < 0)
      throw $.wrapException($.RangeError$value(index));
    receiver[index] = value;
  },
  $asList: function() {
    return null;
  },
  $asIterable: function() {
    return null;
  },
  $isList: function() {
    return true;
  },
  $isIterable: function() {
    return true;
  }
};

$$.JSMutableArray = {"": "JSArray;",
  $asList: function() {
    return function () { return [null]; };
  },
  $asIterable: function() {
    return function () { return [null]; };
  }
};

$$.JSFixedArray = {"": "JSMutableArray;"};

$$.JSExtendableArray = {"": "JSMutableArray;"};

$$.Primitives_applyFunction_anon = {"": "Closure;namedArguments_0,buffer_1,arguments_2",
  call$1: function($name) {
    var t1, t2;
    this.buffer_1.write$1("$" + $.S($name));
    t1 = this.arguments_2;
    t2 = this.namedArguments_0;
    t1.push(t2.$index(t2, $name));
  }
};

$$.DartError = {"": "Object;",
  get$stack: function() {
    return this.stack;
  },
  toString$0: function(_) {
    var dartException = this.dartException;
    if (!!Error.captureStackTrace || this.get$stack() == null)
      return $.toString$0(dartException);
    else
      return $.S(dartException) + "\n" + $.S(this.get$stack());
  },
  DartError$1: function(dartException) {
    this.dartException = dartException;
    this.toString = $.DartError_toStringWrapper.call$0;
  }
};

$$._StackTrace = {"": "Object;_stack",
  toString$0: function(_) {
    var t1 = this._stack;
    return t1 != null ? t1 : "";
  }
};

$$.invokeClosure_anon = {"": "Closure;closure_0",
  call$0: function() {
    return this.closure_0.call$0();
  }
};

$$.invokeClosure_anon0 = {"": "Closure;closure_1,arg1_2",
  call$0: function() {
    return this.closure_1.call$1(this.arg1_2);
  }
};

$$.invokeClosure_anon1 = {"": "Closure;closure_3,arg1_4,arg2_5",
  call$0: function() {
    return this.closure_3.call$2(this.arg1_4, this.arg2_5);
  }
};

$$.Closure = {"": "Object;",
  toString$0: function(_) {
    return "Closure";
  }
};

$$.Null = {"": "Object;"};

$$.JSNumber = {"": "Interceptor;",
  get$isNaN: function(receiver) {
    return isNaN(receiver);
  },
  get$isInfinite: function(receiver) {
    return receiver == Infinity || receiver == -Infinity;
  },
  remainder$1: function(receiver, b) {
    return receiver % b;
  },
  abs$0: function(receiver) {
    return Math.abs(receiver);
  },
  toInt$0: function(receiver) {
    var truncated;
    if (this.get$isNaN(receiver))
      throw $.wrapException($.UnsupportedError$("NaN"));
    if (this.get$isInfinite(receiver))
      throw $.wrapException($.UnsupportedError$("Infinity"));
    truncated = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
    return truncated == -0.0 ? 0 : truncated;
  },
  truncate$0: function(receiver) {
    var truncated;
    if (this.get$isNaN(receiver))
      $.throwExpression($.UnsupportedError$("NaN"));
    if (this.get$isInfinite(receiver))
      $.throwExpression($.UnsupportedError$("Infinity"));
    truncated = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
    return truncated == -0.0 ? 0 : truncated;
  },
  ceil$0: function(receiver) {
    return this.toInt$0(Math.ceil(receiver));
  },
  floor$0: function(receiver) {
    return this.toInt$0(Math.floor(receiver));
  },
  round$0: function(receiver) {
    return this.toInt$0(this.roundToDouble$0(receiver));
  },
  roundToDouble$0: function(receiver) {
    if (receiver < 0)
      return -Math.round(-receiver);
    else
      return Math.round(receiver);
  },
  toString$0: function(receiver) {
    if (receiver === 0 && 1 / receiver < 0)
      return "-0.0";
    else
      return "" + receiver;
  },
  get$hashCode: function(receiver) {
    return receiver & 0x1FFFFFFF;
  },
  $add: function(receiver, other) {
    if (typeof other !== "number")
      throw $.wrapException($.ArgumentError$(other));
    return receiver + other;
  },
  $sub: function(receiver, other) {
    if (typeof other !== "number")
      throw $.wrapException($.ArgumentError$(other));
    return receiver - other;
  },
  $div: function(receiver, other) {
    if (typeof other !== "number")
      throw $.wrapException($.ArgumentError$(other));
    return receiver / other;
  },
  $mul: function(receiver, other) {
    return receiver * other;
  },
  $tdiv: function(receiver, other) {
    return this.truncate$0(receiver / other);
  },
  $shl: function(receiver, other) {
    if (other < 0)
      throw $.wrapException($.ArgumentError$(other));
    if (other > 31)
      return 0;
    return receiver << other >>> 0;
  },
  $and: function(receiver, other) {
    return (receiver & other) >>> 0;
  },
  $lt: function(receiver, other) {
    if (typeof other !== "number")
      throw $.wrapException($.ArgumentError$(other));
    return receiver < other;
  },
  $gt: function(receiver, other) {
    if (typeof other !== "number")
      throw $.wrapException($.ArgumentError$(other));
    return receiver > other;
  },
  $le: function(receiver, other) {
    if (typeof other !== "number")
      throw $.wrapException($.ArgumentError$(other));
    return receiver <= other;
  },
  $ge: function(receiver, other) {
    if (typeof other !== "number")
      throw $.wrapException($.ArgumentError$(other));
    return receiver >= other;
  },
  $isnum: true
};

$$.JSInt = {"": "JSNumber;", $isint: true, $isnum: true};

$$.JSDouble = {"": "JSNumber;", $isdouble: true, $isnum: true};

$$.JSString = {"": "Interceptor;",
  codeUnitAt$1: function(receiver, index) {
    if (index < 0)
      throw $.wrapException($.RangeError$value(index));
    if (index >= receiver.length)
      throw $.wrapException($.RangeError$value(index));
    return receiver.charCodeAt(index);
  },
  allMatches$1: function(receiver, str) {
    return $.allMatchesInStringUnchecked(receiver, str);
  },
  $add: function(receiver, other) {
    if (typeof other !== "string")
      throw $.wrapException($.ArgumentError$(other));
    return receiver + other;
  },
  endsWith$1: function(receiver, other) {
    var otherLength, t1;
    otherLength = other.length;
    t1 = receiver.length;
    if (otherLength > t1)
      return false;
    return other === this.substring$1(receiver, t1 - otherLength);
  },
  replaceAll$2: function(receiver, from, to) {
    return $.stringReplaceAllUnchecked(receiver, from, to);
  },
  split$1: function(receiver, pattern) {
    return receiver.split(pattern);
  },
  substring$2: function(receiver, startIndex, endIndex) {
    if (endIndex == null)
      endIndex = receiver.length;
    if (typeof endIndex !== "number")
      $.throwExpression($.ArgumentError$(endIndex));
    if (startIndex < 0)
      throw $.wrapException($.RangeError$value(startIndex));
    if ($.JSNumber_methods.$gt(startIndex, endIndex))
      throw $.wrapException($.RangeError$value(startIndex));
    if ($.$gt$n(endIndex, receiver.length))
      throw $.wrapException($.RangeError$value(endIndex));
    return receiver.substring(startIndex, endIndex);
  },
  substring$1: function($receiver, startIndex) {
    return this.substring$2($receiver, startIndex, null);
  },
  trim$0: function(receiver) {
    return receiver.trim();
  },
  indexOf$2: function(receiver, other, start) {
    if (other == null)
      $.throwExpression($.ArgumentError$(null));
    if (typeof start !== "number" || Math.floor(start) !== start)
      throw $.wrapException($.ArgumentError$(start));
    if (typeof other !== "string")
      throw $.wrapException($.ArgumentError$(other));
    if (start < 0)
      return -1;
    return receiver.indexOf(other, start);
  },
  contains$2: function(receiver, other, startIndex) {
    if (other == null)
      $.throwExpression($.ArgumentError$(null));
    return $.stringContainsUnchecked(receiver, other, startIndex);
  },
  get$isEmpty: function(receiver) {
    return receiver.length === 0;
  },
  toString$0: function(receiver) {
    return receiver;
  },
  get$hashCode: function(receiver) {
    var hash, i;
    for (hash = 0, i = 0; i < receiver.length; ++i) {
      hash = 536870911 & hash + receiver.charCodeAt(i);
      hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
      hash ^= hash >> 6;
    }
    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
    hash ^= hash >> 11;
    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
  },
  get$length: function(receiver) {
    return receiver.length;
  },
  $index: function(receiver, index) {
    if (typeof index !== "number" || Math.floor(index) !== index)
      throw $.wrapException($.ArgumentError$(index));
    if (index >= receiver.length || index < 0)
      throw $.wrapException($.RangeError$value(index));
    return receiver[index];
  },
  $isString: true
};

$$._convertJsonToDart_anon = {"": "Closure;",
  call$2: function(key, value) {
    return value;
  }
};

$$._convertJsonToDart_walk = {"": "Closure;revive_0",
  call$1: function(e) {
    var list, t1, i, keys, map, key, proto;
    if (e == null || typeof e != "object")
      return e;
    if (Object.getPrototypeOf(e) === Array.prototype) {
      list = e;
      for (t1 = this.revive_0, i = 0; i < list.length; ++i)
        list[i] = t1.call$2(i, this.call$1(list[i]));
      return list;
    }
    keys = Object.keys(e);
    map = $.makeLiteralMap([]);
    for (t1 = this.revive_0, i = 0; i < keys.length; ++i) {
      key = keys[i];
      map.$indexSet(map, key, t1.call$2(key, this.call$1(e[key])));
    }
    proto = e.__proto__;
    if (typeof proto !== "undefined" && proto !== Object.prototype)
      map.$indexSet(map, "__proto__", t1.call$2("__proto__", this.call$1(proto)));
    return map;
  }
};

$$.StringMatch = {"": "Object;start,str,pattern",
  $index: function(_, g) {
    if ($.$eq(g, 0) !== true)
      $.throwExpression($.RangeError$value(g));
    return this.pattern;
  }
};

$$._CompleterImpl = {"": "Object;future,_isComplete",
  complete$1: function(_, value) {
    if (this._isComplete)
      throw $.wrapException($.StateError$("Future already completed"));
    this._isComplete = true;
    this.future._setValue$1(value);
  },
  completeError$2: function(error, stackTrace) {
    if (this._isComplete)
      throw $.wrapException($.StateError$("Future already completed"));
    this._isComplete = true;
    if (stackTrace != null)
      $._attachStackTrace(error, stackTrace);
    this.future._setError$1(error);
  },
  completeError$1: function(error) {
    return this.completeError$2(error, null);
  }
};

$$._FutureListenerWrapper = {"": "Object;future,_nextListener@",
  _sendValue$1: function(value) {
    this.future._setValue$1(value);
  },
  _sendError$1: function(error) {
    this.future._setError$1(error);
  }
};

$$._FutureImpl = {"": "Object;_state@,_resultOrListeners<",
  get$_isComplete: function() {
    return this._state !== 0;
  },
  get$_hasValue: function() {
    return this._state === 1;
  },
  get$_hasError: function() {
    return (this._state & 2) !== 0;
  },
  get$_hasUnhandledError: function() {
    return (this._state & 4) !== 0;
  },
  then$2$onError: function(f, onError) {
    var t1;
    if (!this.get$_isComplete()) {
      if (onError == null) {
        t1 = $._ThenFuture$(f);
        t1._subscribeTo$1(this);
        return t1;
      }
      t1 = $._SubscribeFuture$(f, onError);
      t1._subscribeTo$1(this);
      return t1;
    }
    if (this.get$_hasError()) {
      if (onError != null)
        return this._handleError$2(onError, null);
      return $._FutureWrapper$(this);
    } else
      return this._handleValue$1(f);
  },
  then$1: function(f) {
    return this.then$2$onError(f, null);
  },
  catchError$2$test: function(f, test) {
    var t1;
    if (this.get$_hasValue())
      return $._FutureWrapper$(this);
    if (!this.get$_isComplete()) {
      t1 = $._CatchErrorFuture$(f, test);
      t1._subscribeTo$1(this);
      return t1;
    } else
      return this._handleError$2(f, test);
  },
  catchError$1: function(f) {
    return this.catchError$2$test(f, null);
  },
  _handleValue$1: function(onValue) {
    var thenFuture = $._ThenFuture$(onValue);
    $.Timer_run(new $._FutureImpl__handleValue_anon(thenFuture, this._resultOrListeners));
    return thenFuture;
  },
  _handleError$2: function(onError, test) {
    var error, errorFuture;
    this._state = (this._state & 4294967291) >>> 0;
    error = this._resultOrListeners;
    errorFuture = $._CatchErrorFuture$(onError, test);
    $.Timer_run(new $._FutureImpl__handleError_anon(error, errorFuture));
    return errorFuture;
  },
  _setValue$1: function(value) {
    var listeners, listeners0;
    if (this.get$_isComplete())
      throw $.wrapException($.StateError$("Future already completed"));
    listeners = this._removeListeners$0();
    this._state = 1;
    this._resultOrListeners = value;
    for (; listeners != null; listeners = listeners0) {
      listeners0 = listeners.get$_nextListener();
      listeners.set$_nextListener(null);
      listeners._sendValue$1(value);
    }
  },
  get$_setValue: function() {
    return new $.BoundClosure$1(this, "_setValue$1");
  },
  _setError$1: function(error) {
    var listeners, listeners0;
    if (this.get$_isComplete())
      throw $.wrapException($.StateError$("Future already completed"));
    listeners = this._removeListeners$0();
    this._state = 2;
    this._resultOrListeners = error;
    if (listeners == null) {
      this._scheduleUnhandledError$0();
      return;
    }
    do {
      listeners0 = listeners.get$_nextListener();
      listeners.set$_nextListener(null);
      listeners._sendError$1(error);
      if (listeners0 != null) {
        listeners = listeners0;
        continue;
      } else
        break;
    } while (true);
  },
  get$_setError: function() {
    return new $.BoundClosure$1(this, "_setError$1");
  },
  _scheduleUnhandledError$0: function() {
    this._state = (this._state | 4) >>> 0;
    $.Timer_run(new $._FutureImpl__scheduleUnhandledError_anon(this));
  },
  _addListener$1: function(listener) {
    listener._nextListener = this._resultOrListeners;
    this._resultOrListeners = listener;
  },
  _removeListeners$0: function() {
    var current, prev, next;
    current = this._resultOrListeners;
    this._resultOrListeners = null;
    for (prev = null; current != null; prev = current, current = next) {
      next = current.get$_nextListener();
      current.set$_nextListener(prev);
    }
    return prev;
  },
  _chain$1: function(future) {
    var t1;
    if (!this.get$_isComplete()) {
      t1 = future._asListener$0();
      t1._nextListener = this._resultOrListeners;
      this._resultOrListeners = t1;
    } else if (this.get$_hasValue())
      future._setValue$1(this._resultOrListeners);
    else {
      this._state = (this._state & 4294967291) >>> 0;
      future._setError$1(this._resultOrListeners);
    }
  },
  _setOrChainValue$1: function(result) {
    if (typeof result === "object" && result !== null && !!$.getInterceptor(result).$isFuture)
      if (!!$.getInterceptor(result).$is_FutureImpl) {
        result._chain$1(this);
        return;
      } else {
        result.then$2$onError(this.get$_setValue(), this.get$_setError());
        return;
      }
    else
      this._setValue$1(result);
  },
  _asListener$0: function() {
    return $._FutureListenerWrapper$(this);
  },
  _FutureImpl$immediate$1: function(value) {
    this._state = 1;
    this._resultOrListeners = value;
  },
  $is_FutureImpl: true,
  $isFuture: true
};

$$._FutureImpl__FutureImpl$wait_handleError = {"": "Closure;box_0",
  call$1: function(error) {
    var t1 = this.box_0;
    if (t1.values_1 != null) {
      t1.values_1 = null;
      t1.completer_0.completeError$1(error);
    }
  }
};

$$._FutureImpl__FutureImpl$wait_anon = {"": "Closure;box_0,pos_1",
  call$1: function(value) {
    var t1, t2;
    t1 = this.box_0;
    t2 = t1.values_1;
    if (t2 == null)
      return;
    $.$indexSet$ax(t2, this.pos_1, value);
    t1.remaining_2 = $.$sub$n(t1.remaining_2, 1);
    if ($.$eq(t1.remaining_2, 0)) {
      t2 = t1.completer_0;
      t2.complete$1(t2, t1.values_1);
    }
  }
};

$$._FutureImpl__handleValue_anon = {"": "Closure;thenFuture_0,value_1",
  call$0: function() {
    this.thenFuture_0._sendValue$1(this.value_1);
  }
};

$$._FutureImpl__handleError_anon = {"": "Closure;error_0,errorFuture_1",
  call$0: function() {
    this.errorFuture_1._sendError$1(this.error_0);
  }
};

$$._FutureImpl__scheduleUnhandledError_anon = {"": "Closure;this_0",
  call$0: function() {
    var t1, error, trace;
    t1 = this.this_0;
    if (t1.get$_hasUnhandledError()) {
      t1.set$_state((t1.get$_state() & 4294967291) >>> 0);
      error = t1.get$_resultOrListeners();
      $.Primitives_printString("Uncaught Error: " + $.S(error));
      trace = $.getAttachedStackTrace(error);
      if (trace != null)
        $.Primitives_printString("Stack Trace:\n" + $.S(trace) + "\n");
      throw $.wrapException(error);
    }
  }
};

$$._TransformFuture = {"": "_FutureImpl;_nextListener@",
  _subscribeTo$1: function(future) {
    future._addListener$1(this);
  },
  $as_FutureImpl: function (S, T) { return [T]; },
  $asFuture: function (S, T) { return [T]; }
};

$$._ThenFuture = {"": "_TransformFuture;_onValue,_nextListener,_state,_resultOrListeners",
  _onValue$1: function(arg0) {
    return this._onValue.call$1(arg0);
  },
  _sendValue$1: function(value) {
    var result, e, s, exception, t1;
    result = null;
    try {
      result = this._onValue$1(value);
    } catch (exception) {
      t1 = $.unwrapException(exception);
      e = t1;
      s = $.getTraceFromException(exception);
      this._setError$1($._asyncError(e, s));
      return;
    }

    this._setOrChainValue$1(result);
  },
  _sendError$1: function(error) {
    this._setError$1(error);
  },
  $as_FutureImpl: function (S, T) { return [T]; },
  $asFuture: function (S, T) { return [T]; }
};

$$._CatchErrorFuture = {"": "_TransformFuture;_test,_onError,_nextListener,_state,_resultOrListeners",
  _test$1: function(arg0) {
    return this._test.call$1(arg0);
  },
  _onError$1: function(arg0) {
    return this._onError.call$1(arg0);
  },
  _sendValue$1: function(value) {
    this._setValue$1(value);
  },
  _sendError$1: function(error) {
    var matchesTest, e, s, result, e0, s0, exception, t1;
    if (this._test != null) {
      matchesTest = null;
      try {
        matchesTest = this._test$1(error);
      } catch (exception) {
        t1 = $.unwrapException(exception);
        e = t1;
        s = $.getTraceFromException(exception);
        this._setError$1($._asyncError(e, s));
        return;
      }

      if (matchesTest !== true) {
        this._setError$1(error);
        return;
      }
    }
    result = null;
    try {
      result = this._onError$1(error);
    } catch (exception) {
      t1 = $.unwrapException(exception);
      e0 = t1;
      s0 = $.getTraceFromException(exception);
      this._setError$1($._asyncError(e0, s0));
      return;
    }

    this._setOrChainValue$1(result);
  },
  $as_FutureImpl: null,
  $asFuture: null
};

$$._SubscribeFuture = {"": "_ThenFuture;_onError,_onValue,_nextListener,_state,_resultOrListeners",
  _onError$1: function(arg0) {
    return this._onError.call$1(arg0);
  },
  _sendError$1: function(error) {
    var result, e, s, exception, t1;
    result = null;
    try {
      result = this._onError$1(error);
    } catch (exception) {
      t1 = $.unwrapException(exception);
      e = t1;
      s = $.getTraceFromException(exception);
      this._setError$1($._asyncError(e, s));
      return;
    }

    this._setOrChainValue$1(result);
  },
  $as_FutureImpl: function (S, T) { return [T]; },
  $asFuture: function (S, T) { return [T]; }
};

$$._FutureWrapper = {"": "Object;_future",
  then$2$onError: function($function, onError) {
    return this._future.then$2$onError($function, onError);
  },
  then$1: function($function) {
    return this.then$2$onError($function, null);
  },
  catchError$2$test: function($function, test) {
    return this._future.catchError$2$test($function, test);
  },
  catchError$1: function($function) {
    return this.catchError$2$test($function, null);
  },
  $isFuture: true
};

$$.Stream = {"": "Object;",
  get$length: function(_) {
    var t1, future, t2, t3;
    t1 = {};
    future = $._FutureImpl$();
    t1.count_0 = 0;
    t2 = new $.Stream_length_anon(t1);
    t3 = future.get$_setError();
    this.listen$4$cancelOnError$onDone$onError(t2, true, new $.Stream_length_anon0(t1, future), t3);
    return future;
  },
  get$isEmpty: function(_) {
    var t1, future, t2, t3;
    t1 = {};
    future = $._FutureImpl$();
    t1.subscription_0 = null;
    t2 = new $.Stream_isEmpty_anon(t1, future);
    t3 = future.get$_setError();
    t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(t2, true, new $.Stream_isEmpty_anon0(future), t3);
    return future;
  },
  skip$1: function(_, count) {
    return $._SkipStream$(this, count);
  }
};

$$.Stream_length_anon = {"": "Closure;box_0",
  call$1: function(_) {
    var t1 = this.box_0;
    t1.count_0 = $.$add$ns(t1.count_0, 1);
  }
};

$$.Stream_length_anon0 = {"": "Closure;box_0,future_1",
  call$0: function() {
    this.future_1._setValue$1(this.box_0.count_0);
  }
};

$$.Stream_isEmpty_anon = {"": "Closure;box_0,future_1",
  call$1: function(_) {
    this.box_0.subscription_0.cancel$0();
    this.future_1._setValue$1(false);
  }
};

$$.Stream_isEmpty_anon0 = {"": "Closure;future_2",
  call$0: function() {
    this.future_2._setValue$1(true);
  }
};

$$.StreamSubscription = {"": "Object;"};

$$.EventSink = {"": "Object;"};

$$._throwDelayed_anon = {"": "Closure;error_0,stackTrace_1",
  call$0: function() {
    var t1, t2, trace, t3;
    t1 = this.stackTrace_1;
    if (t1 != null)
      $.Primitives_printString($.JSNull_methods.toString$0(t1));
    t2 = this.error_0;
    trace = $.getAttachedStackTrace(t2);
    t3 = $.getInterceptor(trace);
    if (trace != null && t3.$eq(trace, t1) !== true)
      $.Primitives_printString(t3.toString$0(trace));
    throw $.wrapException(t2);
  }
};

$$._ForwardingStream = {"": "Stream;",
  listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
    if (onData == null)
      onData = $._nullDataHandler;
    if (onError == null)
      onError = $._nullErrorHandler;
    if (onDone == null)
      onDone = $._nullDoneHandler;
    return $._ForwardingStreamSubscription$(this, onData, onError, onDone, true === cancelOnError);
  },
  listen$3$onDone$onError: function(onData, onDone, onError) {
    return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
  },
  _handleData$2: function(data, sink) {
    sink._sendData$1(data);
  },
  _handleError$2: function(error, sink) {
    sink._sendError$1(error);
  },
  _handleDone$1: function(sink) {
    sink._sendDone$0();
  }
};

$$._BaseStreamSubscription = {"": "Object;",
  _onData$1: function(arg0) {
    return this._onData.call$1(arg0);
  },
  _onError$1: function(arg0) {
    return this._onError.call$1(arg0);
  },
  _onDone$0: function() {
    return this._onDone.call$0();
  },
  _BaseStreamSubscription$3: function(_onData, _onError, _onDone) {
    if (this._onData == null)
      this._onData = $._nullDataHandler;
    if (this._onError == null)
      this._onError = $._nullErrorHandler;
    if (this._onDone == null)
      this._onDone = $._nullDoneHandler;
  }
};

$$._ForwardingStreamSubscription = {"": "_BaseStreamSubscription;_stream,_cancelOnError,_subscription,_onData,_onError,_onDone",
  cancel$0: function() {
    var t1 = this._subscription;
    if (t1 != null) {
      t1.cancel$0();
      this._subscription = null;
    }
  },
  _sendData$1: function(data) {
    this._onData$1(data);
  },
  _sendError$1: function(error) {
    this._onError$1(error);
    if (this._cancelOnError) {
      this._subscription.cancel$0();
      this._subscription = null;
    }
  },
  _sendDone$0: function() {
    var t1 = this._subscription;
    if (t1 != null) {
      t1.cancel$0();
      this._subscription = null;
    }
    this._onDone$0();
  },
  _handleData$1: function(data) {
    this._stream._handleData$2(data, this);
  },
  get$_handleData: function() {
    return new $.BoundClosure$1(this, "_handleData$1");
  },
  _handleError$1: function(error) {
    this._stream._handleError$2(error, this);
  },
  get$_handleError: function() {
    return new $.BoundClosure$1(this, "_handleError$1");
  },
  _handleDone$0: function() {
    this._subscription = null;
    this._stream._handleDone$1(this);
  },
  get$_handleDone: function() {
    return new $.BoundClosure$0(this, "_handleDone$0");
  },
  _ForwardingStreamSubscription$5: function(_stream, onData, onError, onDone, _cancelOnError) {
    var t1, t2;
    t1 = this.get$_handleData();
    t2 = this.get$_handleError();
    this._subscription = this._stream._source.listen$3$onDone$onError(t1, this.get$_handleDone(), t2);
  }
};

$$._SkipStream = {"": "_ForwardingStream;_remaining,_source",
  _handleData$2: function(inputEvent, sink) {
    var t1 = this._remaining;
    if (t1 > 0) {
      this._remaining = t1 - 1;
      return;
    }
    return sink._sendData$1(inputEvent);
  },
  _SkipStream$2: function(source, count) {
    if (typeof count !== "number" || Math.floor(count) !== count || count < 0)
      throw $.wrapException($.ArgumentError$(count));
  }
};

$$.Timer_run_anon = {"": "Closure;",
  call$0: function() {
    var runCallbacks, i, callback, newCallbacks, exception;
    runCallbacks = $.get$Timer__runCallbacks();
    $.Timer__runCallbacks = [];
    for (i = 0; $.$lt$n(i, $.get$length$asx(runCallbacks)); i = $.$add$ns(i, 1)) {
      callback = $.$index$asx(runCallbacks, i);
      try {
        callback.call$0();
      } catch (exception) {
        $.unwrapException(exception);
        newCallbacks = $.get$Timer__runCallbacks();
        $.Timer__runCallbacks = [];
        i = $.$add$ns(i, 1);
        $.addAll$1$ax($.get$Timer__runCallbacks(), $.sublist$1$ax(runCallbacks, i));
        $.addAll$1$ax($.get$Timer__runCallbacks(), newCallbacks);
        throw exception;
      }

    }
  }
};

$$.HashMap = {"": "Object;_liblib0$_length,_strings,_nums,_rest,_keys",
  get$length: function(_) {
    return this._liblib0$_length;
  },
  get$isEmpty: function(_) {
    return this._liblib0$_length === 0;
  },
  get$keys: function() {
    return $.HashMapKeyIterable$(this);
  },
  get$values: function(_) {
    var t1 = this.get$keys();
    return t1.map$1(t1, new $.HashMap_values_anon(this));
  },
  containsKey$1: function(key) {
    var strings, nums, rest;
    if (typeof key === "string" && key !== "__proto__") {
      strings = this._strings;
      return strings == null ? false : strings[key] != null;
    } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
      nums = this._nums;
      return nums == null ? false : nums[key] != null;
    } else {
      rest = this._rest;
      if (rest == null)
        return false;
      return $.HashMap__findBucketIndex(rest[$.get$hashCode$(key) & 0x3ffffff], key) >= 0;
    }
  },
  addAll$1: function(_, other) {
    $.forEach$1$ax(other, new $.HashMap_addAll_anon(this));
  },
  $index: function(_, key) {
    var strings, t1, entry, nums, rest, bucket, index;
    if (typeof key === "string" && key !== "__proto__") {
      strings = this._strings;
      if (strings == null)
        t1 = null;
      else {
        entry = strings[key];
        t1 = entry === strings ? null : entry;
      }
      return t1;
    } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
      nums = this._nums;
      if (nums == null)
        t1 = null;
      else {
        entry = nums[key];
        t1 = entry === nums ? null : entry;
      }
      return t1;
    } else {
      rest = this._rest;
      if (rest == null)
        return;
      bucket = rest[$.get$hashCode$(key) & 0x3ffffff];
      index = $.HashMap__findBucketIndex(bucket, key);
      return index < 0 ? null : bucket[index + 1];
    }
  },
  $indexSet: function(_, key, value) {
    var strings, table, nums, rest, hash, bucket, index;
    if (typeof key === "string" && key !== "__proto__") {
      strings = this._strings;
      if (strings == null) {
        table = Object.create(null);
        if (table == null)
          ;
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._strings = table;
        strings = table;
      }
      if (strings[key] == null) {
        this._liblib0$_length = this._liblib0$_length + 1;
        this._keys = null;
      }
      if (value == null)
        value = strings;
      strings[key] = value;
    } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
      nums = this._nums;
      if (nums == null) {
        table = Object.create(null);
        if (table == null)
          ;
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._nums = table;
        nums = table;
      }
      if (nums[key] == null) {
        this._liblib0$_length = this._liblib0$_length + 1;
        this._keys = null;
      }
      if (value == null)
        value = nums;
      nums[key] = value;
    } else {
      rest = this._rest;
      if (rest == null) {
        table = Object.create(null);
        if (table == null)
          ;
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._rest = table;
        rest = table;
      }
      hash = $.get$hashCode$(key) & 0x3ffffff;
      bucket = rest[hash];
      if (bucket == null) {
        value = [key, value];
        if (value == null)
          value = rest;
        rest[hash] = value;
        this._liblib0$_length = this._liblib0$_length + 1;
        this._keys = null;
      } else {
        index = $.HashMap__findBucketIndex(bucket, key);
        if (index >= 0)
          bucket[index + 1] = value;
        else {
          bucket.push(key, value);
          this._liblib0$_length = this._liblib0$_length + 1;
          this._keys = null;
        }
      }
    }
  },
  remove$1: function(_, key) {
    var rest, bucket, index;
    if (typeof key === "string" && key !== "__proto__")
      return this._removeHashTableEntry$2(this._strings, key);
    else if (typeof key === "number" && (key & 0x3ffffff) === key)
      return this._removeHashTableEntry$2(this._nums, key);
    else {
      rest = this._rest;
      if (rest == null)
        return;
      bucket = rest[$.get$hashCode$(key) & 0x3ffffff];
      index = $.HashMap__findBucketIndex(bucket, key);
      if (index < 0)
        return;
      this._liblib0$_length = this._liblib0$_length - 1;
      this._keys = null;
      return bucket.splice(index, 2)[1];
    }
  },
  forEach$1: function(_, action) {
    var keys, $length, i, key;
    keys = this._computeKeys$0();
    for ($length = $.get$length$asx(keys), i = 0; i < $length; ++i) {
      key = keys[i];
      action.call$2(key, this.$index(this, key));
      if (keys !== this._keys)
        throw $.wrapException($.ConcurrentModificationError$(this));
    }
  },
  toString$0: function(_) {
    var result = $.StringBuffer$("");
    $.ToString__emitPair(this, result, $.List_List($));
    return result.toString$0(result);
  },
  _computeKeys$0: function() {
    var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
    t1 = this._keys;
    if (t1 != null)
      return t1;
    result = $.List_List(this._liblib0$_length);
    strings = this._strings;
    if (strings != null) {
      names = Object.getOwnPropertyNames(strings);
      entries = names.length;
      for (index = 0, i = 0; i < entries; ++i) {
        result[index] = names[i];
        ++index;
      }
    } else
      index = 0;
    nums = this._nums;
    if (nums != null) {
      names = Object.getOwnPropertyNames(nums);
      entries = names.length;
      for (i = 0; i < entries; ++i) {
        result[index] = +names[i];
        ++index;
      }
    }
    rest = this._rest;
    if (rest != null) {
      names = Object.getOwnPropertyNames(rest);
      entries = names.length;
      for (i = 0; i < entries; ++i) {
        bucket = rest[names[i]];
        $length = bucket.length;
        for (i0 = 0; i0 < $length; i0 += 2) {
          result[index] = bucket[i0];
          ++index;
        }
      }
    }
    this._keys = result;
    return result;
  },
  _removeHashTableEntry$2: function(table, key) {
    var entry, value;
    if (table != null && table[key] != null) {
      entry = table[key];
      value = entry === table ? null : entry;
      delete table[key];
      this._liblib0$_length = this._liblib0$_length - 1;
      this._keys = null;
      return value;
    } else
      return;
  },
  $isMap: true
};

$$._HashSetBase = {"": "IterableBase;",
  toString$0: function(_) {
    var result = $.StringBuffer$("");
    $.ToString__emitValue(this, result, $.List_List($));
    return result.toString$0(result);
  },
  $asIterable: function() {
    return null;
  },
  $isIterable: function() {
    return true;
  }
};

$$.IterableBase = {"": "Object;",
  map$1: function(_, f) {
    return $.MappedIterable$(this, f);
  },
  forEach$1: function(_, f) {
    var t1;
    for (t1 = this.get$iterator(this); t1.moveNext$0() === true;)
      f.call$1(t1.get$current());
  },
  join$1: function(_, separator) {
    var iterator, buffer;
    if (typeof separator !== "string")
      return this.join$1$bailout(1, separator);
    iterator = this.get$iterator(this);
    if (iterator.moveNext$0() !== true)
      return "";
    buffer = $.StringBuffer$("");
    if (separator === "")
      do
        buffer.write$1($.S(iterator.get$current()));
      while (iterator.moveNext$0() === true);
    else {
      buffer.write$1($.S(iterator.get$current()));
      for (; iterator.moveNext$0() === true;) {
        buffer.write$1(separator);
        buffer.write$1($.S(iterator.get$current()));
      }
    }
    return buffer.toString$0(buffer);
  },
  join$1$bailout: function(state0, separator) {
    var iterator, buffer;
    iterator = this.get$iterator(this);
    if (iterator.moveNext$0() !== true)
      return "";
    buffer = $.StringBuffer$("");
    if (separator == null || $.$eq(separator, "") === true)
      do
        buffer.write$1($.S(iterator.get$current()));
      while (iterator.moveNext$0() === true);
    else {
      buffer.write$1($.S(iterator.get$current()));
      for (; iterator.moveNext$0() === true;) {
        buffer.write$1(separator);
        buffer.write$1($.S(iterator.get$current()));
      }
    }
    return buffer.toString$0(buffer);
  },
  toList$1$growable: function(_, growable) {
    return $.List_List$from(this, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$length: function(_) {
    var it, count;
    it = this.get$iterator(this);
    for (count = 0; it.moveNext$0() === true;)
      ++count;
    return count;
  },
  get$isEmpty: function(_) {
    return this.get$iterator(this).moveNext$0() !== true;
  },
  skip$1: function(_, n) {
    return $.SkipIterable$(this, n);
  },
  elementAt$1: function(_, index) {
    var t1, remaining, t2;
    if (typeof index !== "number")
      return this.elementAt$1$bailout(1, index);
    if (typeof index !== "number" || Math.floor(index) !== index || index < 0)
      throw $.wrapException($.RangeError$value(index));
    for (t1 = this.get$iterator(this), remaining = index; t1.moveNext$0() === true;) {
      t2 = t1.get$current();
      if (remaining === 0)
        return t2;
      --remaining;
    }
    throw $.wrapException($.RangeError$value(index));
  },
  elementAt$1$bailout: function(state0, index) {
    var t1, remaining, t2, t3;
    if (typeof index !== "number" || Math.floor(index) !== index || index < 0)
      throw $.wrapException($.RangeError$value(index));
    for (t1 = this.get$iterator(this), remaining = index; t1.moveNext$0() === true;) {
      t2 = t1.get$current();
      t3 = $.getInterceptor(remaining);
      if (t3.$eq(remaining, 0))
        return t2;
      remaining = t3.$sub(remaining, 1);
    }
    throw $.wrapException($.RangeError$value(index));
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return null;
  }
};

$$.LinkedHashMap = {"": "Object;_liblib0$_length,_strings,_nums,_rest,_first,_last,_modifications",
  addAll$1: function(_, other) {
    $.forEach$1$ax(other, new $.LinkedHashMap_addAll_anon(this));
  },
  $index: function(_, key) {
    var strings, cell, nums, rest, bucket, index;
    if (typeof key === "string" && key !== "__proto__") {
      strings = this._strings;
      if (strings == null)
        return;
      cell = strings[key];
      return cell == null ? null : cell.get$_value();
    } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
      nums = this._nums;
      if (nums == null)
        return;
      cell = nums[key];
      return cell == null ? null : cell.get$_value();
    } else {
      rest = this._rest;
      if (rest == null)
        return;
      bucket = rest[$.get$hashCode$(key) & 0x3ffffff];
      index = $.LinkedHashMap__findBucketIndex(bucket, key);
      if (index < 0)
        return;
      return bucket[index].get$_value();
    }
  },
  $indexSet: function(_, key, value) {
    var strings, table, nums, rest, hash, bucket, index;
    if (typeof key === "string" && key !== "__proto__") {
      strings = this._strings;
      if (strings == null) {
        table = Object.create(null);
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._strings = table;
        strings = table;
      }
      this._addHashTableEntry$3(strings, key, value);
    } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
      nums = this._nums;
      if (nums == null) {
        table = Object.create(null);
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._nums = table;
        nums = table;
      }
      this._addHashTableEntry$3(nums, key, value);
    } else {
      rest = this._rest;
      if (rest == null) {
        table = Object.create(null);
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._rest = table;
        rest = table;
      }
      hash = $.get$hashCode$(key) & 0x3ffffff;
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [this._newLinkedCell$2(key, value)];
      else {
        index = $.LinkedHashMap__findBucketIndex(bucket, key);
        if (index >= 0)
          bucket[index].set$_value(value);
        else
          bucket.push(this._newLinkedCell$2(key, value));
      }
    }
  },
  forEach$1: function(_, action) {
    var cell, modifications;
    cell = this._first;
    modifications = this._modifications;
    for (; cell != null;) {
      action.call$2(cell.get$_key(), cell.get$_value());
      if (modifications !== this._modifications)
        throw $.wrapException($.ConcurrentModificationError$(this));
      cell = cell.get$_next();
    }
  },
  get$keys: function() {
    return $.LinkedHashMapKeyIterable$(this);
  },
  get$values: function(_) {
    var t1 = this.get$keys();
    return t1.map$1(t1, new $.LinkedHashMap_values_anon(this));
  },
  get$length: function(_) {
    return this._liblib0$_length;
  },
  get$isEmpty: function(_) {
    return this._liblib0$_length === 0;
  },
  toString$0: function(_) {
    var result = $.StringBuffer$("");
    $.ToString__emitPair(this, result, $.List_List($));
    return result.toString$0(result);
  },
  _addHashTableEntry$3: function(table, key, value) {
    var cell = table[key];
    if (cell == null)
      table[key] = this._newLinkedCell$2(key, value);
    else
      cell.set$_value(value);
  },
  _newLinkedCell$2: function(key, value) {
    var cell, last;
    cell = $.LinkedHashMapCell$(key, value);
    if (this._first == null) {
      this._last = cell;
      this._first = cell;
    } else {
      last = this._last;
      cell._previous = last;
      last._next = cell;
      this._last = cell;
    }
    this._liblib0$_length = this._liblib0$_length + 1;
    this._modifications = this._modifications + 1 & 67108863;
    return cell;
  },
  $isMap: true
};

$$.LinkedHashSet = {"": "_HashSetBase;_liblib0$_length,_strings,_nums,_rest,_first,_last,_modifications",
  get$iterator: function(_) {
    return $.LinkedHashSetIterator$(this, this._modifications);
  },
  get$length: function(_) {
    return this._liblib0$_length;
  },
  get$isEmpty: function(_) {
    return this._liblib0$_length === 0;
  },
  contains$1: function(_, object) {
    var strings, nums, rest;
    if (object !== "__proto__") {
      strings = this._strings;
      if (strings == null)
        return false;
      return strings[object] != null;
    } else if (false) {
      nums = this._nums;
      if (nums == null)
        return false;
      return nums[object] != null;
    } else {
      rest = this._rest;
      if (rest == null)
        return false;
      return $.LinkedHashSet__findBucketIndex(rest[$.JSString_methods.get$hashCode(object) & 0x3ffffff], object) >= 0;
    }
  },
  forEach$1: function(_, action) {
    var cell, modifications;
    cell = this._first;
    modifications = this._modifications;
    for (; cell != null;) {
      action.call$1(cell.get$_element());
      if (modifications !== this._modifications)
        throw $.wrapException($.ConcurrentModificationError$(this));
      cell = cell.get$_next();
    }
  },
  add$1: function(_, element) {
    var strings, table, nums, rest, hash, bucket;
    if (typeof element === "string" && element !== "__proto__") {
      strings = this._strings;
      if (strings == null) {
        table = Object.create(null);
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._strings = table;
        strings = table;
      }
      this._addHashTableEntry$2(strings, element);
    } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
      nums = this._nums;
      if (nums == null) {
        table = Object.create(null);
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._nums = table;
        nums = table;
      }
      this._addHashTableEntry$2(nums, element);
    } else {
      rest = this._rest;
      if (rest == null) {
        table = Object.create(null);
        table["<non-identifier-key>"] = table;
        delete table["<non-identifier-key>"];
        this._rest = table;
        rest = table;
      }
      hash = $.get$hashCode$(element) & 0x3ffffff;
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [this._newLinkedCell$1(element)];
      else {
        if ($.LinkedHashSet__findBucketIndex(bucket, element) >= 0)
          return;
        bucket.push(this._newLinkedCell$1(element));
      }
    }
  },
  addAll$1: function(_, objects) {
    var t1;
    for (t1 = $.get$iterator$ax(objects); t1.moveNext$0() === true;)
      this.add$1(this, t1.get$current());
  },
  remove$1: function(_, object) {
    var rest, bucket, index;
    if (object !== "__proto__")
      return this._removeHashTableEntry$2(this._strings, object);
    else if (false)
      return this._removeHashTableEntry$2(this._nums, object);
    else {
      rest = this._rest;
      if (rest == null)
        return false;
      bucket = rest[$.JSString_methods.get$hashCode(object) & 0x3ffffff];
      index = $.LinkedHashSet__findBucketIndex(bucket, object);
      if (index < 0)
        return false;
      this._unlinkCell$1(bucket.splice(index, 1)[0]);
      return true;
    }
  },
  _addHashTableEntry$2: function(table, element) {
    if (table[element] != null)
      return;
    table[element] = this._newLinkedCell$1(element);
  },
  _removeHashTableEntry$2: function(table, element) {
    var cell;
    if (table == null)
      return false;
    cell = table[element];
    if (cell == null)
      return false;
    this._unlinkCell$1(cell);
    delete table[element];
    return true;
  },
  _newLinkedCell$1: function(element) {
    var cell, last;
    cell = $.LinkedHashSetCell$(element);
    if (this._first == null) {
      this._last = cell;
      this._first = cell;
    } else {
      last = this._last;
      cell._previous = last;
      last.set$_next(cell);
      this._last = cell;
    }
    this._liblib0$_length = this._liblib0$_length + 1;
    this._modifications = this._modifications + 1 & 67108863;
    return cell;
  },
  _unlinkCell$1: function(cell) {
    var previous, next;
    previous = cell.get$_previous();
    next = cell.get$_next();
    if (previous == null)
      this._first = next;
    else
      previous.set$_next(next);
    if (next == null)
      this._last = previous;
    else
      next.set$_previous(previous);
    this._liblib0$_length = this._liblib0$_length - 1;
    this._modifications = this._modifications + 1 & 67108863;
  },
  $asIterable: function() {
    return null;
  }
};

$$.ListBase = {"": "Object;",
  get$iterator: function(_) {
    return $.ListIterator$(this);
  },
  elementAt$1: function(_, index) {
    return this.$index(this, index);
  },
  forEach$1: function(_, action) {
    var $length, i;
    $length = this.get$length(this);
    if (typeof $length !== "number")
      return this.forEach$1$bailout(1, action, $length);
    for (i = 0; i < $length; ++i) {
      action.call$1(this.$index(this, i));
      if ($length !== this.get$length(this))
        throw $.wrapException($.ConcurrentModificationError$(this));
    }
  },
  forEach$1$bailout: function(state0, action, $length) {
    var t1, i;
    for (t1 = $.getInterceptor($length), i = 0; $.JSNumber_methods.$lt(i, $length); ++i) {
      action.call$1(this.$index(this, i));
      if (t1.$eq($length, this.get$length(this)) !== true)
        throw $.wrapException($.ConcurrentModificationError$(this));
    }
  },
  get$isEmpty: function(_) {
    return $.$eq(this.get$length(this), 0);
  },
  where$1: function(_, test) {
    return $.WhereIterable$(this, test);
  },
  skip$1: function(_, count) {
    return $.SubListIterable$(this, count, null);
  },
  toList$1$growable: function(_, growable) {
    var result, i, t1;
    if (growable === true) {
      result = $.List_List($);
      $.JSArray_methods.set$length(result, this.get$length(this));
    } else
      result = $.List_List(this.get$length(this));
    for (i = 0; $.JSNumber_methods.$lt(i, this.get$length(this)); ++i) {
      t1 = this.$index(this, i);
      if (i >= result.length)
        throw $.ioore(i);
      result[i] = t1;
    }
    return result;
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  add$1: function(_, element) {
    var t1 = this.get$length(this);
    if (typeof t1 !== "number")
      return this.add$1$bailout(1, element, t1);
    this.set$length(this, t1 + 1);
    this.$indexSet(this, t1, element);
  },
  add$1$bailout: function(state0, element, t1) {
    this.set$length(this, $.$add$ns(t1, 1));
    this.$indexSet(this, t1, element);
  },
  addAll$1: function(_, iterable) {
    var t1, t2, t3;
    for (t1 = $.get$iterator$ax(iterable); t1.moveNext$0() === true;) {
      t2 = t1.get$current();
      t3 = this.get$length(this);
      this.set$length(this, $.$add$ns(t3, 1));
      this.$indexSet(this, t3, t2);
    }
  },
  clear$0: function(_) {
    this.set$length(this, 0);
  },
  removeLast$0: function(_) {
    var result;
    if ($.$eq(this.get$length(this), 0) === true)
      throw $.wrapException($.StateError$("No elements"));
    result = this.$index(this, $.$sub$n(this.get$length(this), 1));
    this.set$length(this, $.$sub$n(this.get$length(this), 1));
    return result;
  },
  sublist$2: function(_, start, end) {
    var t1, $length, result, i;
    if (typeof start !== "number")
      return this.sublist$2$bailout(1, start, end);
    if (end == null)
      end = this.get$length(this);
    if (start < 0 || $.JSNumber_methods.$gt(start, this.get$length(this)))
      $.throwExpression($.RangeError$range(start, 0, this.get$length(this)));
    t1 = $.getInterceptor$n(end);
    if (t1.$lt(end, start) || t1.$gt(end, this.get$length(this)))
      $.throwExpression($.RangeError$range(end, start, this.get$length(this)));
    $length = t1.$sub(end, start);
    if (typeof $length !== "number")
      return this.sublist$2$bailout(2, start, 0, $.JSNumber_methods, $length);
    result = $.List_List($);
    $.JSArray_methods.set$length(result, $length);
    for (i = 0; i < $length; ++i) {
      t1 = this.$index(this, start + i);
      if (i >= result.length)
        throw $.ioore(i);
      result[i] = t1;
    }
    return result;
  },
  sublist$2$bailout: function(state0, start, end, t1, $length) {
    switch (state0) {
      case 0:
      case 1:
        state0 = 0;
        if (end == null)
          end = this.get$length(this);
        t1 = $.getInterceptor$n(start);
        if (t1.$lt(start, 0) || t1.$gt(start, this.get$length(this)))
          $.throwExpression($.RangeError$range(start, 0, this.get$length(this)));
        t2 = $.getInterceptor$n(end);
        if (t2.$lt(end, start) || t2.$gt(end, this.get$length(this)))
          $.throwExpression($.RangeError$range(end, start, this.get$length(this)));
        $length = t2.$sub(end, start);
      case 2:
        var t2, result, i;
        state0 = 0;
        result = $.List_List($);
        $.JSArray_methods.set$length(result, $length);
        for (i = 0; $.JSNumber_methods.$lt(i, $length); ++i) {
          t2 = this.$index(this, t1.$add(start, i));
          if (i >= result.length)
            throw $.ioore(i);
          result[i] = t2;
        }
        return result;
    }
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  toString$0: function(_) {
    var result = $.StringBuffer$("");
    $.ToString__emitValue(this, result, $.List_List($));
    return result.toString$0(result);
  },
  $isList: function() {
    return true;
  },
  $asList: function() {
    return null;
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return null;
  }
};

$$.ListQueue = {"": "IterableBase;_table,_head,_tail,_modificationCount",
  get$iterator: function(_) {
    return $._ListQueueIterator$(this);
  },
  forEach$1: function(_, action) {
    var modificationCount, i, t1;
    modificationCount = this._modificationCount;
    for (i = this._head; i !== this._tail; i = (i + 1 & this._table.length - 1) >>> 0) {
      t1 = this._table;
      if (i < 0 || i >= t1.length)
        throw $.ioore(i);
      action.call$1(t1[i]);
      if (modificationCount !== this._modificationCount)
        $.throwExpression($.ConcurrentModificationError$(this));
    }
  },
  get$isEmpty: function(_) {
    return this._head === this._tail;
  },
  get$length: function(_) {
    return $.$and$n($.$sub$n(this._tail, this._head), this._table.length - 1);
  },
  elementAt$1: function(_, index) {
    var t1, t2, t3;
    t1 = $.getInterceptor$n(index);
    if (t1.$lt(index, 0) || t1.$gt(index, this.get$length(this)))
      throw $.wrapException($.RangeError$range(index, 0, this.get$length(this)));
    t1 = this._table;
    t2 = this._head;
    if (typeof index !== "number")
      throw $.iae(index);
    t3 = t1.length;
    t2 = (t2 + index & t3 - 1) >>> 0;
    if (t2 < 0 || t2 >= t3)
      throw $.ioore(t2);
    return t1[t2];
  },
  toList$1$growable: function(_, growable) {
    var list;
    if (growable === true) {
      list = $.List_List($);
      $.JSArray_methods.set$length(list, this.get$length(this));
    } else
      list = $.List_List(this.get$length(this));
    this._writeToList$1(list);
    return list;
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  add$1: function(_, element) {
    this._add$1(element);
  },
  addAll$1: function(_, elements) {
    var addCount, $length, t1, t2, t3, endSpace, preSpace;
    if (typeof elements === "object" && elements !== null && (elements.constructor === Array || $.getInterceptor(elements).$isList())) {
      addCount = $.get$length$asx(elements);
      $length = this.get$length(this);
      if (typeof addCount !== "number")
        throw $.iae(addCount);
      t1 = $length + addCount;
      t2 = this._table;
      t3 = t2.length;
      if (t1 >= t3) {
        this._preGrow$1(t1);
        $.JSArray_methods.setRange$4(this._table, $length, t1, elements, 0);
        this._tail = $.$add$ns(this._tail, addCount);
      } else {
        t1 = this._tail;
        if (typeof t1 !== "number")
          throw $.iae(t1);
        endSpace = t3 - t1;
        if (addCount < endSpace) {
          $.JSArray_methods.setRange$4(t2, t1, t1 + addCount, elements, 0);
          this._tail = $.$add$ns(this._tail, addCount);
        } else {
          preSpace = addCount - endSpace;
          $.JSArray_methods.setRange$4(t2, t1, t1 + endSpace, elements, 0);
          $.JSArray_methods.setRange$4(this._table, 0, preSpace, elements, endSpace);
          this._tail = preSpace;
        }
      }
      this._modificationCount = this._modificationCount + 1;
    } else
      for (t1 = $.get$iterator$ax(elements); t1.moveNext$0() === true;)
        this._add$1(t1.get$current());
  },
  toString$0: function(_) {
    var result = $.StringBuffer$("");
    $.ToString__emitValue(this, result, $.List_List($));
    return result.toString$0(result);
  },
  addLast$1: function(element) {
    this._add$1(element);
  },
  removeFirst$0: function() {
    var t1, t2, t3, result;
    if (this._head === this._tail)
      throw $.wrapException($.StateError$("No elements"));
    this._modificationCount = this._modificationCount + 1;
    t1 = this._table;
    t2 = this._head;
    t3 = t1.length;
    if (t2 < 0 || t2 >= t3)
      throw $.ioore(t2);
    result = t1[t2];
    this._head = (t2 + 1 & t3 - 1) >>> 0;
    return result;
  },
  removeLast$0: function(_) {
    var t1, t2;
    if (this._head === this._tail)
      throw $.wrapException($.StateError$("No elements"));
    this._modificationCount = this._modificationCount + 1;
    this._tail = $.$and$n($.$sub$n(this._tail, 1), this._table.length - 1);
    t1 = this._table;
    t2 = this._tail;
    if (t2 !== (t2 | 0))
      throw $.iae(t2);
    if (t2 < 0 || t2 >= t1.length)
      throw $.ioore(t2);
    return t1[t2];
  },
  _checkModification$1: function(expectedModificationCount) {
    if (typeof expectedModificationCount !== "number")
      return this._checkModification$1$bailout(1, expectedModificationCount);
    if (expectedModificationCount !== this._modificationCount)
      throw $.wrapException($.ConcurrentModificationError$(this));
  },
  _checkModification$1$bailout: function(state0, expectedModificationCount) {
    if ($.$eq(expectedModificationCount, this._modificationCount) !== true)
      throw $.wrapException($.ConcurrentModificationError$(this));
  },
  _add$1: function(element) {
    var t1, t2;
    t1 = this._table;
    t2 = this._tail;
    if (t2 !== (t2 | 0))
      throw $.iae(t2);
    if (t2 < 0 || t2 >= t1.length)
      throw $.ioore(t2);
    t1[t2] = element;
    this._tail = $.$and$n(t2 + 1, this._table.length - 1);
    if (this._head === this._tail)
      this._grow$0();
    this._modificationCount = this._modificationCount + 1;
  },
  _grow$0: function() {
    var newTable, t1, t2, split;
    newTable = $.List_List(this._table.length * 2);
    t1 = this._table;
    t2 = this._head;
    split = t1.length - t2;
    $.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
    $.JSArray_methods.setRange$4(newTable, split, split + this._head, this._table, 0);
    this._head = 0;
    this._tail = this._table.length;
    this._table = newTable;
  },
  _writeToList$1: function(target) {
    var t1, t2, $length, firstPartSize;
    t1 = $.JSInt_methods.$le(this._head, this._tail);
    t2 = this._head;
    if (t1) {
      $length = $.$sub$n(this._tail, t2);
      $.JSArray_methods.setRange$4(target, 0, $length, this._table, this._head);
      return $length;
    } else {
      t1 = this._table;
      firstPartSize = t1.length - t2;
      $.JSArray_methods.setRange$4(target, 0, firstPartSize, t1, t2);
      t2 = this._tail;
      if (typeof t2 !== "number")
        throw $.iae(t2);
      $.JSArray_methods.setRange$4(target, firstPartSize, firstPartSize + t2, this._table, 0);
      return $.$add$ns(this._tail, firstPartSize);
    }
  },
  _preGrow$1: function(newElementCount) {
    var newTable = $.List_List($.ListQueue__nextPowerOf2(newElementCount));
    this._tail = this._writeToList$1(newTable);
    this._table = newTable;
    this._head = 0;
  },
  ListQueue$1: function(initialCapacity) {
    if (initialCapacity == null || $.JSNull_methods.$lt(initialCapacity, 8))
      initialCapacity = 8;
    else if (!$.ListQueue__isPowerOf2(initialCapacity))
      initialCapacity = $.ListQueue__nextPowerOf2(initialCapacity);
    this._table = $.List_List(initialCapacity);
  },
  $asIterable: function() {
    return null;
  },
  $isIterable: function() {
    return true;
  }
};

$$._ListQueueIterator = {"": "Object;_queue,_end,_modificationCount,_liblib0$_position,_liblib0$_current",
  get$current: function() {
    return this._liblib0$_current;
  },
  moveNext$0: function() {
    var t1, t2, t3;
    t1 = this._queue;
    t1._checkModification$1(this._modificationCount);
    t2 = this._liblib0$_position;
    if (t2 === this._end) {
      this._liblib0$_current = null;
      return false;
    }
    t3 = t1._table;
    if (t2 < 0 || t2 >= t3.length)
      throw $.ioore(t2);
    this._liblib0$_current = t3[t2];
    this._liblib0$_position = (this._liblib0$_position + 1 & t1._table.length - 1) >>> 0;
    return true;
  }
};

$$.Duration = {"": "Object;_duration<",
  $add: function(_, other) {
    return $.Duration$(0, 0, this._duration + other.get$_duration(), 0, 0, 0);
  },
  $sub: function(_, other) {
    return $.Duration$(0, 0, this._duration - other.get$_duration(), 0, 0, 0);
  },
  $mul: function(_, factor) {
    return $.Duration$(0, 0, this._duration * factor, 0, 0, 0);
  },
  $tdiv: function(_, quotient) {
    if (quotient === 0)
      throw $.wrapException($.IntegerDivisionByZeroException$());
    return $.Duration$(0, 0, $.JSNumber_methods.$tdiv(this._duration, quotient), 0, 0, 0);
  },
  $lt: function(_, other) {
    return this._duration < other.get$_duration();
  },
  $gt: function(_, other) {
    return this._duration > other.get$_duration();
  },
  $ge: function(_, other) {
    return this._duration >= other.get$_duration();
  },
  get$inHours: function() {
    return $.JSNumber_methods.$tdiv(this._duration, 3600000000);
  },
  get$inMinutes: function() {
    return $.JSNumber_methods.$tdiv(this._duration, 60000000);
  },
  get$inSeconds: function() {
    return $.JSNumber_methods.$tdiv(this._duration, 1000000);
  },
  get$inMilliseconds: function() {
    return $.JSNumber_methods.$tdiv(this._duration, 1000);
  },
  get$inMicroseconds: function() {
    return this._duration;
  },
  $eq: function(_, other) {
    if (other == null)
      return false;
    if (typeof other !== "object" || other === null || !$.getInterceptor(other).$isDuration)
      return false;
    return this._duration === other._duration;
  },
  get$hashCode: function(_) {
    return $.JSNumber_methods.get$hashCode(this._duration);
  },
  toString$0: function(_) {
    var t1, t2, twoDigitMinutes, twoDigitSeconds, sixDigitUs;
    t1 = new $.Duration_toString_sixDigits();
    t2 = new $.Duration_toString_twoDigits();
    if (this.get$inMicroseconds() < 0)
      return "-" + $.S($.Duration$(0, 0, -this.get$inMicroseconds(), 0, 0, 0));
    twoDigitMinutes = t2.call$1($.JSNumber_methods.remainder$1(this.get$inMinutes(), 60));
    twoDigitSeconds = t2.call$1($.JSNumber_methods.remainder$1(this.get$inSeconds(), 60));
    sixDigitUs = t1.call$1($.JSNumber_methods.remainder$1(this.get$inMicroseconds(), 1000000));
    return $.S(this.get$inHours()) + ":" + $.S(twoDigitMinutes) + ":" + $.S(twoDigitSeconds) + "." + $.S(sixDigitUs);
  },
  $isDuration: true
};

$$.Duration_toString_sixDigits = {"": "Closure;",
  call$1: function(n) {
    var t1 = $.getInterceptor$n(n);
    if (t1.$ge(n, 100000))
      return $.S(n);
    if (t1.$ge(n, 10000))
      return "0" + $.S(n);
    if (t1.$ge(n, 1000))
      return "00" + $.S(n);
    if (t1.$ge(n, 100))
      return "000" + $.S(n);
    if (t1.$gt(n, 10))
      return "0000" + $.S(n);
    return "00000" + $.S(n);
  }
};

$$.Duration_toString_twoDigits = {"": "Closure;",
  call$1: function(n) {
    if ($.$ge$n(n, 10))
      return $.S(n);
    return "0" + $.S(n);
  }
};

$$.NullThrownError = {"": "Object;",
  toString$0: function(_) {
    return "Throw of null.";
  }
};

$$.ArgumentError = {"": "Object;message",
  toString$0: function(_) {
    var t1 = this.message;
    if (t1 != null)
      return "Illegal argument(s): " + $.S(t1);
    return "Illegal argument(s)";
  }
};

$$.RangeError = {"": "ArgumentError;message",
  toString$0: function(_) {
    return "RangeError: " + $.S(this.message);
  }
};

$$.NoSuchMethodError = {"": "Object;_receiver,_memberName,_arguments,_namedArguments,_existingArgumentNames",
  toString$0: function(_) {
    var t1, t2, t3, t4, actualParameters, i, formalParameters;
    t1 = {};
    t1.sb_0 = $.StringBuffer$("");
    t1.i_1 = 0;
    t2 = this._arguments;
    for (; $.$lt$n(t1.i_1, t2.length); t1.i_1 = $.$add$ns(t1.i_1, 1)) {
      if ($.$gt$n(t1.i_1, 0))
        t1.sb_0.write$1(", ");
      t3 = t1.sb_0;
      t4 = t1.i_1;
      if (t4 !== (t4 | 0))
        throw $.iae(t4);
      if (t4 < 0 || t4 >= t2.length)
        throw $.ioore(t4);
      t3.write$1($.Error_safeToString(t2[t4]));
    }
    t2 = this._namedArguments;
    t2.forEach$1(t2, new $.NoSuchMethodError_toString_anon(t1));
    t2 = this._existingArgumentNames;
    if (t2 == null)
      return "NoSuchMethodError : method not found: '" + $.S(this._memberName) + "'\nReceiver: " + $.S($.Error_safeToString(this._receiver)) + "\nArguments: [" + $.S(t1.sb_0) + "]";
    else {
      t3 = t1.sb_0;
      actualParameters = t3.toString$0(t3);
      t1.sb_0 = $.StringBuffer$("");
      for (i = 0; $.JSNumber_methods.$lt(i, $.JSNull_methods.get$length(t2)); ++i) {
        if (i > 0)
          t1.sb_0.write$1(", ");
        t1.sb_0.write$1($.JSNull_methods.$index(t2, i));
      }
      t1 = t1.sb_0;
      formalParameters = t1.toString$0(t1);
      t1 = this._memberName;
      return "NoSuchMethodError: incorrect number of arguments passed to method named '" + $.S(t1) + "'\nReceiver: " + $.S($.Error_safeToString(this._receiver)) + "\nTried calling: " + $.S(t1) + "(" + actualParameters + ")\nFound: " + $.S(t1) + "(" + formalParameters + ")";
    }
  }
};

$$.UnsupportedError = {"": "Object;message",
  toString$0: function(_) {
    return "Unsupported operation: " + this.message;
  }
};

$$.UnimplementedError = {"": "Object;message",
  toString$0: function(_) {
    var t1 = this.message;
    return t1 != null ? "UnimplementedError: " + $.S(t1) : "UnimplementedError";
  }
};

$$.StateError = {"": "Object;message",
  toString$0: function(_) {
    return "Bad state: " + this.message;
  }
};

$$.ConcurrentModificationError = {"": "Object;modifiedObject",
  toString$0: function(_) {
    var t1 = this.modifiedObject;
    if (t1 == null)
      return "Concurrent modification during iteration.";
    return "Concurrent modification during iteration: " + $.S($.Error_safeToString(t1)) + ".";
  }
};

$$.StackOverflowError = {"": "Object;",
  toString$0: function(_) {
    return "Stack Overflow";
  }
};

$$.RuntimeError = {"": "Object;message",
  toString$0: function(_) {
    return "RuntimeError: " + this.message;
  }
};

$$._ExceptionImplementation = {"": "Object;message",
  toString$0: function(_) {
    var t1 = this.message;
    if (t1 == null)
      return "Exception";
    return "Exception: " + $.S(t1);
  },
  $isException: true
};

$$.FormatException = {"": "Object;message",
  toString$0: function(_) {
    return "FormatException: " + this.message;
  },
  $isException: true
};

$$.IntegerDivisionByZeroException = {"": "Object;",
  toString$0: function(_) {
    return "IntegerDivisionByZeroException";
  },
  $isException: true
};

$$.Expando = {"": "Object;name>",
  toString$0: function(_) {
    return "Expando:" + this.name;
  },
  $index: function(_, object) {
    var values = $.Primitives_getProperty(object, "expando$values");
    return values == null ? null : $.Primitives_getProperty(values, this._getKey$0());
  },
  $indexSet: function(_, object, value) {
    var values = $.Primitives_getProperty(object, "expando$values");
    if (values == null) {
      values = $.Object$();
      $.Primitives_setProperty(object, "expando$values", values);
    }
    $.Primitives_setProperty(values, this._getKey$0(), value);
  },
  _getKey$0: function() {
    var key, t1;
    key = $.Primitives_getProperty(this, "expando$key");
    if (key == null) {
      t1 = $.Expando__keyCount;
      $.Expando__keyCount = $.$add$ns(t1, 1);
      key = "expando$key$" + $.S(t1);
      $.Primitives_setProperty(this, "expando$key", key);
    }
    return key;
  }
};

$$.Iterator = {"": "Object;"};

$$.Object = {"": ";",
  $eq: function(_, other) {
    return this === other;
  },
  get$hashCode: function(_) {
    return $.Primitives_objectHashCode(this);
  },
  toString$0: function(_) {
    return "Instance of '" + $.S($.Primitives_objectTypeName(this)) + "'";
  }
};

$$.StringBuffer = {"": "Object;_contents",
  get$length: function(_) {
    return this._contents.length;
  },
  get$isEmpty: function(_) {
    return this.get$length(this) === 0;
  },
  write$1: function(obj) {
    if (typeof obj !== "string")
      return this.write$1$bailout(1, obj);
    this._contents = this._contents + obj;
  },
  write$1$bailout: function(state0, obj) {
    var str = typeof obj === "string" ? obj : $.S(obj);
    this._contents = this._contents + str;
  },
  writeAll$2: function(objects, separator) {
    var iterator, str;
    if (typeof separator !== "string")
      return this.writeAll$2$bailout(1, objects, separator);
    iterator = $.get$iterator$ax(objects);
    if (iterator.moveNext$0() !== true)
      return;
    if ($.JSString_methods.get$isEmpty(separator))
      do {
        str = iterator.get$current();
        str = typeof str === "string" ? str : $.S(str);
        this._contents = this._contents + str;
      } while (iterator.moveNext$0() === true);
    else {
      str = iterator.get$current();
      str = typeof str === "string" ? str : $.S(str);
      this._contents = this._contents + str;
      for (; iterator.moveNext$0() === true;) {
        this._contents = this._contents + separator;
        str = iterator.get$current();
        str = typeof str === "string" ? str : $.S(str);
        this._contents = this._contents + str;
      }
    }
  },
  writeAll$2$bailout: function(state0, objects, separator) {
    var iterator, str, t1;
    iterator = $.get$iterator$ax(objects);
    if (iterator.moveNext$0() !== true)
      return;
    if ($.get$isEmpty$asx(separator) === true)
      do {
        str = iterator.get$current();
        str = typeof str === "string" ? str : $.S(str);
        this._contents = this._contents + str;
      } while (iterator.moveNext$0() === true);
    else {
      str = iterator.get$current();
      str = typeof str === "string" ? str : $.S(str);
      this._contents = this._contents + str;
      for (t1 = typeof separator === "string"; iterator.moveNext$0() === true;) {
        str = t1 ? separator : $.S(separator);
        this._contents = this._contents + str;
        str = iterator.get$current();
        str = typeof str === "string" ? str : $.S(str);
        this._contents = this._contents + str;
      }
    }
  },
  toString$0: function(_) {
    return this._contents;
  },
  StringBuffer$1: function($content) {
    this._contents = $content;
  }
};

$$._ChildrenElementList = {"": "ListBase;_liblib1$_element,_childElements",
  toList$1$growable: function(_, growable) {
    var t1, output, len, t2, i, t3;
    t1 = this._childElements;
    if (growable === true) {
      output = [];
      $.JSArray_methods.set$length(output, $.get$length$asx(t1));
    } else
      output = $.List_List($.get$length$asx(t1));
    for (t1 = this._childElements, len = $.get$length$asx(t1), t2 = $.getInterceptor$asx(t1), i = 0; i < len; ++i) {
      t3 = t2.$index(t1, i);
      if (i >= output.length)
        throw $.ioore(i);
      output[i] = t3;
    }
    return output;
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  forEach$1: function(_, f) {
    var t1;
    for (t1 = $.get$iterator$ax(this._childElements); t1.moveNext$0();)
      f.call$1(t1.get$current());
  },
  get$isEmpty: function(_) {
    return this._liblib1$_element.firstElementChild == null;
  },
  skip$1: function(_, n) {
    return $.skip$1$ax(this._childElements, n);
  },
  elementAt$1: function(_, index) {
    return $.$index$asx(this._childElements, index);
  },
  get$length: function(_) {
    return $.get$length$asx(this._childElements);
  },
  $index: function(_, index) {
    return $.$index$asx(this._childElements, index);
  },
  $indexSet: function(_, index, value) {
    this._liblib1$_element.replaceChild(value, $.$index$asx(this._childElements, index));
  },
  set$length: function(_, newLength) {
    throw $.wrapException($.UnsupportedError$(""));
  },
  add$1: function(_, value) {
    this._liblib1$_element.appendChild(value);
    return value;
  },
  get$iterator: function(_) {
    return $.JSArray_methods.get$iterator(this.toList$0(this));
  },
  addAll$1: function(_, iterable) {
    var t1, t2;
    if (typeof iterable === "object" && iterable !== null && !!$.getInterceptor(iterable).$is_ChildNodeListLazy)
      iterable = $.List_List$from(iterable, true);
    for (t1 = $.get$iterator$ax(iterable), t2 = this._liblib1$_element; t1.moveNext$0() === true;)
      t2.appendChild(t1.get$current());
  },
  sublist$2: function(_, start, end) {
    if (end == null)
      end = this.get$length(this);
    return $._FrozenElementList$_wrap($.Lists_getRange(this, start, end, []));
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  clear$0: function(_) {
    this._liblib1$_element.textContent = "";
  },
  removeLast$0: function(_) {
    var result = this.get$last(this);
    if (result != null)
      this._liblib1$_element.removeChild(result);
    return result;
  },
  get$last: function(_) {
    var result = this._liblib1$_element.lastElementChild;
    if (result == null)
      throw $.wrapException($.StateError$("No elements"));
    return result;
  },
  toString$0: function(_) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(this, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  $asList: function() {
    return function () { return [$.Element]; };
  },
  $asIterable: function() {
    return function () { return [$.Element]; };
  }
};

$$._FrozenElementList = {"": "ListBase;_nodeList",
  get$length: function(_) {
    return $.get$length$asx(this._nodeList);
  },
  $index: function(_, index) {
    var t1 = this._nodeList;
    if (typeof t1 !== "string" && (typeof t1 !== "object" || t1 === null || t1.constructor !== Array && !$.getInterceptor(t1).$isJavaScriptIndexingBehavior()))
      return this.$$index$bailout(1, index, t1);
    if (index !== (index | 0))
      throw $.iae(index);
    if (index < 0 || index >= t1.length)
      throw $.ioore(index);
    return t1[index];
  },
  $$index$bailout: function(state0, index, t1) {
    return $.$index$asx(t1, index);
  },
  $indexSet: function(_, index, value) {
    throw $.wrapException($.UnsupportedError$(""));
  },
  set$length: function(_, newLength) {
    $.set$length$asx(this._nodeList, newLength);
  },
  add$1: function(_, value) {
    throw $.wrapException($.UnsupportedError$(""));
  },
  addAll$1: function(_, iterable) {
    throw $.wrapException($.UnsupportedError$(""));
  },
  sublist$2: function(_, start, end) {
    return $._FrozenElementList$_wrap($.sublist$2$ax(this._nodeList, start, end));
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  clear$0: function(_) {
    throw $.wrapException($.UnsupportedError$(""));
  },
  removeLast$0: function(_) {
    throw $.wrapException($.UnsupportedError$(""));
  },
  toString$0: function(_) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(this, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  $asList: function() {
    return function () { return [null]; };
  },
  $asIterable: function() {
    return function () { return [null]; };
  }
};

$$._ElementCssClassSet = {"": "CssClassSet;_liblib1$_element",
  readClasses$0: function() {
    var s, t1, trimmed;
    s = $.LinkedHashSet$();
    for (t1 = $.JSArray_methods.get$iterator($.split$1$s(this._liblib1$_element.className, " ")); t1.moveNext$0();) {
      trimmed = $.trim$0$s(t1.get$current());
      if (!$.JSString_methods.get$isEmpty(trimmed))
        s.add$1(s, trimmed);
    }
    return s;
  },
  writeClasses$1: function(s) {
    $.List_List$from(s, true);
    this._liblib1$_element.className = s.join$1(s, " ");
  }
};

$$.HttpRequest_getString_anon = {"": "Closure;",
  call$1: function(xhr) {
    return $.get$responseText$x(xhr);
  }
};

$$.HttpRequest_request_anon = {"": "Closure;completer_0,xhr_1",
  call$1: function(e) {
    var t1, t2, t3;
    t1 = this.xhr_1;
    if (!($.$ge$n(t1.status, 200) && $.$lt$n(t1.status, 300))) {
      t2 = t1.status;
      t2 = t2 === 0 || t2 === 304;
    } else
      t2 = true;
    t3 = this.completer_0;
    if (t2)
      t3.complete$1(t3, t1);
    else
      t3.completeError$1(e);
  }
};

$$.HttpRequest_request_anon0 = {"": "Closure;completer_2",
  call$1: function(e) {
    this.completer_2.completeError$1(e);
  }
};

$$._ChildNodeListLazy = {"": "ListBase;_this",
  get$last: function(_) {
    var result = this._this.lastChild;
    if (result == null)
      throw $.wrapException($.StateError$("No elements"));
    return result;
  },
  add$1: function(_, value) {
    this._this.appendChild(value);
  },
  addAll$1: function(_, iterable) {
    var t1, len, i, t2;
    if (typeof iterable === "object" && iterable !== null && !!$.getInterceptor(iterable).$is_ChildNodeListLazy) {
      t1 = this._this;
      if (iterable._this !== t1) {
        len = iterable.get$length(iterable);
        if (typeof len !== "number")
          return this.addAll$1$bailout1(1, iterable, len, t1);
        i = 0;
        for (; i < len; ++i)
          t1.appendChild(iterable.$index(iterable, 0));
      }
      return;
    }
    for (t1 = $.get$iterator$ax(iterable), t2 = this._this; t1.moveNext$0() === true;)
      t2.appendChild(t1.get$current());
  },
  addAll$1$bailout1: function(state0, iterable, len, t1) {
    switch (state0) {
      case 0:
      case 1:
        var i, t2;
        if (state0 === 1 || state0 === 0 && typeof iterable === "object" && iterable !== null && !!$.getInterceptor(iterable).$is_ChildNodeListLazy)
          switch (state0) {
            case 0:
              t1 = this._this;
            case 1:
              if (state0 === 1 || state0 === 0 && iterable._this !== t1)
                switch (state0) {
                  case 0:
                    len = iterable.get$length(iterable);
                  case 1:
                    state0 = 0;
                    i = 0;
                    for (; $.JSNumber_methods.$lt(i, len); ++i)
                      t1.appendChild(iterable.$index(iterable, 0));
                }
              return;
          }
        for (t1 = $.get$iterator$ax(iterable), t2 = this._this; t1.moveNext$0() === true;)
          t2.appendChild(t1.get$current());
    }
  },
  removeLast$0: function(_) {
    var result = this.get$last(this);
    if (result != null)
      this._this.removeChild(result);
    return result;
  },
  clear$0: function(_) {
    this._this.textContent = "";
  },
  $indexSet: function(_, index, value) {
    var t1, t2;
    t1 = this._this;
    t2 = t1.childNodes;
    if (typeof t2 !== "string" && (typeof t2 !== "object" || t2 === null || t2.constructor !== Array && !$.getInterceptor(t2).$isJavaScriptIndexingBehavior()))
      return this.$$indexSet$bailout(1, t1, value, t2, index);
    if (index !== (index | 0))
      throw $.iae(index);
    if (index < 0 || index >= t2.length)
      throw $.ioore(index);
    t1.replaceChild(value, t2[index]);
  },
  $$indexSet$bailout: function(state0, t1, value, t2, index) {
    t1.replaceChild(value, $.$index$asx(t2, index));
  },
  get$iterator: function(_) {
    return $.get$iterator$ax(this._this.childNodes);
  },
  toList$1$growable: function(_, growable) {
    return $.List_List$from(this, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$isEmpty: function(_) {
    return $.$eq(this.get$length(this), 0);
  },
  sublist$2: function(_, start, end) {
    if (end == null)
      $.$eq(end, this.get$length(this));
    return $.Lists_getRange(this, start, end, []);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  toString$0: function(_) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(this, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  get$length: function(_) {
    return $.get$length$asx(this._this.childNodes);
  },
  set$length: function(_, value) {
    throw $.wrapException($.UnsupportedError$("Cannot set length on immutable List."));
  },
  $index: function(_, index) {
    var t1 = this._this.childNodes;
    if (typeof t1 !== "string" && (typeof t1 !== "object" || t1 === null || t1.constructor !== Array && !$.getInterceptor(t1).$isJavaScriptIndexingBehavior()))
      return this.$$index$bailout(1, index, t1);
    if (index !== (index | 0))
      throw $.iae(index);
    if (index < 0 || index >= t1.length)
      throw $.ioore(index);
    return t1[index];
  },
  $$index$bailout: function(state0, index, t1) {
    return $.$index$asx(t1, index);
  },
  $is_ChildNodeListLazy: true,
  $asList: function() {
    return function () { return [$.Node]; };
  },
  $asIterable: function() {
    return function () { return [$.Node]; };
  }
};

$$._AttributeMap = {"": "Object;",
  forEach$1: function(_, f) {
    var t1, t2;
    for (t1 = $.JSArray_methods.get$iterator(this.get$keys()); t1.moveNext$0();) {
      t2 = t1.get$current();
      f.call$2(t2, this.$index(this, t2));
    }
  },
  get$keys: function() {
    var attributes, keys, t1, len, i;
    attributes = this._liblib1$_element.attributes;
    keys = $.List_List($);
    for (t1 = $.getInterceptor$asx(attributes), len = t1.get$length(attributes), i = 0; i < len; ++i)
      if (this._matches$1(t1.$index(attributes, i)))
        keys.push(t1.$index(attributes, i).localName);
    return keys;
  },
  get$values: function(_) {
    var attributes, values, t1, len, i;
    attributes = this._liblib1$_element.attributes;
    values = $.List_List($);
    for (t1 = $.getInterceptor$asx(attributes), len = t1.get$length(attributes), i = 0; i < len; ++i)
      if (this._matches$1(t1.$index(attributes, i)))
        values.push($.get$value$x(t1.$index(attributes, i)));
    return values;
  },
  get$isEmpty: function(_) {
    return this.get$length(this) === 0;
  },
  $isMap: true,
  $asMap: function () { return [$.String, $.String]; }
};

$$._ElementAttributeMap = {"": "_AttributeMap;_liblib1$_element",
  $index: function(_, key) {
    return this._liblib1$_element.getAttribute(key);
  },
  $indexSet: function(_, key, value) {
    this._liblib1$_element.setAttribute(key, value);
  },
  get$length: function(_) {
    return this.get$keys().length;
  },
  _matches$1: function(node) {
    return node.namespaceURI == null;
  }
};

$$.CssClassSet = {"": "Object;",
  toString$0: function(_) {
    var t1 = this.readClasses$0();
    return t1.join$1(t1, " ");
  },
  toggle$1: function(value) {
    var s, result;
    s = this.readClasses$0();
    if (s.contains$1(s, value) === true) {
      s.remove$1(s, value);
      result = false;
    } else {
      s.add$1(s, value);
      result = true;
    }
    this.writeClasses$1(s);
    return result;
  },
  get$iterator: function(_) {
    var t1 = this.readClasses$0();
    return t1.get$iterator(t1);
  },
  forEach$1: function(_, f) {
    var t1 = this.readClasses$0();
    t1.forEach$1(t1, f);
  },
  get$isEmpty: function(_) {
    var t1 = this.readClasses$0();
    return t1.get$isEmpty(t1);
  },
  get$length: function(_) {
    var t1 = this.readClasses$0();
    return t1.get$length(t1);
  },
  add$1: function(_, value) {
    var t1, s;
    t1 = new $.CssClassSet_add_anon(value);
    s = this.readClasses$0();
    t1.call$1(s);
    this.writeClasses$1(s);
  },
  addAll$1: function(_, iterable) {
    var t1, s;
    t1 = new $.CssClassSet_addAll_anon(iterable);
    s = this.readClasses$0();
    t1.call$1(s);
    this.writeClasses$1(s);
  },
  toList$1$growable: function(_, growable) {
    var t1 = this.readClasses$0();
    return t1.toList$1$growable(t1, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  skip$1: function(_, n) {
    var t1 = this.readClasses$0();
    return t1.skip$1(t1, n);
  },
  elementAt$1: function(_, index) {
    var t1 = this.readClasses$0();
    return t1.elementAt$1(t1, index);
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return function () { return [$.String]; };
  }
};

$$.CssClassSet_add_anon = {"": "Closure;value_0",
  call$1: function(s) {
    return $.add$1$ax(s, this.value_0);
  }
};

$$.CssClassSet_addAll_anon = {"": "Closure;iterable_0",
  call$1: function(s) {
    return $.addAll$1$ax(s, this.iterable_0);
  }
};

$$._EventStream = {"": "Stream;_target,_eventType,_useCapture",
  listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
    return $._EventStreamSubscription$(this._target, this._eventType, onData, this._useCapture);
  },
  listen$1: function(onData) {
    return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
  },
  listen$3$onDone$onError: function(onData, onDone, onError) {
    return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
  }
};

$$._EventStreamSubscription = {"": "StreamSubscription;_pauseCount,_target,_eventType,_liblib1$_onData,_useCapture",
  cancel$0: function() {
    if (this.get$_canceled())
      return;
    var t1 = this._liblib1$_onData;
    if (t1 != null)
      $.$$dom_removeEventListener$3$x(this._target, this._eventType, t1, this._useCapture);
    this._target = null;
    this._liblib1$_onData = null;
  },
  get$_canceled: function() {
    return this._target == null;
  },
  get$_paused: function() {
    return this._pauseCount > 0;
  },
  _tryResume$0: function() {
    if (this._liblib1$_onData != null && !this.get$_paused())
      $.$$dom_addEventListener$3$x(this._target, this._eventType, this._liblib1$_onData, this._useCapture);
  },
  _EventStreamSubscription$4: function(_target, _eventType, _onData, _useCapture) {
    this._tryResume$0();
  }
};

$$.EventStreamProvider = {"": "Object;_eventType",
  forTarget$2$useCapture: function(e, useCapture) {
    return $._EventStream$(e, this._eventType, useCapture);
  },
  forTarget$1: function(e) {
    return this.forTarget$2$useCapture(e, false);
  }
};

$$.FixedSizeListIterator = {"": "Object;_array,_length,_position,_current",
  moveNext$0: function() {
    var t1, nextPosition;
    t1 = this._position;
    if (typeof t1 !== "number")
      return this.moveNext$0$bailout(1, t1);
    nextPosition = t1 + 1;
    t1 = this._length;
    if (nextPosition < t1) {
      this._current = $.$index$asx(this._array, nextPosition);
      this._position = nextPosition;
      return true;
    }
    this._current = null;
    this._position = t1;
    return false;
  },
  moveNext$0$bailout: function(state0, t1) {
    var nextPosition = $.$add$ns(t1, 1);
    t1 = this._length;
    if ($.$lt$n(nextPosition, t1)) {
      this._current = $.$index$asx(this._array, nextPosition);
      this._position = nextPosition;
      return true;
    }
    this._current = null;
    this._position = t1;
    return false;
  },
  get$current: function() {
    return this._current;
  }
};

$$.convertDartToNative_Dictionary_anon = {"": "Closure;object_0",
  call$2: function(key, value) {
    this.object_0[key] = value;
  }
};

$$.FilteredElementList = {"": "ListBase;_node,_childNodes",
  get$_filtered: function() {
    var t1 = this._childNodes;
    return $.List_List$from(t1.where$1(t1, new $.FilteredElementList__filtered_anon()), true);
  },
  forEach$1: function(_, f) {
    $.JSArray_methods.forEach$1(this.get$_filtered(), f);
  },
  $indexSet: function(_, index, value) {
    var t1 = this.get$_filtered();
    if (index !== (index | 0))
      throw $.iae(index);
    if (index < 0 || index >= t1.length)
      throw $.ioore(index);
    $.replaceWith$1$x(t1[index], value);
  },
  set$length: function(_, newLength) {
    var len;
    if (typeof newLength !== "number")
      return this.set$length$bailout(1, newLength);
    len = this.get$length(this);
    if (newLength >= len)
      return;
    else if (newLength < 0)
      throw $.wrapException($.ArgumentError$("Invalid list length"));
    this.removeRange$2(this, newLength, len);
  },
  set$length$bailout: function(state0, newLength) {
    var len, t1;
    len = this.get$length(this);
    t1 = $.getInterceptor$n(newLength);
    if (t1.$ge(newLength, len))
      return;
    else if (t1.$lt(newLength, 0))
      throw $.wrapException($.ArgumentError$("Invalid list length"));
    this.removeRange$2(this, newLength, len);
  },
  add$1: function(_, value) {
    var t1 = this._childNodes;
    t1.add$1(t1, value);
  },
  addAll$1: function(_, iterable) {
    var t1, t2;
    for (t1 = $.get$iterator$ax(iterable), t2 = this._childNodes; t1.moveNext$0() === true;)
      t2.add$1(t2, t1.get$current());
  },
  removeRange$2: function(_, start, end) {
    $.JSArray_methods.forEach$1($.JSArray_methods.sublist$2(this.get$_filtered(), start, end), new $.FilteredElementList_removeRange_anon());
  },
  clear$0: function(_) {
    var t1 = this._childNodes;
    t1.clear$0(t1);
  },
  removeLast$0: function(_) {
    var result = this.get$last(this);
    if (result != null)
      $.remove$0$ax(result);
    return result;
  },
  toList$1$growable: function(_, growable) {
    return $.List_List$from(this, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  elementAt$1: function(_, index) {
    var t1 = this.get$_filtered();
    if (index !== (index | 0))
      throw $.iae(index);
    if (index < 0 || index >= t1.length)
      throw $.ioore(index);
    return t1[index];
  },
  get$isEmpty: function(_) {
    return $.JSArray_methods.get$isEmpty(this.get$_filtered());
  },
  get$length: function(_) {
    return this.get$_filtered().length;
  },
  $index: function(_, index) {
    var t1 = this.get$_filtered();
    if (index !== (index | 0))
      throw $.iae(index);
    if (index < 0 || index >= t1.length)
      throw $.ioore(index);
    return t1[index];
  },
  get$iterator: function(_) {
    return $.JSArray_methods.get$iterator(this.get$_filtered());
  },
  sublist$2: function(_, start, end) {
    return $.JSArray_methods.sublist$2(this.get$_filtered(), start, end);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  skip$1: function(_, n) {
    return this.get$IterableMixinWorkaround().skipList$2(this, n);
  },
  get$last: function(_) {
    return $.JSArray_methods.get$last(this.get$_filtered());
  },
  $asList: function() {
    return function () { return [$.Element]; };
  },
  $asIterable: function() {
    return function () { return [$.Element]; };
  }
};

$$.FilteredElementList__filtered_anon = {"": "Closure;",
  call$1: function(n) {
    return typeof n === "object" && n !== null && $.getInterceptor(n).$isElement();
  }
};

$$.FilteredElementList_removeRange_anon = {"": "Closure;",
  call$1: function(el) {
    return $.remove$0$ax(el);
  }
};

$$._AttributeClassSet = {"": "CssClassSet;_liblib2$_element",
  readClasses$0: function() {
    var t1, classname, s, trimmed;
    t1 = $.get$attributes$x(this._liblib2$_element);
    classname = t1.$index(t1, "class");
    s = $.LinkedHashSet$();
    if (classname == null)
      return s;
    for (t1 = $.JSArray_methods.get$iterator($.split$1$s(classname, " ")); t1.moveNext$0();) {
      trimmed = $.trim$0$s(t1.get$current());
      if (!$.JSString_methods.get$isEmpty(trimmed))
        s.add$1(s, trimmed);
    }
    return s;
  },
  writeClasses$1: function(s) {
    var t1 = $.get$attributes$x(this._liblib2$_element);
    t1.$indexSet(t1, "class", s.join$1(s, " "));
  }
};

$$.BarGraph = {"": "Object;_canvas,_model,_elements,scaleHeight",
  addSample$1: function(segments) {
    if (segments.length !== this._elements.length)
      throw $.wrapException($.RuntimeError$("invalid sample size for graph"));
    this._model.addSample$1(segments);
  },
  drawBarGraph$0: function() {
    var t1, context, t2, x, i, y;
    t1 = this._canvas;
    $.Primitives_printString("drawBarGraph: _canvas=" + $.S(t1));
    context = $.get$context2D$x(t1);
    context.beginPath();
    context.strokeStyle = "black";
    t2 = $.getInterceptor$x(t1);
    context.strokeRect(48, 1, $.$add$ns($.$sub$n($.$sub$n(t2.get$width(t1), 50), 150), 2), $.$sub$n(t2.get$height(t1), 2), 1);
    x = $.$sub$n(t2.get$width(t1), 130);
    if (typeof x !== "number")
      return this.drawBarGraph$0$bailout(1, context, x);
    context.font = "14px sans-serif";
    for (t1 = this._elements, i = t1.length - 1, t2 = x + 30, y = 20; i >= 0; --i) {
      if (i >= t1.length)
        throw $.ioore(i);
      context.fillStyle = $.get$color$x(t1[i]);
      context.fillRect(x, y, 20, 20);
      context.fillStyle = "black";
      if (i >= t1.length)
        throw $.ioore(i);
      context.fillText($.get$name$x(t1[i]), t2, y + 15);
      y += 30;
    }
  },
  drawBarGraph$0$bailout: function(state0, context, x) {
    var t1, i, t2, y;
    context.font = "14px sans-serif";
    for (t1 = this._elements, i = t1.length - 1, t2 = $.getInterceptor$ns(x), y = 20; i >= 0; --i) {
      if (i >= t1.length)
        throw $.ioore(i);
      context.fillStyle = $.get$color$x(t1[i]);
      context.fillRect(x, y, 20, 20);
      context.fillStyle = "black";
      if (i >= t1.length)
        throw $.ioore(i);
      context.fillText($.get$name$x(t1[i]), t2.$add(x, 30), y + 15);
      y += 30;
    }
  },
  drawGraph$1: function(model) {
    var graphHeight, t1, height, scale;
    graphHeight = model.get$maxTotal();
    t1 = this._canvas;
    t1.clientWidth;
    height = t1.clientHeight;
    t1 = $.getInterceptor$n(graphHeight);
    if (t1.$ge(graphHeight, this.scaleHeight)) {
      this.scaleHeight = t1.$mul(graphHeight, 1.2);
      this.scaleHeight = $.JSNumber_methods.ceil$0($.$div$n(this.scaleHeight, 100)) * 100;
    }
    scale = $.$div$n(height, this.scaleHeight);
    this.drawValues$2(this.scaleHeight, scale);
    this.drawChart$2(this.scaleHeight, scale);
  },
  get$drawGraph: function() {
    return new $.BoundClosure$1(this, "drawGraph$1");
  },
  drawChart$2: function(maxHeight, scale) {
    var t1, dividerHeight, t3, context, height, scaledY, t2, scaledY0, i;
    t1 = $.getInterceptor$n(maxHeight);
    dividerHeight = t1.$tdiv(maxHeight, 5);
    if (typeof dividerHeight !== "number")
      return this.drawChart$2$bailout(1, maxHeight, scale, t1, dividerHeight);
    t3 = this._canvas;
    context = $.get$context2D$x(t3);
    context.beginPath();
    height = t1.toInt$0(maxHeight);
    scaledY = dividerHeight * scale;
    context.clearRect(0, 0, 48, maxHeight);
    for (t1 = $.getInterceptor$x(t3), t2 = $.JSNumber_methods.$tdiv(dividerHeight, 100) * 100, scaledY0 = scaledY, i = 1; i < 5; ++i) {
      height -= t2;
      context.font = "14px sans-serif";
      context.fillStyle = "black";
      context.textAlign = "right";
      context.textBaseline = "middle";
      context.fillText($.JSNumber_methods.toString$0(height), 40, scaledY0);
      context.moveTo(48, scaledY0);
      context.strokeStyle = "grey";
      context.lineWidth = 0.5;
      context.lineTo($.$sub$n(t1.get$width(t3), 150), scaledY0);
      context.stroke();
      scaledY0 += scaledY;
    }
  },
  drawChart$2$bailout: function(state0, maxHeight, scale, t1, dividerHeight) {
    var t3, context, height, scaledY, t2, i, t4;
    t3 = this._canvas;
    context = $.get$context2D$x(t3);
    context.beginPath();
    height = t1.toInt$0(maxHeight);
    t1 = $.getInterceptor$n(dividerHeight);
    scaledY = t1.$mul(dividerHeight, scale);
    context.clearRect(0, 0, 48, maxHeight);
    for (t2 = $.getInterceptor$x(t3), i = 1; i < 5; ++i) {
      t4 = $.$mul$n(t1.$tdiv(dividerHeight, 100), 100);
      if (typeof t4 !== "number")
        throw $.iae(t4);
      height -= t4;
      context.font = "14px sans-serif";
      context.fillStyle = "black";
      context.textAlign = "right";
      context.textBaseline = "middle";
      context.fillText($.JSNumber_methods.toString$0(height), 40, scaledY);
      context.moveTo(48, scaledY);
      context.strokeStyle = "grey";
      context.lineWidth = 0.5;
      context.lineTo($.$sub$n(t2.get$width(t3), 150), scaledY);
      context.stroke();
      scaledY = $.$add$ns(scaledY, t1.$mul(dividerHeight, scale));
    }
  },
  drawValues$2: function(maxHeight, scale) {
    var t1, iterator, w, t2, x, s, blankHeight, y, i, h, t3;
    if (typeof maxHeight !== "number")
      return this.drawValues$2$bailout(1, maxHeight, scale);
    t1 = this._model;
    iterator = t1.get$iterator(t1);
    t1 = this._canvas;
    w = $.$sub$n($.$sub$n($.$sub$n($.get$width$x(t1), 50), 150), 2);
    t2 = $.JSNumber_methods.ceil$0(maxHeight * scale);
    $.get$context2D$x(t1).clearRect(52, 2, w, t2 - 4);
    for (t1 = this._elements, x = 52; iterator.moveNext$0();) {
      s = iterator.get$current();
      t2 = $.getInterceptor(s);
      if (s != null) {
        blankHeight = $.$sub$n(this.scaleHeight, t2.total$0(s));
        this.drawVerticalSegment$6(x, 2, 5, blankHeight, "white", scale);
        if (typeof blankHeight !== "number")
          throw $.iae(blankHeight);
        y = 2 + blankHeight;
        i = $.$sub$n(t2.get$length(s), 1);
        if (i !== (i | 0))
          return this.drawValues$2$bailout(2, maxHeight, scale, t2, t1, iterator, x, y, i, s);
        for (; i >= 0; --i) {
          h = t2.$index(s, i);
          if (i >= t1.length)
            throw $.ioore(i);
          this.drawVerticalSegment$6(x, y, 5, h, $.get$color$x(t1[i]), scale);
          t3 = t2.$index(s, i);
          if (typeof t3 !== "number")
            throw $.iae(t3);
          y += t3;
        }
      } else
        this.drawVerticalSegment$6(x, 2, 5, maxHeight, "white", scale);
      x += 5;
    }
  },
  drawValues$2$bailout: function(state0, maxHeight, scale, t2, t1, iterator, x, y, i, s) {
    switch (state0) {
      case 0:
      case 1:
        state0 = 0;
        t1 = this._model;
        iterator = t1.get$iterator(t1);
        t1 = this._canvas;
        w = $.$sub$n($.$sub$n($.$sub$n($.get$width$x(t1), 50), 150), 2);
        t2 = $.ceil$0$n($.$mul$n(maxHeight, scale));
        $.get$context2D$x(t1).clearRect(52, 2, w, t2 - 4);
        t1 = this._elements;
        x = 52;
      case 2:
        var w, blankHeight, h, t3;
        L0:
          while (true)
            switch (state0) {
              case 0:
                if (!iterator.moveNext$0())
                  break L0;
                s = iterator.get$current();
                t2 = $.getInterceptor(s);
              case 2:
                if (state0 === 2 || state0 === 0 && s != null)
                  switch (state0) {
                    case 0:
                      blankHeight = $.$sub$n(this.scaleHeight, t2.total$0(s));
                      this.drawVerticalSegment$6(x, 2, 5, blankHeight, "white", scale);
                      if (typeof blankHeight !== "number")
                        throw $.iae(blankHeight);
                      y = 2 + blankHeight;
                      i = $.$sub$n(t2.get$length(s), 1);
                    case 2:
                      state0 = 0;
                      for (; $.$ge$n(i, 0); --i) {
                        h = t2.$index(s, i);
                        if (i !== (i | 0))
                          throw $.iae(i);
                        if (i < 0 || i >= t1.length)
                          throw $.ioore(i);
                        this.drawVerticalSegment$6(x, y, 5, h, $.get$color$x(t1[i]), scale);
                        t3 = t2.$index(s, i);
                        if (typeof t3 !== "number")
                          throw $.iae(t3);
                        y += t3;
                      }
                  }
                else
                  this.drawVerticalSegment$6(x, 2, 5, maxHeight, "white", scale);
                x += 5;
            }
    }
  },
  drawVerticalSegment$6: function(x, y, w, h, color, scale) {
    var t1, context, max;
    if (typeof h !== "number")
      return this.drawVerticalSegment$6$bailout(1, x, y, w, h, color, scale);
    t1 = this._canvas;
    context = $.get$context2D$x(t1);
    y = $.JSNumber_methods.floor$0(y * scale);
    h = $.JSNumber_methods.ceil$0(h * scale);
    context.beginPath();
    context.lineWidth = w;
    context.fillStyle = color;
    context.strokeStyle = color;
    if (x < 2)
      x = 2;
    if (y < 2)
      y = 2;
    t1 = $.get$height$x(t1);
    if (typeof t1 !== "number")
      return this.drawVerticalSegment$6$bailout(2, x, y, 0, h, 0, 0, context, t1);
    max = t1 - 2;
    if (y + h > max)
      h = max - y;
    context.moveTo(x, y);
    context.lineTo(x, y + h);
    context.stroke();
  },
  drawVerticalSegment$6$bailout: function(state0, x, y, w, h, color, scale, context, t1) {
    switch (state0) {
      case 0:
      case 1:
        state0 = 0;
        t1 = this._canvas;
        context = $.get$context2D$x(t1);
        y = $.JSNumber_methods.floor$0(y * scale);
        h = $.ceil$0$n($.$mul$n(h, scale));
        context.beginPath();
        context.lineWidth = w;
        context.fillStyle = color;
        context.strokeStyle = color;
        if (x < 2)
          x = 2;
        if (y < 2)
          y = 2;
        t1 = $.get$height$x(t1);
      case 2:
        var max;
        state0 = 0;
        max = $.$sub$n(t1, 2);
        if ($.JSNumber_methods.$gt(y + h, max))
          h = $.$sub$n(max, y);
        context.moveTo(x, y);
        if (typeof h !== "number")
          throw $.iae(h);
        context.lineTo(x, y + h);
        context.stroke();
    }
  },
  BarGraph$2: function(_canvas, _elements) {
    this._model = $.GraphModel$($.$tdiv$n($.$sub$n($.$sub$n($.get$width$x(this._canvas), 50), 150), 5));
    this._model.addListener$2(this.get$drawGraph(), null);
    this.drawBarGraph$0();
  }
};

$$.GraphModel = {"": "ObservableModel;_samples,_maxSize,_listeners",
  addSample$1: function(segments) {
    var t1 = this._samples;
    if ($.JSInt_methods.$ge(t1.length, this._maxSize))
      $.JSArray_methods.remove$1(t1, $.JSArray_methods.get$first(t1));
    t1.push($.Sample$(segments));
    this.notifySuccess$0();
  },
  get$iterator: function(_) {
    return $.JSArray_methods.get$iterator(this._samples);
  },
  $index: function(_, i) {
    var t1 = this._samples;
    if (i !== (i | 0))
      throw $.iae(i);
    if (i < 0 || i >= t1.length)
      throw $.ioore(i);
    return t1[i];
  },
  get$maxTotal: function() {
    var t1 = {};
    t1.max_0 = 1;
    $.JSArray_methods.forEach$1(this._samples, new $.GraphModel_maxTotal_anon(t1));
    return t1.max_0;
  }
};

$$.GraphModel_maxTotal_anon = {"": "Closure;box_0",
  call$1: function(s) {
    var t1, t2, t3, max;
    t1 = $.getInterceptor$x(s);
    t2 = t1.total$0(s);
    t3 = this.box_0;
    max = $.$gt$n(t2, t3.max_0) ? t1.total$0(s) : t3.max_0;
    t3.max_0 = max;
    return max;
  }
};

$$.Element0 = {"": "Object;name>,color>"};

$$.Sample = {"": "Object;_segments",
  get$length: function(_) {
    return this._segments.length;
  },
  $index: function(_, i) {
    var t1 = this._segments;
    if (i !== (i | 0))
      throw $.iae(i);
    if (i < 0 || i >= t1.length)
      throw $.ioore(i);
    return t1[i];
  },
  get$iterator: function(_) {
    return $.JSArray_methods.get$iterator(this._segments);
  },
  total$0: function(_) {
    return $.JSArray_methods.fold$2(this._segments, 0, new $.Sample_total_anon());
  }
};

$$.Sample_total_anon = {"": "Closure;",
  call$2: function(prev, element) {
    return $.$add$ns(prev, element);
  }
};

$$.IsolateList = {"": "Object;_isolateTable",
  updateList$1: function(model) {
    var iterator, t1, t2, t3, isolate, t4, isolateId, t5, detailsCell, basicData, details, stacktraceCell, stacktrace;
    iterator = $.get$iterator$ax(model);
    for (t1 = this._isolateTable, t2 = $.getInterceptor$x(t1); iterator.moveNext$0() === true;) {
      t3 = {};
      isolate = iterator.get$current();
      t4 = $.getInterceptor$x(isolate);
      isolateId = "isolate-" + $.S(t4.get$port(isolate));
      t3.isolateRow_0 = t1.querySelector("#" + isolateId);
      t5 = t3.isolateRow_0;
      if (t5 != null)
        this.updateIsolateDetails$2(isolate, t5);
      else {
        t3.isolateRow_0 = document.createElement("tr");
        $.set$$$dom_className$x(t3.isolateRow_0, "isolate_row");
        $.set$id$x(t3.isolateRow_0, isolateId);
        t5 = t2.get$children(t1);
        t5.add$1(t5, t3.isolateRow_0);
        detailsCell = document.createElement("td");
        t5 = $.getInterceptor$x(detailsCell);
        detailsCell.className = "isolate_details_column";
        $.add$1$ax($.get$children$x(t3.isolateRow_0), detailsCell);
        basicData = document.createElement("div");
        basicData.textContent = $.JSString_methods.replaceAll$2($.replaceAll$2$s(t4.get$name(isolate), "$", ": "), "-", " ");
        t4 = t5.get$children(detailsCell);
        t4.add$1(t4, basicData);
        details = document.createElement("div");
        t4 = $.get$classes$x(details);
        t4.addAll$1(t4, ["isolate_details", "hidden"]);
        t5 = t5.get$children(detailsCell);
        t5.add$1(t5, details);
        stacktraceCell = document.createElement("td");
        t5 = $.getInterceptor$x(stacktraceCell);
        t4 = t5.get$classes(stacktraceCell);
        t4.addAll$1(t4, ["isolate_stacktrace_column", "hidden"]);
        $.add$1$ax($.get$children$x(t3.isolateRow_0), stacktraceCell);
        stacktrace = document.createElement("div");
        t4 = $.get$classes$x(stacktrace);
        t4.addAll$1(t4, ["stack_trace", "hidden"]);
        t5 = t5.get$children(stacktraceCell);
        t5.add$1(t5, stacktrace);
        $.get$onClick$x(t3.isolateRow_0).listen$1(new $.IsolateList_updateList_anon(t3, this));
        this.updateIsolateDetails$2(isolate, t3.isolateRow_0);
      }
    }
  },
  setStacktrace$2: function(element, json) {
    var t1, t2, response, title, t3, stackIterator, i, frame, $frameElement, text, noStack;
    t1 = $.getInterceptor$x(element);
    t2 = t1.get$children(element);
    t2.clear$0(t2);
    response = $.parse(json, null);
    t2 = $.getInterceptor$asx(response);
    t1.set$id(element, t2.$index(response, "handle"));
    title = document.createElement("div");
    title.className = "stack_trace_title";
    title.textContent = "Stack Trace";
    t3 = t1.get$children(element);
    t3.add$1(t3, title);
    if ($.$gt$n($.get$length$asx(t2.$index(response, "stacktrace")), 0)) {
      stackIterator = $.get$iterator$ax(t2.$index(response, "stacktrace"));
      for (i = 0; stackIterator.moveNext$0() === true;) {
        ++i;
        frame = stackIterator.get$current();
        $frameElement = document.createElement("div");
        t2 = $.getInterceptor$asx(frame);
        text = "" + i + ": " + $.S(t2.$index(frame, "url")) + ":" + $.S(t2.$index(frame, "line")) + ": " + $.S(t2.$index(frame, "function"));
        $frameElement.textContent = $.$index$asx(t2.$index(frame, "code"), "optimized") === true ? text + " (optimized)" : text;
        $frameElement.className = "stack_frame";
        t2 = t1.get$children(element);
        t2.add$1(t2, $frameElement);
      }
    } else {
      noStack = document.createElement("div");
      noStack.className = "empty_stack_frame";
      noStack.textContent = "<no stack>";
      t1 = t1.get$children(element);
      t1.add$1(t1, noStack);
    }
  },
  findOrAddChild$2: function($parent, className) {
    var child, t1;
    child = $parent.querySelector("." + className);
    if (child == null) {
      child = document.createElement("div");
      child.className = className;
      t1 = $.get$children$x($parent);
      t1.add$1(t1, child);
    }
    return child;
  },
  updateIsolateDetails$2: function(isolate, row) {
    var details, stackTrace;
    details = row.querySelector(".isolate_details");
    this.findOrAddChild$2(details, "new_space").textContent = "New space: " + $.S(isolate.get$newSpace().used) + "K";
    this.findOrAddChild$2(details, "old_space").textContent = "Old space: " + $.S(isolate.get$oldSpace().used) + "K";
    this.findOrAddChild$2(details, "stack_limit").textContent = "Stack limit: " + $.S($.JSDouble_methods.round$0($.abs$0$n(isolate.get$stackLimit()) / 1000000)) + "M";
    stackTrace = this.findOrAddChild$2(row, "isolate_stacktrace_column");
    $.HttpRequest_getString("/isolate/" + $.S(isolate.get$handle()) + "/stacktrace", null, null).then$1(new $.IsolateList_updateIsolateDetails_anon(this, stackTrace));
  }
};

$$.IsolateList_updateList_anon = {"": "Closure;box_0,this_1",
  call$1: function(e) {
    var t1, t2, t3, t4;
    t1 = this.box_0.isolateRow_0;
    t2 = $.getInterceptor$x(t1);
    t3 = t2.query$1(t1, ".isolate_details");
    t4 = $.getInterceptor$x(t3);
    t4.get$classes(t3).toggle$1("visible");
    t4.get$classes(t3).toggle$1("hidden");
    t1 = t2.query$1(t1, ".isolate_stacktrace_column");
    t2 = $.getInterceptor$x(t1);
    t2.get$classes(t1).toggle$1("visible");
    t2.get$classes(t1).toggle$1("hidden");
    return;
  }
};

$$.IsolateList_updateIsolateDetails_anon = {"": "Closure;this_0,stackTrace_1",
  call$1: function(response) {
    return this.this_0.setStacktrace$2(this.stackTrace_1, response);
  }
};

$$.ObservableModel = {"": "Object;",
  addListener$2: function(onUpdate, onFailure) {
    this._listeners.push($.ModelListener$(onUpdate, onFailure));
  },
  removeListener$1: function(onUpdate) {
    var t1, iterator;
    t1 = this._listeners;
    iterator = $.JSArray_methods.get$iterator(t1);
    for (; iterator.moveNext$0();)
      if (iterator.get$current().get$_onUpdate() === onUpdate) {
        $.JSArray_methods.remove$1(t1, iterator.get$current());
        return;
      }
  },
  notifySuccess$0: function() {
    $.JSArray_methods.forEach$1(this._listeners, new $.ObservableModel_notifySuccess_anon(this));
  },
  notifyFailure$0: function() {
    $.JSArray_methods.forEach$1(this._listeners, new $.ObservableModel_notifyFailure_anon());
  }
};

$$.ObservableModel_notifySuccess_anon = {"": "Closure;this_0",
  call$1: function(listener) {
    return listener.changed$1(this.this_0);
  }
};

$$.ObservableModel_notifyFailure_anon = {"": "Closure;",
  call$1: function(listener) {
    return listener.failed$0();
  }
};

$$.ModelListener = {"": "Object;_onUpdate<,_onFailure",
  _onUpdate$1: function(arg0) {
    return this._onUpdate.call$1(arg0);
  },
  changed$1: function(model) {
    return $.Primitives_applyFunction(this._onUpdate, [model], $.Function__toMangledNames(null));
  },
  failed$0: function() {
    return $.Primitives_applyFunction(this._onFailure, [], $.Function__toMangledNames(null));
  }
};

$$.IsolateListModel = {"": "ObservableModel;_isolates,_listeners",
  update$0: function() {
    $.HttpRequest_getString("/isolates", null, null).then$2$onError(new $.IsolateListModel_update_anon(this), new $.IsolateListModel_update_anon0(this));
  },
  _onUpdate$1: function(isolateMap) {
    var list, i;
    this._isolates = [];
    list = $.$index$asx(isolateMap, "isolates");
    if (typeof list !== "string" && (typeof list !== "object" || list === null || list.constructor !== Array && !$.getInterceptor(list).$isJavaScriptIndexingBehavior()))
      return this._onUpdate$1$bailout(1, list);
    for (i = 0; i < list.length; ++i)
      this._isolates.push($.Isolate$(list[i]));
    this.notifySuccess$0();
  },
  _onUpdate$1$bailout: function(state0, list) {
    var t1, i;
    for (t1 = $.getInterceptor$asx(list), i = 0; $.JSNumber_methods.$lt(i, t1.get$length(list)); ++i)
      this._isolates.push($.Isolate$(t1.$index(list, i)));
    this.notifySuccess$0();
  },
  get$_onUpdate: function() {
    return new $.BoundClosure$1(this, "_onUpdate$1");
  },
  toString$0: function(_) {
    return $.JSArray_methods.join$1(this._isolates, ", ");
  },
  forEach$1: function(_, f) {
    return $.JSArray_methods.forEach$1(this._isolates, f);
  },
  isEmpty$0: function(_) {
    return $.JSArray_methods.get$isEmpty(this._isolates);
  },
  get$isEmpty: function(receiver) {
    return new $.BoundClosure$i0(this, "isEmpty$0", receiver);
  },
  get$iterator: function(_) {
    return $.JSArray_methods.get$iterator(this._isolates);
  },
  get$length: function(_) {
    return this._isolates.length;
  },
  $index: function(_, index) {
    var t1 = this._isolates;
    if (index !== (index | 0))
      throw $.iae(index);
    if (index < 0 || index >= t1.length)
      throw $.ioore(index);
    return t1[index];
  }
};

$$.IsolateListModel_update_anon = {"": "Closure;this_0",
  call$1: function(response) {
    return this.this_0._onUpdate$1($.parse(response, null));
  }
};

$$.IsolateListModel_update_anon0 = {"": "Closure;this_1",
  call$1: function(e) {
    return this.this_1.notifyFailure$0();
  }
};

$$.Isolate = {"": "Object;handle<,name>,port>,startTime,stackLimit<,newSpace<,oldSpace<",
  toString$0: function(_) {
    return $.S(this.name) + ": " + $.S($.$add$ns(this.newSpace.used, this.oldSpace.used)) + "K";
  }
};

$$.Space = {"": "Object;used,capacity",
  toString$0: function(_) {
    return "used: " + $.S(this.used) + " capacity: " + $.S(this.capacity);
  }
};

$$.main_anon = {"": "Closure;",
  call$1: function(timer) {
    return $._isolates.update$0();
  }
};

$$.onUpdateStatus_anon = {"": "Closure;box_0",
  call$1: function(element) {
    var t1 = this.box_0;
    t1.oldSpace_0 = $.$add$ns(t1.oldSpace_0, element.get$oldSpace().used);
    t1.newSpace_1 = $.$add$ns(t1.newSpace_1, element.get$newSpace().used);
  }
};

// Native classes
$$._WorkerStub = {"": "Interceptor;",
  get$id: function(receiver) {
    return receiver.id;
  },
  set$id: function(receiver, i) {
    receiver.id = i;
  },
  set$onmessage: function(receiver, f) {
    receiver.onmessage = f;
  },
  postMessage$1: function(receiver, msg) {
    receiver.postMessage(msg);
  },
  terminate$0: function(receiver) {
    receiver.terminate();
  }
};

$$._HTMLElement = {"": "Element;"};

$$.AnchorElement = {"": "Element;name=,port=",
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$.AnimationEvent = {"": "Event;"};

$$.AreaElement = {"": "Element;port="};

$$.ArrayBuffer = {"": "Interceptor;"};

$$.ArrayBufferView = {"": "Interceptor;"};

$$.Attr = {"": "Node;"};

$$.AudioElement = {"": "MediaElement;"};

$$.AutocompleteErrorEvent = {"": "Event;"};

$$.BRElement = {"": "Element;"};

$$.BaseElement = {"": "Element;"};

$$.BeforeLoadEvent = {"": "Event;"};

$$.Blob = {"": "Interceptor;"};

$$.BodyElement = {"": "Element;"};

$$.ButtonElement = {"": "Element;name=,value="};

$$.CDataSection = {"": "Text;"};

$$.CanvasElement = {"": "Element;height=,width=",
  get$context2D: function(receiver) {
    return receiver.getContext("2d");
  }
};

$$.CanvasGradient = {"": "Interceptor;"};

$$.CanvasPattern = {"": "Interceptor;"};

$$.CanvasRenderingContext = {"": "Interceptor;"};

$$.CanvasRenderingContext2D = {"": "CanvasRenderingContext;"};

$$.CharacterData = {"": "Node;length="};

$$.CloseEvent = {"": "Event;"};

$$.Comment = {"": "CharacterData;"};

$$.CompositionEvent = {"": "UIEvent;"};

$$.ContentElement = {"": "Element;"};

$$.CssFontFaceLoadEvent = {"": "Event;"};

$$.CssStyleDeclaration = {"": "Interceptor;length=",
  getPropertyValue$1: function(receiver, propertyName) {
    var propValue = receiver.getPropertyValue(propertyName);
    return propValue != null ? propValue : "";
  },
  get$color: function(receiver) {
    return this.getPropertyValue$1(receiver, "color");
  }
};

$$.CustomElementConstructor = {"": "Interceptor;"};

$$.CustomEvent = {"": "Event;"};

$$.DListElement = {"": "Element;"};

$$.DataListElement = {"": "Element;"};

$$.DetailsElement = {"": "Element;"};

$$.DeviceMotionEvent = {"": "Event;"};

$$.DeviceOrientationEvent = {"": "Event;"};

$$.DialogElement = {"": "Element;"};

$$.DivElement = {"": "Element;"};

$$.Document = {"": "Node;",
  query$1: function(receiver, selectors) {
    return receiver.querySelector(selectors);
  },
  register$2: function(receiver, $name, options) {
    var t1 = $ === options;
    if (t1)
      options = null;
    if (!t1)
      return receiver.webkitRegister($name, $.convertDartToNative_Dictionary(options));
    return receiver.webkitRegister($name);
  },
  get$onClick: function(receiver) {
    return $.EventStreamProvider_click.forTarget$1(receiver);
  }
};

$$.DocumentFragment = {"": "Node;",
  get$children: function(receiver) {
    if (receiver._children == null)
      receiver._children = $.FilteredElementList$(receiver);
    return receiver._children;
  },
  query$1: function(receiver, selectors) {
    return receiver.querySelector(selectors);
  }
};

$$.DocumentType = {"": "Node;"};

$$.DomError = {"": "Interceptor;name="};

$$.DomException = {"": "Interceptor;",
  get$name: function(receiver) {
    var errorName = receiver.name;
    if ($.Device_isWebKit() === true && errorName === "SECURITY_ERR")
      return "SecurityError";
    if ($.Device_isWebKit() === true && errorName === "SYNTAX_ERR")
      return "SyntaxError";
    return errorName;
  },
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$.Element = {"": "Node;$$dom_children:children=,id%,$$dom_className:className}",
  get$attributes: function(receiver) {
    return $._ElementAttributeMap$(receiver);
  },
  get$children: function(receiver) {
    return $._ChildrenElementList$_wrap(receiver);
  },
  get$classes: function(receiver) {
    return $._ElementCssClassSet$(receiver);
  },
  query$1: function(receiver, selectors) {
    return receiver.querySelector(selectors);
  },
  get$onClick: function(receiver) {
    return $.EventStreamProvider_click.forTarget$1(receiver);
  },
  $isElement: function() {
    return true;
  },
  $asElement: function() {
    return null;
  }
};

$$.EmbedElement = {"": "Element;height=,name=,width="};

$$.EntityReference = {"": "Node;"};

$$.ErrorEvent = {"": "Event;"};

$$.Event = {"": "Interceptor;"};

$$.EventException = {"": "Interceptor;name=",
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$.EventTarget = {"": "Interceptor;",
  $$dom_addEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.addEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  $$dom_removeEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.removeEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  }
};

$$.FieldSetElement = {"": "Element;name="};

$$.File = {"": "Blob;name="};

$$.FileError = {"": "Interceptor;"};

$$.FileException = {"": "Interceptor;name=",
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$.FocusEvent = {"": "UIEvent;"};

$$.FormElement = {"": "Element;length=,name="};

$$.HRElement = {"": "Element;"};

$$.HashChangeEvent = {"": "Event;"};

$$.HeadElement = {"": "Element;"};

$$.HeadingElement = {"": "Element;"};

$$.HtmlCollection = {"": "Interceptor;",
  get$length: function(receiver) {
    return receiver.length;
  },
  $index: function(receiver, index) {
    return receiver[index];
  },
  $indexSet: function(receiver, index, value) {
    throw $.wrapException($.UnsupportedError$("Cannot assign element of immutable List."));
  },
  get$iterator: function(receiver) {
    return $.FixedSizeListIterator$(receiver);
  },
  forEach$1: function(receiver, f) {
    var t1;
    for (t1 = this.get$iterator(receiver); t1.moveNext$0();)
      f.call$1(t1.get$current());
    return;
  },
  toList$1$growable: function(receiver, growable) {
    return $.List_List$from(receiver, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$isEmpty: function(receiver) {
    return this.get$length(receiver) === 0;
  },
  skip$1: function(receiver, n) {
    return $.SubListIterable$(receiver, n, null);
  },
  elementAt$1: function(receiver, index) {
    return receiver[index];
  },
  add$1: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  addAll$1: function(receiver, iterable) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  set$length: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot resize immutable List."));
  },
  removeLast$0: function(receiver) {
    throw $.wrapException($.UnsupportedError$("Cannot remove from immutable List."));
  },
  sublist$2: function(receiver, start, end) {
    if (end == null)
      end = this.get$length(receiver);
    return $.Lists_getRange(receiver, start, end, []);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  toString$0: function(receiver) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(receiver, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  $isList: function() {
    return true;
  },
  $asList: function() {
    return function () { return [$.Node]; };
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return function () { return [$.Node]; };
  },
  $isJavaScriptIndexingBehavior: function() {
    return true;
  },
  $asJavaScriptIndexingBehavior: function() {
    return null;
  }
};

$$.HtmlDocument = {"": "Document;"};

$$.HtmlElement = {"": "Element;"};

$$.HtmlFormControlsCollection = {"": "HtmlCollection;"};

$$.HtmlOptionsCollection = {"": "HtmlCollection;"};

$$.HttpRequest = {"": "EventTarget;responseText=",
  $$dom_addEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.addEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  open$5$async$password$user: function(receiver, method, url, async, password, user) {
    return receiver.open(method, url, async, user, password);
  },
  open$3$async: function($receiver, method, url, async) {
    return $receiver.open(method, url, async);
  },
  $$dom_removeEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.removeEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  send$1: function(receiver, data) {
    return receiver.send(data);
  },
  get$onError: function(receiver) {
    return $.EventStreamProvider_error.forTarget$1(receiver);
  },
  get$onLoad: function(receiver) {
    return $.EventStreamProvider_load.forTarget$1(receiver);
  },
  get$onProgress: function(receiver) {
    return $.EventStreamProvider_progress.forTarget$1(receiver);
  }
};

$$.HttpRequestException = {"": "Interceptor;name=",
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$.HttpRequestProgressEvent = {"": "ProgressEvent;"};

$$.HttpRequestUpload = {"": "EventTarget;",
  $$dom_addEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.addEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  $$dom_removeEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.removeEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  }
};

$$.IFrameElement = {"": "Element;height=,name=,width="};

$$.ImageElement = {"": "Element;height=,width="};

$$.InputElement = {"": "Element;height=,name=,value=,width=",
  $isElement: function() {
    return true;
  },
  $asElement: function() {
    return null;
  }
};

$$.KeyboardEvent = {"": "UIEvent;"};

$$.KeygenElement = {"": "Element;name="};

$$.LIElement = {"": "Element;value="};

$$.LabelElement = {"": "Element;"};

$$.LegendElement = {"": "Element;"};

$$.LinkElement = {"": "Element;"};

$$.MapElement = {"": "Element;name="};

$$.MediaElement = {"": "Element;"};

$$.MediaError = {"": "Interceptor;"};

$$.MediaKeyError = {"": "Interceptor;"};

$$.MediaKeyEvent = {"": "Event;"};

$$.MediaStreamEvent = {"": "Event;"};

$$.MediaStreamTrackEvent = {"": "Event;"};

$$.MenuElement = {"": "Element;"};

$$.MessageEvent = {"": "Event;"};

$$.MetaElement = {"": "Element;name="};

$$.MeterElement = {"": "Element;value="};

$$.ModElement = {"": "Element;"};

$$.MouseEvent = {"": "UIEvent;"};

$$.MutationEvent = {"": "Event;"};

$$.Navigator = {"": "Interceptor;"};

$$.NavigatorUserMediaError = {"": "Interceptor;"};

$$.Node = {"": "EventTarget;text:textContent}",
  get$nodes: function(receiver) {
    return $._ChildNodeListLazy$(receiver);
  },
  remove$0: function(receiver) {
    var t1 = receiver.parentNode;
    if (t1 != null)
      t1.removeChild(receiver);
  },
  replaceWith$1: function(receiver, otherNode) {
    var $parent, exception;
    try {
      $parent = receiver.parentNode;
      $.$$dom_replaceChild$2$x($parent, otherNode, receiver);
    } catch (exception) {
      $.unwrapException(exception);
    }

    return receiver;
  },
  toString$0: function(receiver) {
    var t1 = receiver.localName;
    if (t1 == null) {
      t1 = receiver.nodeValue;
      if (t1 == null)
        t1 = $.Object.prototype.toString$0.call(receiver, receiver);
    }
    return t1;
  },
  $$dom_addEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.addEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  $$dom_removeEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.removeEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  $$dom_replaceChild$2: function(receiver, newChild, oldChild) {
    return receiver.replaceChild(newChild, oldChild);
  }
};

$$.NodeList = {"": "Interceptor;",
  get$length: function(receiver) {
    return receiver.length;
  },
  $index: function(receiver, index) {
    return receiver[index];
  },
  $indexSet: function(receiver, index, value) {
    throw $.wrapException($.UnsupportedError$("Cannot assign element of immutable List."));
  },
  get$iterator: function(receiver) {
    return $.FixedSizeListIterator$(receiver);
  },
  forEach$1: function(receiver, f) {
    var t1;
    for (t1 = this.get$iterator(receiver); t1.moveNext$0();)
      f.call$1(t1.get$current());
    return;
  },
  toList$1$growable: function(receiver, growable) {
    return $.List_List$from(receiver, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$isEmpty: function(receiver) {
    return this.get$length(receiver) === 0;
  },
  skip$1: function(receiver, n) {
    return $.SubListIterable$(receiver, n, null);
  },
  elementAt$1: function(receiver, index) {
    return receiver[index];
  },
  add$1: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  addAll$1: function(receiver, iterable) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  set$length: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot resize immutable List."));
  },
  removeLast$0: function(receiver) {
    throw $.wrapException($.UnsupportedError$("Cannot remove from immutable List."));
  },
  sublist$2: function(receiver, start, end) {
    if (end == null)
      end = this.get$length(receiver);
    return $.Lists_getRange(receiver, start, end, []);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  toString$0: function(receiver) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(receiver, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  $isList: function() {
    return true;
  },
  $asList: function() {
    return function () { return [$.Node]; };
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return function () { return [$.Node]; };
  },
  $isJavaScriptIndexingBehavior: function() {
    return true;
  },
  $asJavaScriptIndexingBehavior: function() {
    return null;
  }
};

$$.Notation = {"": "Node;"};

$$.OListElement = {"": "Element;"};

$$.ObjectElement = {"": "Element;height=,name=,width="};

$$.OptGroupElement = {"": "Element;"};

$$.OptionElement = {"": "Element;value="};

$$.OutputElement = {"": "Element;name=,value="};

$$.OverflowEvent = {"": "Event;"};

$$.PageTransitionEvent = {"": "Event;"};

$$.ParagraphElement = {"": "Element;"};

$$.ParamElement = {"": "Element;name=,value="};

$$.PopStateEvent = {"": "Event;"};

$$.PositionError = {"": "Interceptor;"};

$$.PreElement = {"": "Element;"};

$$.ProcessingInstruction = {"": "Node;"};

$$.ProgressElement = {"": "Element;value="};

$$.ProgressEvent = {"": "Event;",
  total$0: function($receiver) {
    return this.total.call$0();
  }
};

$$.QuoteElement = {"": "Element;"};

$$.RadioNodeList = {"": "NodeList;"};

$$.RangeException = {"": "Interceptor;name=",
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$.RtcDataChannelEvent = {"": "Event;"};

$$.RtcDtmfToneChangeEvent = {"": "Event;"};

$$.RtcIceCandidateEvent = {"": "Event;"};

$$.ScriptElement = {"": "Element;"};

$$.SecurityPolicyViolationEvent = {"": "Event;"};

$$.SelectElement = {"": "Element;length%,name=,value="};

$$.ShadowElement = {"": "Element;"};

$$.ShadowRoot = {"": "DocumentFragment;"};

$$.SourceElement = {"": "Element;"};

$$.SpanElement = {"": "Element;"};

$$.SpeechInputEvent = {"": "Event;"};

$$.SpeechRecognitionError = {"": "Event;"};

$$.SpeechRecognitionEvent = {"": "Event;"};

$$.StorageEvent = {"": "Event;"};

$$.StyleElement = {"": "Element;"};

$$.TableCaptionElement = {"": "Element;"};

$$.TableCellElement = {"": "Element;"};

$$.TableColElement = {"": "Element;"};

$$.TableElement = {"": "Element;"};

$$.TableRowElement = {"": "Element;"};

$$.TableSectionElement = {"": "Element;"};

$$.TemplateElement = {"": "Element;"};

$$.Text = {"": "CharacterData;"};

$$.TextAreaElement = {"": "Element;name=,value="};

$$.TextEvent = {"": "UIEvent;"};

$$.TitleElement = {"": "Element;"};

$$.TouchEvent = {"": "UIEvent;"};

$$.TrackElement = {"": "Element;"};

$$.TrackEvent = {"": "Event;"};

$$.TransitionEvent = {"": "Event;"};

$$.UIEvent = {"": "Event;"};

$$.UListElement = {"": "Element;"};

$$.Uint8Array = {"": "ArrayBufferView;",
  get$length: function(receiver) {
    return receiver.length;
  },
  $index: function(receiver, index) {
    return receiver[index];
  },
  $indexSet: function(receiver, index, value) {
    receiver[index] = value;
  },
  get$iterator: function(receiver) {
    return $.FixedSizeListIterator$(receiver);
  },
  forEach$1: function(receiver, f) {
    var t1;
    for (t1 = this.get$iterator(receiver); t1.moveNext$0();)
      f.call$1(t1.get$current());
    return;
  },
  toList$1$growable: function(receiver, growable) {
    return $.List_List$from(receiver, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$isEmpty: function(receiver) {
    return this.get$length(receiver) === 0;
  },
  skip$1: function(receiver, n) {
    return $.SubListIterable$(receiver, n, null);
  },
  elementAt$1: function(receiver, index) {
    return this.$index(receiver, index);
  },
  add$1: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  addAll$1: function(receiver, iterable) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  set$length: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot resize immutable List."));
  },
  removeLast$0: function(receiver) {
    throw $.wrapException($.UnsupportedError$("Cannot remove from immutable List."));
  },
  sublist$2: function(receiver, start, end) {
    if (end == null)
      end = this.get$length(receiver);
    return $.Lists_getRange(receiver, start, end, []);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  toString$0: function(receiver) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(receiver, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  $isList: function() {
    return true;
  },
  $asList: function() {
    return function () { return [$.$int]; };
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return function () { return [$.$int]; };
  },
  $isJavaScriptIndexingBehavior: function() {
    return true;
  },
  $asJavaScriptIndexingBehavior: function() {
    return null;
  }
};

$$.Uint8ClampedArray = {"": "Uint8Array;",
  $index: function(receiver, index) {
    return receiver[index];
  },
  $indexSet: function(receiver, index, value) {
    receiver[index] = value;
  },
  get$iterator: function(receiver) {
    return $.FixedSizeListIterator$(receiver);
  },
  forEach$1: function(receiver, f) {
    var t1;
    for (t1 = this.get$iterator(receiver); t1.moveNext$0();)
      f.call$1(t1.get$current());
    return;
  },
  toList$1$growable: function(receiver, growable) {
    return $.List_List$from(receiver, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$isEmpty: function(receiver) {
    return this.get$length(receiver) === 0;
  },
  skip$1: function(receiver, n) {
    return $.SubListIterable$(receiver, n, null);
  },
  elementAt$1: function(receiver, index) {
    return receiver[index];
  },
  add$1: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  addAll$1: function(receiver, iterable) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  set$length: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot resize immutable List."));
  },
  removeLast$0: function(receiver) {
    throw $.wrapException($.UnsupportedError$("Cannot remove from immutable List."));
  },
  sublist$2: function(receiver, start, end) {
    if (end == null)
      end = this.get$length(receiver);
    return $.Lists_getRange(receiver, start, end, []);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  toString$0: function(receiver) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(receiver, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  $isList: function() {
    return true;
  },
  $asList: function() {
    return function () { return [$.$int]; };
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return function () { return [$.$int]; };
  },
  $isJavaScriptIndexingBehavior: function() {
    return true;
  },
  $asJavaScriptIndexingBehavior: function() {
    return null;
  }
};

$$.UnknownElement = {"": "Element;"};

$$.VideoElement = {"": "MediaElement;height=,width="};

$$.WheelEvent = {"": "MouseEvent;"};

$$.Window = {"": "EventTarget;name=,navigator=",
  $$dom_addEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.addEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  $$dom_removeEventListener$3: function(receiver, type, listener, useCapture) {
    return receiver.removeEventListener(type, $.convertDartClosureToJS(listener, 1), useCapture);
  },
  get$onClick: function(receiver) {
    return $.EventStreamProvider_click.forTarget$1(receiver);
  }
};

$$.XPathException = {"": "Interceptor;name=",
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$._NamedNodeMap = {"": "Interceptor;",
  get$length: function(receiver) {
    return receiver.length;
  },
  $index: function(receiver, index) {
    return receiver[index];
  },
  $indexSet: function(receiver, index, value) {
    throw $.wrapException($.UnsupportedError$("Cannot assign element of immutable List."));
  },
  get$iterator: function(receiver) {
    return $.FixedSizeListIterator$(receiver);
  },
  forEach$1: function(receiver, f) {
    var t1;
    for (t1 = this.get$iterator(receiver); t1.moveNext$0();)
      f.call$1(t1.get$current());
    return;
  },
  toList$1$growable: function(receiver, growable) {
    return $.List_List$from(receiver, growable);
  },
  toList$0: function($receiver) {
    return this.toList$1$growable($receiver, true);
  },
  get$isEmpty: function(receiver) {
    return this.get$length(receiver) === 0;
  },
  skip$1: function(receiver, n) {
    return $.SubListIterable$(receiver, n, null);
  },
  elementAt$1: function(receiver, index) {
    return receiver[index];
  },
  add$1: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  addAll$1: function(receiver, iterable) {
    throw $.wrapException($.UnsupportedError$("Cannot add to immutable List."));
  },
  set$length: function(receiver, value) {
    throw $.wrapException($.UnsupportedError$("Cannot resize immutable List."));
  },
  removeLast$0: function(receiver) {
    throw $.wrapException($.UnsupportedError$("Cannot remove from immutable List."));
  },
  sublist$2: function(receiver, start, end) {
    if (end == null)
      end = this.get$length(receiver);
    return $.Lists_getRange(receiver, start, end, []);
  },
  sublist$1: function($receiver, start) {
    return this.sublist$2($receiver, start, null);
  },
  toString$0: function(receiver) {
    var buffer = $.StringBuffer$("[");
    buffer.writeAll$2(receiver, ", ");
    buffer.write$1("]");
    return buffer.toString$0(buffer);
  },
  $isList: function() {
    return true;
  },
  $asList: function() {
    return function () { return [$.Node]; };
  },
  $isIterable: function() {
    return true;
  },
  $asIterable: function() {
    return function () { return [$.Node]; };
  },
  $isJavaScriptIndexingBehavior: function() {
    return true;
  },
  $asJavaScriptIndexingBehavior: function() {
    return null;
  }
};

$$._WebKitTransitionEvent = {"": "Event;"};

$$.VersionChangeEvent = {"": "Event;"};

$$.AElement = {"": "StyledElement;"};

$$.AltGlyphElement = {"": "TextPositioningElement;"};

$$.AnimateElement = {"": "AnimationElement;"};

$$.AnimateMotionElement = {"": "AnimationElement;"};

$$.AnimateTransformElement = {"": "AnimationElement;"};

$$.AnimatedLength = {"": "Interceptor;"};

$$.AnimatedNumberList = {"": "Interceptor;"};

$$.AnimationElement = {"": "SvgElement;"};

$$.CircleElement = {"": "StyledElement;"};

$$.ClipPathElement = {"": "StyledElement;"};

$$.DefsElement = {"": "StyledElement;"};

$$.DescElement = {"": "StyledElement;"};

$$.EllipseElement = {"": "StyledElement;"};

$$.FEBlendElement = {"": "StyledElement;height=,width="};

$$.FEColorMatrixElement = {"": "StyledElement;height=,width="};

$$.FEComponentTransferElement = {"": "StyledElement;height=,width="};

$$.FECompositeElement = {"": "StyledElement;height=,width="};

$$.FEConvolveMatrixElement = {"": "StyledElement;height=,width="};

$$.FEDiffuseLightingElement = {"": "StyledElement;height=,width="};

$$.FEDisplacementMapElement = {"": "StyledElement;height=,width="};

$$.FEDistantLightElement = {"": "SvgElement;"};

$$.FEFloodElement = {"": "StyledElement;height=,width="};

$$.FEFuncAElement = {"": "_SVGComponentTransferFunctionElement;"};

$$.FEFuncBElement = {"": "_SVGComponentTransferFunctionElement;"};

$$.FEFuncGElement = {"": "_SVGComponentTransferFunctionElement;"};

$$.FEFuncRElement = {"": "_SVGComponentTransferFunctionElement;"};

$$.FEGaussianBlurElement = {"": "StyledElement;height=,width="};

$$.FEImageElement = {"": "StyledElement;height=,width="};

$$.FEMergeElement = {"": "StyledElement;height=,width="};

$$.FEMergeNodeElement = {"": "SvgElement;"};

$$.FEMorphologyElement = {"": "StyledElement;height=,width="};

$$.FEOffsetElement = {"": "StyledElement;height=,width="};

$$.FEPointLightElement = {"": "SvgElement;"};

$$.FESpecularLightingElement = {"": "StyledElement;height=,width="};

$$.FESpotLightElement = {"": "SvgElement;"};

$$.FETileElement = {"": "StyledElement;height=,width="};

$$.FETurbulenceElement = {"": "StyledElement;height=,width="};

$$.FilterElement = {"": "StyledElement;height=,width="};

$$.ForeignObjectElement = {"": "StyledElement;height=,width="};

$$.GElement = {"": "StyledElement;"};

$$.ImageElement0 = {"": "StyledElement;height=,width="};

$$.LineElement = {"": "StyledElement;"};

$$.LinearGradientElement = {"": "_GradientElement;"};

$$.MarkerElement = {"": "StyledElement;"};

$$.MaskElement = {"": "StyledElement;height=,width="};

$$.MetadataElement = {"": "SvgElement;"};

$$.PathElement = {"": "StyledElement;"};

$$.PatternElement = {"": "StyledElement;height=,width="};

$$.PolygonElement = {"": "StyledElement;"};

$$.PolylineElement = {"": "StyledElement;"};

$$.RadialGradientElement = {"": "_GradientElement;"};

$$.RectElement = {"": "StyledElement;height=,width="};

$$.ScriptElement0 = {"": "SvgElement;"};

$$.SetElement = {"": "AnimationElement;"};

$$.StopElement = {"": "StyledElement;"};

$$.StyleElement0 = {"": "SvgElement;"};

$$.StyledElement = {"": "SvgElement;"};

$$.SvgDocument = {"": "Document;"};

$$.SvgElement = {"": "Element;",
  get$classes: function(receiver) {
    if (receiver._cssClassSet == null)
      receiver._cssClassSet = $._AttributeClassSet$(receiver);
    return receiver._cssClassSet;
  },
  get$children: function(receiver) {
    return $.FilteredElementList$(receiver);
  },
  get$$$dom_children: function(receiver) {
    throw $.wrapException($.UnsupportedError$("Cannot get dom_children on SVG."));
  },
  get$id: function(receiver) {
    return receiver.id;
  },
  set$id: function(receiver, value) {
    receiver.id = value;
  }
};

$$.SvgException = {"": "Interceptor;name=",
  toString$0: function(receiver) {
    return receiver.toString();
  }
};

$$.SvgSvgElement = {"": "StyledElement;height=,width="};

$$.SwitchElement = {"": "StyledElement;"};

$$.SymbolElement = {"": "StyledElement;"};

$$.TSpanElement = {"": "TextPositioningElement;"};

$$.TextContentElement = {"": "StyledElement;"};

$$.TextElement = {"": "TextPositioningElement;"};

$$.TextPathElement = {"": "TextContentElement;"};

$$.TextPositioningElement = {"": "TextContentElement;"};

$$.TitleElement0 = {"": "StyledElement;"};

$$.UseElement = {"": "StyledElement;height=,width="};

$$.ViewElement = {"": "SvgElement;"};

$$.ZoomEvent = {"": "UIEvent;"};

$$._GradientElement = {"": "StyledElement;"};

$$._SVGComponentTransferFunctionElement = {"": "SvgElement;"};

$$.AudioProcessingEvent = {"": "Event;"};

$$.OfflineAudioCompletionEvent = {"": "Event;"};

$$.ContextEvent = {"": "Event;"};

$$.SqlError = {"": "Interceptor;"};

$$.SqlException = {"": "Interceptor;"};

$$.Closure = {"": "Object;",
  toString$0: function(_) {
    return "Closure";
  }
};

// Bound closures
$$.BoundClosure$1 = {"": "Closure;self,target",
  call$1: function(p0) {
    return this.self[this.target](p0);
  }
};

$$.BoundClosure$0 = {"": "Closure;self,target",
  call$0: function() {
    return this.self[this.target]();
  }
};

$$.BoundClosure$i0 = {"": "Closure;self,target,receiver",
  call$0: function() {
    return this.self[this.target](this.receiver);
  }
};

Isolate.$finishClasses($$, $, null);
$$ = null;

$.Arrays_copy = function(src, srcStart, dst, dstStart, count) {
  var i, j, t1, t2, t3;
  if (typeof src !== "string" && (typeof src !== "object" || src === null || src.constructor !== Array && !$.getInterceptor(src).$isJavaScriptIndexingBehavior()))
    return $.Arrays_copy$bailout(1, src, srcStart, dst, dstStart, count);
  if (typeof dst !== "object" || dst === null || (dst.constructor !== Array || !!dst.immutable$list) && !$.getInterceptor(dst).$isJavaScriptIndexingBehavior())
    return $.Arrays_copy$bailout(1, src, srcStart, dst, dstStart, count);
  if (typeof dstStart !== "number")
    return $.Arrays_copy$bailout(1, src, srcStart, dst, dstStart, count);
  if (srcStart < dstStart)
    for (i = srcStart + count - 1, j = dstStart + count - 1, t1 = src.length, t2 = dst.length; i >= srcStart; --i, --j) {
      if (i !== (i | 0))
        throw $.iae(i);
      if (i < 0 || i >= t1)
        throw $.ioore(i);
      t3 = src[i];
      if (j !== (j | 0))
        throw $.iae(j);
      if (j < 0 || j >= t2)
        throw $.ioore(j);
      dst[j] = t3;
    }
  else
    for (t1 = src.length, t2 = dst.length, j = dstStart, i = srcStart; i < srcStart + count; ++i, ++j) {
      if (i !== (i | 0))
        throw $.iae(i);
      if (i < 0 || i >= t1)
        throw $.ioore(i);
      t3 = src[i];
      if (j !== (j | 0))
        throw $.iae(j);
      if (j < 0 || j >= t2)
        throw $.ioore(j);
      dst[j] = t3;
    }
};

$.Arrays_copy$bailout = function(state0, src, srcStart, dst, dstStart, count) {
  var i, j, t1;
  if ($.JSNumber_methods.$lt(srcStart, dstStart))
    for (i = srcStart + count - 1, j = $.$sub$n($.$add$ns(dstStart, count), 1), t1 = $.getInterceptor$asx(src); i >= srcStart; --i, j = $.$sub$n(j, 1))
      $.JSArray_methods.$indexSet(dst, j, t1.$index(src, i));
  else
    for (t1 = $.getInterceptor$asx(src), j = dstStart, i = srcStart; i < srcStart + count; ++i, j = $.$add$ns(j, 1))
      $.JSArray_methods.$indexSet(dst, j, t1.$index(src, i));
};

$.SubListIterable$ = function(_iterable, _start, _endOrLength) {
  return new $.SubListIterable(_iterable, _start, _endOrLength);
};

$.ListIterator$ = function(iterable) {
  return new $.ListIterator(iterable, $.get$length$asx(iterable), 0, null);
};

$.MappedIterable$ = function(_iterable, _f) {
  return new $.MappedIterable(_iterable, _f);
};

$.MappedIterator$ = function(_iterator, _f) {
  return new $.MappedIterator(null, _iterator, _f);
};

$.WhereIterable$ = function(_iterable, _f) {
  return new $.WhereIterable(_iterable, _f);
};

$.WhereIterator$ = function(_iterator, _f) {
  return new $.WhereIterator(_iterator, _f);
};

$.SkipIterable$ = function(_iterable, _skipCount) {
  var t1 = new $.SkipIterable(_iterable, _skipCount);
  t1.SkipIterable$2(_iterable, _skipCount);
  return t1;
};

$.SkipIterator$ = function(_iterator, _skipCount) {
  var t1 = new $.SkipIterator(_iterator, _skipCount);
  t1.SkipIterator$2(_iterator, _skipCount);
  return t1;
};

$.IterableMixinWorkaround__rangeCheck = function(list, start, end) {
  var t1 = $.getInterceptor$n(start);
  if (t1.$lt(start, 0) || t1.$gt(start, list.length))
    throw $.wrapException($.RangeError$range(start, 0, list.length));
  t1 = $.getInterceptor$n(end);
  if (t1.$lt(end, start) || t1.$gt(end, list.length))
    throw $.wrapException($.RangeError$range(end, start, list.length));
};

$.IterableMixinWorkaround_setRangeList = function(list, start, end, from, skipCount) {
  var $length, otherStart, otherList;
  $.IterableMixinWorkaround__rangeCheck(list, start, end);
  $length = $.$sub$n(end, start);
  if ($.$eq($length, 0))
    return;
  if (skipCount < 0)
    throw $.wrapException($.ArgumentError$(skipCount));
  if (typeof from === "object" && from !== null && (from.constructor === Array || $.getInterceptor(from).$isList())) {
    otherStart = skipCount;
    otherList = from;
  } else {
    otherList = $.toList$1$growable$ax($.skip$1$ax(from, skipCount), false);
    otherStart = 0;
  }
  if (typeof $length !== "number")
    throw $.iae($length);
  if ($.JSNumber_methods.$gt(otherStart + $length, $.get$length$asx(otherList)))
    throw $.wrapException($.StateError$("Not enough elements"));
  $.Arrays_copy(otherList, otherStart, list, start, $length);
};

$.ToString__emitValue = function(i, result, visiting) {
  var t1, isList, t2, first, t3;
  t1 = $.getInterceptor$ax(visiting);
  t1.add$1(visiting, i);
  isList = typeof i === "object" && i !== null && (i.constructor === Array || $.getInterceptor(i).$isList());
  result.write$1(isList ? "[" : "{");
  for (t2 = $.get$iterator$ax(i), first = true; t2.moveNext$0() === true; first = false) {
    t3 = t2.get$current();
    if (!first)
      result.write$1(", ");
    $.ToString__emitObject(t3, result, visiting);
  }
  result.write$1(isList ? "]" : "}");
  t1.removeLast$0(visiting);
};

$.ToString__emitObject = function(o, result, visiting) {
  if (typeof o === "object" && o !== null && (o.constructor === Array || $.getInterceptor(o).$isIterable()))
    if ($.ToString__containsRef(visiting, o))
      result.write$1(typeof o === "object" && o !== null && (o.constructor === Array || $.getInterceptor(o).$isList()) ? "[...]" : "{...}");
    else
      $.ToString__emitValue(o, result, visiting);
  else if (typeof o === "object" && o !== null && !!$.getInterceptor(o).$isMap)
    if ($.ToString__containsRef(visiting, o))
      result.write$1("{...}");
    else
      $.ToString__emitPair(o, result, visiting);
  else
    result.write$1(o);
};

$.ToString__containsRef = function(i, ref) {
  var t1;
  for (t1 = $.get$iterator$ax(i); t1.moveNext$0() === true;)
    if (t1.get$current() === ref)
      return true;
  return false;
};

$.ToString__emitPair = function(m, result, visiting) {
  var t1, t2;
  t1 = {};
  t2 = $.getInterceptor$ax(visiting);
  t2.add$1(visiting, m);
  result.write$1("{");
  t1.first_0 = true;
  m.forEach$1(m, new $.ToString__emitPair_anon(t1, result, visiting));
  result.write$1("}");
  t2.removeLast$0(visiting);
};

$.HashMap__findBucketIndex = function(bucket, key) {
  var $length, i;
  if (bucket == null)
    return -1;
  $length = bucket.length;
  for (i = 0; i < $length; i += 2)
    if ($.$eq(bucket[i], key) === true)
      return i;
  return -1;
};

$.HashMapKeyIterable$ = function(_map) {
  return new $.HashMapKeyIterable(_map);
};

$.HashMapKeyIterator$ = function(_map, _keys) {
  return new $.HashMapKeyIterator(_map, _keys, 0, null);
};

$.LinkedHashMap__findBucketIndex = function(bucket, key) {
  var $length, i;
  if (bucket == null)
    return -1;
  $length = bucket.length;
  for (i = 0; i < $length; ++i)
    if ($.$eq(bucket[i].get$_key(), key) === true)
      return i;
  return -1;
};

$.LinkedHashMapCell$ = function(_key, _value) {
  return new $.LinkedHashMapCell(_key, _value, null, null);
};

$.LinkedHashMapKeyIterable$ = function(_map) {
  return new $.LinkedHashMapKeyIterable(_map);
};

$.LinkedHashMapKeyIterator$ = function(_map, _modifications) {
  var t1 = new $.LinkedHashMapKeyIterator(_map, _modifications, null, null);
  t1.LinkedHashMapKeyIterator$2(_map, _modifications);
  return t1;
};

$.LinkedHashSet__findBucketIndex = function(bucket, element) {
  var $length, i;
  if (bucket == null)
    return -1;
  $length = bucket.length;
  for (i = 0; i < $length; ++i)
    if ($.$eq(bucket[i].get$_element(), element) === true)
      return i;
  return -1;
};

$.LinkedHashSetCell$ = function(_element) {
  return new $.LinkedHashSetCell(_element, null, null);
};

$.LinkedHashSetIterator$ = function(_set, _modifications) {
  var t1 = new $.LinkedHashSetIterator(_set, _modifications, null, null);
  t1.LinkedHashSetIterator$2(_set, _modifications);
  return t1;
};

$.Function__toMangledNames = function(namedArguments) {
  var result;
  if (namedArguments == null)
    return;
  result = $.makeLiteralMap([]);
  $.JSNull_methods.forEach$1(namedArguments, new $.Function__toMangledNames_anon(result));
  return result;
};

$.getDispatchProperty = function(object) {
  return object[$.dispatchPropertyName];
};

$.setDispatchProperty = function(object, value) {
  object[$.dispatchPropertyName] = value;
};

$.getNativeInterceptor = function(object) {
  var record, proto, objectProto;
  record = $.getDispatchProperty(object);
  if (record != null) {
    proto = record.p;
    if (false === proto)
      return record.i;
    if (true === proto)
      return object;
    objectProto = Object.getPrototypeOf(object);
    if (proto === objectProto)
      return record.i;
    if (record.e === objectProto)
      return proto(object, record);
  }
  record = $.lookupDispatchRecord(object);
  $.setDispatchProperty(Object.getPrototypeOf(object), record);
  return $.getNativeInterceptor(object);
};

$.JsIsolateSink$fromPort = function(_port) {
  return new $.JsIsolateSink(false, _port);
};

$._callInIsolate = function(isolate, $function) {
  var result = isolate.eval$1($function);
  $globalState.topEventLoop.run$0();
  return result;
};

$._currentIsolate = function() {
  return $globalState.currentContext;
};

$.startRootIsolate = function(entry) {
  var t1, rootContext;
  t1 = $._Manager$();
  $._globalState0(t1);
  if ($globalState.isWorker === true)
    return;
  rootContext = $._IsolateContext$();
  $globalState.rootContext = rootContext;
  $globalState.currentContext = rootContext;
  rootContext.eval$1(entry);
  $globalState.topEventLoop.run$0();
};

$._globalState = function() {
  return $globalState;
};

$._globalState0 = function(val) {
  $globalState = val;
};

$._Manager$ = function() {
  var t1 = new $._Manager(0, 0, 1, null, null, null, null, null, null, null, null, null);
  t1._Manager$0();
  return t1;
};

$._IsolateContext$ = function() {
  var t1 = new $._IsolateContext(null, null, null);
  t1._IsolateContext$0();
  return t1;
};

$._EventLoop$ = function() {
  return new $._EventLoop($.Queue_Queue(), 0);
};

$._IsolateEvent$ = function(isolate, fn, message) {
  return new $._IsolateEvent(isolate, fn, message);
};

$._MainManagerStub$ = function() {
  return new $._MainManagerStub();
};

$.IsolateNatives_computeThisScript = function() {
  var currentScript, stack, matches;
  currentScript = $.$currentScript;
  if (currentScript != null)
    return String(currentScript.src);
  stack = new Error().stack;
  if (stack == null)
    stack = (function() {try { throw new Error() } catch(e) { return e.stack }})();
  matches = stack.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"));
  if (matches != null)
    return matches[1];
  matches = stack.match(new RegExp("^[^@]*@(.*):[0-9]*$", "m"));
  if (matches != null)
    return matches[1];
  throw $.wrapException($.UnsupportedError$("Cannot extract URI from \"" + $.S(stack) + "\""));
};

$.IsolateNatives_computeGlobalThis = function() {
  return function() { return this; }();
};

$.IsolateNatives__processWorkerMessage = function(sender, e) {
  var msg, t1, entryPoint, replyTo, context, t2;
  msg = $._deserializeMessage(e.data);
  t1 = $.getInterceptor$asx(msg);
  switch (t1.$index(msg, "command")) {
    case "start":
      $globalState.currentManagerId = t1.$index(msg, "id");
      entryPoint = $[t1.$index(msg, "functionName")];
      replyTo = $._deserializeMessage(t1.$index(msg, "replyTo"));
      context = $._IsolateContext$();
      $globalState.topEventLoop.enqueue$3(context, new $.IsolateNatives__processWorkerMessage_anon(entryPoint, replyTo), "worker-start");
      $globalState.currentContext = context;
      $globalState.topEventLoop.run$0();
      break;
    case "spawn-worker":
      $.IsolateNatives__spawnWorker(t1.$index(msg, "functionName"), t1.$index(msg, "uri"), t1.$index(msg, "replyPort"));
      break;
    case "message":
      if (t1.$index(msg, "port") != null)
        $.send$2$x(t1.$index(msg, "port"), t1.$index(msg, "msg"), t1.$index(msg, "replyTo"));
      $globalState.topEventLoop.run$0();
      break;
    case "close":
      $.IsolateNatives__log("Closing Worker");
      t1 = $globalState.managers;
      t2 = $.getInterceptor$x(sender);
      t1.remove$1(t1, t2.get$id(sender));
      t2.terminate$0(sender);
      $globalState.topEventLoop.run$0();
      break;
    case "log":
      $.IsolateNatives__log(t1.$index(msg, "msg"));
      break;
    case "print":
      if ($globalState.isWorker === true) {
        t1 = $globalState.mainManager;
        t1.postMessage$1(t1, $._serializeMessage($.makeLiteralMap(["command", "print", "msg", msg])));
      } else
        $.Primitives_printString($.toString$0(t1.$index(msg, "msg")));
      break;
    case "error":
      throw $.wrapException(t1.$index(msg, "msg"));
  }
};

$.IsolateNatives__log = function(msg) {
  var trace, t1, exception;
  if ($globalState.isWorker === true) {
    t1 = $globalState.mainManager;
    t1.postMessage$1(t1, $._serializeMessage($.makeLiteralMap(["command", "log", "msg", msg])));
  } else
    try {
      $.get$globalThis().console.log(msg);
    } catch (exception) {
      $.unwrapException(exception);
      trace = $.getTraceFromException(exception);
      throw $.wrapException($._ExceptionImplementation$(trace));
    }

};

$.IsolateNatives__spawnWorker = function(functionName, uri, replyPort) {
  var worker, t1, t2, workerId;
  if (functionName == null)
    functionName = "main";
  if (uri == null)
    uri = $.get$IsolateNatives_thisScript();
  worker = new Worker(uri);
  t1 = $.getInterceptor$x(worker);
  t1.set$onmessage(worker, function(e) { $.IsolateNatives__processWorkerMessage.call$2(worker, e); });
  t2 = $globalState;
  workerId = t2.nextManagerId;
  t2.nextManagerId = workerId + 1;
  t1.set$id(worker, workerId);
  t2 = $globalState.managers;
  t2.$indexSet(t2, workerId, worker);
  t1.postMessage$1(worker, $._serializeMessage($.makeLiteralMap(["command", "start", "id", workerId, "replyTo", $._serializeMessage(replyPort), "functionName", functionName])));
};

$._NativeJsSendPort$ = function(_receivePort, isolateId) {
  return new $._NativeJsSendPort(_receivePort, isolateId);
};

$._WorkerSendPort$ = function(_workerId, isolateId, _receivePortId) {
  return new $._WorkerSendPort(_workerId, _receivePortId, isolateId);
};

$.ReceivePortImpl$ = function() {
  var t1 = $.ReceivePortImpl__nextFreeId;
  $.ReceivePortImpl__nextFreeId = $.$add$ns(t1, 1);
  t1 = new $.ReceivePortImpl(t1, null);
  t1.ReceivePortImpl$0();
  return t1;
};

$._waitForPendingPorts = function(message, callback) {
  var finder = $._PendingSendPortFinder$();
  finder.traverse$1(message);
  $._FutureImpl__FutureImpl$wait(finder.ports).then$1(new $._waitForPendingPorts_anon(callback));
};

$._PendingSendPortFinder$ = function() {
  var t1 = new $._PendingSendPortFinder([], $._MessageTraverserVisitedMap$());
  t1._PendingSendPortFinder$0();
  return t1;
};

$._serializeMessage = function(message) {
  if ($globalState.get$needSerialization() === true)
    return $._JsSerializer$().traverse$1(message);
  else
    return $._JsCopier$().traverse$1(message);
};

$._deserializeMessage = function(message) {
  if ($globalState.get$needSerialization() === true)
    return $._JsDeserializer$().deserialize$1(message);
  else
    return message;
};

$._JsSerializer$ = function() {
  var t1 = new $._JsSerializer(0, $._MessageTraverserVisitedMap$());
  t1._JsSerializer$0();
  return t1;
};

$._JsCopier$ = function() {
  var t1 = new $._JsCopier($._MessageTraverserVisitedMap$());
  t1._JsCopier$0();
  return t1;
};

$._JsDeserializer$ = function() {
  return new $._JsDeserializer(null);
};

$._JsVisitedMap$ = function() {
  return new $._JsVisitedMap(null);
};

$._MessageTraverserVisitedMap$ = function() {
  return new $._MessageTraverserVisitedMap();
};

$.TimerImpl$ = function(milliseconds, callback) {
  var t1 = new $.TimerImpl(true, false, null);
  t1.TimerImpl$2(milliseconds, callback);
  return t1;
};

$.TimerImpl$periodic = function(milliseconds, callback) {
  var t1 = new $.TimerImpl(false, false, null);
  t1.TimerImpl$periodic$2(milliseconds, callback);
  return t1;
};

$.hasTimer = function() {
  return $.get$globalThis().setTimeout != null;
};

$.checkGrowable = function(list, reason) {
  if (!!list.fixed$length)
    throw $.wrapException($.UnsupportedError$(reason));
};

$.S = function(value) {
  var res;
  if (typeof value === "string")
    return value;
  if (typeof value === "number") {
    if (value !== 0)
      return "" + value;
  } else if (true === value)
    return "true";
  else if (false === value)
    return "false";
  else if (value == null)
    return "null";
  res = $.toString$0(value);
  if (typeof res !== "string")
    throw $.wrapException($.ArgumentError$(value));
  return res;
};

$.Primitives_objectHashCode = function(object) {
  var hash = object.$identityHash;
  if (hash == null) {
    hash = $.$add$ns($.Primitives_hashCodeSeed, 1);
    $.Primitives_hashCodeSeed = hash;
    object.$identityHash = hash;
  }
  return hash;
};

$.Primitives_printString = function(string) {
  if (typeof dartPrint == "function") {
    dartPrint(string);
    return;
  }
  if (typeof window == "object") {
    if (typeof console == "object")
      console.log(string);
    return;
  }
  if (typeof print == "function") {
    print(string);
    return;
  }
  throw "Unable to print message: " + String(string);
};

$.Primitives_objectTypeName = function(object) {
  var $name, decompiled, t1;
  $name = $.constructorNameFallback(object);
  if ($.$eq($name, "Object") === true) {
    decompiled = String(object.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1];
    if (typeof decompiled === "string")
      $name = decompiled;
  }
  t1 = $.getInterceptor$s($name);
  return t1.codeUnitAt$1($name, 0) === 36 ? t1.substring$1($name, 1) : $name;
};

$.Primitives_getProperty = function(object, key) {
  if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
    throw $.wrapException($.ArgumentError$(object));
  return object[key];
};

$.Primitives_setProperty = function(object, key, value) {
  if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
    throw $.wrapException($.ArgumentError$(object));
  object[key] = value;
};

$.Primitives_applyFunction = function($function, positionalArguments, namedArguments) {
  var buffer, $arguments, argumentCount, listOfNamedArguments, selectorName, jsFunction;
  buffer = $.StringBuffer$("");
  $arguments = [];
  argumentCount = 0 + positionalArguments.length;
  $.JSArray_methods.addAll$1($arguments, positionalArguments);
  if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments)) {
    listOfNamedArguments = $.List_List$from(namedArguments.get$keys(), true);
    argumentCount += namedArguments.get$length(namedArguments);
    listOfNamedArguments.sort();
    $.forEach$1$ax(listOfNamedArguments, new $.Primitives_applyFunction_anon(namedArguments, buffer, $arguments));
  }
  selectorName = "call$" + $.S(argumentCount) + $.S(buffer);
  jsFunction = $function[selectorName];
  if (jsFunction == null)
    throw $.wrapException($.NoSuchMethodError$($function, selectorName, $arguments, $.makeLiteralMap([]), null));
  return jsFunction.apply($function, $arguments);
};

$.iae = function(argument) {
  throw $.wrapException($.ArgumentError$(argument));
};

$.ioore = function(index) {
  throw $.wrapException($.RangeError$value(index));
};

$.wrapException = function(ex) {
  var wrapper;
  if (ex == null)
    ex = $.C_NullThrownError;
  wrapper = $.DartError$(ex);
  if (!!Error.captureStackTrace)
    Error.captureStackTrace(wrapper, $.wrapException);
  else
    wrapper.stack = new Error().stack;
  return wrapper;
};

$.throwExpression = function(ex) {
  throw $.wrapException(ex);
};

$.DartError$ = function(dartException) {
  var t1 = new $.DartError();
  t1.DartError$1(dartException);
  return t1;
};

$.DartError_toStringWrapper = function() {
  return $.toString$0(this);
};

$.unwrapException = function(ex) {
  var message, type, $name, t1, ieErrorCode, ieFacilityNumber, t2;
  if ("dartException" in ex)
    return ex.dartException;
  message = ex.message;
  if (ex instanceof TypeError) {
    type = ex.type;
    $name = ex.arguments ? ex.arguments[0] : "";
    if (message.indexOf("JSNull") === -1) {
      t1 = $.getInterceptor(type);
      t1 = t1.$eq(type, "property_not_function") === true || t1.$eq(type, "called_non_callable") === true || t1.$eq(type, "non_object_property_call") === true || t1.$eq(type, "non_object_property_load") === true;
    } else
      t1 = true;
    if (t1)
      return $.NoSuchMethodError$(null, $name, [], $.makeLiteralMap([]), null);
    else if ($.$eq(type, "undefined_method") === true)
      return $.NoSuchMethodError$("", $name, [], $.makeLiteralMap([]), null);
    ieErrorCode = ex.number & 0xffff;
    ieFacilityNumber = ex.number >> 16 & 0x1FFF;
    t1 = typeof message === "string";
    if (t1)
      if (message === "null has no properties" || message === "'null' is not an object" || message === "'undefined' is not an object" || $.JSString_methods.endsWith$1(message, "is null") || $.JSString_methods.endsWith$1(message, "is undefined") || $.JSString_methods.endsWith$1(message, "is null or undefined") || $.JSString_methods.endsWith$1(message, "of undefined") || $.JSString_methods.endsWith$1(message, "of null"))
        return $.NoSuchMethodError$(null, "<unknown>", [], $.makeLiteralMap([]), null);
      else {
        if (message.indexOf(" has no method ") === -1)
          if (message.indexOf(" is not a function") === -1)
            t2 = ieErrorCode === 438 && ieFacilityNumber === 10;
          else
            t2 = true;
        else
          t2 = true;
        if (t2)
          return $.NoSuchMethodError$("", "<unknown>", [], $.makeLiteralMap([]), null);
      }
    t1 = t1 ? message : "";
    return $._ExceptionImplementation$(t1);
  }
  if (ex instanceof RangeError) {
    if (typeof message === "string" && message.indexOf("call stack") !== -1)
      return $.StackOverflowError$();
    return $.ArgumentError$(null);
  }
  if (typeof InternalError == "function" && ex instanceof InternalError)
    if (typeof message === "string" && message === "too much recursion")
      return $.StackOverflowError$();
  return ex;
};

$.getTraceFromException = function(exception) {
  return $._StackTrace$(exception.stack);
};

$._StackTrace$ = function(_stack) {
  return new $._StackTrace(_stack);
};

$.makeLiteralMap = function(keyValuePairs) {
  var iterator, result, key;
  iterator = $.JSArray_methods.get$iterator(keyValuePairs);
  result = $.LinkedHashMap$();
  for (; iterator.moveNext$0();) {
    key = iterator.get$current();
    iterator.moveNext$0();
    result.$indexSet(result, key, iterator.get$current());
  }
  return result;
};

$.invokeClosure = function(closure, isolate, numberOfArguments, arg1, arg2) {
  var t1 = $.getInterceptor(numberOfArguments);
  if (t1.$eq(numberOfArguments, 0) === true)
    return $._callInIsolate(isolate, new $.invokeClosure_anon(closure));
  else if (t1.$eq(numberOfArguments, 1) === true)
    return $._callInIsolate(isolate, new $.invokeClosure_anon0(closure, arg1));
  else if (t1.$eq(numberOfArguments, 2) === true)
    return $._callInIsolate(isolate, new $.invokeClosure_anon1(closure, arg1, arg2));
  else
    throw $.wrapException($._ExceptionImplementation$("Unsupported number of arguments for wrapped closure"));
};

$.convertDartClosureToJS = function(closure, arity) {
  var $function;
  if (closure == null)
    return;
  $function = closure.$identity;
  if (!!$function)
    return $function;
  $function = (function ($2, $3) { return function($0, $1) { return $3(closure, $2, arity, $0, $1) }})($._currentIsolate(), $.invokeClosure.call$5);
  closure.$identity = $function;
  return $function;
};

$.throwCyclicInit = function(staticName) {
  throw $.wrapException($.RuntimeError$("Cyclic initialization for static " + $.S(staticName)));
};

$._convertJsonToDart = function(json, reviver) {
  var revive = reviver == null ? new $._convertJsonToDart_anon() : reviver;
  return revive.call$2("", new $._convertJsonToDart_walk(revive).call$1(json));
};

$.typeNameInChrome = function(obj) {
  return $.typeNameInWebKitCommon(obj.constructor.name);
};

$.typeNameInSafari = function(obj) {
  return $.typeNameInWebKitCommon($.constructorNameFallback(obj));
};

$.typeNameInWebKitCommon = function(tag) {
  var $name = tag;
  if ($name === "Window")
    return "DOMWindow";
  if ($name === "CanvasPixelArray")
    return "Uint8ClampedArray";
  if ($name === "WebKitMutationObserver")
    return "MutationObserver";
  if ($name === "AudioChannelMerger")
    return "ChannelMergerNode";
  if ($name === "AudioChannelSplitter")
    return "ChannelSplitterNode";
  if ($name === "AudioGainNode")
    return "GainNode";
  if ($name === "AudioPannerNode")
    return "PannerNode";
  if ($name === "JavaScriptAudioNode")
    return "ScriptProcessorNode";
  if ($name === "Oscillator")
    return "OscillatorNode";
  if ($name === "RealtimeAnalyserNode")
    return "AnalyserNode";
  if ($name === "IDBVersionChangeRequest")
    return "IDBOpenDBRequest";
  return $name;
};

$.typeNameInOpera = function(obj) {
  var $name = $.constructorNameFallback(obj);
  if ($name === "Window")
    return "DOMWindow";
  if ($name === "ApplicationCache")
    return "DOMApplicationCache";
  return $name;
};

$.typeNameInFirefox = function(obj) {
  var $name = $.constructorNameFallback(obj);
  if ($name === "Window")
    return "DOMWindow";
  if ($name === "BeforeUnloadEvent")
    return "Event";
  if ($name === "CSS2Properties")
    return "CSSStyleDeclaration";
  if ($name === "DataTransfer")
    return "Clipboard";
  if ($name === "DragEvent")
    return "MouseEvent";
  if ($name === "GeoGeolocation")
    return "Geolocation";
  if ($name === "MouseScrollEvent")
    return "WheelEvent";
  if ($name === "OfflineResourceList")
    return "DOMApplicationCache";
  if ($name === "WorkerMessageEvent")
    return "MessageEvent";
  if ($name === "XMLDocument")
    return "Document";
  return $name;
};

$.typeNameInIE = function(obj) {
  var $name = $.constructorNameFallback(obj);
  if ($name === "Window")
    return "DOMWindow";
  if ($name === "Document") {
    if (!!obj.xmlVersion)
      return "Document";
    return "HTMLDocument";
  }
  if ($name === "ApplicationCache")
    return "DOMApplicationCache";
  if ($name === "BeforeUnloadEvent")
    return "Event";
  if ($name === "CanvasPixelArray")
    return "Uint8ClampedArray";
  if ($name === "DataTransfer")
    return "Clipboard";
  if ($name === "DragEvent")
    return "MouseEvent";
  if ($name === "HTMLDDElement")
    return "HTMLElement";
  if ($name === "HTMLDTElement")
    return "HTMLElement";
  if ($name === "HTMLTableDataCellElement")
    return "HTMLTableCellElement";
  if ($name === "HTMLTableHeaderCellElement")
    return "HTMLTableCellElement";
  if ($name === "HTMLPhraseElement")
    return "HTMLElement";
  if ($name === "MSStyleCSSProperties")
    return "CSSStyleDeclaration";
  if ($name === "MouseWheelEvent")
    return "WheelEvent";
  if ($name === "Position")
    return "Geoposition";
  if ($name === "Object")
    if (window.DataView && obj instanceof window.DataView)
      return "DataView";
  return $name;
};

$.constructorNameFallback = function(object) {
  var $constructor, $name, t1, string;
  if (object == null)
    return "Null";
  $constructor = object.constructor;
  if (typeof $constructor === "function") {
    $name = $constructor.name;
    if (typeof $name === "string")
      t1 = $name !== "" && $name !== "Object" && $name !== "Function.prototype";
    else
      t1 = false;
    if (t1)
      return $name;
  }
  string = Object.prototype.toString.call(object);
  return string.substring(8, string.length - 1);
};

$.alternateTag = function(object, tag) {
  if (!!/^HTML[A-Z].*Element$/.test(tag)) {
    if (Object.prototype.toString.call(object) === "[object Object]")
      return;
    return "HTMLElement";
  }
  return;
};

$.getFunctionForTypeNameOf = function() {
  if (typeof navigator !== "object")
    return $.typeNameInChrome;
  var userAgent = navigator.userAgent;
  if (userAgent.indexOf("Chrome") !== -1 || userAgent.indexOf("DumpRenderTree") !== -1)
    return $.typeNameInChrome;
  else if (userAgent.indexOf("Firefox") !== -1)
    return $.typeNameInFirefox;
  else if (userAgent.indexOf("MSIE") !== -1)
    return $.typeNameInIE;
  else if (userAgent.indexOf("Opera") !== -1)
    return $.typeNameInOpera;
  else if (userAgent.indexOf("AppleWebKit") !== -1)
    return $.typeNameInSafari;
  else
    return $.constructorNameFallback;
};

$.toStringForNativeObject = function(obj) {
  if ($._getTypeNameOf == null)
    $._getTypeNameOf = $.getFunctionForTypeNameOf();
  return "Instance of " + $._getTypeNameOf.call$1(obj);
};

$.hashCodeForNativeObject = function(object) {
  return $.Primitives_objectHashCode(object);
};

$.defineProperty = function(obj, property, value) {
  Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
};

$.defineNativeMethods = function(tags, interceptorClass) {
  $.defineNativeMethodsCommon(tags, interceptorClass, true);
};

$.defineNativeMethodsNonleaf = function(tags, interceptorClass) {
  $.defineNativeMethodsCommon(tags, interceptorClass, false);
};

$.defineNativeMethodsCommon = function(tags, interceptorClass, isLeaf) {
  var methods, tagsList, i, tag;
  methods = interceptorClass.prototype;
  if ($.interceptorsByTag == null)
    $.interceptorsByTag = {};
  if ($.leafTags == null)
    $.leafTags = {};
  tagsList = tags.split("|");
  for (i = 0; i < tagsList.length; ++i) {
    tag = tagsList[i];
    $.interceptorsByTag[tag] = methods;
    $.leafTags[tag] = isLeaf;
  }
};

$.defineNativeMethodsFinish = function() {
};

$.lookupDispatchRecord = function(obj) {
  var hasOwnPropertyFunction, tag, map, interceptor, secondTag;
  hasOwnPropertyFunction = Object.prototype.hasOwnProperty;
  if ($._getTypeNameOf == null)
    $._getTypeNameOf = $.getFunctionForTypeNameOf();
  tag = $._getTypeNameOf.call$1(obj);
  map = $.interceptorsByTag;
  interceptor = hasOwnPropertyFunction.call(map, tag) ? map[tag] : null;
  if (interceptor == null) {
    secondTag = $.alternateTag(obj, tag);
    if (secondTag != null) {
      map = $.interceptorsByTag;
      interceptor = hasOwnPropertyFunction.call(map, secondTag) ? map[secondTag] : null;
    }
  }
  if (interceptor == null)
    interceptor = {__what: "interceptor not found", __tag: tag};
  if (true === $.leafTags[tag])
    return {i: interceptor, p: false, e: null};
  else
    return {i: interceptor, p: Object.getPrototypeOf(obj), e: null};
};

$.StringMatch$ = function(start, str, pattern) {
  return new $.StringMatch(start, str, pattern);
};

$.allMatchesInStringUnchecked = function(needle, haystack) {
  var result, $length, patternLength, startIndex, position, endIndex;
  result = $.List_List($);
  $length = haystack.length;
  patternLength = needle.length;
  for (startIndex = 0; true;) {
    position = $.JSString_methods.indexOf$2(haystack, needle, startIndex);
    if (position === -1)
      break;
    result.push($.StringMatch$(position, haystack, needle));
    endIndex = position + patternLength;
    if (endIndex === $length)
      break;
    else
      startIndex = position === endIndex ? startIndex + 1 : endIndex;
  }
  return result;
};

$.stringContainsUnchecked = function(receiver, other, startIndex) {
  if (typeof other === "string")
    return $.JSString_methods.indexOf$2(receiver, other, startIndex) !== -1;
  else if (typeof other === "object" && other !== null && !!$.getInterceptor(other).$isJSSyntaxRegExp)
    return other.hasMatch$1($.JSString_methods.substring$1(receiver, startIndex));
  else
    return $.get$iterator$ax($.allMatches$1$s(other, $.JSString_methods.substring$1(receiver, startIndex))).moveNext$0();
};

$.stringReplaceAllUnchecked = function(receiver, from, to) {
  var result, $length, i;
  if (from === "")
    if (receiver === "")
      return to;
    else {
      result = $.StringBuffer$("");
      $length = receiver.length;
      result.write$1(to);
      for (i = 0; i < $length; ++i) {
        result.write$1(receiver[i]);
        result.write$1(to);
      }
      return result.toString$0(result);
    }
  else
    return receiver.replace(new RegExp(from.replace(new RegExp("[-[\\]{}()*+?.,\\\\^$|#\\s]", 'g'), "\\$&"), 'g'), to.replace("$", "$$$$"));
};

$._attachStackTrace = function(o, st) {
  if (o == null || typeof o === "boolean" || typeof o === "number" || typeof o === "string")
    return;
  $.$indexSet$ax($.get$_stackTraceExpando(), o, st);
};

$.getAttachedStackTrace = function(o) {
  if (o == null || typeof o === "boolean" || typeof o === "number" || typeof o === "string")
    return;
  return $.$index$asx($.get$_stackTraceExpando(), o);
};

$._asyncRunCallback = function() {
  var callbacks, i, callback, remainingCallbacks, newCallbacks, exception;
  for (; $.get$isEmpty$asx($.get$_asyncCallbacks()) !== true;) {
    callbacks = $.get$_asyncCallbacks();
    $._asyncCallbacks = [];
    for (i = 0; $.$lt$n(i, $.get$length$asx(callbacks)); i = $.$add$ns(i, 1)) {
      callback = $.$index$asx(callbacks, i);
      $.$indexSet$ax(callbacks, i, null);
      try {
        callback.call$0();
      } catch (exception) {
        $.unwrapException(exception);
        i = $.$add$ns(i, 1);
        remainingCallbacks = $.sublist$1$ax(callbacks, i);
        newCallbacks = $.get$_asyncCallbacks();
        $._asyncCallbacks = [];
        $.addAll$1$ax($.get$_asyncCallbacks(), remainingCallbacks);
        $.addAll$1$ax($.get$_asyncCallbacks(), newCallbacks);
        $.Timer_run($._asyncRunCallback);
        throw exception;
      }

    }
  }
  $._callbacksAreEnqueued = false;
};

$._CompleterImpl$ = function() {
  return new $._CompleterImpl($._FutureImpl$(), false);
};

$._FutureListenerWrapper$ = function(future) {
  return new $._FutureListenerWrapper(future, null);
};

$._FutureImpl$ = function() {
  return new $._FutureImpl(0, null);
};

$._FutureImpl$immediate = function(value) {
  var t1 = new $._FutureImpl(0, null);
  t1._FutureImpl$immediate$1(value);
  return t1;
};

$._FutureImpl__FutureImpl$wait = function(futures) {
  var t1, t2, t3, t4, pos;
  t1 = {};
  t1.completer_0 = null;
  t1.values_1 = null;
  t2 = new $._FutureImpl__FutureImpl$wait_handleError(t1);
  t1.remaining_2 = 0;
  for (t3 = $.JSArray_methods.get$iterator(futures); t3.moveNext$0();) {
    t4 = t3.get$current();
    pos = t1.remaining_2;
    t1.remaining_2 = $.$add$ns(pos, 1);
    t4.catchError$1(t2).then$1(new $._FutureImpl__FutureImpl$wait_anon(t1, pos));
  }
  if ($.$eq(t1.remaining_2, 0))
    return $._FutureImpl$immediate($.List_empty);
  t1.values_1 = $.List_List(t1.remaining_2);
  t1.completer_0 = $._CompleterImpl$();
  return t1.completer_0.future;
};

$._ThenFuture$ = function(_onValue) {
  return new $._ThenFuture(_onValue, null, 0, null);
};

$._CatchErrorFuture$ = function(_onError, _test) {
  return new $._CatchErrorFuture(_test, _onError, null, 0, null);
};

$._SubscribeFuture$ = function(onValue, _onError) {
  return new $._SubscribeFuture(_onError, onValue, null, 0, null);
};

$._FutureWrapper$ = function(_future) {
  return new $._FutureWrapper(_future);
};

$._throwDelayed = function(error, stackTrace) {
  var t1 = new $._throwDelayed_anon(error, stackTrace);
  $.add$1$ax($.get$_asyncCallbacks(), t1);
  if ($._callbacksAreEnqueued !== true) {
    $.Timer_run($._asyncRunCallback);
    $._callbacksAreEnqueued = true;
  }
};

$._nullDataHandler = function(value) {
};

$._nullErrorHandler = function(error) {
  $._throwDelayed(error, null);
};

$._nullDoneHandler = function() {
};

$._asyncError = function(error, stackTrace) {
  if (stackTrace == null)
    return error;
  if ($.getAttachedStackTrace(error) != null)
    return error;
  $._attachStackTrace(error, stackTrace);
  return error;
};

$._ForwardingStreamSubscription$ = function(_stream, onData, onError, onDone, _cancelOnError) {
  var t1 = new $._ForwardingStreamSubscription(_stream, _cancelOnError, null, onData, onError, onDone);
  t1._BaseStreamSubscription$3(onData, onError, onDone);
  t1._ForwardingStreamSubscription$5(_stream, onData, onError, onDone, _cancelOnError);
  return t1;
};

$._SkipStream$ = function(source, count) {
  var t1 = new $._SkipStream(count, source);
  t1._SkipStream$2(source, count);
  return t1;
};

$.Timer_run = function(callback) {
  var t1, milliseconds;
  $.add$1$ax($.get$Timer__runCallbacks(), callback);
  if ($.$eq($.get$length$asx($.get$Timer__runCallbacks()), 1) === true) {
    t1 = new $.Timer_run_anon();
    milliseconds = $.Duration_0.get$inMilliseconds();
    if (milliseconds < 0)
      milliseconds = 0;
    $.TimerImpl$(milliseconds, t1);
  }
};

$.HashMap$ = function() {
  return new $.HashMap(0, null, null, null, null);
};

$.LinkedHashMap$ = function() {
  return new $.LinkedHashMap(0, null, null, null, null, null, 0);
};

$.LinkedHashSet$ = function() {
  return new $.LinkedHashSet(0, null, null, null, null, null, 0);
};

$.Queue_Queue = function() {
  return $.ListQueue$(null);
};

$.ListQueue$ = function(initialCapacity) {
  var t1 = new $.ListQueue(null, 0, 0, 0);
  t1.ListQueue$1(initialCapacity);
  return t1;
};

$.ListQueue__isPowerOf2 = function(number) {
  return $.JSNull_methods.$and(number, $.JSNull_methods.$sub(number, 1)) === 0;
};

$.ListQueue__nextPowerOf2 = function(number) {
  var nextNumber;
  number = $.$shl$n(number, 2) - 1;
  for (; true; number = nextNumber) {
    nextNumber = (number & number - 1) >>> 0;
    if (nextNumber === 0)
      return number;
  }
};

$._ListQueueIterator$ = function(queue) {
  return new $._ListQueueIterator(queue, queue._tail, queue._modificationCount, queue._head, null);
};

$.Duration$ = function(days, hours, microseconds, milliseconds, minutes, seconds) {
  if (typeof microseconds !== "number")
    throw $.iae(microseconds);
  return new $.Duration(days * 86400000000 + hours * 3600000000 + minutes * 60000000 + seconds * 1000000 + milliseconds * 1000 + microseconds);
};

$.Error_safeToString = function(object) {
  if (typeof object === "number" && Math.floor(object) === object || typeof object === "number" || typeof object === "boolean" || null == object)
    return $.toString$0(object);
  if (typeof object === "string")
    return "\"" + $.JSString_methods.replaceAll$2($.JSString_methods.replaceAll$2($.JSString_methods.replaceAll$2($.JSString_methods.replaceAll$2(object, "\\", "\\\\"), "\n", "\\n"), "\r", "\\r"), "\"", "\\\"") + "\"";
  return "Instance of '" + $.S($.Primitives_objectTypeName(object)) + "'";
};

$.ArgumentError$ = function(message) {
  return new $.ArgumentError(message);
};

$.RangeError$value = function(value) {
  return new $.RangeError("value " + $.S(value));
};

$.RangeError$range = function(value, start, end) {
  return new $.RangeError("value " + $.S(value) + " not in range " + $.S(start) + ".." + $.S(end));
};

$.NoSuchMethodError$ = function(_receiver, _memberName, _arguments, _namedArguments, existingArgumentNames) {
  return new $.NoSuchMethodError(_receiver, _memberName, _arguments, _namedArguments, existingArgumentNames);
};

$.UnsupportedError$ = function(message) {
  return new $.UnsupportedError(message);
};

$.UnimplementedError$ = function(message) {
  return new $.UnimplementedError(message);
};

$.StateError$ = function(message) {
  return new $.StateError(message);
};

$.ConcurrentModificationError$ = function(modifiedObject) {
  return new $.ConcurrentModificationError(modifiedObject);
};

$.StackOverflowError$ = function() {
  return new $.StackOverflowError();
};

$.RuntimeError$ = function(message) {
  return new $.RuntimeError(message);
};

$._ExceptionImplementation$ = function(message) {
  return new $._ExceptionImplementation(message);
};

$.FormatException$ = function(message) {
  return new $.FormatException(message);
};

$.IntegerDivisionByZeroException$ = function() {
  return new $.IntegerDivisionByZeroException();
};

$.Expando$ = function($name) {
  return new $.Expando($name);
};

$.List_List = function($length) {
  var t1, result;
  t1 = $ === $length;
  if (t1)
    $length = null;
  if (t1)
    return new Array(0);
  if (typeof $length !== "number" || Math.floor($length) !== $length || $length < 0)
    throw $.wrapException($.ArgumentError$("Length must be a positive integer: " + $.S($length) + "."));
  result = new Array($length);
  result.fixed$length = true;
  return result;
};

$.List_List$from = function(other, growable) {
  var list, t1, $length, fixedList, i;
  list = $.List_List($);
  for (t1 = $.get$iterator$ax(other); t1.moveNext$0() === true;)
    list.push(t1.get$current());
  if (growable === true)
    return list;
  $length = list.length;
  fixedList = $.List_List($length);
  for (t1 = list.length, i = 0; i < $length; ++i) {
    if (i >= t1)
      throw $.ioore(i);
    fixedList[i] = list[i];
  }
  return fixedList;
};

$.Map_Map = function() {
  return $.HashMap$();
};

$.Object$ = function() {
  return new $.Object();
};

$.StringBuffer$ = function($content) {
  var t1 = new $.StringBuffer("");
  t1.StringBuffer$1($content);
  return t1;
};

$.window = function() {
  return window;
};

$._ChildrenElementList$_wrap = function(element) {
  return new $._ChildrenElementList(element, $.get$$$dom_children$x(element));
};

$._FrozenElementList$_wrap = function(_nodeList) {
  return new $._FrozenElementList(_nodeList);
};

$._ElementCssClassSet$ = function(_element) {
  return new $._ElementCssClassSet(_element);
};

$.HttpRequest_getString = function(url, onProgress, withCredentials) {
  return $.HttpRequest_request(url, null, onProgress, null, null, withCredentials).then$1(new $.HttpRequest_getString_anon());
};

$.HttpRequest_request = function(url, method, onProgress, responseType, sendData, withCredentials) {
  var completer, xhr, t1;
  completer = $._CompleterImpl$();
  xhr = new XMLHttpRequest();
  if (method == null)
    method = "GET";
  t1 = $.getInterceptor$x(xhr);
  t1.open$3$async(xhr, method, url, true);
  if (withCredentials != null)
    xhr.withCredentials = withCredentials;
  if (responseType != null)
    xhr.responseType = responseType;
  if (onProgress != null)
    t1.get$onProgress(xhr).listen$1(onProgress);
  t1.get$onLoad(xhr).listen$1(new $.HttpRequest_request_anon(completer, xhr));
  t1.get$onError(xhr).listen$1(new $.HttpRequest_request_anon0(completer));
  if (sendData != null)
    xhr.send(sendData);
  else
    xhr.send();
  return completer.future;
};

$._ChildNodeListLazy$ = function(_this) {
  return new $._ChildNodeListLazy(_this);
};

$._ElementAttributeMap$ = function(element) {
  return new $._ElementAttributeMap(element);
};

$._EventStream$ = function(_target, _eventType, _useCapture) {
  return new $._EventStream(_target, _eventType, _useCapture);
};

$._EventStreamSubscription$ = function(_target, _eventType, _onData, _useCapture) {
  var t1 = new $._EventStreamSubscription(0, _target, _eventType, _onData, _useCapture);
  t1._EventStreamSubscription$4(_target, _eventType, _onData, _useCapture);
  return t1;
};

$.FixedSizeListIterator$ = function(array) {
  return new $.FixedSizeListIterator(array, $.get$length$asx(array), -1, null);
};

$.convertDartToNative_Dictionary = function(dict) {
  var object;
  if (dict == null)
    return;
  object = {};
  dict.forEach$1(dict, new $.convertDartToNative_Dictionary_anon(object));
  return object;
};

$.Device_userAgent = function() {
  return $.get$navigator$x($.window()).userAgent;
};

$.Device_isOpera = function() {
  if ($.Device__isOpera == null)
    $.Device__isOpera = $.contains$2$asx($.Device_userAgent(), "Opera", 0);
  return $.Device__isOpera;
};

$.Device_isWebKit = function() {
  if ($.Device__isWebKit == null)
    $.Device__isWebKit = $.Device_isOpera() !== true && $.contains$2$asx($.Device_userAgent(), "WebKit", 0) === true;
  return $.Device__isWebKit;
};

$.FilteredElementList$ = function(node) {
  return new $.FilteredElementList(node, $.get$nodes$x(node));
};

$.Lists_getRange = function(a, start, end, accumulator) {
  var i;
  if (typeof a !== "string" && (typeof a !== "object" || a === null || a.constructor !== Array && !$.getInterceptor(a).$isJavaScriptIndexingBehavior()))
    return $.Lists_getRange$bailout(1, a, start, end, accumulator);
  if (typeof start !== "number")
    return $.Lists_getRange$bailout(1, a, start, end, accumulator);
  if (typeof end !== "number")
    return $.Lists_getRange$bailout(1, a, start, end, accumulator);
  if (start < 0)
    throw $.wrapException($.RangeError$value(start));
  if (end < start)
    throw $.wrapException($.RangeError$value(end));
  if (end > a.length)
    throw $.wrapException($.RangeError$value(end));
  for (i = start; i < end; ++i) {
    if (i !== (i | 0))
      throw $.iae(i);
    if (i < 0 || i >= a.length)
      throw $.ioore(i);
    accumulator.push(a[i]);
  }
  return accumulator;
};

$.Lists_getRange$bailout = function(state0, a, start, end, accumulator) {
  var t1, t2, i;
  if ($.$lt$n(start, 0))
    throw $.wrapException($.RangeError$value(start));
  t1 = $.getInterceptor$n(end);
  if (t1.$lt(end, start))
    throw $.wrapException($.RangeError$value(end));
  t2 = $.getInterceptor$asx(a);
  if (t1.$gt(end, t2.get$length(a)))
    throw $.wrapException($.RangeError$value(end));
  for (i = start; t1 = $.getInterceptor$n(i), t1.$lt(i, end); i = t1.$add(i, 1))
    accumulator.push(t2.$index(a, i));
  return accumulator;
};

$.ReceivePort_ReceivePort = function() {
  return $.ReceivePortImpl$();
};

$._Isolate_port = function() {
  if ($.lazyPort == null)
    $.lazyPort = $.ReceivePort_ReceivePort();
  return $.lazyPort;
};

$.parse = function(json, reviver) {
  var parsed, e, t1, exception;
  t1 = json;
  if (typeof t1 !== "string")
    throw $.wrapException($.ArgumentError$(json));
  parsed = null;
  try {
    parsed = JSON.parse(json);
  } catch (exception) {
    t1 = $.unwrapException(exception);
    e = t1;
    throw $.wrapException($.FormatException$(String(e)));
  }

  return $._convertJsonToDart(parsed, reviver);
};

$._AttributeClassSet$ = function(_element) {
  return new $._AttributeClassSet(_element);
};

$.BarGraph$ = function(_canvas, _elements) {
  var t1 = new $.BarGraph(_canvas, null, _elements, 0);
  t1.BarGraph$2(_canvas, _elements);
  return t1;
};

$.GraphModel$ = function(_maxSize) {
  return new $.GraphModel($.List_List($), _maxSize, []);
};

$.Element$ = function($name, color) {
  return new $.Element0($name, color);
};

$.Sample$ = function(_segments) {
  return new $.Sample(_segments);
};

$.IsolateList$ = function(_isolateTable) {
  return new $.IsolateList(_isolateTable);
};

$.ModelListener$ = function(_onUpdate, _onFailure) {
  return new $.ModelListener(_onUpdate, _onFailure);
};

$.IsolateListModel$ = function() {
  return new $.IsolateListModel([], []);
};

$.Isolate$ = function(raw) {
  var t1 = $.getInterceptor$asx(raw);
  return new $.Isolate(t1.$index(raw, "handle"), t1.$index(raw, "name"), t1.$index(raw, "port"), t1.$index(raw, "starttime"), t1.$index(raw, "stacklimit"), $.Space$(t1.$index(raw, "newspace")), $.Space$(t1.$index(raw, "oldspace")));
};

$.Space$ = function(raw) {
  var t1 = $.getInterceptor$asx(raw);
  return new $.Space(t1.$index(raw, "used"), t1.$index(raw, "capacity"));
};

$.main = function() {
  var t1, milliseconds;
  document.querySelector("#dashboard");
  $._graph = $.BarGraph$(document.querySelector("#graph"), [$.Element$("Old Space", "#97FFFF"), $.Element$("New Space", "#00EE76")]);
  $._isolateList = $.IsolateList$(document.querySelector("#isolateList"));
  $._statusText = document.querySelector("#statusText");
  $._isolates = $.IsolateListModel$();
  $._isolates.addListener$2($.onUpdateStatus, $.onRequestFailed);
  $._isolates.update$0();
  t1 = new $.main_anon();
  milliseconds = $.Duration_3000000.get$inMilliseconds();
  if (milliseconds < 0)
    milliseconds = 0;
  $._updater = $.TimerImpl$periodic(milliseconds, t1);
};

$.onUpdateStatus = function(model) {
  var t1 = {};
  t1.oldSpace_0 = 0;
  t1.newSpace_1 = 0;
  $.forEach$1$ax(model, new $.onUpdateStatus_anon(t1));
  $._graph.addSample$1([t1.oldSpace_0, t1.newSpace_1]);
  $._isolateList.updateList$1(model);
  $.set$text$x($._statusText, "Running ...");
};

$.onRequestFailed = function() {
  $._updater.cancel$0();
  $._isolates.removeListener$1($.onUpdateStatus);
  $.set$text$x($._statusText, "Server closed");
};

$.IsolateNatives__processWorkerMessage.call$2 = $.IsolateNatives__processWorkerMessage;
$.IsolateNatives__processWorkerMessage.$name = "IsolateNatives__processWorkerMessage";
$.wrapException.call$1 = $.wrapException;
$.wrapException.$name = "wrapException";
$.DartError_toStringWrapper.call$0 = $.DartError_toStringWrapper;
$.DartError_toStringWrapper.$name = "DartError_toStringWrapper";
$.invokeClosure.call$5 = $.invokeClosure;
$.invokeClosure.$name = "invokeClosure";
$.typeNameInChrome.call$1 = $.typeNameInChrome;
$.typeNameInChrome.$name = "typeNameInChrome";
$.typeNameInSafari.call$1 = $.typeNameInSafari;
$.typeNameInSafari.$name = "typeNameInSafari";
$.typeNameInOpera.call$1 = $.typeNameInOpera;
$.typeNameInOpera.$name = "typeNameInOpera";
$.typeNameInFirefox.call$1 = $.typeNameInFirefox;
$.typeNameInFirefox.$name = "typeNameInFirefox";
$.typeNameInIE.call$1 = $.typeNameInIE;
$.typeNameInIE.$name = "typeNameInIE";
$.constructorNameFallback.call$1 = $.constructorNameFallback;
$.constructorNameFallback.$name = "constructorNameFallback";
$._asyncRunCallback.call$0 = $._asyncRunCallback;
$._asyncRunCallback.$name = "_asyncRunCallback";
$._nullDataHandler.call$1 = $._nullDataHandler;
$._nullDataHandler.$name = "_nullDataHandler";
$._nullErrorHandler.call$1 = $._nullErrorHandler;
$._nullErrorHandler.$name = "_nullErrorHandler";
$._nullDoneHandler.call$0 = $._nullDoneHandler;
$._nullDoneHandler.$name = "_nullDoneHandler";
$.onUpdateStatus.call$1 = $.onUpdateStatus;
$.onUpdateStatus.$name = "onUpdateStatus";
$.onRequestFailed.call$0 = $.onRequestFailed;
$.onRequestFailed.$name = "onRequestFailed";
$.String = {builtin$cls: "String"};
$.ReceivePort = {builtin$cls: "ReceivePort"};
$.$int = {builtin$cls: "int"};
$.bool = {builtin$cls: "bool"};
$._ManagerStub = {builtin$cls: "_ManagerStub"};
$.List = {builtin$cls: "List"};
$.num = {builtin$cls: "num"};
$.Match = {builtin$cls: "Match"};
$.C_NullThrownError = new $.NullThrownError();
Isolate.makeConstantList = function(list) {
  list.immutable$list = true;
  list.fixed$length = true;
  return list;
};
$.List_empty = Isolate.makeConstantList([]);
$.JSDouble_methods = $.JSDouble.prototype;
$.EventStreamProvider_click = new $.EventStreamProvider("click");
$.JSNull_methods = $.JSNull.prototype;
$.JSNumber_methods = $.JSNumber.prototype;
$.JSString_methods = $.JSString.prototype;
$.EventStreamProvider_progress = new $.EventStreamProvider("progress");
$.JSArray_methods = $.JSArray.prototype;
$.EventStreamProvider_error = new $.EventStreamProvider("error");
$.C_CloseToken = new $.CloseToken();
$.EventStreamProvider_load = new $.EventStreamProvider("load");
$.JSInt_methods = $.JSInt.prototype;
$.Duration_0 = new $.Duration(0);
$.Duration_3000000 = new $.Duration(3000000);
$.Expando__keyCount = 0;
$.dispatchPropertyName = "_zzyzx";
$.lazyPort = null;
$.ReceivePortImpl__nextFreeId = 1;
$.Primitives_hashCodeSeed = 0;
$._getTypeNameOf = null;
$.interceptorsByTag = null;
$.leafTags = null;
$._callbacksAreEnqueued = false;
$.Device__isOpera = null;
$.Device__isWebKit = null;
$._graph = null;
$._isolateList = null;
$._statusText = null;
$._isolates = null;
$._updater = null;
$.$$dom_addEventListener$3$x = function(receiver, a0, a1, a2) {
  return $.getInterceptor$x(receiver).$$dom_addEventListener$3(receiver, a0, a1, a2);
};
$.$$dom_removeEventListener$3$x = function(receiver, a0, a1, a2) {
  return $.getInterceptor$x(receiver).$$dom_removeEventListener$3(receiver, a0, a1, a2);
};
$.$$dom_replaceChild$2$x = function(receiver, a0, a1) {
  return $.getInterceptor$x(receiver).$$dom_replaceChild$2(receiver, a0, a1);
};
$.$add$ns = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return receiver + a0;
  return $.getInterceptor$ns(receiver).$add(receiver, a0);
};
$.$and$n = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return (receiver & a0) >>> 0;
  return $.getInterceptor$n(receiver).$and(receiver, a0);
};
$.$div$n = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return receiver / a0;
  return $.getInterceptor$n(receiver).$div(receiver, a0);
};
$.$eq = function(receiver, a0) {
  if (receiver == null)
    return a0 == null;
  if (typeof receiver != "object")
    return a0 != null && receiver === a0;
  return $.getInterceptor(receiver).$eq(receiver, a0);
};
$.$ge$n = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return receiver >= a0;
  return $.getInterceptor$n(receiver).$ge(receiver, a0);
};
$.$gt$n = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return receiver > a0;
  return $.getInterceptor$n(receiver).$gt(receiver, a0);
};
$.$index$asx = function(receiver, a0) {
  if (receiver.constructor == Array || typeof receiver == "string")
    if (a0 >>> 0 === a0 && a0 < receiver.length)
      return receiver[a0];
  return $.getInterceptor$asx(receiver).$index(receiver, a0);
};
$.$indexSet$ax = function(receiver, a0, a1) {
  if (receiver.constructor == Array && !receiver.immutable$list && a0 >>> 0 === a0 && a0 < receiver.length)
    return receiver[a0] = a1;
  return $.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
};
$.$lt$n = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return receiver < a0;
  return $.getInterceptor$n(receiver).$lt(receiver, a0);
};
$.$mul$n = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return receiver * a0;
  return $.getInterceptor$n(receiver).$mul(receiver, a0);
};
$.$shl$n = function(receiver, a0) {
  return $.getInterceptor$n(receiver).$shl(receiver, a0);
};
$.$sub$n = function(receiver, a0) {
  if (typeof receiver == "number" && typeof a0 == "number")
    return receiver - a0;
  return $.getInterceptor$n(receiver).$sub(receiver, a0);
};
$.$tdiv$n = function(receiver, a0) {
  return $.getInterceptor$n(receiver).$tdiv(receiver, a0);
};
$.abs$0$n = function(receiver) {
  return $.getInterceptor$n(receiver).abs$0(receiver);
};
$.add$1$ax = function(receiver, a0) {
  return $.getInterceptor$ax(receiver).add$1(receiver, a0);
};
$.addAll$1$ax = function(receiver, a0) {
  return $.getInterceptor$ax(receiver).addAll$1(receiver, a0);
};
$.allMatches$1$s = function(receiver, a0) {
  return $.getInterceptor$s(receiver).allMatches$1(receiver, a0);
};
$.ceil$0$n = function(receiver) {
  return $.getInterceptor$n(receiver).ceil$0(receiver);
};
$.contains$2$asx = function(receiver, a0, a1) {
  return $.getInterceptor$asx(receiver).contains$2(receiver, a0, a1);
};
$.elementAt$1$ax = function(receiver, a0) {
  return $.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
};
$.forEach$1$ax = function(receiver, a0) {
  return $.getInterceptor$ax(receiver).forEach$1(receiver, a0);
};
$.get$$$dom_children$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$$$dom_children(receiver);
};
$.get$attributes$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$attributes(receiver);
};
$.get$children$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$children(receiver);
};
$.get$classes$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$classes(receiver);
};
$.get$color$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$color(receiver);
};
$.get$context2D$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$context2D(receiver);
};
$.get$hashCode$ = function(receiver) {
  return $.getInterceptor(receiver).get$hashCode(receiver);
};
$.get$height$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$height(receiver);
};
$.get$id$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$id(receiver);
};
$.get$isEmpty$asx = function(receiver) {
  return $.getInterceptor$asx(receiver).get$isEmpty(receiver);
};
$.get$iterator$ax = function(receiver) {
  return $.getInterceptor$ax(receiver).get$iterator(receiver);
};
$.get$length$asx = function(receiver) {
  return $.getInterceptor$asx(receiver).get$length(receiver);
};
$.get$name$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$name(receiver);
};
$.get$navigator$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$navigator(receiver);
};
$.get$nodes$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$nodes(receiver);
};
$.get$onClick$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$onClick(receiver);
};
$.get$responseText$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$responseText(receiver);
};
$.get$value$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$value(receiver);
};
$.get$width$x = function(receiver) {
  return $.getInterceptor$x(receiver).get$width(receiver);
};
$.postMessage$1$x = function(receiver, a0) {
  return $.getInterceptor$x(receiver).postMessage$1(receiver, a0);
};
$.register$2$x = function(receiver, a0, a1) {
  return $.getInterceptor$x(receiver).register$2(receiver, a0, a1);
};
$.remove$0$ax = function(receiver) {
  return $.getInterceptor$ax(receiver).remove$0(receiver);
};
$.replaceAll$2$s = function(receiver, a0, a1) {
  return $.getInterceptor$s(receiver).replaceAll$2(receiver, a0, a1);
};
$.replaceWith$1$x = function(receiver, a0) {
  return $.getInterceptor$x(receiver).replaceWith$1(receiver, a0);
};
$.send$1$x = function(receiver, a0) {
  return $.getInterceptor$x(receiver).send$1(receiver, a0);
};
$.send$2$x = function(receiver, a0, a1) {
  return $.getInterceptor$x(receiver).send$2(receiver, a0, a1);
};
$.set$$$dom_className$x = function(receiver, value) {
  return $.getInterceptor$x(receiver).set$$$dom_className(receiver, value);
};
$.set$id$x = function(receiver, value) {
  return $.getInterceptor$x(receiver).set$id(receiver, value);
};
$.set$length$asx = function(receiver, value) {
  return $.getInterceptor$asx(receiver).set$length(receiver, value);
};
$.set$text$x = function(receiver, value) {
  return $.getInterceptor$x(receiver).set$text(receiver, value);
};
$.skip$1$ax = function(receiver, a0) {
  return $.getInterceptor$ax(receiver).skip$1(receiver, a0);
};
$.split$1$s = function(receiver, a0) {
  return $.getInterceptor$s(receiver).split$1(receiver, a0);
};
$.sublist$1$ax = function(receiver, a0) {
  return $.getInterceptor$ax(receiver).sublist$1(receiver, a0);
};
$.sublist$2$ax = function(receiver, a0, a1) {
  return $.getInterceptor$ax(receiver).sublist$2(receiver, a0, a1);
};
$.toList$0$ax = function(receiver) {
  return $.getInterceptor$ax(receiver).toList$0(receiver);
};
$.toList$1$growable$ax = function(receiver, a0) {
  return $.getInterceptor$ax(receiver).toList$1$growable(receiver, a0);
};
$.toString$0 = function(receiver) {
  return $.getInterceptor(receiver).toString$0(receiver);
};
$.trim$0$s = function(receiver) {
  return $.getInterceptor$s(receiver).trim$0(receiver);
};
$.getInterceptor = function(receiver) {
  if (typeof receiver == "number") {
    if (Math.floor(receiver) == receiver)
      return $.JSInt.prototype;
    return $.JSDouble.prototype;
  }
  if (typeof receiver == "string")
    return $.JSString.prototype;
  if (receiver == null)
    return $.JSNull.prototype;
  if (typeof receiver == "function")
    return $.JSFunction.prototype;
  if (typeof receiver == "boolean")
    return $.JSBool.prototype;
  if (receiver.constructor == Array)
    return $.JSArray.prototype;
  if (typeof receiver != "object")
    return receiver;
  if (receiver instanceof $.Object)
    return receiver;
  if (Object.getPrototypeOf(receiver) === Object.prototype)
    return $.Interceptor.prototype;
  return $.getNativeInterceptor(receiver);
};
$.getInterceptor$asx = function(receiver) {
  if (typeof receiver == "string")
    return $.JSString.prototype;
  if (receiver == null)
    return receiver;
  if (receiver.constructor == Array)
    return $.JSArray.prototype;
  if (typeof receiver != "object")
    return receiver;
  if (receiver instanceof $.Object)
    return receiver;
  if (Object.getPrototypeOf(receiver) === Object.prototype)
    return $.Interceptor.prototype;
  return $.getNativeInterceptor(receiver);
};
$.getInterceptor$ax = function(receiver) {
  if (receiver == null)
    return receiver;
  if (receiver.constructor == Array)
    return $.JSArray.prototype;
  if (typeof receiver != "object")
    return receiver;
  if (receiver instanceof $.Object)
    return receiver;
  if (Object.getPrototypeOf(receiver) === Object.prototype)
    return $.Interceptor.prototype;
  return $.getNativeInterceptor(receiver);
};
$.getInterceptor$n = function(receiver) {
  if (typeof receiver == "number")
    return $.JSNumber.prototype;
  if (receiver == null)
    return receiver;
  return receiver;
};
$.getInterceptor$ns = function(receiver) {
  if (typeof receiver == "number")
    return $.JSNumber.prototype;
  if (typeof receiver == "string")
    return $.JSString.prototype;
  if (receiver == null)
    return receiver;
  return receiver;
};
$.getInterceptor$s = function(receiver) {
  if (typeof receiver == "string")
    return $.JSString.prototype;
  if (receiver == null)
    return receiver;
  return receiver;
};
$.getInterceptor$x = function(receiver) {
  if (receiver == null)
    return receiver;
  if (typeof receiver != "object")
    return receiver;
  if (receiver instanceof $.Object)
    return receiver;
  if (Object.getPrototypeOf(receiver) === Object.prototype)
    return $.Interceptor.prototype;
  return $.getNativeInterceptor(receiver);
};
Isolate.$lazy($, "globalThis", "globalThis", "get$globalThis", function() {
  return $.IsolateNatives_computeGlobalThis();
});
Isolate.$lazy($, "globalWindow", "globalWindow", "get$globalWindow", function() {
  return $.get$globalThis().window;
});
Isolate.$lazy($, "globalWorker", "globalWorker", "get$globalWorker", function() {
  return $.get$globalThis().Worker;
});
Isolate.$lazy($, "globalPostMessageDefined", "globalPostMessageDefined", "get$globalPostMessageDefined", function() {
  return $.get$globalThis().postMessage !== void 0;
});
Isolate.$lazy($, "thisScript", "IsolateNatives_thisScript", "get$IsolateNatives_thisScript", function() {
  return $.IsolateNatives_computeThisScript();
});
Isolate.$lazy($, "_stackTraceExpando", "_stackTraceExpando", "get$_stackTraceExpando", function() {
  return $.Expando$("asynchronous error");
});
Isolate.$lazy($, "_asyncCallbacks", "_asyncCallbacks", "get$_asyncCallbacks", function() {
  return [];
});
Isolate.$lazy($, "_runCallbacks", "Timer__runCallbacks", "get$Timer__runCallbacks", function() {
  return [];
});
// Native classes
(function(table) {
  for (var key in table)
    $.defineProperty(Object.prototype, key, table[key]);
})({
  $isJavaScriptIndexingBehavior: function() {
    return false;
  },
  $asJavaScriptIndexingBehavior: function() {
    return null;
  },
  $isIterable: function() {
    return false;
  },
  $asIterable: function() {
    return null;
  },
  $isList: function() {
    return false;
  },
  $asList: function() {
    return null;
  },
  $isElement: function() {
    return false;
  },
  $asElement: function() {
    return null;
  }
});

$.defineNativeMethods("Worker", $._WorkerStub);

$.defineNativeMethodsNonleaf("HTMLElement", $._HTMLElement);

$.defineNativeMethods("HTMLAnchorElement", $.AnchorElement);

$.defineNativeMethods("WebKitAnimationEvent", $.AnimationEvent);

$.defineNativeMethods("HTMLAreaElement", $.AreaElement);

$.defineNativeMethods("ArrayBuffer", $.ArrayBuffer);

$.defineNativeMethodsNonleaf("ArrayBufferView", $.ArrayBufferView);

$.defineNativeMethods("Attr", $.Attr);

$.defineNativeMethods("HTMLAudioElement", $.AudioElement);

$.defineNativeMethods("AutocompleteErrorEvent", $.AutocompleteErrorEvent);

$.defineNativeMethods("HTMLBRElement", $.BRElement);

$.defineNativeMethods("HTMLBaseElement", $.BaseElement);

$.defineNativeMethods("BeforeLoadEvent", $.BeforeLoadEvent);

$.defineNativeMethodsNonleaf("Blob", $.Blob);

$.defineNativeMethods("HTMLBodyElement", $.BodyElement);

$.defineNativeMethods("HTMLButtonElement", $.ButtonElement);

$.defineNativeMethods("CDATASection", $.CDataSection);

$.defineNativeMethods("HTMLCanvasElement", $.CanvasElement);

$.defineNativeMethods("CanvasGradient", $.CanvasGradient);

$.defineNativeMethods("CanvasPattern", $.CanvasPattern);

$.defineNativeMethodsNonleaf("CanvasRenderingContext", $.CanvasRenderingContext);

$.defineNativeMethods("CanvasRenderingContext2D", $.CanvasRenderingContext2D);

$.defineNativeMethodsNonleaf("CharacterData", $.CharacterData);

$.defineNativeMethods("CloseEvent", $.CloseEvent);

$.defineNativeMethods("Comment", $.Comment);

$.defineNativeMethods("CompositionEvent", $.CompositionEvent);

$.defineNativeMethods("HTMLContentElement", $.ContentElement);

$.defineNativeMethods("CSSFontFaceLoadEvent", $.CssFontFaceLoadEvent);

$.defineNativeMethods("CSSStyleDeclaration", $.CssStyleDeclaration);

$.defineNativeMethods("CustomElementConstructor", $.CustomElementConstructor);

$.defineNativeMethods("CustomEvent", $.CustomEvent);

$.defineNativeMethods("HTMLDListElement", $.DListElement);

$.defineNativeMethods("HTMLDataListElement", $.DataListElement);

$.defineNativeMethods("HTMLDetailsElement", $.DetailsElement);

$.defineNativeMethods("DeviceMotionEvent", $.DeviceMotionEvent);

$.defineNativeMethods("DeviceOrientationEvent", $.DeviceOrientationEvent);

$.defineNativeMethods("HTMLDialogElement", $.DialogElement);

$.defineNativeMethods("HTMLDivElement", $.DivElement);

$.defineNativeMethodsNonleaf("Document", $.Document);

$.defineNativeMethodsNonleaf("DocumentFragment", $.DocumentFragment);

$.defineNativeMethods("DocumentType", $.DocumentType);

$.defineNativeMethods("DOMError", $.DomError);

$.defineNativeMethods("DOMException", $.DomException);

$.defineNativeMethodsNonleaf("Element", $.Element);

$.defineNativeMethods("HTMLEmbedElement", $.EmbedElement);

$.defineNativeMethods("EntityReference", $.EntityReference);

$.defineNativeMethods("ErrorEvent", $.ErrorEvent);

$.defineNativeMethodsNonleaf("Event", $.Event);

$.defineNativeMethods("EventException", $.EventException);

$.defineNativeMethodsNonleaf("EventTarget", $.EventTarget);

$.defineNativeMethods("HTMLFieldSetElement", $.FieldSetElement);

$.defineNativeMethods("File", $.File);

$.defineNativeMethods("FileError", $.FileError);

$.defineNativeMethods("FileException", $.FileException);

$.defineNativeMethods("FocusEvent", $.FocusEvent);

$.defineNativeMethods("HTMLFormElement", $.FormElement);

$.defineNativeMethods("HTMLHRElement", $.HRElement);

$.defineNativeMethods("HashChangeEvent", $.HashChangeEvent);

$.defineNativeMethods("HTMLHeadElement", $.HeadElement);

$.defineNativeMethods("HTMLHeadingElement", $.HeadingElement);

$.defineNativeMethodsNonleaf("HTMLCollection", $.HtmlCollection);

$.defineNativeMethods("HTMLDocument", $.HtmlDocument);

$.defineNativeMethods("HTMLHtmlElement", $.HtmlElement);

$.defineNativeMethods("HTMLFormControlsCollection", $.HtmlFormControlsCollection);

$.defineNativeMethods("HTMLOptionsCollection", $.HtmlOptionsCollection);

$.defineNativeMethods("XMLHttpRequest", $.HttpRequest);

$.defineNativeMethods("XMLHttpRequestException", $.HttpRequestException);

$.defineNativeMethods("XMLHttpRequestProgressEvent", $.HttpRequestProgressEvent);

$.defineNativeMethods("XMLHttpRequestUpload", $.HttpRequestUpload);

$.defineNativeMethods("HTMLIFrameElement", $.IFrameElement);

$.defineNativeMethods("HTMLImageElement", $.ImageElement);

$.defineNativeMethods("HTMLInputElement", $.InputElement);

$.defineNativeMethods("KeyboardEvent", $.KeyboardEvent);

$.defineNativeMethods("HTMLKeygenElement", $.KeygenElement);

$.defineNativeMethods("HTMLLIElement", $.LIElement);

$.defineNativeMethods("HTMLLabelElement", $.LabelElement);

$.defineNativeMethods("HTMLLegendElement", $.LegendElement);

$.defineNativeMethods("HTMLLinkElement", $.LinkElement);

$.defineNativeMethods("HTMLMapElement", $.MapElement);

$.defineNativeMethodsNonleaf("HTMLMediaElement", $.MediaElement);

$.defineNativeMethods("MediaError", $.MediaError);

$.defineNativeMethods("MediaKeyError", $.MediaKeyError);

$.defineNativeMethods("MediaKeyEvent", $.MediaKeyEvent);

$.defineNativeMethods("MediaStreamEvent", $.MediaStreamEvent);

$.defineNativeMethods("MediaStreamTrackEvent", $.MediaStreamTrackEvent);

$.defineNativeMethods("HTMLMenuElement", $.MenuElement);

$.defineNativeMethods("MessageEvent", $.MessageEvent);

$.defineNativeMethods("HTMLMetaElement", $.MetaElement);

$.defineNativeMethods("HTMLMeterElement", $.MeterElement);

$.defineNativeMethods("HTMLModElement", $.ModElement);

$.defineNativeMethodsNonleaf("MouseEvent", $.MouseEvent);

$.defineNativeMethods("MutationEvent", $.MutationEvent);

$.defineNativeMethods("Navigator", $.Navigator);

$.defineNativeMethods("NavigatorUserMediaError", $.NavigatorUserMediaError);

$.defineNativeMethodsNonleaf("Node", $.Node);

$.defineNativeMethodsNonleaf("NodeList", $.NodeList);

$.defineNativeMethods("Notation", $.Notation);

$.defineNativeMethods("HTMLOListElement", $.OListElement);

$.defineNativeMethods("HTMLObjectElement", $.ObjectElement);

$.defineNativeMethods("HTMLOptGroupElement", $.OptGroupElement);

$.defineNativeMethods("HTMLOptionElement", $.OptionElement);

$.defineNativeMethods("HTMLOutputElement", $.OutputElement);

$.defineNativeMethods("OverflowEvent", $.OverflowEvent);

$.defineNativeMethods("PageTransitionEvent", $.PageTransitionEvent);

$.defineNativeMethods("HTMLParagraphElement", $.ParagraphElement);

$.defineNativeMethods("HTMLParamElement", $.ParamElement);

$.defineNativeMethods("PopStateEvent", $.PopStateEvent);

$.defineNativeMethods("PositionError", $.PositionError);

$.defineNativeMethods("HTMLPreElement", $.PreElement);

$.defineNativeMethods("ProcessingInstruction", $.ProcessingInstruction);

$.defineNativeMethods("HTMLProgressElement", $.ProgressElement);

$.defineNativeMethodsNonleaf("ProgressEvent", $.ProgressEvent);

$.defineNativeMethods("HTMLQuoteElement", $.QuoteElement);

$.defineNativeMethods("RadioNodeList", $.RadioNodeList);

$.defineNativeMethods("RangeException", $.RangeException);

$.defineNativeMethods("RTCDataChannelEvent", $.RtcDataChannelEvent);

$.defineNativeMethods("RTCDTMFToneChangeEvent", $.RtcDtmfToneChangeEvent);

$.defineNativeMethods("RTCIceCandidateEvent", $.RtcIceCandidateEvent);

$.defineNativeMethods("HTMLScriptElement", $.ScriptElement);

$.defineNativeMethods("SecurityPolicyViolationEvent", $.SecurityPolicyViolationEvent);

$.defineNativeMethods("HTMLSelectElement", $.SelectElement);

$.defineNativeMethods("HTMLShadowElement", $.ShadowElement);

$.defineNativeMethods("ShadowRoot", $.ShadowRoot);

$.defineNativeMethods("HTMLSourceElement", $.SourceElement);

$.defineNativeMethods("HTMLSpanElement", $.SpanElement);

$.defineNativeMethods("SpeechInputEvent", $.SpeechInputEvent);

$.defineNativeMethods("SpeechRecognitionError", $.SpeechRecognitionError);

$.defineNativeMethods("SpeechRecognitionEvent", $.SpeechRecognitionEvent);

$.defineNativeMethods("StorageEvent", $.StorageEvent);

$.defineNativeMethods("HTMLStyleElement", $.StyleElement);

$.defineNativeMethods("HTMLTableCaptionElement", $.TableCaptionElement);

$.defineNativeMethods("HTMLTableCellElement", $.TableCellElement);

$.defineNativeMethods("HTMLTableColElement", $.TableColElement);

$.defineNativeMethods("HTMLTableElement", $.TableElement);

$.defineNativeMethods("HTMLTableRowElement", $.TableRowElement);

$.defineNativeMethods("HTMLTableSectionElement", $.TableSectionElement);

$.defineNativeMethods("HTMLTemplateElement", $.TemplateElement);

$.defineNativeMethodsNonleaf("Text", $.Text);

$.defineNativeMethods("HTMLTextAreaElement", $.TextAreaElement);

$.defineNativeMethods("TextEvent", $.TextEvent);

$.defineNativeMethods("HTMLTitleElement", $.TitleElement);

$.defineNativeMethods("TouchEvent", $.TouchEvent);

$.defineNativeMethods("HTMLTrackElement", $.TrackElement);

$.defineNativeMethods("TrackEvent", $.TrackEvent);

$.defineNativeMethods("TransitionEvent", $.TransitionEvent);

$.defineNativeMethodsNonleaf("UIEvent", $.UIEvent);

$.defineNativeMethods("HTMLUListElement", $.UListElement);

$.defineNativeMethodsNonleaf("Uint8Array", $.Uint8Array);

$.defineNativeMethods("Uint8ClampedArray", $.Uint8ClampedArray);

$.defineNativeMethods("HTMLUnknownElement", $.UnknownElement);

$.defineNativeMethods("HTMLVideoElement", $.VideoElement);

$.defineNativeMethods("WheelEvent", $.WheelEvent);

$.defineNativeMethods("DOMWindow", $.Window);

$.defineNativeMethods("XPathException", $.XPathException);

$.defineNativeMethods("NamedNodeMap", $._NamedNodeMap);

$.defineNativeMethods("WebKitTransitionEvent", $._WebKitTransitionEvent);

$.defineNativeMethods("IDBVersionChangeEvent", $.VersionChangeEvent);

$.defineNativeMethods("SVGAElement", $.AElement);

$.defineNativeMethods("SVGAltGlyphElement", $.AltGlyphElement);

$.defineNativeMethods("SVGAnimateElement", $.AnimateElement);

$.defineNativeMethods("SVGAnimateMotionElement", $.AnimateMotionElement);

$.defineNativeMethods("SVGAnimateTransformElement", $.AnimateTransformElement);

$.defineNativeMethods("SVGAnimatedLength", $.AnimatedLength);

$.defineNativeMethods("SVGAnimatedNumberList", $.AnimatedNumberList);

$.defineNativeMethodsNonleaf("SVGAnimationElement", $.AnimationElement);

$.defineNativeMethods("SVGCircleElement", $.CircleElement);

$.defineNativeMethods("SVGClipPathElement", $.ClipPathElement);

$.defineNativeMethods("SVGDefsElement", $.DefsElement);

$.defineNativeMethods("SVGDescElement", $.DescElement);

$.defineNativeMethods("SVGEllipseElement", $.EllipseElement);

$.defineNativeMethods("SVGFEBlendElement", $.FEBlendElement);

$.defineNativeMethods("SVGFEColorMatrixElement", $.FEColorMatrixElement);

$.defineNativeMethods("SVGFEComponentTransferElement", $.FEComponentTransferElement);

$.defineNativeMethods("SVGFECompositeElement", $.FECompositeElement);

$.defineNativeMethods("SVGFEConvolveMatrixElement", $.FEConvolveMatrixElement);

$.defineNativeMethods("SVGFEDiffuseLightingElement", $.FEDiffuseLightingElement);

$.defineNativeMethods("SVGFEDisplacementMapElement", $.FEDisplacementMapElement);

$.defineNativeMethods("SVGFEDistantLightElement", $.FEDistantLightElement);

$.defineNativeMethods("SVGFEFloodElement", $.FEFloodElement);

$.defineNativeMethods("SVGFEFuncAElement", $.FEFuncAElement);

$.defineNativeMethods("SVGFEFuncBElement", $.FEFuncBElement);

$.defineNativeMethods("SVGFEFuncGElement", $.FEFuncGElement);

$.defineNativeMethods("SVGFEFuncRElement", $.FEFuncRElement);

$.defineNativeMethods("SVGFEGaussianBlurElement", $.FEGaussianBlurElement);

$.defineNativeMethods("SVGFEImageElement", $.FEImageElement);

$.defineNativeMethods("SVGFEMergeElement", $.FEMergeElement);

$.defineNativeMethods("SVGFEMergeNodeElement", $.FEMergeNodeElement);

$.defineNativeMethods("SVGFEMorphologyElement", $.FEMorphologyElement);

$.defineNativeMethods("SVGFEOffsetElement", $.FEOffsetElement);

$.defineNativeMethods("SVGFEPointLightElement", $.FEPointLightElement);

$.defineNativeMethods("SVGFESpecularLightingElement", $.FESpecularLightingElement);

$.defineNativeMethods("SVGFESpotLightElement", $.FESpotLightElement);

$.defineNativeMethods("SVGFETileElement", $.FETileElement);

$.defineNativeMethods("SVGFETurbulenceElement", $.FETurbulenceElement);

$.defineNativeMethods("SVGFilterElement", $.FilterElement);

$.defineNativeMethods("SVGForeignObjectElement", $.ForeignObjectElement);

$.defineNativeMethods("SVGGElement", $.GElement);

$.defineNativeMethods("SVGImageElement", $.ImageElement0);

$.defineNativeMethods("SVGLineElement", $.LineElement);

$.defineNativeMethods("SVGLinearGradientElement", $.LinearGradientElement);

$.defineNativeMethods("SVGMarkerElement", $.MarkerElement);

$.defineNativeMethods("SVGMaskElement", $.MaskElement);

$.defineNativeMethods("SVGMetadataElement", $.MetadataElement);

$.defineNativeMethods("SVGPathElement", $.PathElement);

$.defineNativeMethods("SVGPatternElement", $.PatternElement);

$.defineNativeMethods("SVGPolygonElement", $.PolygonElement);

$.defineNativeMethods("SVGPolylineElement", $.PolylineElement);

$.defineNativeMethods("SVGRadialGradientElement", $.RadialGradientElement);

$.defineNativeMethods("SVGRectElement", $.RectElement);

$.defineNativeMethods("SVGScriptElement", $.ScriptElement0);

$.defineNativeMethods("SVGSetElement", $.SetElement);

$.defineNativeMethods("SVGStopElement", $.StopElement);

$.defineNativeMethods("SVGStyleElement", $.StyleElement0);

$.defineNativeMethodsNonleaf("SVGStyledElement", $.StyledElement);

$.defineNativeMethods("SVGDocument", $.SvgDocument);

$.defineNativeMethodsNonleaf("SVGElement", $.SvgElement);

$.defineNativeMethods("SVGException", $.SvgException);

$.defineNativeMethods("SVGSVGElement", $.SvgSvgElement);

$.defineNativeMethods("SVGSwitchElement", $.SwitchElement);

$.defineNativeMethods("SVGSymbolElement", $.SymbolElement);

$.defineNativeMethods("SVGTSpanElement", $.TSpanElement);

$.defineNativeMethodsNonleaf("SVGTextContentElement", $.TextContentElement);

$.defineNativeMethods("SVGTextElement", $.TextElement);

$.defineNativeMethods("SVGTextPathElement", $.TextPathElement);

$.defineNativeMethodsNonleaf("SVGTextPositioningElement", $.TextPositioningElement);

$.defineNativeMethods("SVGTitleElement", $.TitleElement0);

$.defineNativeMethods("SVGUseElement", $.UseElement);

$.defineNativeMethods("SVGViewElement", $.ViewElement);

$.defineNativeMethods("SVGZoomEvent", $.ZoomEvent);

$.defineNativeMethodsNonleaf("SVGGradientElement", $._GradientElement);

$.defineNativeMethodsNonleaf("SVGComponentTransferFunctionElement", $._SVGComponentTransferFunctionElement);

$.defineNativeMethods("AudioProcessingEvent", $.AudioProcessingEvent);

$.defineNativeMethods("OfflineAudioCompletionEvent", $.OfflineAudioCompletionEvent);

$.defineNativeMethods("WebGLContextEvent", $.ContextEvent);

$.defineNativeMethods("SQLError", $.SqlError);

$.defineNativeMethods("SQLException", $.SqlException);


var $ = null;
Isolate = Isolate.$finishIsolateConstructor(Isolate);
var $ = new Isolate();
$.main.call$0 = $.main;
// BEGIN invoke [main].
if (typeof document !== "undefined" && document.readyState !== "complete") {
  document.addEventListener("readystatechange", function () {
    if (document.readyState == "complete") {
      if (typeof dartMainRunner === "function") {
        dartMainRunner(function() { $.startRootIsolate($.main); });
      } else {
        $.startRootIsolate($.main);
      }
    }
  }, false);
} else {
  if (typeof dartMainRunner === "function") {
    dartMainRunner(function() { $.startRootIsolate($.main); });
  } else {
    $.startRootIsolate($.main);
  }
}
// END invoke [main].
function init() {
  Isolate.$isolateProperties = {};
  function generateAccessor(field, prototype) {
    var len = field.length;
    var code = field.charCodeAt(len - 1);
    code = code >= 60 && code <= 64 ? code - 59 : code >= 123 && code <= 126 ? code - 117 : code >= 37 && code <= 43 ? code - 27 : 0;
    if (code) {
      var getterCode = code & 3;
      var setterCode = code >> 2;
      var accessorName = field = field.substring(0, len - 1);
      var divider = field.indexOf(":");
      if (divider > 0) {
        accessorName = field.substring(0, divider);
        field = field.substring(divider + 1);
      }
      if (getterCode) {
        var args = getterCode & 2 ? "receiver" : "";
        var receiver = getterCode & 1 ? "this" : "receiver";
        var body = "return " + receiver + "." + field;
        prototype["get$" + accessorName] = new Function(args, body);
      }
      if (setterCode) {
        var args = setterCode & 2 ? "receiver, value" : "value";
        var receiver = setterCode & 1 ? "this" : "receiver";
        var body = receiver + "." + field + " = value";
        prototype["set$" + accessorName] = new Function(args, body);
      }
    }
    return field;
  }
  Isolate.$isolateProperties.$generateAccessor = generateAccessor;
  function defineClass(cls, fields, prototype) {
    var constructor;
    if (typeof fields == "function") {
      constructor = fields;
    } else {
      var str = "function " + cls + "(";
      var body = "";
      for (var i = 0; i < fields.length; i++) {
        if (i != 0)
          str += ", ";
        var field = fields[i];
        field = generateAccessor(field, prototype);
        str += field;
        body += "this." + field + " = " + field + ";\n";
      }
      str += ") {" + body + "}\nreturn " + cls;
      constructor = new Function(str)();
    }
    constructor.prototype = prototype;
    constructor.builtin$cls = cls;
    return constructor;
  }
  var supportsProto = false;
  var tmp = defineClass("c", ["f?"], {}).prototype;
  if (tmp.__proto__) {
    tmp.__proto__ = {};
    if (typeof tmp.get$f != "undefined")
      supportsProto = true;
  }
  Isolate.$finishClasses = function(collectedClasses, isolateProperties, existingIsolateProperties) {
    var pendingClasses = {};
    var hasOwnProperty = Object.prototype.hasOwnProperty;
    for (var cls in collectedClasses) {
      if (hasOwnProperty.call(collectedClasses, cls)) {
        var desc = collectedClasses[cls];
        var fields = desc[""], supr;
        if (typeof fields == "string") {
          var s = fields.split(";");
          supr = s[0];
          fields = s[1] == "" ? [] : s[1].split(",");
        } else {
          supr = desc.super;
        }
        isolateProperties[cls] = defineClass(cls, fields, desc);
        if (supr)
          pendingClasses[cls] = supr;
      }
    }
    var finishedClasses = {};
    function finishClass(cls) {
      var hasOwnProperty = Object.prototype.hasOwnProperty;
      if (hasOwnProperty.call(finishedClasses, cls))
        return;
      finishedClasses[cls] = true;
      var superclass = pendingClasses[cls];
      if (!superclass || typeof superclass != "string")
        return;
      finishClass(superclass);
      var constructor = isolateProperties[cls];
      var superConstructor = isolateProperties[superclass];
      if (!superConstructor)
        superConstructor = existingIsolateProperties[superclass];
      var prototype = constructor.prototype;
      if (supportsProto) {
        prototype.__proto__ = superConstructor.prototype;
        prototype.constructor = constructor;
      } else {
        function tmp() {
        }
        tmp.prototype = superConstructor.prototype;
        var newPrototype = new tmp();
        constructor.prototype = newPrototype;
        newPrototype.constructor = constructor;
        for (var member in prototype) {
          if (!member)
            continue;
          if (hasOwnProperty.call(prototype, member)) {
            newPrototype[member] = prototype[member];
          }
        }
      }
    }
    for (var cls in pendingClasses)
      finishClass(cls);
  };
  Isolate.$lazy = function(prototype, staticName, fieldName, getterName, lazyValue) {
    var getter = new Function("{ return $." + fieldName + ";}");
    var sentinelUndefined = {};
    var sentinelInProgress = {};
    prototype[fieldName] = sentinelUndefined;
    prototype[getterName] = function() {
      var result = $[fieldName];
      try {
        if (result === sentinelUndefined) {
          $[fieldName] = sentinelInProgress;
          try {
            result = $[fieldName] = lazyValue();
          } finally {
            if (result === sentinelUndefined) {
              if ($[fieldName] === sentinelInProgress) {
                $[fieldName] = null;
              }
            }
          }
        } else {
          if (result === sentinelInProgress)
            $.throwCyclicInit(staticName);
        }
        return result;
      } finally {
        $[getterName] = getter;
      }
    };
  };
  Isolate.$finishIsolateConstructor = function(oldIsolate) {
    var isolateProperties = oldIsolate.$isolateProperties;
    isolateProperties.$currentScript = typeof document == "object" ? document.currentScript || document.scripts[document.scripts.length - 1] : null;
    var isolatePrototype = oldIsolate.prototype;
    var str = "{\n";
    str += "var properties = Isolate.$isolateProperties;\n";
    var hasOwnProperty = Object.prototype.hasOwnProperty;
    for (var staticName in isolateProperties) {
      if (hasOwnProperty.call(isolateProperties, staticName)) {
        str += "this." + staticName + "= properties." + staticName + ";\n";
      }
    }
    str += "}\n";
    var newIsolate = new Function(str);
    newIsolate.prototype = isolatePrototype;
    isolatePrototype.constructor = newIsolate;
    newIsolate.$isolateProperties = isolateProperties;
    newIsolate.$finishClasses = oldIsolate.$finishClasses;
    return newIsolate;
  };
}
//@ sourceMappingURL=vmstats.dart.js.map
