// Generated by dart2js (NullSafetyMode.sound, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.4.0-edge.b811ab5b0469736ce3fe6a9f6c023bb2313853ec.
// The code supports the following hooks:
// dartPrint(message):
//    if this function is defined it is called instead of the Dart [print]
//    method.
//
// dartMainRunner(main, args):
//    if this function is defined, the Dart [main] method will not be invoked
//    directly. Instead, a closure that will invoke [main], and its arguments
//    [args] is passed to [dartMainRunner].
//
// dartDeferredLibraryLoader(uri, successCallback, errorCallback, loadId, loadPriority):
//    if this function is defined, it will be called when a deferred library
//    is loaded. It should load and eval the javascript of `uri`, and call
//    successCallback. If it fails to do so, it should call errorCallback with
//    an error. The loadId argument is the deferred import that resulted in
//    this uri being loaded. The loadPriority argument is the priority the
//    library should be loaded with as specified in the code via the
//    load-priority annotation (0: normal, 1: high).
// dartDeferredLibraryMultiLoader(uris, successCallback, errorCallback, loadId, loadPriority):
//    if this function is defined, it will be called when a deferred library
//    is loaded. It should load and eval the javascript of every URI in `uris`,
//    and call successCallback. If it fails to do so, it should call
//    errorCallback with an error. The loadId argument is the deferred import
//    that resulted in this uri being loaded. The loadPriority argument is the
//    priority the library should be loaded with as specified in the code via
//    the load-priority annotation (0: normal, 1: high).
//
// dartCallInstrumentation(id, qualifiedName):
//    if this function is defined, it will be called at each entry of a
//    method or constructor. Used only when compiling programs with
//    --experiment-call-instrumentation.
(function dartProgram() {
  function copyProperties(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      to[key] = from[key];
    }
  }
  function mixinPropertiesHard(from, to) {
    var keys = Object.keys(from);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      if (!to.hasOwnProperty(key)) {
        to[key] = from[key];
      }
    }
  }
  function mixinPropertiesEasy(from, to) {
    Object.assign(to, from);
  }
  var supportsDirectProtoAccess = function() {
    var cls = function() {
    };
    cls.prototype = {p: {}};
    var object = new cls();
    if (!(Object.getPrototypeOf(object) && Object.getPrototypeOf(object).p === cls.prototype.p))
      return false;
    try {
      if (typeof navigator != "undefined" && typeof navigator.userAgent == "string" && navigator.userAgent.indexOf("Chrome/") >= 0)
        return true;
      if (typeof version == "function" && version.length == 0) {
        var v = version();
        if (/^\d+\.\d+\.\d+\.\d+$/.test(v))
          return true;
      }
    } catch (_) {
    }
    return false;
  }();
  function inherit(cls, sup) {
    cls.prototype.constructor = cls;
    cls.prototype["$is" + cls.name] = cls;
    if (sup != null) {
      if (supportsDirectProtoAccess) {
        Object.setPrototypeOf(cls.prototype, sup.prototype);
        return;
      }
      var clsPrototype = Object.create(sup.prototype);
      copyProperties(cls.prototype, clsPrototype);
      cls.prototype = clsPrototype;
    }
  }
  function inheritMany(sup, classes) {
    for (var i = 0; i < classes.length; i++) {
      inherit(classes[i], sup);
    }
  }
  function mixinEasy(cls, mixin) {
    mixinPropertiesEasy(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function mixinHard(cls, mixin) {
    mixinPropertiesHard(mixin.prototype, cls.prototype);
    cls.prototype.constructor = cls;
  }
  function lazyOld(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      holder[getterName] = function() {
        A.throwCyclicInit(name);
      };
      var result;
      var sentinelInProgress = initializer;
      try {
        if (holder[name] === uninitializedSentinel) {
          result = holder[name] = sentinelInProgress;
          result = holder[name] = initializer();
        } else {
          result = holder[name];
        }
      } finally {
        if (result === sentinelInProgress) {
          holder[name] = null;
        }
        holder[getterName] = function() {
          return this[name];
        };
      }
      return result;
    };
  }
  function lazy(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel) {
        holder[name] = initializer();
      }
      holder[getterName] = function() {
        return this[name];
      };
      return holder[name];
    };
  }
  function lazyFinal(holder, name, getterName, initializer) {
    var uninitializedSentinel = holder;
    holder[name] = uninitializedSentinel;
    holder[getterName] = function() {
      if (holder[name] === uninitializedSentinel) {
        var value = initializer();
        if (holder[name] !== uninitializedSentinel) {
          A.throwLateFieldADI(name);
        }
        holder[name] = value;
      }
      var finalValue = holder[name];
      holder[getterName] = function() {
        return finalValue;
      };
      return finalValue;
    };
  }
  function makeConstList(list) {
    list.immutable$list = Array;
    list.fixed$length = Array;
    return list;
  }
  function convertToFastObject(properties) {
    function t() {
    }
    t.prototype = properties;
    new t();
    return properties;
  }
  function convertAllToFastObject(arrayOfObjects) {
    for (var i = 0; i < arrayOfObjects.length; ++i) {
      convertToFastObject(arrayOfObjects[i]);
    }
  }
  var functionCounter = 0;
  function instanceTearOffGetter(isIntercepted, parameters) {
    var cache = null;
    return isIntercepted ? function(receiver) {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(receiver, this);
    } : function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters);
      return new cache(this, null);
    };
  }
  function staticTearOffGetter(parameters) {
    var cache = null;
    return function() {
      if (cache === null)
        cache = A.closureFromTearOff(parameters).prototype;
      return cache;
    };
  }
  var typesOffset = 0;
  function tearOffParameters(container, isStatic, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    if (typeof funType == "number") {
      funType += typesOffset;
    }
    return {co: container, iS: isStatic, iI: isIntercepted, rC: requiredParameterCount, dV: optionalParameterDefaultValues, cs: callNames, fs: funsOrNames, fT: funType, aI: applyIndex || 0, nDA: needsDirectAccess};
  }
  function installStaticTearOff(holder, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex) {
    var parameters = tearOffParameters(holder, true, false, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, false);
    var getterFunction = staticTearOffGetter(parameters);
    holder[getterName] = getterFunction;
  }
  function installInstanceTearOff(prototype, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, needsDirectAccess) {
    isIntercepted = !!isIntercepted;
    var parameters = tearOffParameters(prototype, false, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, funsOrNames, funType, applyIndex, !!needsDirectAccess);
    var getterFunction = instanceTearOffGetter(isIntercepted, parameters);
    prototype[getterName] = getterFunction;
  }
  function setOrUpdateInterceptorsByTag(newTags) {
    var tags = init.interceptorsByTag;
    if (!tags) {
      init.interceptorsByTag = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function setOrUpdateLeafTags(newTags) {
    var tags = init.leafTags;
    if (!tags) {
      init.leafTags = newTags;
      return;
    }
    copyProperties(newTags, tags);
  }
  function updateTypes(newTypes) {
    var types = init.types;
    var length = types.length;
    types.push.apply(types, newTypes);
    return length;
  }
  function updateHolder(holder, newHolder) {
    copyProperties(newHolder, holder);
    return holder;
  }
  var hunkHelpers = function() {
    var mkInstance = function(isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installInstanceTearOff(container, getterName, isIntercepted, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex, false);
        };
      },
      mkStatic = function(requiredParameterCount, optionalParameterDefaultValues, callNames, applyIndex) {
        return function(container, getterName, name, funType) {
          return installStaticTearOff(container, getterName, requiredParameterCount, optionalParameterDefaultValues, callNames, [name], funType, applyIndex);
        };
      };
    return {inherit: inherit, inheritMany: inheritMany, mixin: mixinEasy, mixinHard: mixinHard, installStaticTearOff: installStaticTearOff, installInstanceTearOff: installInstanceTearOff, _instance_0u: mkInstance(0, 0, null, ["call$0"], 0), _instance_1u: mkInstance(0, 1, null, ["call$1"], 0), _instance_2u: mkInstance(0, 2, null, ["call$2"], 0), _instance_0i: mkInstance(1, 0, null, ["call$0"], 0), _instance_1i: mkInstance(1, 1, null, ["call$1"], 0), _instance_2i: mkInstance(1, 2, null, ["call$2"], 0), _static_0: mkStatic(0, null, ["call$0"], 0), _static_1: mkStatic(1, null, ["call$1"], 0), _static_2: mkStatic(2, null, ["call$2"], 0), makeConstList: makeConstList, lazy: lazy, lazyFinal: lazyFinal, lazyOld: lazyOld, updateHolder: updateHolder, convertToFastObject: convertToFastObject, updateTypes: updateTypes, setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag, setOrUpdateLeafTags: setOrUpdateLeafTags};
  }();
  function initializeDeferredHunk(hunk) {
    typesOffset = init.types.length;
    hunk(hunkHelpers, init, holders, $);
  }
  var J = {
    makeDispatchRecord(interceptor, proto, extension, indexability) {
      return {i: interceptor, p: proto, e: extension, x: indexability};
    },
    getNativeInterceptor(object) {
      var proto, objectProto, $constructor, interceptor, t1,
        record = object[init.dispatchPropertyName];
      if (record == null)
        if ($.initNativeDispatchFlag == null) {
          A.initNativeDispatch();
          record = object[init.dispatchPropertyName];
        }
      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)
          throw A.wrapException(A.UnimplementedError$("Return interceptor for " + A.S(proto(object, record))));
      }
      $constructor = object.constructor;
      if ($constructor == null)
        interceptor = null;
      else {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        interceptor = $constructor[t1];
      }
      if (interceptor != null)
        return interceptor;
      interceptor = A.lookupAndCacheInterceptor(object);
      if (interceptor != null)
        return interceptor;
      if (typeof object == "function")
        return B.JavaScriptFunction_methods;
      proto = Object.getPrototypeOf(object);
      if (proto == null)
        return B.PlainJavaScriptObject_methods;
      if (proto === Object.prototype)
        return B.PlainJavaScriptObject_methods;
      if (typeof $constructor == "function") {
        t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
        if (t1 == null)
          t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
        Object.defineProperty($constructor, t1, {value: B.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
        return B.UnknownJavaScriptObject_methods;
      }
      return B.UnknownJavaScriptObject_methods;
    },
    JSArray_JSArray$fixed($length, $E) {
      if ($length < 0 || $length > 4294967295)
        throw A.wrapException(A.RangeError$range($length, 0, 4294967295, "length", null));
      return J.JSArray_JSArray$markFixed(new Array($length), $E);
    },
    JSArray_JSArray$growable($length, $E) {
      if ($length < 0)
        throw A.wrapException(A.ArgumentError$("Length must be a non-negative integer: " + $length, null));
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$allocateGrowable($length, $E) {
      return A._setArrayType(new Array($length), $E._eval$1("JSArray<0>"));
    },
    JSArray_JSArray$markFixed(allocation, $E) {
      return J.JSArray_markFixedList(A._setArrayType(allocation, $E._eval$1("JSArray<0>")), $E);
    },
    JSArray_markFixedList(list, $T) {
      list.fixed$length = Array;
      return list;
    },
    JSArray_markUnmodifiableList(list) {
      list.fixed$length = Array;
      list.immutable$list = Array;
      return list;
    },
    JSArray__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    getInterceptor$(receiver) {
      if (typeof receiver == "number") {
        if (Math.floor(receiver) == receiver)
          return J.JSInt.prototype;
        return J.JSNumNotInt.prototype;
      }
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return J.JSNull.prototype;
      if (typeof receiver == "boolean")
        return J.JSBool.prototype;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$asx(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$ax(receiver) {
      if (receiver == null)
        return receiver;
      if (Array.isArray(receiver))
        return J.JSArray.prototype;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$n(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$ns(receiver) {
      if (typeof receiver == "number")
        return J.JSNumber.prototype;
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$s(receiver) {
      if (typeof receiver == "string")
        return J.JSString.prototype;
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    getInterceptor$x(receiver) {
      if (receiver == null)
        return receiver;
      if (typeof receiver != "object") {
        if (typeof receiver == "function")
          return J.JavaScriptFunction.prototype;
        if (typeof receiver == "symbol")
          return J.JavaScriptSymbol.prototype;
        if (typeof receiver == "bigint")
          return J.JavaScriptBigInt.prototype;
        return receiver;
      }
      if (receiver instanceof A.Object)
        return receiver;
      return J.getNativeInterceptor(receiver);
    },
    getInterceptor$z(receiver) {
      if (receiver == null)
        return receiver;
      if (!(receiver instanceof A.Object))
        return J.UnknownJavaScriptObject.prototype;
      return receiver;
    },
    set$_innerHtml$x(receiver, value) {
      return J.getInterceptor$x(receiver).set$_innerHtml(receiver, value);
    },
    get$attributes$x(receiver) {
      return J.getInterceptor$x(receiver).get$attributes(receiver);
    },
    get$digestsPath$x(receiver) {
      return J.getInterceptor$x(receiver).get$digestsPath(receiver);
    },
    get$first$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$first(receiver);
    },
    get$hashCode$(receiver) {
      return J.getInterceptor$(receiver).get$hashCode(receiver);
    },
    get$isEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
    },
    get$isNotEmpty$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
    },
    get$iterator$ax(receiver) {
      return J.getInterceptor$ax(receiver).get$iterator(receiver);
    },
    get$keys$x(receiver) {
      return J.getInterceptor$x(receiver).get$keys(receiver);
    },
    get$length$asx(receiver) {
      return J.getInterceptor$asx(receiver).get$length(receiver);
    },
    get$message$x(receiver) {
      return J.getInterceptor$x(receiver).get$message(receiver);
    },
    get$moduleParentsGraph$x(receiver) {
      return J.getInterceptor$x(receiver).get$moduleParentsGraph(receiver);
    },
    get$parent$z(receiver) {
      return J.getInterceptor$z(receiver).get$parent(receiver);
    },
    get$runtimeType$(receiver) {
      return J.getInterceptor$(receiver).get$runtimeType(receiver);
    },
    $eq$(receiver, a0) {
      if (receiver == null)
        return a0 == null;
      if (typeof receiver != "object")
        return a0 != null && receiver === a0;
      return J.getInterceptor$(receiver).$eq(receiver, a0);
    },
    $get$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).$get$1(receiver, a0);
    },
    $index$asx(receiver, a0) {
      if (typeof a0 === "number")
        if (Array.isArray(receiver) || typeof receiver == "string" || A.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
          if (a0 >>> 0 === a0 && a0 < receiver.length)
            return receiver[a0];
      return J.getInterceptor$asx(receiver).$index(receiver, a0);
    },
    $indexSet$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
    },
    _clearChildren$0$x(receiver) {
      return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
    },
    _initCustomEvent$4$x(receiver, a0, a1, a2, a3) {
      return J.getInterceptor$x(receiver)._initCustomEvent$4(receiver, a0, a1, a2, a3);
    },
    _removeEventListener$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver)._removeEventListener$3(receiver, a0, a1, a2);
    },
    addEventListener$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
    },
    allMatches$1$s(receiver, a0) {
      return J.getInterceptor$s(receiver).allMatches$1(receiver, a0);
    },
    cast$1$0$ax(receiver, $T1) {
      return J.getInterceptor$ax(receiver).cast$1$0(receiver, $T1);
    },
    cast$2$0$ax(receiver, $T1, $T2) {
      return J.getInterceptor$ax(receiver).cast$2$0(receiver, $T1, $T2);
    },
    compareTo$1$ns(receiver, a0) {
      return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
    },
    complete$1$z(receiver, a0) {
      return J.getInterceptor$z(receiver).complete$1(receiver, a0);
    },
    contains$1$asx(receiver, a0) {
      return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
    },
    containsKey$1$x(receiver, a0) {
      return J.getInterceptor$x(receiver).containsKey$1(receiver, a0);
    },
    elementAt$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
    },
    forEach$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
    },
    forceLoadModule$3$x(receiver, a0, a1, a2) {
      return J.getInterceptor$x(receiver).forceLoadModule$3(receiver, a0, a1, a2);
    },
    getRange$2$ax(receiver, a0, a1) {
      return J.getInterceptor$ax(receiver).getRange$2(receiver, a0, a1);
    },
    keys$0$x(receiver) {
      return J.getInterceptor$x(receiver).keys$0(receiver);
    },
    map$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).map$1(receiver, a0);
    },
    map$1$1$ax(receiver, a0, $T1) {
      return J.getInterceptor$ax(receiver).map$1$1(receiver, a0, $T1);
    },
    map$2$1$ax(receiver, a0, $T1, $T2) {
      return J.getInterceptor$ax(receiver).map$2$1(receiver, a0, $T1, $T2);
    },
    matchAsPrefix$2$s(receiver, a0, a1) {
      return J.getInterceptor$s(receiver).matchAsPrefix$2(receiver, a0, a1);
    },
    noSuchMethod$1$(receiver, a0) {
      return J.getInterceptor$(receiver).noSuchMethod$1(receiver, a0);
    },
    remove$0$x(receiver) {
      return J.getInterceptor$x(receiver).remove$0(receiver);
    },
    skip$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
    },
    sort$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
    },
    take$1$ax(receiver, a0) {
      return J.getInterceptor$ax(receiver).take$1(receiver, a0);
    },
    then$1$1$x(receiver, a0, $T1) {
      return J.getInterceptor$x(receiver).then$1$1(receiver, a0, $T1);
    },
    then$2$x(receiver, a0, a1) {
      return J.getInterceptor$x(receiver).then$2(receiver, a0, a1);
    },
    toList$0$ax(receiver) {
      return J.getInterceptor$ax(receiver).toList$0(receiver);
    },
    toLowerCase$0$s(receiver) {
      return J.getInterceptor$s(receiver).toLowerCase$0(receiver);
    },
    toRadixString$1$n(receiver, a0) {
      return J.getInterceptor$n(receiver).toRadixString$1(receiver, a0);
    },
    toString$0$(receiver) {
      return J.getInterceptor$(receiver).toString$0(receiver);
    },
    update$2$z(receiver, a0, a1) {
      return J.getInterceptor$z(receiver).update$2(receiver, a0, a1);
    },
    Interceptor: function Interceptor() {
    },
    JSBool: function JSBool() {
    },
    JSNull: function JSNull() {
    },
    JavaScriptObject: function JavaScriptObject() {
    },
    LegacyJavaScriptObject: function LegacyJavaScriptObject() {
    },
    PlainJavaScriptObject: function PlainJavaScriptObject() {
    },
    UnknownJavaScriptObject: function UnknownJavaScriptObject() {
    },
    JavaScriptFunction: function JavaScriptFunction() {
    },
    JavaScriptBigInt: function JavaScriptBigInt() {
    },
    JavaScriptSymbol: function JavaScriptSymbol() {
    },
    JSArray: function JSArray(t0) {
      this.$ti = t0;
    },
    JSUnmodifiableArray: function JSUnmodifiableArray(t0) {
      this.$ti = t0;
    },
    ArrayIterator: function ArrayIterator(t0, t1, t2) {
      var _ = this;
      _._iterable = t0;
      _.__interceptors$_length = t1;
      _._index = 0;
      _.__interceptors$_current = null;
      _.$ti = t2;
    },
    JSNumber: function JSNumber() {
    },
    JSInt: function JSInt() {
    },
    JSNumNotInt: function JSNumNotInt() {
    },
    JSString: function JSString() {
    }
  },
  A = {JS_CONST: function JS_CONST() {
    },
    CastIterable_CastIterable(source, $S, $T) {
      if ($S._eval$1("EfficientLengthIterable<0>")._is(source))
        return new A._EfficientLengthCastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("_EfficientLengthCastIterable<1,2>"));
      return new A.CastIterable(source, $S._eval$1("@<0>")._bind$1($T)._eval$1("CastIterable<1,2>"));
    },
    LateError$fieldNI(fieldName) {
      return new A.LateError("Field '" + fieldName + "' has not been initialized.");
    },
    hexDigitValue(char) {
      var letter,
        digit = char ^ 48;
      if (digit <= 9)
        return digit;
      letter = char | 32;
      if (97 <= letter && letter <= 102)
        return letter - 87;
      return -1;
    },
    SystemHash_combine(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    SystemHash_finish(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    checkNotNullable(value, $name, $T) {
      return value;
    },
    isToStringVisiting(object) {
      var t1, i;
      for (t1 = $.toStringVisiting.length, i = 0; i < t1; ++i)
        if (object === $.toStringVisiting[i])
          return true;
      return false;
    },
    SubListIterable$(_iterable, _start, _endOrLength, $E) {
      A.RangeError_checkNotNegative(_start, "start");
      if (_endOrLength != null) {
        A.RangeError_checkNotNegative(_endOrLength, "end");
        if (_start > _endOrLength)
          A.throwExpression(A.RangeError$range(_start, 0, _endOrLength, "start", null));
      }
      return new A.SubListIterable(_iterable, _start, _endOrLength, $E._eval$1("SubListIterable<0>"));
    },
    MappedIterable_MappedIterable(iterable, $function, $S, $T) {
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new A.EfficientLengthMappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
      return new A.MappedIterable(iterable, $function, $S._eval$1("@<0>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    TakeIterable_TakeIterable(iterable, takeCount, $E) {
      var _s9_ = "takeCount";
      A.ArgumentError_checkNotNull(takeCount, _s9_, type$.int);
      A.RangeError_checkNotNegative(takeCount, _s9_);
      if (type$.EfficientLengthIterable_dynamic._is(iterable))
        return new A.EfficientLengthTakeIterable(iterable, takeCount, $E._eval$1("EfficientLengthTakeIterable<0>"));
      return new A.TakeIterable(iterable, takeCount, $E._eval$1("TakeIterable<0>"));
    },
    SkipIterable_SkipIterable(iterable, count, $E) {
      var _s5_ = "count";
      if (type$.EfficientLengthIterable_dynamic._is(iterable)) {
        A.ArgumentError_checkNotNull(count, _s5_, type$.int);
        A.RangeError_checkNotNegative(count, _s5_);
        return new A.EfficientLengthSkipIterable(iterable, count, $E._eval$1("EfficientLengthSkipIterable<0>"));
      }
      A.ArgumentError_checkNotNull(count, _s5_, type$.int);
      A.RangeError_checkNotNegative(count, _s5_);
      return new A.SkipIterable(iterable, count, $E._eval$1("SkipIterable<0>"));
    },
    IterableElementError_noElement() {
      return new A.StateError("No element");
    },
    IterableElementError_tooMany() {
      return new A.StateError("Too many elements");
    },
    IterableElementError_tooFew() {
      return new A.StateError("Too few elements");
    },
    Sort__doSort(a, left, right, compare, $E) {
      if (right - left <= 32)
        A.Sort__insertionSort(a, left, right, compare, $E);
      else
        A.Sort__dualPivotQuicksort(a, left, right, compare, $E);
    },
    Sort__insertionSort(a, left, right, compare, $E) {
      var i, t1, el, j, t2, j0;
      for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
        el = t1.$index(a, i);
        j = i;
        while (true) {
          if (j > left) {
            t2 = compare.call$2(t1.$index(a, j - 1), el);
            if (typeof t2 !== "number")
              return t2.$gt();
            t2 = t2 > 0;
          } else
            t2 = false;
          if (!t2)
            break;
          j0 = j - 1;
          t1.$indexSet(a, j, t1.$index(a, j0));
          j = j0;
        }
        t1.$indexSet(a, j, el);
      }
    },
    Sort__dualPivotQuicksort(a, left, right, compare, $E) {
      var t0, less, great, k, ak, comp, great0, less0, pivots_are_equal,
        sixth = B.JSInt_methods._tdivFast$1(right - left + 1, 6),
        index1 = left + sixth,
        index5 = right - sixth,
        index3 = B.JSInt_methods._tdivFast$1(left + right, 2),
        index2 = index3 - sixth,
        index4 = index3 + sixth,
        t1 = J.getInterceptor$asx(a),
        el1 = t1.$index(a, index1),
        el2 = t1.$index(a, index2),
        el3 = t1.$index(a, index3),
        el4 = t1.$index(a, index4),
        el5 = t1.$index(a, index5),
        t2 = compare.call$2(el1, el2);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el2;
        el2 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t2 = compare.call$2(el1, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el1, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el1;
        el1 = t0;
      }
      t2 = compare.call$2(el3, el4);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el4;
        el4 = el3;
        el3 = t0;
      }
      t2 = compare.call$2(el2, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el2, el3);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el3;
        el3 = el2;
        el2 = t0;
      }
      t2 = compare.call$2(el4, el5);
      if (typeof t2 !== "number")
        return t2.$gt();
      if (t2 > 0) {
        t0 = el5;
        el5 = el4;
        el4 = t0;
      }
      t1.$indexSet(a, index1, el1);
      t1.$indexSet(a, index3, el3);
      t1.$indexSet(a, index5, el5);
      t1.$indexSet(a, index2, t1.$index(a, left));
      t1.$indexSet(a, index4, t1.$index(a, right));
      less = left + 1;
      great = right - 1;
      if (J.$eq$(compare.call$2(el2, el4), 0)) {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          comp = compare.call$2(ak, el2);
          if (comp === 0)
            continue;
          if (comp < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else
            for (; true;) {
              comp = compare.call$2(t1.$index(a, great), el2);
              if (comp > 0) {
                --great;
                continue;
              } else {
                great0 = great - 1;
                if (comp < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  less = less0;
                  break;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  great = great0;
                  break;
                }
              }
            }
        }
        pivots_are_equal = true;
      } else {
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          if (compare.call$2(ak, el2) < 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else if (compare.call$2(ak, el4) > 0)
            for (; true;)
              if (compare.call$2(t1.$index(a, great), el4) > 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                great0 = great - 1;
                if (compare.call$2(t1.$index(a, great), el2) < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
        pivots_are_equal = false;
      }
      t2 = less - 1;
      t1.$indexSet(a, left, t1.$index(a, t2));
      t1.$indexSet(a, t2, el2);
      t2 = great + 1;
      t1.$indexSet(a, right, t1.$index(a, t2));
      t1.$indexSet(a, t2, el4);
      A.Sort__doSort(a, left, less - 2, compare, $E);
      A.Sort__doSort(a, great + 2, right, compare, $E);
      if (pivots_are_equal)
        return;
      if (less < index1 && great > index5) {
        for (; J.$eq$(compare.call$2(t1.$index(a, less), el2), 0);)
          ++less;
        for (; J.$eq$(compare.call$2(t1.$index(a, great), el4), 0);)
          --great;
        for (k = less; k <= great; ++k) {
          ak = t1.$index(a, k);
          if (compare.call$2(ak, el2) === 0) {
            if (k !== less) {
              t1.$indexSet(a, k, t1.$index(a, less));
              t1.$indexSet(a, less, ak);
            }
            ++less;
          } else if (compare.call$2(ak, el4) === 0)
            for (; true;)
              if (compare.call$2(t1.$index(a, great), el4) === 0) {
                --great;
                if (great < k)
                  break;
                continue;
              } else {
                great0 = great - 1;
                if (compare.call$2(t1.$index(a, great), el2) < 0) {
                  t1.$indexSet(a, k, t1.$index(a, less));
                  less0 = less + 1;
                  t1.$indexSet(a, less, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                  less = less0;
                } else {
                  t1.$indexSet(a, k, t1.$index(a, great));
                  t1.$indexSet(a, great, ak);
                }
                great = great0;
                break;
              }
        }
        A.Sort__doSort(a, less, great, compare, $E);
      } else
        A.Sort__doSort(a, less, great, compare, $E);
    },
    _CastIterableBase: function _CastIterableBase() {
    },
    CastIterator: function CastIterator(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastIterable: function CastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _EfficientLengthCastIterable: function _EfficientLengthCastIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    _CastListBase: function _CastListBase() {
    },
    _CastListBase_sort_closure: function _CastListBase_sort_closure(t0, t1) {
      this.$this = t0;
      this.compare = t1;
    },
    CastList: function CastList(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap: function CastMap(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    CastMap_forEach_closure: function CastMap_forEach_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    LateError: function LateError(t0) {
      this._message = t0;
    },
    nullFuture_closure: function nullFuture_closure() {
    },
    SentinelValue: function SentinelValue() {
    },
    EfficientLengthIterable: function EfficientLengthIterable() {
    },
    ListIterable: function ListIterable() {
    },
    SubListIterable: function SubListIterable(t0, t1, t2, t3) {
      var _ = this;
      _.__internal$_iterable = t0;
      _._start = t1;
      _._endOrLength = t2;
      _.$ti = t3;
    },
    ListIterator: function ListIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_iterable = t0;
      _.__internal$_length = t1;
      _.__internal$_index = 0;
      _.__internal$_current = null;
      _.$ti = t2;
    },
    MappedIterable: function MappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    EfficientLengthMappedIterable: function EfficientLengthMappedIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    MappedIterator: function MappedIterator(t0, t1, t2) {
      var _ = this;
      _.__internal$_current = null;
      _._iterator = t0;
      _._f = t1;
      _.$ti = t2;
    },
    MappedListIterable: function MappedListIterable(t0, t1, t2) {
      this.__internal$_source = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterable: function WhereIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._f = t1;
      this.$ti = t2;
    },
    WhereIterator: function WhereIterator(t0, t1, t2) {
      this._iterator = t0;
      this._f = t1;
      this.$ti = t2;
    },
    TakeIterable: function TakeIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._takeCount = t1;
      this.$ti = t2;
    },
    EfficientLengthTakeIterable: function EfficientLengthTakeIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._takeCount = t1;
      this.$ti = t2;
    },
    TakeIterator: function TakeIterator(t0, t1, t2) {
      this._iterator = t0;
      this._remaining = t1;
      this.$ti = t2;
    },
    SkipIterable: function SkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EfficientLengthSkipIterable: function EfficientLengthSkipIterable(t0, t1, t2) {
      this.__internal$_iterable = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    SkipIterator: function SkipIterator(t0, t1, t2) {
      this._iterator = t0;
      this._skipCount = t1;
      this.$ti = t2;
    },
    EmptyIterable: function EmptyIterable(t0) {
      this.$ti = t0;
    },
    EmptyIterator: function EmptyIterator(t0) {
      this.$ti = t0;
    },
    FixedLengthListMixin: function FixedLengthListMixin() {
    },
    UnmodifiableListMixin: function UnmodifiableListMixin() {
    },
    UnmodifiableListBase: function UnmodifiableListBase() {
    },
    ReversedListIterable: function ReversedListIterable(t0, t1) {
      this.__internal$_source = t0;
      this.$ti = t1;
    },
    Symbol: function Symbol(t0) {
      this._name = t0;
    },
    __CastListBase__CastIterableBase_ListMixin: function __CastListBase__CastIterableBase_ListMixin() {
    },
    ConstantMap__throwUnmodifiable() {
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable Map"));
    },
    unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    isJsIndexable(object, record) {
      var result;
      if (record != null) {
        result = record.x;
        if (result != null)
          return result;
      }
      return type$.JavaScriptIndexingBehavior_dynamic._is(object);
    },
    S(value) {
      var result;
      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";
      result = J.toString$0$(value);
      return result;
    },
    Primitives_objectHashCode(object) {
      var hash,
        property = $.Primitives__identityHashCodeProperty;
      if (property == null)
        property = $.Primitives__identityHashCodeProperty = Symbol("identityHashCode");
      hash = object[property];
      if (hash == null) {
        hash = Math.random() * 0x3fffffff | 0;
        object[property] = hash;
      }
      return hash;
    },
    Primitives_parseInt(source, radix) {
      var decimalMatch, maxCharCode, digitsPart, t1, i, _null = null,
        match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
      if (match == null)
        return _null;
      if (3 >= match.length)
        return A.ioore(match, 3);
      decimalMatch = match[3];
      if (radix == null) {
        if (decimalMatch != null)
          return parseInt(source, 10);
        if (match[2] != null)
          return parseInt(source, 16);
        return _null;
      }
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", _null));
      if (radix === 10 && decimalMatch != null)
        return parseInt(source, 10);
      if (radix < 10 || decimalMatch == null) {
        maxCharCode = radix <= 10 ? 47 + radix : 86 + radix;
        digitsPart = match[1];
        for (t1 = digitsPart.length, i = 0; i < t1; ++i)
          if ((digitsPart.charCodeAt(i) | 32) > maxCharCode)
            return _null;
      }
      return parseInt(source, radix);
    },
    Primitives_objectTypeName(object) {
      return A.Primitives__objectTypeNameNewRti(object);
    },
    Primitives__objectTypeNameNewRti(object) {
      var interceptor, dispatchName, $constructor, constructorName;
      if (object instanceof A.Object)
        return A._rtiToString(A.instanceType(object), null);
      interceptor = J.getInterceptor$(object);
      if (interceptor === B.Interceptor_methods || interceptor === B.JavaScriptObject_methods || type$.UnknownJavaScriptObject._is(object)) {
        dispatchName = B.C_JS_CONST(object);
        if (dispatchName !== "Object" && dispatchName !== "")
          return dispatchName;
        $constructor = object.constructor;
        if (typeof $constructor == "function") {
          constructorName = $constructor.name;
          if (typeof constructorName == "string" && constructorName !== "Object" && constructorName !== "")
            return constructorName;
        }
      }
      return A._rtiToString(A.instanceType(object), null);
    },
    Primitives_safeToString(object) {
      if (typeof object == "number" || A._isBool(object))
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      if (object instanceof A.Closure)
        return object.toString$0(0);
      return "Instance of '" + A.Primitives_objectTypeName(object) + "'";
    },
    Primitives__fromCharCodeApply(array) {
      var result, i, i0, chunkEnd,
        end = array.length;
      if (end <= 500)
        return String.fromCharCode.apply(null, array);
      for (result = "", i = 0; i < end; i = i0) {
        i0 = i + 500;
        chunkEnd = i0 < end ? i0 : end;
        result += String.fromCharCode.apply(null, array.slice(i, chunkEnd));
      }
      return result;
    },
    Primitives_stringFromCodePoints(codePoints) {
      var t1, _i, i,
        a = A._setArrayType([], type$.JSArray_int);
      for (t1 = codePoints.length, _i = 0; _i < codePoints.length; codePoints.length === t1 || (0, A.throwConcurrentModificationError)(codePoints), ++_i) {
        i = codePoints[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i <= 65535)
          B.JSArray_methods.add$1(a, i);
        else if (i <= 1114111) {
          B.JSArray_methods.add$1(a, 55296 + (B.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
          B.JSArray_methods.add$1(a, 56320 + (i & 1023));
        } else
          throw A.wrapException(A.argumentErrorValue(i));
      }
      return A.Primitives__fromCharCodeApply(a);
    },
    Primitives_stringFromCharCodes(charCodes) {
      var t1, _i, i;
      for (t1 = charCodes.length, _i = 0; _i < t1; ++_i) {
        i = charCodes[_i];
        if (!A._isInt(i))
          throw A.wrapException(A.argumentErrorValue(i));
        if (i < 0)
          throw A.wrapException(A.argumentErrorValue(i));
        if (i > 65535)
          return A.Primitives_stringFromCodePoints(charCodes);
      }
      return A.Primitives__fromCharCodeApply(charCodes);
    },
    Primitives_stringFromNativeUint8List(charCodes, start, end) {
      var i, result, i0, chunkEnd;
      if (end <= 500 && start === 0 && end === charCodes.length)
        return String.fromCharCode.apply(null, charCodes);
      for (i = start, result = ""; i < end; i = i0) {
        i0 = i + 500;
        chunkEnd = i0 < end ? i0 : end;
        result += String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
      }
      return result;
    },
    Primitives_stringFromCharCode(charCode) {
      var bits;
      if (0 <= charCode) {
        if (charCode <= 65535)
          return String.fromCharCode(charCode);
        if (charCode <= 1114111) {
          bits = charCode - 65536;
          return String.fromCharCode((B.JSInt_methods._shrOtherPositive$1(bits, 10) | 55296) >>> 0, bits & 1023 | 56320);
        }
      }
      throw A.wrapException(A.RangeError$range(charCode, 0, 1114111, null, null));
    },
    Primitives_lazyAsJsDate(receiver) {
      if (receiver.date === void 0)
        receiver.date = new Date(receiver._value);
      return receiver.date;
    },
    Primitives_getYear(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCFullYear() + 0 : A.Primitives_lazyAsJsDate(receiver).getFullYear() + 0;
    },
    Primitives_getMonth(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMonth() + 1 : A.Primitives_lazyAsJsDate(receiver).getMonth() + 1;
    },
    Primitives_getDay(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCDate() + 0 : A.Primitives_lazyAsJsDate(receiver).getDate() + 0;
    },
    Primitives_getHours(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCHours() + 0 : A.Primitives_lazyAsJsDate(receiver).getHours() + 0;
    },
    Primitives_getMinutes(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMinutes() + 0 : A.Primitives_lazyAsJsDate(receiver).getMinutes() + 0;
    },
    Primitives_getSeconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCSeconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getSeconds() + 0;
    },
    Primitives_getMilliseconds(receiver) {
      return receiver.isUtc ? A.Primitives_lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : A.Primitives_lazyAsJsDate(receiver).getMilliseconds() + 0;
    },
    Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments) {
      var $arguments, namedArgumentList, t1 = {};
      t1.argumentCount = 0;
      $arguments = [];
      namedArgumentList = [];
      t1.argumentCount = positionalArguments.length;
      B.JSArray_methods.addAll$1($arguments, positionalArguments);
      t1.names = "";
      if (namedArguments != null && namedArguments._length !== 0)
        namedArguments.forEach$1(0, new A.Primitives_functionNoSuchMethod_closure(t1, namedArgumentList, $arguments));
      return J.noSuchMethod$1$($function, new A.JSInvocationMirror(B.Symbol_call, 0, $arguments, namedArgumentList, 0));
    },
    Primitives_applyFunction($function, positionalArguments, namedArguments) {
      var t1, argumentCount, jsStub;
      if (Array.isArray(positionalArguments))
        t1 = namedArguments == null || namedArguments._length === 0;
      else
        t1 = false;
      if (t1) {
        argumentCount = positionalArguments.length;
        if (argumentCount === 0) {
          if (!!$function.call$0)
            return $function.call$0();
        } else if (argumentCount === 1) {
          if (!!$function.call$1)
            return $function.call$1(positionalArguments[0]);
        } else if (argumentCount === 2) {
          if (!!$function.call$2)
            return $function.call$2(positionalArguments[0], positionalArguments[1]);
        } else if (argumentCount === 3) {
          if (!!$function.call$3)
            return $function.call$3(positionalArguments[0], positionalArguments[1], positionalArguments[2]);
        } else if (argumentCount === 4) {
          if (!!$function.call$4)
            return $function.call$4(positionalArguments[0], positionalArguments[1], positionalArguments[2], positionalArguments[3]);
        } else if (argumentCount === 5)
          if (!!$function.call$5)
            return $function.call$5(positionalArguments[0], positionalArguments[1], positionalArguments[2], positionalArguments[3], positionalArguments[4]);
        jsStub = $function["call" + "$" + argumentCount];
        if (jsStub != null)
          return jsStub.apply($function, positionalArguments);
      }
      return A.Primitives__generalApplyFunction($function, positionalArguments, namedArguments);
    },
    Primitives__generalApplyFunction($function, positionalArguments, namedArguments) {
      var $arguments, argumentCount, requiredParameterCount, defaultValuesClosure, t1, defaultValues, interceptor, jsFunction, maxArguments, missingDefaults, keys, _i, defaultValue, used, key;
      if (positionalArguments != null)
        $arguments = Array.isArray(positionalArguments) ? positionalArguments : A.List_List$of(positionalArguments, true, type$.dynamic);
      else
        $arguments = [];
      argumentCount = $arguments.length;
      requiredParameterCount = $function.$requiredArgCount;
      if (argumentCount < requiredParameterCount)
        return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      defaultValuesClosure = $function.$defaultValues;
      t1 = defaultValuesClosure == null;
      defaultValues = !t1 ? defaultValuesClosure() : null;
      interceptor = J.getInterceptor$($function);
      jsFunction = interceptor["call*"];
      if (typeof jsFunction == "string")
        jsFunction = interceptor[jsFunction];
      if (t1) {
        if (namedArguments != null && namedArguments._length !== 0)
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if (argumentCount === requiredParameterCount)
          return jsFunction.apply($function, $arguments);
        return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
      }
      if (Array.isArray(defaultValues)) {
        if (namedArguments != null && namedArguments._length !== 0)
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        maxArguments = requiredParameterCount + defaultValues.length;
        if (argumentCount > maxArguments)
          return A.Primitives_functionNoSuchMethod($function, $arguments, null);
        if (argumentCount < maxArguments) {
          missingDefaults = defaultValues.slice(argumentCount - requiredParameterCount);
          if ($arguments === positionalArguments)
            $arguments = A.List_List$of($arguments, true, type$.dynamic);
          B.JSArray_methods.addAll$1($arguments, missingDefaults);
        }
        return jsFunction.apply($function, $arguments);
      } else {
        if (argumentCount > requiredParameterCount)
          return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        if ($arguments === positionalArguments)
          $arguments = A.List_List$of($arguments, true, type$.dynamic);
        keys = Object.keys(defaultValues);
        if (namedArguments == null)
          for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
            defaultValue = defaultValues[A._asString(keys[_i])];
            if (B.C__Required === defaultValue)
              return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
            B.JSArray_methods.add$1($arguments, defaultValue);
          }
        else {
          for (t1 = keys.length, used = 0, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
            key = A._asString(keys[_i]);
            if (namedArguments.containsKey$1(0, key)) {
              ++used;
              B.JSArray_methods.add$1($arguments, namedArguments.$index(0, key));
            } else {
              defaultValue = defaultValues[key];
              if (B.C__Required === defaultValue)
                return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
              B.JSArray_methods.add$1($arguments, defaultValue);
            }
          }
          if (used !== namedArguments._length)
            return A.Primitives_functionNoSuchMethod($function, $arguments, namedArguments);
        }
        return jsFunction.apply($function, $arguments);
      }
    },
    iae(argument) {
      throw A.wrapException(A.argumentErrorValue(argument));
    },
    ioore(receiver, index) {
      if (receiver == null)
        J.get$length$asx(receiver);
      throw A.wrapException(A.diagnoseIndexError(receiver, index));
    },
    diagnoseIndexError(indexable, index) {
      var $length, _s5_ = "index";
      if (!A._isInt(index))
        return new A.ArgumentError(true, index, _s5_, null);
      $length = A._asInt(J.get$length$asx(indexable));
      if (index < 0 || index >= $length)
        return A.IndexError$withLength(index, $length, indexable, null, _s5_);
      return A.RangeError$value(index, _s5_);
    },
    diagnoseRangeError(start, end, $length) {
      if (start > $length)
        return A.RangeError$range(start, 0, $length, "start", null);
      if (end != null)
        if (end < start || end > $length)
          return A.RangeError$range(end, start, $length, "end", null);
      return new A.ArgumentError(true, end, "end", null);
    },
    argumentErrorValue(object) {
      return new A.ArgumentError(true, object, null, null);
    },
    checkNum(value) {
      return value;
    },
    wrapException(ex) {
      return A.initializeExceptionWrapper(new Error(), ex);
    },
    initializeExceptionWrapper(wrapper, ex) {
      var t1;
      if (ex == null)
        ex = new A.TypeError();
      wrapper.dartException = ex;
      t1 = A.toStringWrapper;
      if ("defineProperty" in Object) {
        Object.defineProperty(wrapper, "message", {get: t1});
        wrapper.name = "";
      } else
        wrapper.toString = t1;
      return wrapper;
    },
    toStringWrapper() {
      return J.toString$0$(this.dartException);
    },
    throwExpression(ex) {
      throw A.wrapException(ex);
    },
    throwExpressionWithWrapper(ex, wrapper) {
      throw A.initializeExceptionWrapper(wrapper, ex);
    },
    throwConcurrentModificationError(collection) {
      throw A.wrapException(A.ConcurrentModificationError$(collection));
    },
    TypeErrorDecoder_extractPattern(message) {
      var match, $arguments, argumentsExpr, expr, method, receiver;
      message = A.quoteStringForRegExp(message.replace(String({}), "$receiver$"));
      match = message.match(/\\\$[a-zA-Z]+\\\$/g);
      if (match == null)
        match = A._setArrayType([], type$.JSArray_String);
      $arguments = match.indexOf("\\$arguments\\$");
      argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
      expr = match.indexOf("\\$expr\\$");
      method = match.indexOf("\\$method\\$");
      receiver = match.indexOf("\\$receiver\\$");
      return new A.TypeErrorDecoder(message.replace(new RegExp("\\\\\\$arguments\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$", "g"), "((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$", "g"), "((?:x|[^x])*)"), $arguments, argumentsExpr, expr, method, receiver);
    },
    TypeErrorDecoder_provokeCallErrorOn(expression) {
      return function($expr$) {
        var $argumentsExpr$ = "$arguments$";
        try {
          $expr$.$method$($argumentsExpr$);
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    TypeErrorDecoder_provokePropertyErrorOn(expression) {
      return function($expr$) {
        try {
          $expr$.$method$;
        } catch (e) {
          return e.message;
        }
      }(expression);
    },
    JsNoSuchMethodError$(_message, match) {
      var t1 = match == null,
        t2 = t1 ? null : match.method;
      return new A.JsNoSuchMethodError(_message, t2, t1 ? null : match.receiver);
    },
    unwrapException(ex) {
      var t1;
      if (ex == null)
        return new A.NullThrownFromJavaScriptException(ex);
      if (ex instanceof A.ExceptionAndStackTrace) {
        t1 = ex.dartException;
        return A.saveStackTrace(ex, t1 == null ? type$.Object._as(t1) : t1);
      }
      if (typeof ex !== "object")
        return ex;
      if ("dartException" in ex)
        return A.saveStackTrace(ex, ex.dartException);
      return A._unwrapNonDartException(ex);
    },
    saveStackTrace(ex, error) {
      if (type$.Error._is(error))
        if (error.$thrownJsError == null)
          error.$thrownJsError = ex;
      return error;
    },
    _unwrapNonDartException(ex) {
      var message, number, ieErrorCode, nsme, notClosure, nullCall, nullLiteralCall, undefCall, undefLiteralCall, nullProperty, undefProperty, undefLiteralProperty, match;
      if (!("message" in ex))
        return ex;
      message = ex.message;
      if ("number" in ex && typeof ex.number == "number") {
        number = ex.number;
        ieErrorCode = number & 65535;
        if ((B.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
          switch (ieErrorCode) {
            case 438:
              return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A.S(message) + " (Error " + ieErrorCode + ")", null));
            case 445:
            case 5007:
              A.S(message);
              return A.saveStackTrace(ex, new A.NullError());
          }
      }
      if (ex instanceof TypeError) {
        nsme = $.$get$TypeErrorDecoder_noSuchMethodPattern();
        notClosure = $.$get$TypeErrorDecoder_notClosurePattern();
        nullCall = $.$get$TypeErrorDecoder_nullCallPattern();
        nullLiteralCall = $.$get$TypeErrorDecoder_nullLiteralCallPattern();
        undefCall = $.$get$TypeErrorDecoder_undefinedCallPattern();
        undefLiteralCall = $.$get$TypeErrorDecoder_undefinedLiteralCallPattern();
        nullProperty = $.$get$TypeErrorDecoder_nullPropertyPattern();
        $.$get$TypeErrorDecoder_nullLiteralPropertyPattern();
        undefProperty = $.$get$TypeErrorDecoder_undefinedPropertyPattern();
        undefLiteralProperty = $.$get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
        match = nsme.matchTypeError$1(message);
        if (match != null)
          return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asString(message), match));
        else {
          match = notClosure.matchTypeError$1(message);
          if (match != null) {
            match.method = "call";
            return A.saveStackTrace(ex, A.JsNoSuchMethodError$(A._asString(message), match));
          } else if (nullCall.matchTypeError$1(message) != null || nullLiteralCall.matchTypeError$1(message) != null || undefCall.matchTypeError$1(message) != null || undefLiteralCall.matchTypeError$1(message) != null || nullProperty.matchTypeError$1(message) != null || nullLiteralCall.matchTypeError$1(message) != null || undefProperty.matchTypeError$1(message) != null || undefLiteralProperty.matchTypeError$1(message) != null) {
            A._asString(message);
            return A.saveStackTrace(ex, new A.NullError());
          }
        }
        return A.saveStackTrace(ex, new A.UnknownJsTypeError(typeof message == "string" ? message : ""));
      }
      if (ex instanceof RangeError) {
        if (typeof message == "string" && message.indexOf("call stack") !== -1)
          return new A.StackOverflowError();
        message = function(ex) {
          try {
            return String(ex);
          } catch (e) {
          }
          return null;
        }(ex);
        return A.saveStackTrace(ex, new A.ArgumentError(false, null, null, typeof message == "string" ? message.replace(/^RangeError:\s*/, "") : message));
      }
      if (typeof InternalError == "function" && ex instanceof InternalError)
        if (typeof message == "string" && message === "too much recursion")
          return new A.StackOverflowError();
      return ex;
    },
    getTraceFromException(exception) {
      var trace;
      if (exception instanceof A.ExceptionAndStackTrace)
        return exception.stackTrace;
      if (exception == null)
        return new A._StackTrace(exception);
      trace = exception.$cachedTrace;
      if (trace != null)
        return trace;
      trace = new A._StackTrace(exception);
      if (typeof exception === "object")
        exception.$cachedTrace = trace;
      return trace;
    },
    objectHashCode(object) {
      if (object == null)
        return J.get$hashCode$(object);
      if (typeof object == "object")
        return A.Primitives_objectHashCode(object);
      return J.get$hashCode$(object);
    },
    fillLiteralMap(keyValuePairs, result) {
      var index, index0, index1,
        $length = keyValuePairs.length;
      for (index = 0; index < $length; index = index1) {
        index0 = index + 1;
        index1 = index0 + 1;
        result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
      }
      return result;
    },
    _invokeClosure(closure, numberOfArguments, arg1, arg2, arg3, arg4) {
      type$.Function._as(closure);
      switch (A._asInt(numberOfArguments)) {
        case 0:
          return closure.call$0();
        case 1:
          return closure.call$1(arg1);
        case 2:
          return closure.call$2(arg1, arg2);
        case 3:
          return closure.call$3(arg1, arg2, arg3);
        case 4:
          return closure.call$4(arg1, arg2, arg3, arg4);
      }
      throw A.wrapException(A.Exception_Exception("Unsupported number of arguments for wrapped closure"));
    },
    convertDartClosureToJS(closure, arity) {
      var $function;
      if (closure == null)
        return null;
      $function = closure.$identity;
      if (!!$function)
        return $function;
      $function = A.convertDartClosureToJSUncached(closure, arity);
      closure.$identity = $function;
      return $function;
    },
    convertDartClosureToJSUncached(closure, arity) {
      var entry;
      switch (arity) {
        case 0:
          entry = closure.call$0;
          break;
        case 1:
          entry = closure.call$1;
          break;
        case 2:
          entry = closure.call$2;
          break;
        case 3:
          entry = closure.call$3;
          break;
        case 4:
          entry = closure.call$4;
          break;
        default:
          entry = null;
      }
      if (entry != null)
        return entry.bind(closure);
      return function(closure, arity, invoke) {
        return function(a1, a2, a3, a4) {
          return invoke(closure, arity, a1, a2, a3, a4);
        };
      }(closure, arity, A._invokeClosure);
    },
    Closure_fromTearOff(parameters) {
      var $prototype, $constructor, t2, trampoline, applyTrampoline, i, stub, stub0, stubName, stubCallName,
        container = parameters.co,
        isStatic = parameters.iS,
        isIntercepted = parameters.iI,
        needsDirectAccess = parameters.nDA,
        applyTrampolineIndex = parameters.aI,
        funsOrNames = parameters.fs,
        callNames = parameters.cs,
        $name = funsOrNames[0],
        callName = callNames[0],
        $function = container[$name],
        t1 = parameters.fT;
      t1.toString;
      $prototype = isStatic ? Object.create(new A.StaticClosure().constructor.prototype) : Object.create(new A.BoundClosure(null, null).constructor.prototype);
      $prototype.$initialize = $prototype.constructor;
      $constructor = isStatic ? function static_tear_off() {
        this.$initialize();
      } : function tear_off(a, b) {
        this.$initialize(a, b);
      };
      $prototype.constructor = $constructor;
      $constructor.prototype = $prototype;
      $prototype.$_name = $name;
      $prototype.$_target = $function;
      t2 = !isStatic;
      if (t2)
        trampoline = A.Closure_forwardCallTo($name, $function, isIntercepted, needsDirectAccess);
      else {
        $prototype.$static_name = $name;
        trampoline = $function;
      }
      $prototype.$signature = A.Closure__computeSignatureFunctionNewRti(t1, isStatic, isIntercepted);
      $prototype[callName] = trampoline;
      for (applyTrampoline = trampoline, i = 1; i < funsOrNames.length; ++i) {
        stub = funsOrNames[i];
        if (typeof stub == "string") {
          stub0 = container[stub];
          stubName = stub;
          stub = stub0;
        } else
          stubName = "";
        stubCallName = callNames[i];
        if (stubCallName != null) {
          if (t2)
            stub = A.Closure_forwardCallTo(stubName, stub, isIntercepted, needsDirectAccess);
          $prototype[stubCallName] = stub;
        }
        if (i === applyTrampolineIndex)
          applyTrampoline = stub;
      }
      $prototype["call*"] = applyTrampoline;
      $prototype.$requiredArgCount = parameters.rC;
      $prototype.$defaultValues = parameters.dV;
      return $constructor;
    },
    Closure__computeSignatureFunctionNewRti(functionType, isStatic, isIntercepted) {
      if (typeof functionType == "number")
        return functionType;
      if (typeof functionType == "string") {
        if (isStatic)
          throw A.wrapException("Cannot compute signature for static tearoff.");
        return function(recipe, evalOnReceiver) {
          return function() {
            return evalOnReceiver(this, recipe);
          };
        }(functionType, A.BoundClosure_evalRecipe);
      }
      throw A.wrapException("Error in functionType of tearoff");
    },
    Closure_cspForwardCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf;
      switch (needsDirectAccess ? -1 : arity) {
        case 0:
          return function(entry, receiverOf) {
            return function() {
              return receiverOf(this)[entry]();
            };
          }(stubName, getReceiver);
        case 1:
          return function(entry, receiverOf) {
            return function(a) {
              return receiverOf(this)[entry](a);
            };
          }(stubName, getReceiver);
        case 2:
          return function(entry, receiverOf) {
            return function(a, b) {
              return receiverOf(this)[entry](a, b);
            };
          }(stubName, getReceiver);
        case 3:
          return function(entry, receiverOf) {
            return function(a, b, c) {
              return receiverOf(this)[entry](a, b, c);
            };
          }(stubName, getReceiver);
        case 4:
          return function(entry, receiverOf) {
            return function(a, b, c, d) {
              return receiverOf(this)[entry](a, b, c, d);
            };
          }(stubName, getReceiver);
        case 5:
          return function(entry, receiverOf) {
            return function(a, b, c, d, e) {
              return receiverOf(this)[entry](a, b, c, d, e);
            };
          }(stubName, getReceiver);
        default:
          return function(f, receiverOf) {
            return function() {
              return f.apply(receiverOf(this), arguments);
            };
          }($function, getReceiver);
      }
    },
    Closure_forwardCallTo(stubName, $function, isIntercepted, needsDirectAccess) {
      if (isIntercepted)
        return A.Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess);
      return A.Closure_cspForwardCall($function.length, needsDirectAccess, stubName, $function);
    },
    Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function) {
      var getReceiver = A.BoundClosure_receiverOf,
        getInterceptor = A.BoundClosure_interceptorOf;
      switch (needsDirectAccess ? -1 : arity) {
        case 0:
          throw A.wrapException(new A.RuntimeError("Intercepted function with no arguments."));
        case 1:
          return function(entry, interceptorOf, receiverOf) {
            return function() {
              return interceptorOf(this)[entry](receiverOf(this));
            };
          }(stubName, getInterceptor, getReceiver);
        case 2:
          return function(entry, interceptorOf, receiverOf) {
            return function(a) {
              return interceptorOf(this)[entry](receiverOf(this), a);
            };
          }(stubName, getInterceptor, getReceiver);
        case 3:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b) {
              return interceptorOf(this)[entry](receiverOf(this), a, b);
            };
          }(stubName, getInterceptor, getReceiver);
        case 4:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c);
            };
          }(stubName, getInterceptor, getReceiver);
        case 5:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d);
            };
          }(stubName, getInterceptor, getReceiver);
        case 6:
          return function(entry, interceptorOf, receiverOf) {
            return function(a, b, c, d, e) {
              return interceptorOf(this)[entry](receiverOf(this), a, b, c, d, e);
            };
          }(stubName, getInterceptor, getReceiver);
        default:
          return function(f, interceptorOf, receiverOf) {
            return function() {
              var a = [receiverOf(this)];
              Array.prototype.push.apply(a, arguments);
              return f.apply(interceptorOf(this), a);
            };
          }($function, getInterceptor, getReceiver);
      }
    },
    Closure_forwardInterceptedCallTo(stubName, $function, needsDirectAccess) {
      var arity, t1;
      if ($.BoundClosure__interceptorFieldNameCache == null)
        $.BoundClosure__interceptorFieldNameCache = A.BoundClosure__computeFieldNamed("interceptor");
      if ($.BoundClosure__receiverFieldNameCache == null)
        $.BoundClosure__receiverFieldNameCache = A.BoundClosure__computeFieldNamed("receiver");
      arity = $function.length;
      t1 = A.Closure_cspForwardInterceptedCall(arity, needsDirectAccess, stubName, $function);
      return t1;
    },
    closureFromTearOff(parameters) {
      return A.Closure_fromTearOff(parameters);
    },
    BoundClosure_evalRecipe(closure, recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, A.instanceType(closure._receiver), recipe);
    },
    BoundClosure_receiverOf(closure) {
      return closure._receiver;
    },
    BoundClosure_interceptorOf(closure) {
      return closure._interceptor;
    },
    BoundClosure__computeFieldNamed(fieldName) {
      var t1, i, $name,
        template = new A.BoundClosure("receiver", "interceptor"),
        names = J.JSArray_markFixedList(Object.getOwnPropertyNames(template), type$.nullable_Object);
      for (t1 = names.length, i = 0; i < t1; ++i) {
        $name = names[i];
        if (template[$name] === fieldName)
          return $name;
      }
      throw A.wrapException(A.ArgumentError$("Field name " + fieldName + " not found.", null));
    },
    boolConversionCheck(value) {
      if (value == null)
        A.assertThrow("boolean expression must not be null");
      return value;
    },
    assertThrow(message) {
      throw A.wrapException(new A._AssertionError(message));
    },
    throwCyclicInit(staticName) {
      throw A.wrapException(new A._CyclicInitializationError(staticName));
    },
    getIsolateAffinityTag($name) {
      return init.getIsolateTag($name);
    },
    LinkedHashMapKeyIterator$(_map, _modifications, $E) {
      var t1 = new A.LinkedHashMapKeyIterator(_map, _modifications, $E._eval$1("LinkedHashMapKeyIterator<0>"));
      t1._cell = _map._first;
      return t1;
    },
    defineProperty(obj, property, value) {
      Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
    },
    lookupAndCacheInterceptor(obj) {
      var interceptor, interceptorClass, altTag, mark, t1,
        tag = A._asString($.getTagFunction.call$1(obj)),
        record = $.dispatchRecordsForInstanceTags[tag];
      if (record != null) {
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      interceptor = $.interceptorsForUncacheableTags[tag];
      if (interceptor != null)
        return interceptor;
      interceptorClass = init.interceptorsByTag[tag];
      if (interceptorClass == null) {
        altTag = A._asStringQ($.alternateTagFunction.call$2(obj, tag));
        if (altTag != null) {
          record = $.dispatchRecordsForInstanceTags[altTag];
          if (record != null) {
            Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
            return record.i;
          }
          interceptor = $.interceptorsForUncacheableTags[altTag];
          if (interceptor != null)
            return interceptor;
          interceptorClass = init.interceptorsByTag[altTag];
          tag = altTag;
        }
      }
      if (interceptorClass == null)
        return null;
      interceptor = interceptorClass.prototype;
      mark = tag[0];
      if (mark === "!") {
        record = A.makeLeafDispatchRecord(interceptor);
        $.dispatchRecordsForInstanceTags[tag] = record;
        Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
        return record.i;
      }
      if (mark === "~") {
        $.interceptorsForUncacheableTags[tag] = interceptor;
        return interceptor;
      }
      if (mark === "-") {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      }
      if (mark === "+")
        return A.patchInteriorProto(obj, interceptor);
      if (mark === "*")
        throw A.wrapException(A.UnimplementedError$(tag));
      if (init.leafTags[tag] === true) {
        t1 = A.makeLeafDispatchRecord(interceptor);
        Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
        return t1.i;
      } else
        return A.patchInteriorProto(obj, interceptor);
    },
    patchInteriorProto(obj, interceptor) {
      var proto = Object.getPrototypeOf(obj);
      Object.defineProperty(proto, init.dispatchPropertyName, {value: J.makeDispatchRecord(interceptor, proto, null, null), enumerable: false, writable: true, configurable: true});
      return interceptor;
    },
    makeLeafDispatchRecord(interceptor) {
      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
    },
    makeDefaultDispatchRecord(tag, interceptorClass, proto) {
      var interceptor = interceptorClass.prototype;
      if (init.leafTags[tag] === true)
        return A.makeLeafDispatchRecord(interceptor);
      else
        return J.makeDispatchRecord(interceptor, proto, null, null);
    },
    initNativeDispatch() {
      if (true === $.initNativeDispatchFlag)
        return;
      $.initNativeDispatchFlag = true;
      A.initNativeDispatchContinue();
    },
    initNativeDispatchContinue() {
      var map, tags, fun, i, tag, proto, record, interceptorClass;
      $.dispatchRecordsForInstanceTags = Object.create(null);
      $.interceptorsForUncacheableTags = Object.create(null);
      A.initHooks();
      map = init.interceptorsByTag;
      tags = Object.getOwnPropertyNames(map);
      if (typeof window != "undefined") {
        window;
        fun = function() {
        };
        for (i = 0; i < tags.length; ++i) {
          tag = tags[i];
          proto = $.prototypeForTagFunction.call$1(tag);
          if (proto != null) {
            record = A.makeDefaultDispatchRecord(tag, map[tag], proto);
            if (record != null) {
              Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
              fun.prototype = proto;
            }
          }
        }
      }
      for (i = 0; i < tags.length; ++i) {
        tag = tags[i];
        if (/^[A-Za-z_]/.test(tag)) {
          interceptorClass = map[tag];
          map["!" + tag] = interceptorClass;
          map["~" + tag] = interceptorClass;
          map["-" + tag] = interceptorClass;
          map["+" + tag] = interceptorClass;
          map["*" + tag] = interceptorClass;
        }
      }
    },
    initHooks() {
      var transformers, i, transformer, getTag, getUnknownTag, prototypeForTag,
        hooks = B.C_JS_CONST0();
      hooks = A.applyHooksTransformer(B.C_JS_CONST1, A.applyHooksTransformer(B.C_JS_CONST2, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST3, A.applyHooksTransformer(B.C_JS_CONST4, A.applyHooksTransformer(B.C_JS_CONST5, A.applyHooksTransformer(B.C_JS_CONST6(B.C_JS_CONST), hooks)))))));
      if (typeof dartNativeDispatchHooksTransformer != "undefined") {
        transformers = dartNativeDispatchHooksTransformer;
        if (typeof transformers == "function")
          transformers = [transformers];
        if (Array.isArray(transformers))
          for (i = 0; i < transformers.length; ++i) {
            transformer = transformers[i];
            if (typeof transformer == "function")
              hooks = transformer(hooks) || hooks;
          }
      }
      getTag = hooks.getTag;
      getUnknownTag = hooks.getUnknownTag;
      prototypeForTag = hooks.prototypeForTag;
      $.getTagFunction = new A.initHooks_closure(getTag);
      $.alternateTagFunction = new A.initHooks_closure0(getUnknownTag);
      $.prototypeForTagFunction = new A.initHooks_closure1(prototypeForTag);
    },
    applyHooksTransformer(transformer, hooks) {
      return transformer(hooks) || hooks;
    },
    createRecordTypePredicate(shape, fieldRtis) {
      var $length = fieldRtis.length,
        $function = init.rttc["" + $length + ";" + shape];
      if ($function == null)
        return null;
      if ($length === 0)
        return $function;
      if ($length === $function.length)
        return $function.apply(null, fieldRtis);
      return $function(fieldRtis);
    },
    JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, unicode, dotAll, global) {
      var m = multiLine ? "m" : "",
        i = caseSensitive ? "" : "i",
        u = unicode ? "u" : "",
        s = dotAll ? "s" : "",
        g = global ? "g" : "",
        regexp = function(source, modifiers) {
          try {
            return new RegExp(source, modifiers);
          } catch (e) {
            return e;
          }
        }(source, m + i + u + s + g);
      if (regexp instanceof RegExp)
        return regexp;
      throw A.wrapException(A.FormatException$("Illegal RegExp pattern (" + String(regexp) + ")", source, null));
    },
    stringContainsUnchecked(receiver, other, startIndex) {
      var t1;
      if (typeof other == "string")
        return receiver.indexOf(other, startIndex) >= 0;
      else if (other instanceof A.JSSyntaxRegExp) {
        t1 = B.JSString_methods.substring$1(receiver, startIndex);
        return other._nativeRegExp.test(t1);
      } else
        return !J.allMatches$1$s(other, B.JSString_methods.substring$1(receiver, startIndex)).get$isEmpty(0);
    },
    quoteStringForRegExp(string) {
      if (/[[\]{}()*+?.\\^$|]/.test(string))
        return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
      return string;
    },
    stringReplaceRangeUnchecked(receiver, start, end, replacement) {
      return receiver.substring(0, start) + replacement + receiver.substring(end);
    },
    ConstantMapView: function ConstantMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    ConstantMap: function ConstantMap() {
    },
    ConstantMap_map_closure: function ConstantMap_map_closure(t0, t1, t2) {
      this.$this = t0;
      this.transform = t1;
      this.result = t2;
    },
    ConstantStringMap: function ConstantStringMap(t0, t1, t2) {
      this._jsIndex = t0;
      this._values = t1;
      this.$ti = t2;
    },
    _KeysOrValues: function _KeysOrValues(t0, t1) {
      this._elements = t0;
      this.$ti = t1;
    },
    _KeysOrValuesOrElementsIterator: function _KeysOrValuesOrElementsIterator(t0, t1, t2) {
      var _ = this;
      _._elements = t0;
      _._length = t1;
      _.__js_helper$_index = 0;
      _.__js_helper$_current = null;
      _.$ti = t2;
    },
    JSInvocationMirror: function JSInvocationMirror(t0, t1, t2, t3, t4) {
      var _ = this;
      _._memberName = t0;
      _.__js_helper$_kind = t1;
      _._arguments = t2;
      _._namedArgumentNames = t3;
      _._typeArgumentCount = t4;
    },
    Primitives_functionNoSuchMethod_closure: function Primitives_functionNoSuchMethod_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.namedArgumentList = t1;
      this.$arguments = t2;
    },
    TypeErrorDecoder: function TypeErrorDecoder(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _._pattern = t0;
      _._arguments = t1;
      _._argumentsExpr = t2;
      _._expr = t3;
      _._method = t4;
      _._receiver = t5;
    },
    NullError: function NullError() {
    },
    JsNoSuchMethodError: function JsNoSuchMethodError(t0, t1, t2) {
      this.__js_helper$_message = t0;
      this._method = t1;
      this._receiver = t2;
    },
    UnknownJsTypeError: function UnknownJsTypeError(t0) {
      this.__js_helper$_message = t0;
    },
    NullThrownFromJavaScriptException: function NullThrownFromJavaScriptException(t0) {
      this._irritant = t0;
    },
    ExceptionAndStackTrace: function ExceptionAndStackTrace(t0, t1) {
      this.dartException = t0;
      this.stackTrace = t1;
    },
    _StackTrace: function _StackTrace(t0) {
      this._exception = t0;
      this._trace = null;
    },
    Closure: function Closure() {
    },
    Closure0Args: function Closure0Args() {
    },
    Closure2Args: function Closure2Args() {
    },
    TearOffClosure: function TearOffClosure() {
    },
    StaticClosure: function StaticClosure() {
    },
    BoundClosure: function BoundClosure(t0, t1) {
      this._receiver = t0;
      this._interceptor = t1;
    },
    _CyclicInitializationError: function _CyclicInitializationError(t0) {
      this.variableName = t0;
    },
    RuntimeError: function RuntimeError(t0) {
      this.message = t0;
    },
    _AssertionError: function _AssertionError(t0) {
      this.message = t0;
    },
    _Required: function _Required() {
    },
    JsLinkedHashMap: function JsLinkedHashMap(t0) {
      var _ = this;
      _._length = 0;
      _._last = _._first = _.__js_helper$_rest = _._nums = _._strings = null;
      _._modifications = 0;
      _.$ti = t0;
    },
    JsLinkedHashMap_addAll_closure: function JsLinkedHashMap_addAll_closure(t0) {
      this.$this = t0;
    },
    LinkedHashMapCell: function LinkedHashMapCell(t0, t1) {
      var _ = this;
      _.hashMapCellKey = t0;
      _.hashMapCellValue = t1;
      _._previous = _._next = null;
    },
    LinkedHashMapKeyIterable: function LinkedHashMapKeyIterable(t0, t1) {
      this._map = t0;
      this.$ti = t1;
    },
    LinkedHashMapKeyIterator: function LinkedHashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._map = t0;
      _._modifications = t1;
      _.__js_helper$_current = _._cell = null;
      _.$ti = t2;
    },
    initHooks_closure: function initHooks_closure(t0) {
      this.getTag = t0;
    },
    initHooks_closure0: function initHooks_closure0(t0) {
      this.getUnknownTag = t0;
    },
    initHooks_closure1: function initHooks_closure1(t0) {
      this.prototypeForTag = t0;
    },
    JSSyntaxRegExp: function JSSyntaxRegExp(t0, t1) {
      var _ = this;
      _.pattern = t0;
      _._nativeRegExp = t1;
      _._nativeAnchoredRegExp = _._nativeGlobalRegExp = null;
    },
    _MatchImplementation: function _MatchImplementation(t0) {
      this._match = t0;
    },
    _AllMatchesIterable: function _AllMatchesIterable(t0, t1, t2) {
      this._re = t0;
      this._string = t1;
      this.__js_helper$_start = t2;
    },
    _AllMatchesIterator: function _AllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._regExp = t0;
      _._string = t1;
      _._nextIndex = t2;
      _.__js_helper$_current = null;
    },
    StringMatch: function StringMatch(t0, t1) {
      this.start = t0;
      this.pattern = t1;
    },
    _StringAllMatchesIterable: function _StringAllMatchesIterable(t0, t1, t2) {
      this._input = t0;
      this._pattern = t1;
      this.__js_helper$_index = t2;
    },
    _StringAllMatchesIterator: function _StringAllMatchesIterator(t0, t1, t2) {
      var _ = this;
      _._input = t0;
      _._pattern = t1;
      _.__js_helper$_index = t2;
      _.__js_helper$_current = null;
    },
    throwLateFieldNI(fieldName) {
      A.throwExpressionWithWrapper(new A.LateError("Field '" + fieldName + "' has not been initialized."), new Error());
    },
    throwLateFieldAI(fieldName) {
      A.throwExpressionWithWrapper(new A.LateError("Field '" + fieldName + "' has already been initialized."), new Error());
    },
    throwLateFieldADI(fieldName) {
      A.throwExpressionWithWrapper(new A.LateError("Field '" + fieldName + "' has been assigned during initialization."), new Error());
    },
    _Cell$named(_name) {
      var t1 = new A._Cell(_name);
      return t1.__late_helper$_value = t1;
    },
    _Cell: function _Cell(t0) {
      this.__late_helper$_name = t0;
      this.__late_helper$_value = null;
    },
    _ensureNativeList(list) {
      return list;
    },
    NativeInt8List__create1(arg) {
      return new Int8Array(arg);
    },
    NativeUint8List_NativeUint8List($length) {
      return new Uint8Array($length);
    },
    NativeUint8List_NativeUint8List$view(buffer, offsetInBytes, $length) {
      return $length == null ? new Uint8Array(buffer, offsetInBytes) : new Uint8Array(buffer, offsetInBytes, $length);
    },
    _checkValidIndex(index, list, $length) {
      if (index >>> 0 !== index || index >= $length)
        throw A.wrapException(A.diagnoseIndexError(list, index));
    },
    _checkValidRange(start, end, $length) {
      var t1;
      if (!(start >>> 0 !== start))
        if (end == null)
          t1 = start > $length;
        else
          t1 = end >>> 0 !== end || start > end || end > $length;
      else
        t1 = true;
      if (t1)
        throw A.wrapException(A.diagnoseRangeError(start, end, $length));
      if (end == null)
        return $length;
      return end;
    },
    NativeByteBuffer: function NativeByteBuffer() {
    },
    NativeTypedData: function NativeTypedData() {
    },
    NativeByteData: function NativeByteData() {
    },
    NativeTypedArray: function NativeTypedArray() {
    },
    NativeTypedArrayOfDouble: function NativeTypedArrayOfDouble() {
    },
    NativeTypedArrayOfInt: function NativeTypedArrayOfInt() {
    },
    NativeFloat32List: function NativeFloat32List() {
    },
    NativeFloat64List: function NativeFloat64List() {
    },
    NativeInt16List: function NativeInt16List() {
    },
    NativeInt32List: function NativeInt32List() {
    },
    NativeInt8List: function NativeInt8List() {
    },
    NativeUint16List: function NativeUint16List() {
    },
    NativeUint32List: function NativeUint32List() {
    },
    NativeUint8ClampedList: function NativeUint8ClampedList() {
    },
    NativeUint8List: function NativeUint8List() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin() {
    },
    _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin: function _NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin() {
    },
    Rti__getQuestionFromStar(universe, rti) {
      var question = rti._precomputed1;
      return question == null ? rti._precomputed1 = A._Universe__lookupQuestionRti(universe, rti._primary, true) : question;
    },
    Rti__getFutureFromFutureOr(universe, rti) {
      var future = rti._precomputed1;
      return future == null ? rti._precomputed1 = A._Universe__lookupInterfaceRti(universe, "Future", [rti._primary]) : future;
    },
    Rti__isUnionOfFunctionType(rti) {
      var kind = rti._kind;
      if (kind === 6 || kind === 7 || kind === 8)
        return A.Rti__isUnionOfFunctionType(rti._primary);
      return kind === 12 || kind === 13;
    },
    Rti__getCanonicalRecipe(rti) {
      return rti._canonicalRecipe;
    },
    findType(recipe) {
      return A._Universe_eval(init.typeUniverse, recipe, false);
    },
    _substitute(universe, rti, typeArguments, depth) {
      var baseType, substitutedBaseType, interfaceTypeArguments, substitutedInterfaceTypeArguments, base, substitutedBase, $arguments, substitutedArguments, t1, fields, substitutedFields, returnType, substitutedReturnType, functionParameters, substitutedFunctionParameters, bounds, substitutedBounds, index, argument,
        kind = rti._kind;
      switch (kind) {
        case 5:
        case 1:
        case 2:
        case 3:
        case 4:
          return rti;
        case 6:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupStarRti(universe, substitutedBaseType, true);
        case 7:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupQuestionRti(universe, substitutedBaseType, true);
        case 8:
          baseType = rti._primary;
          substitutedBaseType = A._substitute(universe, baseType, typeArguments, depth);
          if (substitutedBaseType === baseType)
            return rti;
          return A._Universe__lookupFutureOrRti(universe, substitutedBaseType, true);
        case 9:
          interfaceTypeArguments = rti._rest;
          substitutedInterfaceTypeArguments = A._substituteArray(universe, interfaceTypeArguments, typeArguments, depth);
          if (substitutedInterfaceTypeArguments === interfaceTypeArguments)
            return rti;
          return A._Universe__lookupInterfaceRti(universe, rti._primary, substitutedInterfaceTypeArguments);
        case 10:
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          $arguments = rti._rest;
          substitutedArguments = A._substituteArray(universe, $arguments, typeArguments, depth);
          if (substitutedBase === base && substitutedArguments === $arguments)
            return rti;
          return A._Universe__lookupBindingRti(universe, substitutedBase, substitutedArguments);
        case 11:
          t1 = rti._primary;
          fields = rti._rest;
          substitutedFields = A._substituteArray(universe, fields, typeArguments, depth);
          if (substitutedFields === fields)
            return rti;
          return A._Universe__lookupRecordRti(universe, t1, substitutedFields);
        case 12:
          returnType = rti._primary;
          substitutedReturnType = A._substitute(universe, returnType, typeArguments, depth);
          functionParameters = rti._rest;
          substitutedFunctionParameters = A._substituteFunctionParameters(universe, functionParameters, typeArguments, depth);
          if (substitutedReturnType === returnType && substitutedFunctionParameters === functionParameters)
            return rti;
          return A._Universe__lookupFunctionRti(universe, substitutedReturnType, substitutedFunctionParameters);
        case 13:
          bounds = rti._rest;
          depth += bounds.length;
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, depth);
          base = rti._primary;
          substitutedBase = A._substitute(universe, base, typeArguments, depth);
          if (substitutedBounds === bounds && substitutedBase === base)
            return rti;
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, true);
        case 14:
          index = rti._primary;
          if (index < depth)
            return rti;
          argument = typeArguments[index - depth];
          if (argument == null)
            return rti;
          return argument;
        default:
          throw A.wrapException(A.AssertionError$("Attempted to substitute unexpected RTI kind " + kind));
      }
    },
    _substituteArray(universe, rtiArray, typeArguments, depth) {
      var changed, i, rti, substitutedRti,
        $length = rtiArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; ++i) {
        rti = rtiArray[i];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result[i] = substitutedRti;
      }
      return changed ? result : rtiArray;
    },
    _substituteNamed(universe, namedArray, typeArguments, depth) {
      var changed, i, t1, t2, rti, substitutedRti,
        $length = namedArray.length,
        result = A._Utils_newArrayOrEmpty($length);
      for (changed = false, i = 0; i < $length; i += 3) {
        t1 = namedArray[i];
        t2 = namedArray[i + 1];
        rti = namedArray[i + 2];
        substitutedRti = A._substitute(universe, rti, typeArguments, depth);
        if (substitutedRti !== rti)
          changed = true;
        result.splice(i, 3, t1, t2, substitutedRti);
      }
      return changed ? result : namedArray;
    },
    _substituteFunctionParameters(universe, functionParameters, typeArguments, depth) {
      var result,
        requiredPositional = functionParameters._requiredPositional,
        substitutedRequiredPositional = A._substituteArray(universe, requiredPositional, typeArguments, depth),
        optionalPositional = functionParameters._optionalPositional,
        substitutedOptionalPositional = A._substituteArray(universe, optionalPositional, typeArguments, depth),
        named = functionParameters._named,
        substitutedNamed = A._substituteNamed(universe, named, typeArguments, depth);
      if (substitutedRequiredPositional === requiredPositional && substitutedOptionalPositional === optionalPositional && substitutedNamed === named)
        return functionParameters;
      result = new A._FunctionParameters();
      result._requiredPositional = substitutedRequiredPositional;
      result._optionalPositional = substitutedOptionalPositional;
      result._named = substitutedNamed;
      return result;
    },
    _setArrayType(target, rti) {
      target[init.arrayRti] = rti;
      return target;
    },
    closureFunctionType(closure) {
      var signature = closure.$signature;
      if (signature != null) {
        if (typeof signature == "number")
          return A.getTypeFromTypesTable(signature);
        return closure.$signature();
      }
      return null;
    },
    instanceOrFunctionType(object, testRti) {
      var rti;
      if (A.Rti__isUnionOfFunctionType(testRti))
        if (object instanceof A.Closure) {
          rti = A.closureFunctionType(object);
          if (rti != null)
            return rti;
        }
      return A.instanceType(object);
    },
    instanceType(object) {
      if (object instanceof A.Object)
        return A._instanceType(object);
      if (Array.isArray(object))
        return A._arrayInstanceType(object);
      return A._instanceTypeFromConstructor(J.getInterceptor$(object));
    },
    _arrayInstanceType(object) {
      var rti = object[init.arrayRti],
        defaultRti = type$.JSArray_dynamic;
      if (rti == null)
        return defaultRti;
      if (rti.constructor !== defaultRti.constructor)
        return defaultRti;
      return rti;
    },
    _instanceType(object) {
      var rti = object.$ti;
      return rti != null ? rti : A._instanceTypeFromConstructor(object);
    },
    _instanceTypeFromConstructor(instance) {
      var $constructor = instance.constructor,
        probe = $constructor.$ccache;
      if (probe != null)
        return probe;
      return A._instanceTypeFromConstructorMiss(instance, $constructor);
    },
    _instanceTypeFromConstructorMiss(instance, $constructor) {
      var effectiveConstructor = instance instanceof A.Closure ? Object.getPrototypeOf(Object.getPrototypeOf(instance)).constructor : $constructor,
        rti = A._Universe_findErasedType(init.typeUniverse, effectiveConstructor.name);
      $constructor.$ccache = rti;
      return rti;
    },
    getTypeFromTypesTable(index) {
      var rti,
        table = init.types,
        type = table[index];
      if (typeof type == "string") {
        rti = A._Universe_eval(init.typeUniverse, type, false);
        table[index] = rti;
        return rti;
      }
      return type;
    },
    getRuntimeTypeOfDartObject(object) {
      return A.createRuntimeType(A._instanceType(object));
    },
    _structuralTypeOf(object) {
      var functionRti = object instanceof A.Closure ? A.closureFunctionType(object) : null;
      if (functionRti != null)
        return functionRti;
      if (type$.TrustedGetRuntimeType._is(object))
        return J.get$runtimeType$(object)._rti;
      if (Array.isArray(object))
        return A._arrayInstanceType(object);
      return A.instanceType(object);
    },
    createRuntimeType(rti) {
      var t1 = rti._cachedRuntimeType;
      return t1 == null ? rti._cachedRuntimeType = A._createRuntimeType(rti) : t1;
    },
    _createRuntimeType(rti) {
      var starErasedRti, t1,
        s = rti._canonicalRecipe,
        starErasedRecipe = s.replace(/\*/g, "");
      if (starErasedRecipe === s)
        return rti._cachedRuntimeType = new A._Type(rti);
      starErasedRti = A._Universe_eval(init.typeUniverse, starErasedRecipe, true);
      t1 = starErasedRti._cachedRuntimeType;
      return t1 == null ? starErasedRti._cachedRuntimeType = A._createRuntimeType(starErasedRti) : t1;
    },
    typeLiteral(recipe) {
      return A.createRuntimeType(A._Universe_eval(init.typeUniverse, recipe, false));
    },
    _installSpecializedIsTest(object) {
      var t1, unstarred, unstarredKind, isFn, $name, predicate, testRti = this;
      if (testRti === type$.Object)
        return A._finishIsFn(testRti, object, A._isObject);
      if (!A.isSoundTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return A._finishIsFn(testRti, object, A._isTop);
      t1 = testRti._kind;
      if (t1 === 7)
        return A._finishIsFn(testRti, object, A._generalNullableIsTestImplementation);
      if (t1 === 1)
        return A._finishIsFn(testRti, object, A._isNever);
      unstarred = t1 === 6 ? testRti._primary : testRti;
      unstarredKind = unstarred._kind;
      if (unstarredKind === 8)
        return A._finishIsFn(testRti, object, A._isFutureOr);
      if (unstarred === type$.int)
        isFn = A._isInt;
      else if (unstarred === type$.double || unstarred === type$.num)
        isFn = A._isNum;
      else if (unstarred === type$.String)
        isFn = A._isString;
      else
        isFn = unstarred === type$.bool ? A._isBool : null;
      if (isFn != null)
        return A._finishIsFn(testRti, object, isFn);
      if (unstarredKind === 9) {
        $name = unstarred._primary;
        if (unstarred._rest.every(A.isDefinitelyTopType)) {
          testRti._specializedTestResource = "$is" + $name;
          if ($name === "List")
            return A._finishIsFn(testRti, object, A._isListTestViaProperty);
          return A._finishIsFn(testRti, object, A._isTestViaProperty);
        }
      } else if (unstarredKind === 11) {
        predicate = A.createRecordTypePredicate(unstarred._primary, unstarred._rest);
        return A._finishIsFn(testRti, object, predicate == null ? A._isNever : predicate);
      }
      return A._finishIsFn(testRti, object, A._generalIsTestImplementation);
    },
    _finishIsFn(testRti, object, isFn) {
      testRti._is = isFn;
      return testRti._is(object);
    },
    _installSpecializedAsCheck(object) {
      var t1, testRti = this,
        asFn = A._generalAsCheckImplementation;
      if (!A.isSoundTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        asFn = A._asTop;
      else if (testRti === type$.Object)
        asFn = A._asObject;
      else {
        t1 = A.isNullable(testRti);
        if (t1)
          asFn = A._generalNullableAsCheckImplementation;
      }
      testRti._as = asFn;
      return testRti._as(object);
    },
    _nullIs(testRti) {
      var t1,
        kind = testRti._kind;
      if (!A.isSoundTopType(testRti))
        if (!(testRti === type$.legacy_Object))
          if (!(testRti === type$.legacy_Never))
            if (kind !== 7)
              if (!(kind === 6 && A._nullIs(testRti._primary)))
                t1 = kind === 8 && A._nullIs(testRti._primary) || testRti === type$.Null || testRti === type$.JSNull;
              else
                t1 = true;
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    _generalIsTestImplementation(object) {
      var testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      return A.isSubtype(init.typeUniverse, A.instanceOrFunctionType(object, testRti), testRti);
    },
    _generalNullableIsTestImplementation(object) {
      if (object == null)
        return true;
      return this._primary._is(object);
    },
    _isTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _isListTestViaProperty(object) {
      var tag, testRti = this;
      if (object == null)
        return A._nullIs(testRti);
      if (typeof object != "object")
        return false;
      if (Array.isArray(object))
        return true;
      tag = testRti._specializedTestResource;
      if (object instanceof A.Object)
        return !!object[tag];
      return !!J.getInterceptor$(object)[tag];
    },
    _generalAsCheckImplementation(object) {
      var testRti = this;
      if (object == null) {
        if (A.isNullable(testRti))
          return object;
      } else if (testRti._is(object))
        return object;
      A._failedAsCheck(object, testRti);
    },
    _generalNullableAsCheckImplementation(object) {
      var testRti = this;
      if (object == null)
        return object;
      else if (testRti._is(object))
        return object;
      A._failedAsCheck(object, testRti);
    },
    _failedAsCheck(object, testRti) {
      throw A.wrapException(A._TypeError$fromMessage(A._Error_compose(object, A._rtiToString(testRti, null))));
    },
    checkTypeBound(type, bound, variable, methodName) {
      if (A.isSubtype(init.typeUniverse, type, bound))
        return type;
      throw A.wrapException(A._TypeError$fromMessage("The type argument '" + A._rtiToString(type, null) + "' is not a subtype of the type variable bound '" + A._rtiToString(bound, null) + "' of type variable '" + variable + "' in '" + methodName + "'."));
    },
    _Error_compose(object, checkedTypeDescription) {
      return A.Error_safeToString(object) + ": type '" + A._rtiToString(A._structuralTypeOf(object), null) + "' is not a subtype of type '" + checkedTypeDescription + "'";
    },
    _TypeError$fromMessage(message) {
      return new A._TypeError("TypeError: " + message);
    },
    _TypeError__TypeError$forType(object, type) {
      return new A._TypeError("TypeError: " + A._Error_compose(object, type));
    },
    _isFutureOr(object) {
      var testRti = this,
        unstarred = testRti._kind === 6 ? testRti._primary : testRti;
      return unstarred._primary._is(object) || A.Rti__getFutureFromFutureOr(init.typeUniverse, unstarred)._is(object);
    },
    _isObject(object) {
      return object != null;
    },
    _asObject(object) {
      if (object != null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "Object"));
    },
    _isTop(object) {
      return true;
    },
    _asTop(object) {
      return object;
    },
    _isNever(object) {
      return false;
    },
    _isBool(object) {
      return true === object || false === object;
    },
    _asBool(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolS(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool"));
    },
    _asBoolQ(object) {
      if (true === object)
        return true;
      if (false === object)
        return false;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "bool?"));
    },
    _asDouble(object) {
      if (typeof object == "number")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleS(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double"));
    },
    _asDoubleQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "double?"));
    },
    _isInt(object) {
      return typeof object == "number" && Math.floor(object) === object;
    },
    _asInt(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int"));
    },
    _asIntS(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int"));
    },
    _asIntQ(object) {
      if (typeof object == "number" && Math.floor(object) === object)
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "int?"));
    },
    _isNum(object) {
      return typeof object == "number";
    },
    _asNum(object) {
      if (typeof object == "number")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num"));
    },
    _asNumS(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num"));
    },
    _asNumQ(object) {
      if (typeof object == "number")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "num?"));
    },
    _isString(object) {
      return typeof object == "string";
    },
    _asString(object) {
      if (typeof object == "string")
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String"));
    },
    _asStringS(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String"));
    },
    _asStringQ(object) {
      if (typeof object == "string")
        return object;
      if (object == null)
        return object;
      throw A.wrapException(A._TypeError__TypeError$forType(object, "String?"));
    },
    _rtiArrayToString(array, genericContext) {
      var s, sep, i;
      for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ")
        s += sep + A._rtiToString(array[i], genericContext);
      return s;
    },
    _recordRtiToString(recordType, genericContext) {
      var fieldCount, names, namesIndex, s, comma, i,
        partialShape = recordType._primary,
        fields = recordType._rest;
      if ("" === partialShape)
        return "(" + A._rtiArrayToString(fields, genericContext) + ")";
      fieldCount = fields.length;
      names = partialShape.split(",");
      namesIndex = names.length - fieldCount;
      for (s = "(", comma = "", i = 0; i < fieldCount; ++i, comma = ", ") {
        s += comma;
        if (namesIndex === 0)
          s += "{";
        s += A._rtiToString(fields[i], genericContext);
        if (namesIndex >= 0)
          s += " " + names[namesIndex];
        ++namesIndex;
      }
      return s + "})";
    },
    _functionRtiToString(functionType, genericContext, bounds) {
      var boundsLength, outerContextLength, offset, i, t1, t2, typeParametersText, typeSep, t3, t4, boundRti, kind, parameters, requiredPositional, requiredPositionalLength, optionalPositional, optionalPositionalLength, named, namedLength, returnTypeText, argumentsText, sep, _s2_ = ", ";
      if (bounds != null) {
        boundsLength = bounds.length;
        if (genericContext == null) {
          genericContext = A._setArrayType([], type$.JSArray_String);
          outerContextLength = null;
        } else
          outerContextLength = genericContext.length;
        offset = genericContext.length;
        for (i = boundsLength; i > 0; --i)
          B.JSArray_methods.add$1(genericContext, "T" + (offset + i));
        for (t1 = type$.nullable_Object, t2 = type$.legacy_Object, typeParametersText = "<", typeSep = "", i = 0; i < boundsLength; ++i, typeSep = _s2_) {
          t3 = genericContext.length;
          t4 = t3 - 1 - i;
          if (!(t4 >= 0))
            return A.ioore(genericContext, t4);
          typeParametersText = B.JSString_methods.$add(typeParametersText + typeSep, genericContext[t4]);
          boundRti = bounds[i];
          kind = boundRti._kind;
          if (!(kind === 2 || kind === 3 || kind === 4 || kind === 5 || boundRti === t1))
            if (!(boundRti === t2))
              t3 = false;
            else
              t3 = true;
          else
            t3 = true;
          if (!t3)
            typeParametersText += " extends " + A._rtiToString(boundRti, genericContext);
        }
        typeParametersText += ">";
      } else {
        typeParametersText = "";
        outerContextLength = null;
      }
      t1 = functionType._primary;
      parameters = functionType._rest;
      requiredPositional = parameters._requiredPositional;
      requiredPositionalLength = requiredPositional.length;
      optionalPositional = parameters._optionalPositional;
      optionalPositionalLength = optionalPositional.length;
      named = parameters._named;
      namedLength = named.length;
      returnTypeText = A._rtiToString(t1, genericContext);
      for (argumentsText = "", sep = "", i = 0; i < requiredPositionalLength; ++i, sep = _s2_)
        argumentsText += sep + A._rtiToString(requiredPositional[i], genericContext);
      if (optionalPositionalLength > 0) {
        argumentsText += sep + "[";
        for (sep = "", i = 0; i < optionalPositionalLength; ++i, sep = _s2_)
          argumentsText += sep + A._rtiToString(optionalPositional[i], genericContext);
        argumentsText += "]";
      }
      if (namedLength > 0) {
        argumentsText += sep + "{";
        for (sep = "", i = 0; i < namedLength; i += 3, sep = _s2_) {
          argumentsText += sep;
          if (named[i + 1])
            argumentsText += "required ";
          argumentsText += A._rtiToString(named[i + 2], genericContext) + " " + named[i];
        }
        argumentsText += "}";
      }
      if (outerContextLength != null) {
        genericContext.toString;
        genericContext.length = outerContextLength;
      }
      return typeParametersText + "(" + argumentsText + ") => " + returnTypeText;
    },
    _rtiToString(rti, genericContext) {
      var questionArgument, s, argumentKind, $name, $arguments, t1, t2,
        kind = rti._kind;
      if (kind === 5)
        return "erased";
      if (kind === 2)
        return "dynamic";
      if (kind === 3)
        return "void";
      if (kind === 1)
        return "Never";
      if (kind === 4)
        return "any";
      if (kind === 6)
        return A._rtiToString(rti._primary, genericContext);
      if (kind === 7) {
        questionArgument = rti._primary;
        s = A._rtiToString(questionArgument, genericContext);
        argumentKind = questionArgument._kind;
        return (argumentKind === 12 || argumentKind === 13 ? "(" + s + ")" : s) + "?";
      }
      if (kind === 8)
        return "FutureOr<" + A._rtiToString(rti._primary, genericContext) + ">";
      if (kind === 9) {
        $name = A._unminifyOrTag(rti._primary);
        $arguments = rti._rest;
        return $arguments.length > 0 ? $name + ("<" + A._rtiArrayToString($arguments, genericContext) + ">") : $name;
      }
      if (kind === 11)
        return A._recordRtiToString(rti, genericContext);
      if (kind === 12)
        return A._functionRtiToString(rti, genericContext, null);
      if (kind === 13)
        return A._functionRtiToString(rti._primary, genericContext, rti._rest);
      if (kind === 14) {
        t1 = rti._primary;
        t2 = genericContext.length;
        t1 = t2 - 1 - t1;
        if (!(t1 >= 0 && t1 < t2))
          return A.ioore(genericContext, t1);
        return genericContext[t1];
      }
      return "?";
    },
    _unminifyOrTag(rawClassName) {
      var preserved = init.mangledGlobalNames[rawClassName];
      if (preserved != null)
        return preserved;
      return rawClassName;
    },
    _Universe_findRule(universe, targetType) {
      var rule = universe.tR[targetType];
      for (; typeof rule == "string";)
        rule = universe.tR[rule];
      return rule;
    },
    _Universe_findErasedType(universe, cls) {
      var $length, erased, $arguments, i, $interface,
        t1 = universe.eT,
        probe = t1[cls];
      if (probe == null)
        return A._Universe_eval(universe, cls, false);
      else if (typeof probe == "number") {
        $length = probe;
        erased = A._Universe__lookupTerminalRti(universe, 5, "#");
        $arguments = A._Utils_newArrayOrEmpty($length);
        for (i = 0; i < $length; ++i)
          $arguments[i] = erased;
        $interface = A._Universe__lookupInterfaceRti(universe, cls, $arguments);
        t1[cls] = $interface;
        return $interface;
      } else
        return probe;
    },
    _Universe_addRules(universe, rules) {
      return A._Utils_objectAssign(universe.tR, rules);
    },
    _Universe_addErasedTypes(universe, types) {
      return A._Utils_objectAssign(universe.eT, types);
    },
    _Universe_eval(universe, recipe, normalize) {
      var rti,
        t1 = universe.eC,
        probe = t1.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, null, recipe, normalize));
      t1.set(recipe, rti);
      return rti;
    },
    _Universe_evalInEnvironment(universe, environment, recipe) {
      var probe, rti,
        cache = environment._evalCache;
      if (cache == null)
        cache = environment._evalCache = new Map();
      probe = cache.get(recipe);
      if (probe != null)
        return probe;
      rti = A._Parser_parse(A._Parser_create(universe, environment, recipe, true));
      cache.set(recipe, rti);
      return rti;
    },
    _Universe_bind(universe, environment, argumentsRti) {
      var argumentsRecipe, probe, rti,
        cache = environment._bindCache;
      if (cache == null)
        cache = environment._bindCache = new Map();
      argumentsRecipe = argumentsRti._canonicalRecipe;
      probe = cache.get(argumentsRecipe);
      if (probe != null)
        return probe;
      rti = A._Universe__lookupBindingRti(universe, environment, argumentsRti._kind === 10 ? argumentsRti._rest : [argumentsRti]);
      cache.set(argumentsRecipe, rti);
      return rti;
    },
    _Universe__installTypeTests(universe, rti) {
      rti._as = A._installSpecializedAsCheck;
      rti._is = A._installSpecializedIsTest;
      return rti;
    },
    _Universe__lookupTerminalRti(universe, kind, key) {
      var rti, t1,
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = kind;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupStarRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "*",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createStarRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createStarRti(universe, baseType, key, normalize) {
      var baseKind, t1, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!A.isSoundTopType(baseType))
          t1 = baseType === type$.Null || baseType === type$.JSNull || baseKind === 7 || baseKind === 6;
        else
          t1 = true;
        if (t1)
          return baseType;
      }
      rti = new A.Rti(null, null);
      rti._kind = 6;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupQuestionRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "?",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createQuestionRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createQuestionRti(universe, baseType, key, normalize) {
      var baseKind, t1, starArgument, rti;
      if (normalize) {
        baseKind = baseType._kind;
        if (!A.isSoundTopType(baseType))
          if (!(baseType === type$.Null || baseType === type$.JSNull))
            if (baseKind !== 7)
              t1 = baseKind === 8 && A.isNullable(baseType._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
        if (t1)
          return baseType;
        else if (baseKind === 1 || baseType === type$.legacy_Never)
          return type$.Null;
        else if (baseKind === 6) {
          starArgument = baseType._primary;
          if (starArgument._kind === 8 && A.isNullable(starArgument._primary))
            return starArgument;
          else
            return A.Rti__getQuestionFromStar(universe, baseType);
        }
      }
      rti = new A.Rti(null, null);
      rti._kind = 7;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupFutureOrRti(universe, baseType, normalize) {
      var t1,
        key = baseType._canonicalRecipe + "/",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createFutureOrRti(universe, baseType, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createFutureOrRti(universe, baseType, key, normalize) {
      var t1, rti;
      if (normalize) {
        t1 = baseType._kind;
        if (A.isSoundTopType(baseType) || baseType === type$.Object || baseType === type$.legacy_Object)
          return baseType;
        else if (t1 === 1)
          return A._Universe__lookupInterfaceRti(universe, "Future", [baseType]);
        else if (baseType === type$.Null || baseType === type$.JSNull)
          return type$.nullable_Future_Null;
      }
      rti = new A.Rti(null, null);
      rti._kind = 8;
      rti._primary = baseType;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Universe__lookupGenericFunctionParameterRti(universe, index) {
      var rti, t1,
        key = "" + index + "^",
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 14;
      rti._primary = index;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__canonicalRecipeJoin($arguments) {
      var s, sep, i,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; ++i, sep = ",")
        s += sep + $arguments[i]._canonicalRecipe;
      return s;
    },
    _Universe__canonicalRecipeJoinNamed($arguments) {
      var s, sep, i, t1, nameSep,
        $length = $arguments.length;
      for (s = "", sep = "", i = 0; i < $length; i += 3, sep = ",") {
        t1 = $arguments[i];
        nameSep = $arguments[i + 1] ? "!" : ":";
        s += sep + t1 + nameSep + $arguments[i + 2]._canonicalRecipe;
      }
      return s;
    },
    _Universe__lookupInterfaceRti(universe, $name, $arguments) {
      var probe, rti, t1,
        s = $name;
      if ($arguments.length > 0)
        s += "<" + A._Universe__canonicalRecipeJoin($arguments) + ">";
      probe = universe.eC.get(s);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 9;
      rti._primary = $name;
      rti._rest = $arguments;
      if ($arguments.length > 0)
        rti._precomputed1 = $arguments[0];
      rti._canonicalRecipe = s;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(s, t1);
      return t1;
    },
    _Universe__lookupBindingRti(universe, base, $arguments) {
      var newBase, newArguments, key, probe, rti, t1;
      if (base._kind === 10) {
        newBase = base._primary;
        newArguments = base._rest.concat($arguments);
      } else {
        newArguments = $arguments;
        newBase = base;
      }
      key = newBase._canonicalRecipe + (";<" + A._Universe__canonicalRecipeJoin(newArguments) + ">");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 10;
      rti._primary = newBase;
      rti._rest = newArguments;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupRecordRti(universe, partialShapeTag, fields) {
      var rti, t1,
        key = "+" + (partialShapeTag + "(" + A._Universe__canonicalRecipeJoin(fields) + ")"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 11;
      rti._primary = partialShapeTag;
      rti._rest = fields;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupFunctionRti(universe, returnType, parameters) {
      var sep, key, probe, rti, t1,
        s = returnType._canonicalRecipe,
        requiredPositional = parameters._requiredPositional,
        requiredPositionalLength = requiredPositional.length,
        optionalPositional = parameters._optionalPositional,
        optionalPositionalLength = optionalPositional.length,
        named = parameters._named,
        namedLength = named.length,
        recipe = "(" + A._Universe__canonicalRecipeJoin(requiredPositional);
      if (optionalPositionalLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        recipe += sep + "[" + A._Universe__canonicalRecipeJoin(optionalPositional) + "]";
      }
      if (namedLength > 0) {
        sep = requiredPositionalLength > 0 ? "," : "";
        recipe += sep + "{" + A._Universe__canonicalRecipeJoinNamed(named) + "}";
      }
      key = s + (recipe + ")");
      probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      rti = new A.Rti(null, null);
      rti._kind = 12;
      rti._primary = returnType;
      rti._rest = parameters;
      rti._canonicalRecipe = key;
      t1 = A._Universe__installTypeTests(universe, rti);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__lookupGenericFunctionRti(universe, baseFunctionType, bounds, normalize) {
      var t1,
        key = baseFunctionType._canonicalRecipe + ("<" + A._Universe__canonicalRecipeJoin(bounds) + ">"),
        probe = universe.eC.get(key);
      if (probe != null)
        return probe;
      t1 = A._Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize);
      universe.eC.set(key, t1);
      return t1;
    },
    _Universe__createGenericFunctionRti(universe, baseFunctionType, bounds, key, normalize) {
      var $length, typeArguments, count, i, bound, substitutedBase, substitutedBounds, rti;
      if (normalize) {
        $length = bounds.length;
        typeArguments = A._Utils_newArrayOrEmpty($length);
        for (count = 0, i = 0; i < $length; ++i) {
          bound = bounds[i];
          if (bound._kind === 1) {
            typeArguments[i] = bound;
            ++count;
          }
        }
        if (count > 0) {
          substitutedBase = A._substitute(universe, baseFunctionType, typeArguments, 0);
          substitutedBounds = A._substituteArray(universe, bounds, typeArguments, 0);
          return A._Universe__lookupGenericFunctionRti(universe, substitutedBase, substitutedBounds, bounds !== substitutedBounds);
        }
      }
      rti = new A.Rti(null, null);
      rti._kind = 13;
      rti._primary = baseFunctionType;
      rti._rest = bounds;
      rti._canonicalRecipe = key;
      return A._Universe__installTypeTests(universe, rti);
    },
    _Parser_create(universe, environment, recipe, normalize) {
      return {u: universe, e: environment, r: recipe, s: [], p: 0, n: normalize};
    },
    _Parser_parse(parser) {
      var t2, i, ch, t3, array, end, item,
        source = parser.r,
        t1 = parser.s;
      for (t2 = source.length, i = 0; i < t2;) {
        ch = source.charCodeAt(i);
        if (ch >= 48 && ch <= 57)
          i = A._Parser_handleDigit(i + 1, ch, source, t1);
        else if ((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36 || ch === 124)
          i = A._Parser_handleIdentifier(parser, i, source, t1, false);
        else if (ch === 46)
          i = A._Parser_handleIdentifier(parser, i, source, t1, true);
        else {
          ++i;
          switch (ch) {
            case 44:
              break;
            case 58:
              t1.push(false);
              break;
            case 33:
              t1.push(true);
              break;
            case 59:
              t1.push(A._Parser_toType(parser.u, parser.e, t1.pop()));
              break;
            case 94:
              t1.push(A._Universe__lookupGenericFunctionParameterRti(parser.u, t1.pop()));
              break;
            case 35:
              t1.push(A._Universe__lookupTerminalRti(parser.u, 5, "#"));
              break;
            case 64:
              t1.push(A._Universe__lookupTerminalRti(parser.u, 2, "@"));
              break;
            case 126:
              t1.push(A._Universe__lookupTerminalRti(parser.u, 3, "~"));
              break;
            case 60:
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 62:
              A._Parser_handleTypeArguments(parser, t1);
              break;
            case 38:
              A._Parser_handleExtendedOperations(parser, t1);
              break;
            case 42:
              t3 = parser.u;
              t1.push(A._Universe__lookupStarRti(t3, A._Parser_toType(t3, parser.e, t1.pop()), parser.n));
              break;
            case 63:
              t3 = parser.u;
              t1.push(A._Universe__lookupQuestionRti(t3, A._Parser_toType(t3, parser.e, t1.pop()), parser.n));
              break;
            case 47:
              t3 = parser.u;
              t1.push(A._Universe__lookupFutureOrRti(t3, A._Parser_toType(t3, parser.e, t1.pop()), parser.n));
              break;
            case 40:
              t1.push(-3);
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 41:
              A._Parser_handleArguments(parser, t1);
              break;
            case 91:
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 93:
              array = t1.splice(parser.p);
              A._Parser_toTypes(parser.u, parser.e, array);
              parser.p = t1.pop();
              t1.push(array);
              t1.push(-1);
              break;
            case 123:
              t1.push(parser.p);
              parser.p = t1.length;
              break;
            case 125:
              array = t1.splice(parser.p);
              A._Parser_toTypesNamed(parser.u, parser.e, array);
              parser.p = t1.pop();
              t1.push(array);
              t1.push(-2);
              break;
            case 43:
              end = source.indexOf("(", i);
              t1.push(source.substring(i, end));
              t1.push(-4);
              t1.push(parser.p);
              parser.p = t1.length;
              i = end + 1;
              break;
            default:
              throw "Bad character " + ch;
          }
        }
      }
      item = t1.pop();
      return A._Parser_toType(parser.u, parser.e, item);
    },
    _Parser_handleDigit(i, digit, source, stack) {
      var t1, ch,
        value = digit - 48;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (!(ch >= 48 && ch <= 57))
          break;
        value = value * 10 + (ch - 48);
      }
      stack.push(value);
      return i;
    },
    _Parser_handleIdentifier(parser, start, source, stack, hasPeriod) {
      var t1, ch, t2, string, environment, recipe,
        i = start + 1;
      for (t1 = source.length; i < t1; ++i) {
        ch = source.charCodeAt(i);
        if (ch === 46) {
          if (hasPeriod)
            break;
          hasPeriod = true;
        } else {
          if (!((((ch | 32) >>> 0) - 97 & 65535) < 26 || ch === 95 || ch === 36 || ch === 124))
            t2 = ch >= 48 && ch <= 57;
          else
            t2 = true;
          if (!t2)
            break;
        }
      }
      string = source.substring(start, i);
      if (hasPeriod) {
        t1 = parser.u;
        environment = parser.e;
        if (environment._kind === 10)
          environment = environment._primary;
        recipe = A._Universe_findRule(t1, environment._primary)[string];
        if (recipe == null)
          A.throwExpression('No "' + string + '" in "' + A.Rti__getCanonicalRecipe(environment) + '"');
        stack.push(A._Universe_evalInEnvironment(t1, environment, recipe));
      } else
        stack.push(string);
      return i;
    },
    _Parser_handleTypeArguments(parser, stack) {
      var base,
        t1 = parser.u,
        $arguments = A._Parser_collectArray(parser, stack),
        head = stack.pop();
      if (typeof head == "string")
        stack.push(A._Universe__lookupInterfaceRti(t1, head, $arguments));
      else {
        base = A._Parser_toType(t1, parser.e, head);
        switch (base._kind) {
          case 12:
            stack.push(A._Universe__lookupGenericFunctionRti(t1, base, $arguments, parser.n));
            break;
          default:
            stack.push(A._Universe__lookupBindingRti(t1, base, $arguments));
            break;
        }
      }
    },
    _Parser_handleArguments(parser, stack) {
      var optionalPositional, named, requiredPositional, returnType, parameters, _null = null,
        t1 = parser.u,
        head = stack.pop();
      if (typeof head == "number")
        switch (head) {
          case -1:
            optionalPositional = stack.pop();
            named = _null;
            break;
          case -2:
            named = stack.pop();
            optionalPositional = _null;
            break;
          default:
            stack.push(head);
            named = _null;
            optionalPositional = named;
            break;
        }
      else {
        stack.push(head);
        named = _null;
        optionalPositional = named;
      }
      requiredPositional = A._Parser_collectArray(parser, stack);
      head = stack.pop();
      switch (head) {
        case -3:
          head = stack.pop();
          if (optionalPositional == null)
            optionalPositional = t1.sEA;
          if (named == null)
            named = t1.sEA;
          returnType = A._Parser_toType(t1, parser.e, head);
          parameters = new A._FunctionParameters();
          parameters._requiredPositional = requiredPositional;
          parameters._optionalPositional = optionalPositional;
          parameters._named = named;
          stack.push(A._Universe__lookupFunctionRti(t1, returnType, parameters));
          return;
        case -4:
          stack.push(A._Universe__lookupRecordRti(t1, stack.pop(), requiredPositional));
          return;
        default:
          throw A.wrapException(A.AssertionError$("Unexpected state under `()`: " + A.S(head)));
      }
    },
    _Parser_handleExtendedOperations(parser, stack) {
      var $top = stack.pop();
      if (0 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 1, "0&"));
        return;
      }
      if (1 === $top) {
        stack.push(A._Universe__lookupTerminalRti(parser.u, 4, "1&"));
        return;
      }
      throw A.wrapException(A.AssertionError$("Unexpected extended operation " + A.S($top)));
    },
    _Parser_collectArray(parser, stack) {
      var array = stack.splice(parser.p);
      A._Parser_toTypes(parser.u, parser.e, array);
      parser.p = stack.pop();
      return array;
    },
    _Parser_toType(universe, environment, item) {
      if (typeof item == "string")
        return A._Universe__lookupInterfaceRti(universe, item, universe.sEA);
      else if (typeof item == "number") {
        environment.toString;
        return A._Parser_indexToType(universe, environment, item);
      } else
        return item;
    },
    _Parser_toTypes(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 0; i < $length; ++i)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_toTypesNamed(universe, environment, items) {
      var i,
        $length = items.length;
      for (i = 2; i < $length; i += 3)
        items[i] = A._Parser_toType(universe, environment, items[i]);
    },
    _Parser_indexToType(universe, environment, index) {
      var typeArguments, len,
        kind = environment._kind;
      if (kind === 10) {
        if (index === 0)
          return environment._primary;
        typeArguments = environment._rest;
        len = typeArguments.length;
        if (index <= len)
          return typeArguments[index - 1];
        index -= len;
        environment = environment._primary;
        kind = environment._kind;
      } else if (index === 0)
        return environment;
      if (kind !== 9)
        throw A.wrapException(A.AssertionError$("Indexed base must be an interface type"));
      typeArguments = environment._rest;
      if (index <= typeArguments.length)
        return typeArguments[index - 1];
      throw A.wrapException(A.AssertionError$("Bad index " + index + " for " + environment.toString$0(0)));
    },
    isSubtype(universe, s, t) {
      var result,
        sCache = s._isSubtypeCache;
      if (sCache == null)
        sCache = s._isSubtypeCache = new Map();
      result = sCache.get(t);
      if (result == null) {
        result = A._isSubtype(universe, s, null, t, null, false) ? 1 : 0;
        sCache.set(t, result);
      }
      if (0 === result)
        return false;
      if (1 === result)
        return true;
      return true;
    },
    _isSubtype(universe, s, sEnv, t, tEnv, isLegacy) {
      var t1, sKind, leftTypeVariable, tKind, t2, sBounds, tBounds, sLength, i, sBound, tBound;
      if (s === t)
        return true;
      if (!A.isSoundTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      if (t1)
        return true;
      sKind = s._kind;
      if (sKind === 4)
        return true;
      if (A.isSoundTopType(s))
        return false;
      if (s._kind !== 1)
        t1 = false;
      else
        t1 = true;
      if (t1)
        return true;
      leftTypeVariable = sKind === 14;
      if (leftTypeVariable)
        if (A._isSubtype(universe, sEnv[s._primary], sEnv, t, tEnv, false))
          return true;
      tKind = t._kind;
      t1 = s === type$.Null || s === type$.JSNull;
      if (t1) {
        if (tKind === 8)
          return A._isSubtype(universe, s, sEnv, t._primary, tEnv, false);
        return t === type$.Null || t === type$.JSNull || tKind === 7 || tKind === 6;
      }
      if (t === type$.Object) {
        if (sKind === 8)
          return A._isSubtype(universe, s._primary, sEnv, t, tEnv, false);
        if (sKind === 6)
          return A._isSubtype(universe, s._primary, sEnv, t, tEnv, false);
        return sKind !== 7;
      }
      if (sKind === 6)
        return A._isSubtype(universe, s._primary, sEnv, t, tEnv, false);
      if (tKind === 6) {
        t1 = A.Rti__getQuestionFromStar(universe, t);
        return A._isSubtype(universe, s, sEnv, t1, tEnv, false);
      }
      if (sKind === 8) {
        if (!A._isSubtype(universe, s._primary, sEnv, t, tEnv, false))
          return false;
        return A._isSubtype(universe, A.Rti__getFutureFromFutureOr(universe, s), sEnv, t, tEnv, false);
      }
      if (sKind === 7) {
        t1 = A._isSubtype(universe, type$.Null, sEnv, t, tEnv, false);
        return t1 && A._isSubtype(universe, s._primary, sEnv, t, tEnv, false);
      }
      if (tKind === 8) {
        if (A._isSubtype(universe, s, sEnv, t._primary, tEnv, false))
          return true;
        return A._isSubtype(universe, s, sEnv, A.Rti__getFutureFromFutureOr(universe, t), tEnv, false);
      }
      if (tKind === 7) {
        t1 = A._isSubtype(universe, s, sEnv, type$.Null, tEnv, false);
        return t1 || A._isSubtype(universe, s, sEnv, t._primary, tEnv, false);
      }
      if (leftTypeVariable)
        return false;
      t1 = sKind !== 12;
      if ((!t1 || sKind === 13) && t === type$.Function)
        return true;
      t2 = sKind === 11;
      if (t2 && t === type$.Record)
        return true;
      if (tKind === 13) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (sKind !== 13)
          return false;
        sBounds = s._rest;
        tBounds = t._rest;
        sLength = sBounds.length;
        if (sLength !== tBounds.length)
          return false;
        sEnv = sEnv == null ? sBounds : sBounds.concat(sEnv);
        tEnv = tEnv == null ? tBounds : tBounds.concat(tEnv);
        for (i = 0; i < sLength; ++i) {
          sBound = sBounds[i];
          tBound = tBounds[i];
          if (!A._isSubtype(universe, sBound, sEnv, tBound, tEnv, false) || !A._isSubtype(universe, tBound, tEnv, sBound, sEnv, false))
            return false;
        }
        return A._isFunctionSubtype(universe, s._primary, sEnv, t._primary, tEnv, false);
      }
      if (tKind === 12) {
        if (s === type$.JavaScriptFunction)
          return true;
        if (t1)
          return false;
        return A._isFunctionSubtype(universe, s, sEnv, t, tEnv, false);
      }
      if (sKind === 9) {
        if (tKind !== 9)
          return false;
        return A._isInterfaceSubtype(universe, s, sEnv, t, tEnv, false);
      }
      if (t2 && tKind === 11)
        return A._isRecordSubtype(universe, s, sEnv, t, tEnv, false);
      return false;
    },
    _isFunctionSubtype(universe, s, sEnv, t, tEnv, isLegacy) {
      var sParameters, tParameters, sRequiredPositional, tRequiredPositional, sRequiredPositionalLength, tRequiredPositionalLength, requiredPositionalDelta, sOptionalPositional, tOptionalPositional, sOptionalPositionalLength, tOptionalPositionalLength, i, t1, sNamed, tNamed, sNamedLength, tNamedLength, sIndex, tIndex, tName, sName, sIsRequired;
      if (!A._isSubtype(universe, s._primary, sEnv, t._primary, tEnv, false))
        return false;
      sParameters = s._rest;
      tParameters = t._rest;
      sRequiredPositional = sParameters._requiredPositional;
      tRequiredPositional = tParameters._requiredPositional;
      sRequiredPositionalLength = sRequiredPositional.length;
      tRequiredPositionalLength = tRequiredPositional.length;
      if (sRequiredPositionalLength > tRequiredPositionalLength)
        return false;
      requiredPositionalDelta = tRequiredPositionalLength - sRequiredPositionalLength;
      sOptionalPositional = sParameters._optionalPositional;
      tOptionalPositional = tParameters._optionalPositional;
      sOptionalPositionalLength = sOptionalPositional.length;
      tOptionalPositionalLength = tOptionalPositional.length;
      if (sRequiredPositionalLength + sOptionalPositionalLength < tRequiredPositionalLength + tOptionalPositionalLength)
        return false;
      for (i = 0; i < sRequiredPositionalLength; ++i) {
        t1 = sRequiredPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[i], tEnv, t1, sEnv, false))
          return false;
      }
      for (i = 0; i < requiredPositionalDelta; ++i) {
        t1 = sOptionalPositional[i];
        if (!A._isSubtype(universe, tRequiredPositional[sRequiredPositionalLength + i], tEnv, t1, sEnv, false))
          return false;
      }
      for (i = 0; i < tOptionalPositionalLength; ++i) {
        t1 = sOptionalPositional[requiredPositionalDelta + i];
        if (!A._isSubtype(universe, tOptionalPositional[i], tEnv, t1, sEnv, false))
          return false;
      }
      sNamed = sParameters._named;
      tNamed = tParameters._named;
      sNamedLength = sNamed.length;
      tNamedLength = tNamed.length;
      for (sIndex = 0, tIndex = 0; tIndex < tNamedLength; tIndex += 3) {
        tName = tNamed[tIndex];
        for (; true;) {
          if (sIndex >= sNamedLength)
            return false;
          sName = sNamed[sIndex];
          sIndex += 3;
          if (tName < sName)
            return false;
          sIsRequired = sNamed[sIndex - 2];
          if (sName < tName) {
            if (sIsRequired)
              return false;
            continue;
          }
          t1 = tNamed[tIndex + 1];
          if (sIsRequired && !t1)
            return false;
          t1 = sNamed[sIndex - 1];
          if (!A._isSubtype(universe, tNamed[tIndex + 2], tEnv, t1, sEnv, false))
            return false;
          break;
        }
      }
      for (; sIndex < sNamedLength;) {
        if (sNamed[sIndex + 1])
          return false;
        sIndex += 3;
      }
      return true;
    },
    _isInterfaceSubtype(universe, s, sEnv, t, tEnv, isLegacy) {
      var rule, recipes, $length, supertypeArgs, i,
        sName = s._primary,
        tName = t._primary;
      for (; sName !== tName;) {
        rule = universe.tR[sName];
        if (rule == null)
          return false;
        if (typeof rule == "string") {
          sName = rule;
          continue;
        }
        recipes = rule[tName];
        if (recipes == null)
          return false;
        $length = recipes.length;
        supertypeArgs = $length > 0 ? new Array($length) : init.typeUniverse.sEA;
        for (i = 0; i < $length; ++i)
          supertypeArgs[i] = A._Universe_evalInEnvironment(universe, s, recipes[i]);
        return A._areArgumentsSubtypes(universe, supertypeArgs, null, sEnv, t._rest, tEnv, false);
      }
      return A._areArgumentsSubtypes(universe, s._rest, null, sEnv, t._rest, tEnv, false);
    },
    _areArgumentsSubtypes(universe, sArgs, sVariances, sEnv, tArgs, tEnv, isLegacy) {
      var i,
        $length = sArgs.length;
      for (i = 0; i < $length; ++i)
        if (!A._isSubtype(universe, sArgs[i], sEnv, tArgs[i], tEnv, false))
          return false;
      return true;
    },
    _isRecordSubtype(universe, s, sEnv, t, tEnv, isLegacy) {
      var i,
        sFields = s._rest,
        tFields = t._rest,
        sCount = sFields.length;
      if (sCount !== tFields.length)
        return false;
      if (s._primary !== t._primary)
        return false;
      for (i = 0; i < sCount; ++i)
        if (!A._isSubtype(universe, sFields[i], sEnv, tFields[i], tEnv, false))
          return false;
      return true;
    },
    isNullable(t) {
      var t1,
        kind = t._kind;
      if (!(t === type$.Null || t === type$.JSNull))
        if (!A.isSoundTopType(t))
          if (kind !== 7)
            if (!(kind === 6 && A.isNullable(t._primary)))
              t1 = kind === 8 && A.isNullable(t._primary);
            else
              t1 = true;
          else
            t1 = true;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isDefinitelyTopType(t) {
      var t1;
      if (!A.isSoundTopType(t))
        if (!(t === type$.legacy_Object))
          t1 = false;
        else
          t1 = true;
      else
        t1 = true;
      return t1;
    },
    isSoundTopType(t) {
      var kind = t._kind;
      return kind === 2 || kind === 3 || kind === 4 || kind === 5 || t === type$.nullable_Object;
    },
    _Utils_objectAssign(o, other) {
      var i, key,
        keys = Object.keys(other),
        $length = keys.length;
      for (i = 0; i < $length; ++i) {
        key = keys[i];
        o[key] = other[key];
      }
    },
    _Utils_newArrayOrEmpty($length) {
      return $length > 0 ? new Array($length) : init.typeUniverse.sEA;
    },
    Rti: function Rti(t0, t1) {
      var _ = this;
      _._as = t0;
      _._is = t1;
      _._cachedRuntimeType = _._specializedTestResource = _._isSubtypeCache = _._precomputed1 = null;
      _._kind = 0;
      _._canonicalRecipe = _._bindCache = _._evalCache = _._rest = _._primary = null;
    },
    _FunctionParameters: function _FunctionParameters() {
      this._named = this._optionalPositional = this._requiredPositional = null;
    },
    _Type: function _Type(t0) {
      this._rti = t0;
    },
    _Error: function _Error() {
    },
    _TypeError: function _TypeError(t0) {
      this.__rti$_message = t0;
    },
    _AsyncRun__initializeScheduleImmediate() {
      var div, span, t1 = {};
      if (self.scheduleImmediate != null)
        return A.async__AsyncRun__scheduleImmediateJsOverride$closure();
      if (self.MutationObserver != null && self.document != null) {
        div = self.document.createElement("div");
        span = self.document.createElement("span");
        t1.storedCallback = null;
        new self.MutationObserver(A.convertDartClosureToJS(new A._AsyncRun__initializeScheduleImmediate_internalCallback(t1), 1)).observe(div, {childList: true});
        return new A._AsyncRun__initializeScheduleImmediate_closure(t1, div, span);
      } else if (self.setImmediate != null)
        return A.async__AsyncRun__scheduleImmediateWithSetImmediate$closure();
      return A.async__AsyncRun__scheduleImmediateWithTimer$closure();
    },
    _AsyncRun__scheduleImmediateJsOverride(callback) {
      self.scheduleImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateJsOverride_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithSetImmediate(callback) {
      self.setImmediate(A.convertDartClosureToJS(new A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(type$.void_Function._as(callback)), 0));
    },
    _AsyncRun__scheduleImmediateWithTimer(callback) {
      A.Timer__createTimer(B.Duration_0, type$.void_Function._as(callback));
    },
    Timer__createTimer(duration, callback) {
      var milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _TimerImpl$(milliseconds, callback) {
      var t1 = new A._TimerImpl(true);
      t1._TimerImpl$2(milliseconds, callback);
      return t1;
    },
    _TimerImpl$periodic(milliseconds, callback) {
      var t1 = new A._TimerImpl(false);
      t1._TimerImpl$periodic$2(milliseconds, callback);
      return t1;
    },
    _makeAsyncAwaitCompleter($T) {
      return new A._AsyncAwaitCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncAwaitCompleter<0>"));
    },
    _asyncStartSync(bodyFunction, completer) {
      bodyFunction.call$2(0, null);
      completer.isSync = true;
      return completer._future;
    },
    _asyncAwait(object, bodyFunction) {
      A._awaitOnObject(object, bodyFunction);
    },
    _asyncReturn(object, completer) {
      completer.complete$1(0, object);
    },
    _asyncRethrow(object, completer) {
      completer.completeError$2(A.unwrapException(object), A.getTraceFromException(object));
    },
    _awaitOnObject(object, bodyFunction) {
      var t1, future,
        thenCallback = new A._awaitOnObject_closure(bodyFunction),
        errorCallback = new A._awaitOnObject_closure0(bodyFunction);
      if (object instanceof A._Future)
        object._thenAwait$1$2(thenCallback, errorCallback, type$.dynamic);
      else {
        t1 = type$.dynamic;
        if (object instanceof A._Future)
          object.then$1$2$onError(0, thenCallback, errorCallback, t1);
        else {
          future = new A._Future($.Zone__current, type$._Future_dynamic);
          future._state = 8;
          future._resultOrListeners = object;
          future._thenAwait$1$2(thenCallback, errorCallback, t1);
        }
      }
    },
    _wrapJsFunctionForAsync($function) {
      var $protected = function(fn, ERROR) {
        return function(errorCode, result) {
          while (true) {
            try {
              fn(errorCode, result);
              break;
            } catch (error) {
              result = error;
              errorCode = ERROR;
            }
          }
        };
      }($function, 1);
      return $.Zone__current.registerBinaryCallback$3$1(new A._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic);
    },
    AsyncError$(error, stackTrace) {
      var t1 = A.checkNotNullable(error, "error", type$.Object);
      return new A.AsyncError(t1, stackTrace == null ? A.AsyncError_defaultStackTrace(error) : stackTrace);
    },
    AsyncError_defaultStackTrace(error) {
      var stackTrace;
      if (type$.Error._is(error)) {
        stackTrace = error.get$stackTrace();
        if (stackTrace != null)
          return stackTrace;
      }
      return B._StringStackTrace_3uE;
    },
    Future_Future$microtask(computation, $T) {
      var result = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      A.scheduleMicrotask(new A.Future_Future$microtask_closure(result, computation));
      return result;
    },
    Future_Future$sync(computation, $T) {
      var result, error, stackTrace, future, replacement, t1, exception;
      try {
        result = computation.call$0();
        t1 = $T._eval$1("Future<0>")._is(result) ? result : A._Future$value(result, $T);
        return t1;
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        t1 = $.Zone__current;
        future = new A._Future(t1, $T._eval$1("_Future<0>"));
        replacement = t1.errorCallback$2(error, stackTrace);
        if (replacement != null)
          future._asyncCompleteError$2(replacement.error, replacement.stackTrace);
        else
          future._asyncCompleteError$2(error, stackTrace);
        return future;
      }
    },
    Future_Future$value(value, $T) {
      var t1 = value == null ? $T._as(value) : value,
        t2 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      t2._asyncComplete$1(t1);
      return t2;
    },
    Completer_Completer($T) {
      return new A._AsyncCompleter(new A._Future($.Zone__current, $T._eval$1("_Future<0>")), $T._eval$1("_AsyncCompleter<0>"));
    },
    _completeWithErrorCallback(result, error, stackTrace) {
      var replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      result._completeError$2(error, stackTrace);
    },
    _Future$value(value, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>"));
      $T._as(value);
      t1._state = 8;
      t1._resultOrListeners = value;
      return t1;
    },
    _Future__chainCoreFutureSync(source, target) {
      var t1, t2, listeners;
      for (t1 = type$._Future_dynamic; t2 = source._state, (t2 & 4) !== 0;)
        source = t1._as(source._resultOrListeners);
      if ((t2 & 24) !== 0) {
        listeners = target._removeListeners$0();
        target._cloneResult$1(source);
        A._Future__propagateToListeners(target, listeners);
      } else {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._setChained$1(source);
        source._prependListeners$1(listeners);
      }
    },
    _Future__chainCoreFutureAsync(source, target) {
      var t2, t3, listeners, _box_0 = {},
        t1 = _box_0.source = source;
      for (t2 = type$._Future_dynamic; t3 = t1._state, (t3 & 4) !== 0; t1 = source) {
        source = t2._as(t1._resultOrListeners);
        _box_0.source = source;
      }
      if ((t3 & 24) === 0) {
        listeners = type$.nullable__FutureListener_dynamic_dynamic._as(target._resultOrListeners);
        target._setChained$1(t1);
        _box_0.source._prependListeners$1(listeners);
        return;
      }
      if ((t3 & 16) === 0 && target._resultOrListeners == null) {
        target._cloneResult$1(t1);
        return;
      }
      target._state ^= 2;
      target._zone.scheduleMicrotask$1(new A._Future__chainCoreFutureAsync_closure(_box_0, target));
    },
    _Future__propagateToListeners(source, listeners) {
      var t2, t3, t4, _box_0, t5, t6, hasError, asyncError, nextListener, nextListener0, sourceResult, t7, zone, oldZone, result, current, _box_1 = {},
        t1 = _box_1.source = source;
      for (t2 = type$.AsyncError, t3 = type$.nullable__FutureListener_dynamic_dynamic, t4 = type$.Future_dynamic; true;) {
        _box_0 = {};
        t5 = t1._state;
        t6 = (t5 & 16) === 0;
        hasError = !t6;
        if (listeners == null) {
          if (hasError && (t5 & 1) === 0) {
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
          }
          return;
        }
        _box_0.listener = listeners;
        nextListener = listeners._nextListener;
        for (t1 = listeners; nextListener != null; t1 = nextListener, nextListener = nextListener0) {
          t1._nextListener = null;
          A._Future__propagateToListeners(_box_1.source, t1);
          _box_0.listener = nextListener;
          nextListener0 = nextListener._nextListener;
        }
        t5 = _box_1.source;
        sourceResult = t5._resultOrListeners;
        _box_0.listenerHasError = hasError;
        _box_0.listenerValueOrError = sourceResult;
        if (t6) {
          t7 = t1.state;
          t7 = (t7 & 1) !== 0 || (t7 & 15) === 8;
        } else
          t7 = true;
        if (t7) {
          zone = t1.result._zone;
          if (hasError) {
            t1 = t5._zone;
            t1 = !(t1 === zone || t1.get$errorZone() === zone.get$errorZone());
          } else
            t1 = false;
          if (t1) {
            t1 = _box_1.source;
            asyncError = t2._as(t1._resultOrListeners);
            t1._zone.handleUncaughtError$2(asyncError.error, asyncError.stackTrace);
            return;
          }
          oldZone = $.Zone__current;
          if (oldZone !== zone)
            $.Zone__current = zone;
          else
            oldZone = null;
          t1 = _box_0.listener.state;
          if ((t1 & 15) === 8)
            new A._Future__propagateToListeners_handleWhenCompleteCallback(_box_0, _box_1, hasError).call$0();
          else if (t6) {
            if ((t1 & 1) !== 0)
              new A._Future__propagateToListeners_handleValueCallback(_box_0, sourceResult).call$0();
          } else if ((t1 & 2) !== 0)
            new A._Future__propagateToListeners_handleError(_box_1, _box_0).call$0();
          if (oldZone != null)
            $.Zone__current = oldZone;
          t1 = _box_0.listenerValueOrError;
          if (t1 instanceof A._Future) {
            t5 = _box_0.listener.$ti;
            t5 = t5._eval$1("Future<2>")._is(t1) || !t5._rest[1]._is(t1);
          } else
            t5 = false;
          if (t5) {
            t4._as(t1);
            result = _box_0.listener.result;
            if ((t1._state & 24) !== 0) {
              current = t3._as(result._resultOrListeners);
              result._resultOrListeners = null;
              listeners = result._reverseListeners$1(current);
              result._state = t1._state & 30 | result._state & 1;
              result._resultOrListeners = t1._resultOrListeners;
              _box_1.source = t1;
              continue;
            } else
              A._Future__chainCoreFutureSync(t1, result);
            return;
          }
        }
        result = _box_0.listener.result;
        current = t3._as(result._resultOrListeners);
        result._resultOrListeners = null;
        listeners = result._reverseListeners$1(current);
        t1 = _box_0.listenerHasError;
        t5 = _box_0.listenerValueOrError;
        if (!t1) {
          result.$ti._precomputed1._as(t5);
          result._state = 8;
          result._resultOrListeners = t5;
        } else {
          t2._as(t5);
          result._state = result._state & 1 | 16;
          result._resultOrListeners = t5;
        }
        _box_1.source = result;
        t1 = result;
      }
    },
    _registerErrorHandler(errorHandler, zone) {
      if (type$.dynamic_Function_Object_StackTrace._is(errorHandler))
        return zone.registerBinaryCallback$3$1(errorHandler, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.dynamic_Function_Object._is(errorHandler))
        return zone.registerUnaryCallback$2$1(errorHandler, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$value(errorHandler, "onError", string$.Error_));
    },
    _microtaskLoop() {
      var entry, next;
      for (entry = $._nextCallback; entry != null; entry = $._nextCallback) {
        $._lastPriorityCallback = null;
        next = entry.next;
        $._nextCallback = next;
        if (next == null)
          $._lastCallback = null;
        entry.callback.call$0();
      }
    },
    _startMicrotaskLoop() {
      $._isInCallbackLoop = true;
      try {
        A._microtaskLoop();
      } finally {
        $._lastPriorityCallback = null;
        $._isInCallbackLoop = false;
        if ($._nextCallback != null)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      }
    },
    _scheduleAsyncCallback(callback) {
      var newEntry = new A._AsyncCallbackEntry(callback),
        lastCallback = $._lastCallback;
      if (lastCallback == null) {
        $._nextCallback = $._lastCallback = newEntry;
        if (!$._isInCallbackLoop)
          $.$get$_AsyncRun__scheduleImmediateClosure().call$1(A.async___startMicrotaskLoop$closure());
      } else
        $._lastCallback = lastCallback.next = newEntry;
    },
    _schedulePriorityAsyncCallback(callback) {
      var entry, lastPriorityCallback, next,
        t1 = $._nextCallback;
      if (t1 == null) {
        A._scheduleAsyncCallback(callback);
        $._lastPriorityCallback = $._lastCallback;
        return;
      }
      entry = new A._AsyncCallbackEntry(callback);
      lastPriorityCallback = $._lastPriorityCallback;
      if (lastPriorityCallback == null) {
        entry.next = t1;
        $._nextCallback = $._lastPriorityCallback = entry;
      } else {
        next = lastPriorityCallback.next;
        entry.next = next;
        $._lastPriorityCallback = lastPriorityCallback.next = entry;
        if (next == null)
          $._lastCallback = entry;
      }
    },
    scheduleMicrotask(callback) {
      var t1, _null = null,
        currentZone = $.Zone__current;
      if (B.C__RootZone === currentZone) {
        A._rootScheduleMicrotask(_null, _null, B.C__RootZone, callback);
        return;
      }
      if (B.C__RootZone === currentZone.get$_scheduleMicrotask().zone)
        t1 = B.C__RootZone.get$errorZone() === currentZone.get$errorZone();
      else
        t1 = false;
      if (t1) {
        A._rootScheduleMicrotask(_null, _null, currentZone, currentZone.registerCallback$1$1(callback, type$.void));
        return;
      }
      t1 = $.Zone__current;
      t1.scheduleMicrotask$1(t1.bindCallbackGuarded$1(callback));
    },
    StreamIterator_StreamIterator(stream, $T) {
      A.checkNotNullable(stream, "stream", type$.Object);
      return new A._StreamIterator($T._eval$1("_StreamIterator<0>"));
    },
    StreamController_StreamController(onCancel, onListen, sync, $T) {
      var _null = null;
      return sync ? new A._SyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_SyncStreamController<0>")) : new A._AsyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_AsyncStreamController<0>"));
    },
    _runGuarded(notificationHandler) {
      var e, s, exception;
      if (notificationHandler == null)
        return;
      try {
        notificationHandler.call$0();
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current.handleUncaughtError$2(e, s);
      }
    },
    _BufferingStreamSubscription__registerDataHandler(zone, handleData, $T) {
      var t1 = handleData == null ? A.async___nullDataHandler$closure() : handleData;
      return zone.registerUnaryCallback$2$1(t1, type$.void, $T);
    },
    _BufferingStreamSubscription__registerErrorHandler(zone, handleError) {
      if (handleError == null)
        handleError = A.async___nullErrorHandler$closure();
      if (type$.void_Function_Object_StackTrace._is(handleError))
        return zone.registerBinaryCallback$3$1(handleError, type$.dynamic, type$.Object, type$.StackTrace);
      if (type$.void_Function_Object._is(handleError))
        return zone.registerUnaryCallback$2$1(handleError, type$.dynamic, type$.Object);
      throw A.wrapException(A.ArgumentError$("handleError callback must take either an Object (the error), or both an Object (the error) and a StackTrace.", null));
    },
    _nullDataHandler(value) {
    },
    _nullErrorHandler(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      $.Zone__current.handleUncaughtError$2(error, stackTrace);
    },
    _nullDoneHandler() {
    },
    _cancelAndValue(subscription, future, value) {
      var cancelFuture = subscription.cancel$0(0),
        t1 = $.$get$Future__nullFuture();
      if (cancelFuture !== t1)
        cancelFuture.whenComplete$1(new A._cancelAndValue_closure(future, value));
      else
        future._complete$1(value);
    },
    Timer_Timer(duration, callback) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return t1.createTimer$2(duration, callback);
      return t1.createTimer$2(duration, t1.bindCallbackGuarded$1(callback));
    },
    ZoneSpecification_ZoneSpecification$from(other, handleUncaughtError) {
      var t1 = handleUncaughtError == null ? other.handleUncaughtError : handleUncaughtError;
      return new A._ZoneSpecification(t1, other.run, other.runUnary, other.runBinary, other.registerCallback, other.registerUnaryCallback, other.registerBinaryCallback, other.errorCallback, other.scheduleMicrotask, other.createTimer, other.createPeriodicTimer, other.print, other.fork);
    },
    _rootHandleUncaughtError($self, $parent, zone, error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    _rootHandleError(error, stackTrace) {
      A._schedulePriorityAsyncCallback(new A._rootHandleError_closure(error, stackTrace));
    },
    _rootRun($self, $parent, zone, f, $R) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("0()")._as(f);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$0();
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$0();
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunUnary($self, $parent, zone, f, arg, $R, $T) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$1(arg);
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$1(arg);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRunBinary($self, $parent, zone, f, arg1, arg2, $R, T1, T2) {
      var old, t1;
      type$.nullable_Zone._as($self);
      type$.nullable_ZoneDelegate._as($parent);
      type$.Zone._as(zone);
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      t1 = $.Zone__current;
      if (t1 === zone)
        return f.call$2(arg1, arg2);
      $.Zone__current = zone;
      old = t1;
      try {
        t1 = f.call$2(arg1, arg2);
        return t1;
      } finally {
        $.Zone__current = old;
      }
    },
    _rootRegisterCallback($self, $parent, zone, f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    _rootRegisterUnaryCallback($self, $parent, zone, f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    _rootRegisterBinaryCallback($self, $parent, zone, f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    },
    _rootErrorCallback($self, $parent, zone, error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    _rootScheduleMicrotask($self, $parent, zone, f) {
      var t1, t2;
      type$.void_Function._as(f);
      if (B.C__RootZone !== zone) {
        t1 = B.C__RootZone.get$errorZone();
        t2 = zone.get$errorZone();
        f = t1 !== t2 ? zone.bindCallbackGuarded$1(f) : zone.bindCallback$1$1(f, type$.void);
      }
      A._scheduleAsyncCallback(f);
    },
    _rootCreateTimer($self, $parent, zone, duration, callback) {
      type$.Duration._as(duration);
      type$.void_Function._as(callback);
      return A.Timer__createTimer(duration, B.C__RootZone !== zone ? zone.bindCallback$1$1(callback, type$.void) : callback);
    },
    _rootCreatePeriodicTimer($self, $parent, zone, duration, callback) {
      var milliseconds;
      type$.Duration._as(duration);
      type$.void_Function_Timer._as(callback);
      if (B.C__RootZone !== zone)
        callback = zone.bindUnaryCallback$2$1(callback, type$.void, type$.Timer);
      milliseconds = B.JSInt_methods._tdivFast$1(duration._duration, 1000);
      return A._TimerImpl$periodic(milliseconds < 0 ? 0 : milliseconds, callback);
    },
    _rootPrint($self, $parent, zone, line) {
      A.printString(A._asString(line));
    },
    _printToZone(line) {
      $.Zone__current.print$1(0, line);
    },
    _rootFork($self, $parent, zone, specification, zoneValues) {
      var valueMap, t1, handleUncaughtError;
      type$.nullable_ZoneSpecification._as(specification);
      type$.nullable_Map_of_nullable_Object_and_nullable_Object._as(zoneValues);
      $.printToZone = A.async___printToZone$closure();
      valueMap = zone.get$_async$_map();
      t1 = new A._CustomZone(zone.get$_run(), zone.get$_runUnary(), zone.get$_runBinary(), zone.get$_registerCallback(), zone.get$_registerUnaryCallback(), zone.get$_registerBinaryCallback(), zone.get$_errorCallback(), zone.get$_scheduleMicrotask(), zone.get$_createTimer(), zone.get$_createPeriodicTimer(), zone.get$_print(), zone.get$_fork(), zone.get$_handleUncaughtError(), zone, valueMap);
      handleUncaughtError = specification.handleUncaughtError;
      if (handleUncaughtError != null)
        t1.set$_handleUncaughtError(new A._ZoneFunction(t1, handleUncaughtError, type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace));
      return t1;
    },
    runZonedGuarded(body, onError, $R) {
      var error, stackTrace, parentZone, errorHandler, t1, exception, _null = null, zoneSpecification = null, zoneValues = null;
      A.checkNotNullable(body, "body", $R._eval$1("0()"));
      A.checkNotNullable(onError, "onError", type$.void_Function_Object_StackTrace);
      parentZone = $.Zone__current;
      errorHandler = new A.runZonedGuarded_closure(parentZone, onError);
      if (zoneSpecification == null)
        zoneSpecification = new A._ZoneSpecification(errorHandler, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null, _null);
      else
        zoneSpecification = A.ZoneSpecification_ZoneSpecification$from(zoneSpecification, errorHandler);
      try {
        t1 = parentZone.fork$2$specification$zoneValues(zoneSpecification, zoneValues).run$1$1(body, $R);
        return t1;
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        onError.call$2(error, stackTrace);
      }
      return _null;
    },
    _AsyncRun__initializeScheduleImmediate_internalCallback: function _AsyncRun__initializeScheduleImmediate_internalCallback(t0) {
      this._box_0 = t0;
    },
    _AsyncRun__initializeScheduleImmediate_closure: function _AsyncRun__initializeScheduleImmediate_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.div = t1;
      this.span = t2;
    },
    _AsyncRun__scheduleImmediateJsOverride_internalCallback: function _AsyncRun__scheduleImmediateJsOverride_internalCallback(t0) {
      this.callback = t0;
    },
    _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback: function _AsyncRun__scheduleImmediateWithSetImmediate_internalCallback(t0) {
      this.callback = t0;
    },
    _TimerImpl: function _TimerImpl(t0) {
      this._once = t0;
      this._handle = null;
      this._tick = 0;
    },
    _TimerImpl_internalCallback: function _TimerImpl_internalCallback(t0, t1) {
      this.$this = t0;
      this.callback = t1;
    },
    _TimerImpl$periodic_closure: function _TimerImpl$periodic_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.milliseconds = t1;
      _.start = t2;
      _.callback = t3;
    },
    _AsyncAwaitCompleter: function _AsyncAwaitCompleter(t0, t1) {
      this._future = t0;
      this.isSync = false;
      this.$ti = t1;
    },
    _awaitOnObject_closure: function _awaitOnObject_closure(t0) {
      this.bodyFunction = t0;
    },
    _awaitOnObject_closure0: function _awaitOnObject_closure0(t0) {
      this.bodyFunction = t0;
    },
    _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) {
      this.$protected = t0;
    },
    AsyncError: function AsyncError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    Future_Future$microtask_closure: function Future_Future$microtask_closure(t0, t1) {
      this.result = t0;
      this.computation = t1;
    },
    _Completer: function _Completer() {
    },
    _AsyncCompleter: function _AsyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _SyncCompleter: function _SyncCompleter(t0, t1) {
      this.future = t0;
      this.$ti = t1;
    },
    _FutureListener: function _FutureListener(t0, t1, t2, t3, t4) {
      var _ = this;
      _._nextListener = null;
      _.result = t0;
      _.state = t1;
      _.callback = t2;
      _.errorCallback = t3;
      _.$ti = t4;
    },
    _Future: function _Future(t0, t1) {
      var _ = this;
      _._state = 0;
      _._zone = t0;
      _._resultOrListeners = null;
      _.$ti = t1;
    },
    _Future__addListener_closure: function _Future__addListener_closure(t0, t1) {
      this.$this = t0;
      this.listener = t1;
    },
    _Future__prependListeners_closure: function _Future__prependListeners_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _Future__chainForeignFuture_closure: function _Future__chainForeignFuture_closure(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure0: function _Future__chainForeignFuture_closure0(t0) {
      this.$this = t0;
    },
    _Future__chainForeignFuture_closure1: function _Future__chainForeignFuture_closure1(t0, t1, t2) {
      this.$this = t0;
      this.e = t1;
      this.s = t2;
    },
    _Future__chainCoreFutureAsync_closure: function _Future__chainCoreFutureAsync_closure(t0, t1) {
      this._box_0 = t0;
      this.target = t1;
    },
    _Future__asyncCompleteWithValue_closure: function _Future__asyncCompleteWithValue_closure(t0, t1) {
      this.$this = t0;
      this.value = t1;
    },
    _Future__asyncCompleteError_closure: function _Future__asyncCompleteError_closure(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback: function _Future__propagateToListeners_handleWhenCompleteCallback(t0, t1, t2) {
      this._box_0 = t0;
      this._box_1 = t1;
      this.hasError = t2;
    },
    _Future__propagateToListeners_handleWhenCompleteCallback_closure: function _Future__propagateToListeners_handleWhenCompleteCallback_closure(t0) {
      this.originalSource = t0;
    },
    _Future__propagateToListeners_handleValueCallback: function _Future__propagateToListeners_handleValueCallback(t0, t1) {
      this._box_0 = t0;
      this.sourceResult = t1;
    },
    _Future__propagateToListeners_handleError: function _Future__propagateToListeners_handleError(t0, t1) {
      this._box_1 = t0;
      this._box_0 = t1;
    },
    _Future_timeout_closure: function _Future_timeout_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _._future = t1;
      _.zone = t2;
      _.onTimeoutHandler = t3;
    },
    _Future_timeout_closure0: function _Future_timeout_closure0(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this._future = t2;
    },
    _Future_timeout_closure1: function _Future_timeout_closure1(t0, t1) {
      this._box_0 = t0;
      this._future = t1;
    },
    _AsyncCallbackEntry: function _AsyncCallbackEntry(t0) {
      this.callback = t0;
      this.next = null;
    },
    Stream: function Stream() {
    },
    Stream_length_closure: function Stream_length_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    Stream_length_closure0: function Stream_length_closure0(t0, t1) {
      this._box_0 = t0;
      this.future = t1;
    },
    Stream_first_closure: function Stream_first_closure(t0) {
      this.future = t0;
    },
    Stream_first_closure0: function Stream_first_closure0(t0, t1, t2) {
      this.$this = t0;
      this.subscription = t1;
      this.future = t2;
    },
    _StreamController: function _StreamController() {
    },
    _StreamController__subscribe_closure: function _StreamController__subscribe_closure(t0) {
      this.$this = t0;
    },
    _StreamController__recordCancel_complete: function _StreamController__recordCancel_complete(t0) {
      this.$this = t0;
    },
    _SyncStreamControllerDispatch: function _SyncStreamControllerDispatch() {
    },
    _AsyncStreamControllerDispatch: function _AsyncStreamControllerDispatch() {
    },
    _AsyncStreamController: function _AsyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _SyncStreamController: function _SyncStreamController(t0, t1, t2, t3, t4) {
      var _ = this;
      _._varData = null;
      _._state = 0;
      _._doneFuture = null;
      _.onListen = t0;
      _.onPause = t1;
      _.onResume = t2;
      _.onCancel = t3;
      _.$ti = t4;
    },
    _ControllerStream: function _ControllerStream(t0, t1) {
      this._controller = t0;
      this.$ti = t1;
    },
    _ControllerSubscription: function _ControllerSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._controller = t0;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _StreamSinkWrapper: function _StreamSinkWrapper(t0, t1) {
      this._async$_target = t0;
      this.$ti = t1;
    },
    _BufferingStreamSubscription: function _BufferingStreamSubscription() {
    },
    _BufferingStreamSubscription_asFuture_closure: function _BufferingStreamSubscription_asFuture_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture_closure0: function _BufferingStreamSubscription_asFuture_closure0(t0, t1) {
      this.$this = t0;
      this.result = t1;
    },
    _BufferingStreamSubscription_asFuture__closure: function _BufferingStreamSubscription_asFuture__closure(t0, t1, t2) {
      this.result = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendError_sendError: function _BufferingStreamSubscription__sendError_sendError(t0, t1, t2) {
      this.$this = t0;
      this.error = t1;
      this.stackTrace = t2;
    },
    _BufferingStreamSubscription__sendDone_sendDone: function _BufferingStreamSubscription__sendDone_sendDone(t0) {
      this.$this = t0;
    },
    _StreamImpl: function _StreamImpl() {
    },
    _DelayedEvent: function _DelayedEvent() {
    },
    _DelayedData: function _DelayedData(t0, t1) {
      this.value = t0;
      this.next = null;
      this.$ti = t1;
    },
    _DelayedError: function _DelayedError(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
      this.next = null;
    },
    _DelayedDone: function _DelayedDone() {
    },
    _PendingEvents: function _PendingEvents(t0) {
      var _ = this;
      _._state = 0;
      _.lastPendingEvent = _.firstPendingEvent = null;
      _.$ti = t0;
    },
    _PendingEvents_schedule_closure: function _PendingEvents_schedule_closure(t0, t1) {
      this.$this = t0;
      this.dispatch = t1;
    },
    _StreamIterator: function _StreamIterator(t0) {
      this.$ti = t0;
    },
    _cancelAndValue_closure: function _cancelAndValue_closure(t0, t1) {
      this.future = t0;
      this.value = t1;
    },
    _ForwardingStream: function _ForwardingStream() {
    },
    _ForwardingStreamSubscription: function _ForwardingStreamSubscription(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _._stream = t0;
      _._subscription = null;
      _._async$_onData = t1;
      _._onError = t2;
      _._onDone = t3;
      _._zone = t4;
      _._state = t5;
      _._pending = _._cancelFuture = null;
      _.$ti = t6;
    },
    _MapStream: function _MapStream(t0, t1, t2) {
      this._transform = t0;
      this._source = t1;
      this.$ti = t2;
    },
    _ZoneFunction: function _ZoneFunction(t0, t1, t2) {
      this.zone = t0;
      this.$function = t1;
      this.$ti = t2;
    },
    _ZoneSpecification: function _ZoneSpecification(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
      var _ = this;
      _.handleUncaughtError = t0;
      _.run = t1;
      _.runUnary = t2;
      _.runBinary = t3;
      _.registerCallback = t4;
      _.registerUnaryCallback = t5;
      _.registerBinaryCallback = t6;
      _.errorCallback = t7;
      _.scheduleMicrotask = t8;
      _.createTimer = t9;
      _.createPeriodicTimer = t10;
      _.print = t11;
      _.fork = t12;
    },
    _ZoneDelegate: function _ZoneDelegate(t0) {
      this._delegationTarget = t0;
    },
    _Zone: function _Zone() {
    },
    _CustomZone: function _CustomZone(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14) {
      var _ = this;
      _._run = t0;
      _._runUnary = t1;
      _._runBinary = t2;
      _._registerCallback = t3;
      _._registerUnaryCallback = t4;
      _._registerBinaryCallback = t5;
      _._errorCallback = t6;
      _._scheduleMicrotask = t7;
      _._createTimer = t8;
      _._createPeriodicTimer = t9;
      _._print = t10;
      _._fork = t11;
      _._handleUncaughtError = t12;
      _._delegateCache = null;
      _.parent = t13;
      _._async$_map = t14;
    },
    _CustomZone_bindCallback_closure: function _CustomZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.R = t2;
    },
    _CustomZone_bindUnaryCallback_closure: function _CustomZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.registered = t1;
      _.T = t2;
      _.R = t3;
    },
    _CustomZone_bindCallbackGuarded_closure: function _CustomZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.registered = t1;
    },
    _CustomZone_bindUnaryCallbackGuarded_closure: function _CustomZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.registered = t1;
      this.T = t2;
    },
    _rootHandleError_closure: function _rootHandleError_closure(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    _RootZone: function _RootZone() {
    },
    _RootZone_bindCallback_closure: function _RootZone_bindCallback_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.R = t2;
    },
    _RootZone_bindUnaryCallback_closure: function _RootZone_bindUnaryCallback_closure(t0, t1, t2, t3) {
      var _ = this;
      _.$this = t0;
      _.f = t1;
      _.T = t2;
      _.R = t3;
    },
    _RootZone_bindCallbackGuarded_closure: function _RootZone_bindCallbackGuarded_closure(t0, t1) {
      this.$this = t0;
      this.f = t1;
    },
    _RootZone_bindUnaryCallbackGuarded_closure: function _RootZone_bindUnaryCallbackGuarded_closure(t0, t1, t2) {
      this.$this = t0;
      this.f = t1;
      this.T = t2;
    },
    runZonedGuarded_closure: function runZonedGuarded_closure(t0, t1) {
      this.parentZone = t0;
      this.onError = t1;
    },
    HashMap_HashMap(equals, hashCode, isValidKey, $K, $V) {
      if (isValidKey == null)
        if (hashCode == null) {
          if (equals == null)
            return new A._HashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_HashMap<1,2>"));
          hashCode = A.collection___defaultHashCode$closure();
        } else {
          if (A.core__identityHashCode$closure() === hashCode && A.core__identical$closure() === equals)
            return new A._IdentityHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("_IdentityHashMap<1,2>"));
          if (equals == null)
            equals = A.collection___defaultEquals$closure();
        }
      else {
        if (hashCode == null)
          hashCode = A.collection___defaultHashCode$closure();
        if (equals == null)
          equals = A.collection___defaultEquals$closure();
      }
      return A._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
    },
    _HashMap__getTableEntry(table, key) {
      var entry = table[key];
      return entry === table ? null : entry;
    },
    _HashMap__setTableEntry(table, key, value) {
      if (value == null)
        table[key] = table;
      else
        table[key] = value;
    },
    _HashMap__newHashTable() {
      var table = Object.create(null);
      A._HashMap__setTableEntry(table, "<non-identifier-key>", table);
      delete table["<non-identifier-key>"];
      return table;
    },
    _CustomHashMap$(_equals, _hashCode, validKey, $K, $V) {
      var t1 = validKey != null ? validKey : new A._CustomHashMap_closure($K);
      return new A._CustomHashMap(_equals, _hashCode, t1, $K._eval$1("@<0>")._bind$1($V)._eval$1("_CustomHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap($K, $V) {
      return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    LinkedHashMap_LinkedHashMap$_literal(keyValuePairs, $K, $V) {
      return $K._eval$1("@<0>")._bind$1($V)._eval$1("LinkedHashMap<1,2>")._as(A.fillLiteralMap(keyValuePairs, new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"))));
    },
    LinkedHashMap_LinkedHashMap$_empty($K, $V) {
      return new A.JsLinkedHashMap($K._eval$1("@<0>")._bind$1($V)._eval$1("JsLinkedHashMap<1,2>"));
    },
    HashSet_HashSet(equals, hashCode, $E) {
      return new A._HashSet($E._eval$1("_HashSet<0>"));
    },
    _HashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    LinkedHashSet_LinkedHashSet($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    LinkedHashSet_LinkedHashSet$_empty($E) {
      return new A._LinkedHashSet($E._eval$1("_LinkedHashSet<0>"));
    },
    _LinkedHashSet__newHashTable() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    _LinkedHashSetIterator$(_set, _modifications, $E) {
      var t1 = new A._LinkedHashSetIterator(_set, _modifications, $E._eval$1("_LinkedHashSetIterator<0>"));
      t1._collection$_cell = _set._collection$_first;
      return t1;
    },
    _defaultEquals0(a, b) {
      return J.$eq$(a, b);
    },
    _defaultHashCode(a) {
      return J.get$hashCode$(a);
    },
    LinkedHashMap_LinkedHashMap$from(other, $K, $V) {
      var result = A.LinkedHashMap_LinkedHashMap($K, $V);
      other.forEach$1(0, new A.LinkedHashMap_LinkedHashMap$from_closure(result, $K, $V));
      return result;
    },
    LinkedHashSet_LinkedHashSet$from(elements, $E) {
      var t1, _i,
        result = A.LinkedHashSet_LinkedHashSet($E);
      for (t1 = elements.length, _i = 0; _i < elements.length; elements.length === t1 || (0, A.throwConcurrentModificationError)(elements), ++_i)
        result.add$1(0, $E._as(elements[_i]));
      return result;
    },
    ListBase__compareAny(a, b) {
      var t1 = type$.Comparable_dynamic;
      return J.compareTo$1$ns(t1._as(a), t1._as(b));
    },
    MapBase_mapToString(m) {
      var result, t1 = {};
      if (A.isToStringVisiting(m))
        return "{...}";
      result = new A.StringBuffer("");
      try {
        B.JSArray_methods.add$1($.toStringVisiting, m);
        result._contents += "{";
        t1.first = true;
        J.forEach$1$ax(m, new A.MapBase_mapToString_closure(t1, result));
        result._contents += "}";
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      t1 = result._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    ListQueue$($E) {
      return new A.ListQueue(A.List_List$filled(A.ListQueue__calculateCapacity(null), null, false, $E._eval$1("0?")), $E._eval$1("ListQueue<0>"));
    },
    ListQueue__calculateCapacity(initialCapacity) {
      return 8;
    },
    SplayTreeSet$(compare, isValidKey, $E) {
      var t1 = isValidKey == null ? new A.SplayTreeSet_closure($E) : isValidKey;
      return new A.SplayTreeSet(compare, t1, $E._eval$1("SplayTreeSet<0>"));
    },
    _HashMap: function _HashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _IdentityHashMap: function _IdentityHashMap(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _CustomHashMap: function _CustomHashMap(t0, t1, t2, t3) {
      var _ = this;
      _._equals = t0;
      _._hashCode = t1;
      _._validKey = t2;
      _._collection$_length = 0;
      _._keys = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t3;
    },
    _CustomHashMap_closure: function _CustomHashMap_closure(t0) {
      this.K = t0;
    },
    _HashMapKeyIterable: function _HashMapKeyIterable(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    _HashMapKeyIterator: function _HashMapKeyIterator(t0, t1, t2) {
      var _ = this;
      _._collection$_map = t0;
      _._keys = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _HashSet: function _HashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_elements = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _.$ti = t0;
    },
    _HashSetIterator: function _HashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._collection$_elements = t1;
      _._offset = 0;
      _._collection$_current = null;
      _.$ti = t2;
    },
    _LinkedHashSet: function _LinkedHashSet(t0) {
      var _ = this;
      _._collection$_length = 0;
      _._collection$_last = _._collection$_first = _._collection$_rest = _._collection$_nums = _._collection$_strings = null;
      _._collection$_modifications = 0;
      _.$ti = t0;
    },
    _LinkedHashSetCell: function _LinkedHashSetCell(t0) {
      this._collection$_element = t0;
      this._collection$_next = null;
    },
    _LinkedHashSetIterator: function _LinkedHashSetIterator(t0, t1, t2) {
      var _ = this;
      _._set = t0;
      _._collection$_modifications = t1;
      _._collection$_current = _._collection$_cell = null;
      _.$ti = t2;
    },
    UnmodifiableListView: function UnmodifiableListView(t0, t1) {
      this._collection$_source = t0;
      this.$ti = t1;
    },
    LinkedHashMap_LinkedHashMap$from_closure: function LinkedHashMap_LinkedHashMap$from_closure(t0, t1, t2) {
      this.result = t0;
      this.K = t1;
      this.V = t2;
    },
    ListBase: function ListBase() {
    },
    MapBase: function MapBase() {
    },
    MapBase_mapToString_closure: function MapBase_mapToString_closure(t0, t1) {
      this._box_0 = t0;
      this.result = t1;
    },
    _UnmodifiableMapMixin: function _UnmodifiableMapMixin() {
    },
    MapView: function MapView() {
    },
    UnmodifiableMapView: function UnmodifiableMapView(t0, t1) {
      this._collection$_map = t0;
      this.$ti = t1;
    },
    ListQueue: function ListQueue(t0, t1) {
      var _ = this;
      _._table = t0;
      _._modificationCount = _._tail = _._head = 0;
      _.$ti = t1;
    },
    _ListQueueIterator: function _ListQueueIterator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue = t0;
      _._end = t1;
      _._modificationCount = t2;
      _._collection$_position = t3;
      _._collection$_current = null;
      _.$ti = t4;
    },
    SetBase: function SetBase() {
    },
    _SetBase: function _SetBase() {
    },
    _SplayTreeNode: function _SplayTreeNode() {
    },
    _SplayTreeSetNode: function _SplayTreeSetNode(t0, t1) {
      var _ = this;
      _.key = t0;
      _._right = _._left = null;
      _.$ti = t1;
    },
    _SplayTree: function _SplayTree() {
    },
    _SplayTreeIterator: function _SplayTreeIterator() {
    },
    _SplayTreeKeyIterator: function _SplayTreeKeyIterator(t0, t1, t2, t3) {
      var _ = this;
      _._tree = t0;
      _._path = t1;
      _._modificationCount = null;
      _._splayCount = t2;
      _.$ti = t3;
    },
    SplayTreeSet: function SplayTreeSet(t0, t1, t2) {
      var _ = this;
      _._root = null;
      _._compare = t0;
      _._validKey = t1;
      _._splayCount = _._modificationCount = _._count = 0;
      _.$ti = t2;
    },
    SplayTreeSet_closure: function SplayTreeSet_closure(t0) {
      this.E = t0;
    },
    _SplayTreeSet__SplayTree_Iterable: function _SplayTreeSet__SplayTree_Iterable() {
    },
    _SplayTreeSet__SplayTree_Iterable_SetMixin: function _SplayTreeSet__SplayTree_Iterable_SetMixin() {
    },
    _UnmodifiableMapView_MapView__UnmodifiableMapMixin: function _UnmodifiableMapView_MapView__UnmodifiableMapMixin() {
    },
    _parseJson(source, reviver) {
      var e, exception, t1, parsed = null;
      try {
        parsed = JSON.parse(source);
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.FormatException$(String(e), null, null);
        throw A.wrapException(t1);
      }
      t1 = A._convertJsonToDartLazy(parsed);
      return t1;
    },
    _convertJsonToDartLazy(object) {
      var i;
      if (object == null)
        return null;
      if (typeof object != "object")
        return object;
      if (Object.getPrototypeOf(object) !== Array.prototype)
        return new A._JsonMap(object, Object.create(null));
      for (i = 0; i < object.length; ++i)
        object[i] = A._convertJsonToDartLazy(object[i]);
      return object;
    },
    Base64Codec__checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, $length) {
      if (B.JSInt_methods.$mod($length, 4) !== 0)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, padded length must be multiple of four, is " + $length, source, sourceEnd));
      if (firstPadding + paddingCount !== $length)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, '=' not at the end", source, sourceIndex));
      if (paddingCount > 2)
        throw A.wrapException(A.FormatException$("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
    },
    _Base64Encoder_encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
      var t1, t2, t3, i, byteOr, byte, outputIndex0, t4, outputIndex1,
        bits = state >>> 2,
        expectedChars = 3 - (state & 3);
      for (t1 = J.getInterceptor$asx(bytes), t2 = alphabet.length, t3 = output.length, i = start, byteOr = 0; i < end; ++i) {
        byte = t1.$index(bytes, i);
        byteOr = (byteOr | byte) >>> 0;
        bits = (bits << 8 | byte) & 16777215;
        --expectedChars;
        if (expectedChars === 0) {
          outputIndex0 = outputIndex + 1;
          t4 = bits >>> 18 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex < t3))
            return A.ioore(output, outputIndex);
          output[outputIndex] = alphabet.charCodeAt(t4);
          outputIndex = outputIndex0 + 1;
          t4 = bits >>> 12 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex0 < t3))
            return A.ioore(output, outputIndex0);
          output[outputIndex0] = alphabet.charCodeAt(t4);
          outputIndex0 = outputIndex + 1;
          t4 = bits >>> 6 & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex < t3))
            return A.ioore(output, outputIndex);
          output[outputIndex] = alphabet.charCodeAt(t4);
          outputIndex = outputIndex0 + 1;
          t4 = bits & 63;
          if (!(t4 < t2))
            return A.ioore(alphabet, t4);
          if (!(outputIndex0 < t3))
            return A.ioore(output, outputIndex0);
          output[outputIndex0] = alphabet.charCodeAt(t4);
          bits = 0;
          expectedChars = 3;
        }
      }
      if (byteOr >= 0 && byteOr <= 255) {
        if (isLast && expectedChars < 3) {
          outputIndex0 = outputIndex + 1;
          outputIndex1 = outputIndex0 + 1;
          if (3 - expectedChars === 1) {
            t1 = bits >>> 2 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = alphabet.charCodeAt(t1);
            t1 = bits << 4 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex0 < t3))
              return A.ioore(output, outputIndex0);
            output[outputIndex0] = alphabet.charCodeAt(t1);
            outputIndex = outputIndex1 + 1;
            if (!(outputIndex1 < t3))
              return A.ioore(output, outputIndex1);
            output[outputIndex1] = 61;
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = 61;
          } else {
            t1 = bits >>> 10 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = alphabet.charCodeAt(t1);
            t1 = bits >>> 4 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex0 < t3))
              return A.ioore(output, outputIndex0);
            output[outputIndex0] = alphabet.charCodeAt(t1);
            outputIndex = outputIndex1 + 1;
            t1 = bits << 2 & 63;
            if (!(t1 < t2))
              return A.ioore(alphabet, t1);
            if (!(outputIndex1 < t3))
              return A.ioore(output, outputIndex1);
            output[outputIndex1] = alphabet.charCodeAt(t1);
            if (!(outputIndex < t3))
              return A.ioore(output, outputIndex);
            output[outputIndex] = 61;
          }
          return 0;
        }
        return (bits << 2 | 3 - expectedChars) >>> 0;
      }
      for (i = start; i < end;) {
        byte = t1.$index(bytes, i);
        if (byte < 0 || byte > 255)
          break;
        ++i;
      }
      throw A.wrapException(A.ArgumentError$value(bytes, "Not a byte value at index " + i + ": 0x" + J.toRadixString$1$n(t1.$index(bytes, i), 16), null));
    },
    _Base64Decoder_decodeChunk(input, start, end, output, outIndex, state) {
      var t1, t2, t3, i, charOr, char, t4, code, outIndex0, expectedPadding,
        _s31_ = "Invalid encoding before padding",
        _s17_ = "Invalid character",
        bits = B.JSInt_methods._shrOtherPositive$1(state, 2),
        count = state & 3,
        inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (t1 = input.length, t2 = inverseAlphabet.length, t3 = output.length, i = start, charOr = 0; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(input, i);
        char = input.charCodeAt(i);
        charOr |= char;
        t4 = char & 127;
        if (!(t4 < t2))
          return A.ioore(inverseAlphabet, t4);
        code = inverseAlphabet[t4];
        if (code >= 0) {
          bits = (bits << 6 | code) & 16777215;
          count = count + 1 & 3;
          if (count === 0) {
            outIndex0 = outIndex + 1;
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 16 & 255;
            outIndex = outIndex0 + 1;
            if (!(outIndex0 < t3))
              return A.ioore(output, outIndex0);
            output[outIndex0] = bits >>> 8 & 255;
            outIndex0 = outIndex + 1;
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits & 255;
            outIndex = outIndex0;
            bits = 0;
          }
          continue;
        } else if (code === -1 && count > 1) {
          if (charOr > 127)
            break;
          if (count === 3) {
            if ((bits & 3) !== 0)
              throw A.wrapException(A.FormatException$(_s31_, input, i));
            outIndex0 = outIndex + 1;
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 10;
            if (!(outIndex0 < t3))
              return A.ioore(output, outIndex0);
            output[outIndex0] = bits >>> 2;
          } else {
            if ((bits & 15) !== 0)
              throw A.wrapException(A.FormatException$(_s31_, input, i));
            if (!(outIndex < t3))
              return A.ioore(output, outIndex);
            output[outIndex] = bits >>> 4;
          }
          expectedPadding = (3 - count) * 3;
          if (char === 37)
            expectedPadding += 2;
          return A._Base64Decoder__checkPadding(input, i + 1, end, -expectedPadding - 1);
        }
        throw A.wrapException(A.FormatException$(_s17_, input, i));
      }
      if (charOr >= 0 && charOr <= 127)
        return (bits << 2 | count) >>> 0;
      for (i = start; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(input, i);
        if (input.charCodeAt(i) > 127)
          break;
      }
      throw A.wrapException(A.FormatException$(_s17_, input, i));
    },
    _Base64Decoder__allocateBuffer(input, start, end, state) {
      var paddingStart = A._Base64Decoder__trimPaddingChars(input, start, end),
        $length = (state & 3) + (paddingStart - start),
        bufferLength = B.JSInt_methods._shrOtherPositive$1($length, 2) * 3,
        remainderLength = $length & 3;
      if (remainderLength !== 0 && paddingStart < end)
        bufferLength += remainderLength - 1;
      if (bufferLength > 0)
        return new Uint8Array(bufferLength);
      return $.$get$_Base64Decoder__emptyBuffer();
    },
    _Base64Decoder__trimPaddingChars(input, start, end) {
      var char,
        t1 = input.length,
        newEnd = end,
        index = newEnd,
        padding = 0;
      while (true) {
        if (!(index > start && padding < 2))
          break;
        c$0: {
          --index;
          if (!(index >= 0 && index < t1))
            return A.ioore(input, index);
          char = input.charCodeAt(index);
          if (char === 61) {
            ++padding;
            newEnd = index;
            break c$0;
          }
          if ((char | 32) === 100) {
            if (index === start)
              break;
            --index;
            if (!(index >= 0 && index < t1))
              return A.ioore(input, index);
            char = input.charCodeAt(index);
          }
          if (char === 51) {
            if (index === start)
              break;
            --index;
            if (!(index >= 0 && index < t1))
              return A.ioore(input, index);
            char = input.charCodeAt(index);
          }
          if (char === 37) {
            ++padding;
            newEnd = index;
            break c$0;
          }
          break;
        }
      }
      return newEnd;
    },
    _Base64Decoder__checkPadding(input, start, end, state) {
      var expectedPadding, t1, char;
      if (start === end)
        return state;
      expectedPadding = -state - 1;
      for (t1 = input.length; expectedPadding > 0;) {
        if (!(start < t1))
          return A.ioore(input, start);
        char = input.charCodeAt(start);
        if (expectedPadding === 3) {
          if (char === 61) {
            expectedPadding -= 3;
            ++start;
            break;
          }
          if (char === 37) {
            --expectedPadding;
            ++start;
            if (start === end)
              break;
            if (!(start < t1))
              return A.ioore(input, start);
            char = input.charCodeAt(start);
          } else
            break;
        }
        if ((expectedPadding > 3 ? expectedPadding - 3 : expectedPadding) === 2) {
          if (char !== 51)
            break;
          ++start;
          --expectedPadding;
          if (start === end)
            break;
          if (!(start < t1))
            return A.ioore(input, start);
          char = input.charCodeAt(start);
        }
        if ((char | 32) !== 100)
          break;
        ++start;
        --expectedPadding;
        if (start === end)
          break;
      }
      if (start !== end)
        throw A.wrapException(A.FormatException$("Invalid padding character", input, start));
      return -expectedPadding - 1;
    },
    JsonUnsupportedObjectError$(unsupportedObject, cause, partialResult) {
      return new A.JsonUnsupportedObjectError(unsupportedObject, cause);
    },
    _defaultToEncodable(object) {
      return object.toJson$0();
    },
    _JsonStringStringifier$(_sink, _toEncodable) {
      return new A._JsonStringStringifier(_sink, [], A.convert___defaultToEncodable$closure());
    },
    _JsonStringStringifier_stringify(object, toEncodable, indent) {
      var t1,
        output = new A.StringBuffer("");
      A._JsonStringStringifier_printOn(object, output, toEncodable, indent);
      t1 = output._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _JsonStringStringifier_printOn(object, output, toEncodable, indent) {
      var stringifier = A._JsonStringStringifier$(output, toEncodable);
      stringifier.writeObject$1(object);
    },
    _JsonMap: function _JsonMap(t0, t1) {
      this._original = t0;
      this._processed = t1;
      this._data = null;
    },
    _JsonMapKeyIterable: function _JsonMapKeyIterable(t0) {
      this._parent = t0;
    },
    Base64Codec: function Base64Codec() {
    },
    Base64Encoder: function Base64Encoder() {
    },
    _Base64Encoder: function _Base64Encoder(t0) {
      this._convert$_state = 0;
      this._alphabet = t0;
    },
    Base64Decoder: function Base64Decoder() {
    },
    _Base64Decoder: function _Base64Decoder() {
      this._convert$_state = 0;
    },
    Codec: function Codec() {
    },
    Converter: function Converter() {
    },
    Encoding: function Encoding() {
    },
    JsonUnsupportedObjectError: function JsonUnsupportedObjectError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCyclicError: function JsonCyclicError(t0, t1) {
      this.unsupportedObject = t0;
      this.cause = t1;
    },
    JsonCodec: function JsonCodec() {
    },
    JsonEncoder: function JsonEncoder(t0) {
      this._toEncodable = t0;
    },
    JsonDecoder: function JsonDecoder(t0) {
      this._reviver = t0;
    },
    _JsonStringifier: function _JsonStringifier() {
    },
    _JsonStringifier_writeMap_closure: function _JsonStringifier_writeMap_closure(t0, t1) {
      this._box_0 = t0;
      this.keyValueList = t1;
    },
    _JsonStringStringifier: function _JsonStringStringifier(t0, t1, t2) {
      this._convert$_sink = t0;
      this._seen = t1;
      this._toEncodable = t2;
    },
    Utf8Codec: function Utf8Codec() {
    },
    Utf8Encoder: function Utf8Encoder() {
    },
    _Utf8Encoder: function _Utf8Encoder(t0) {
      this._bufferIndex = this._carry = 0;
      this._buffer = t0;
    },
    _BigIntImpl__parseDecimal(source, isNegative) {
      var part, i,
        result = $.$get$_BigIntImpl_zero(),
        t1 = source.length,
        digitInPartCount = 4 - t1 % 4;
      if (digitInPartCount === 4)
        digitInPartCount = 0;
      for (part = 0, i = 0; i < t1; ++i) {
        part = part * 10 + source.charCodeAt(i) - 48;
        ++digitInPartCount;
        if (digitInPartCount === 4) {
          result = result.$mul(0, $.$get$_BigIntImpl__bigInt10000()).$add(0, A._BigIntImpl__BigIntImpl$_fromInt(part));
          part = 0;
          digitInPartCount = 0;
        }
      }
      if (isNegative)
        return result.$negate(0);
      return result;
    },
    _BigIntImpl__codeUnitToRadixValue(codeUnit) {
      if (48 <= codeUnit && codeUnit <= 57)
        return codeUnit - 48;
      return (codeUnit | 32) - 97 + 10;
    },
    _BigIntImpl__parseHex(source, startPos, isNegative) {
      var i, chunk, j, i0, digitValue, digitIndex, digitIndex0,
        t1 = source.length,
        sourceLength = t1 - startPos,
        chunkCount = B.JSNumber_methods.ceil$0(sourceLength / 4),
        digits = new Uint16Array(chunkCount),
        t2 = chunkCount - 1,
        lastDigitLength = sourceLength - t2 * 4;
      for (i = startPos, chunk = 0, j = 0; j < lastDigitLength; ++j, i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(source, i);
        digitValue = A._BigIntImpl__codeUnitToRadixValue(source.charCodeAt(i));
        if (digitValue >= 16)
          return null;
        chunk = chunk * 16 + digitValue;
      }
      digitIndex = t2 - 1;
      if (!(t2 >= 0 && t2 < chunkCount))
        return A.ioore(digits, t2);
      digits[t2] = chunk;
      for (; i < t1; digitIndex = digitIndex0) {
        for (chunk = 0, j = 0; j < 4; ++j, i = i0) {
          i0 = i + 1;
          if (!(i >= 0 && i < t1))
            return A.ioore(source, i);
          digitValue = A._BigIntImpl__codeUnitToRadixValue(source.charCodeAt(i));
          if (digitValue >= 16)
            return null;
          chunk = chunk * 16 + digitValue;
        }
        digitIndex0 = digitIndex - 1;
        if (!(digitIndex >= 0 && digitIndex < chunkCount))
          return A.ioore(digits, digitIndex);
        digits[digitIndex] = chunk;
      }
      if (chunkCount === 1) {
        if (0 >= chunkCount)
          return A.ioore(digits, 0);
        t1 = digits[0] === 0;
      } else
        t1 = false;
      if (t1)
        return $.$get$_BigIntImpl_zero();
      t1 = A._BigIntImpl__normalize(chunkCount, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__tryParse(source, radix) {
      var match, t1, t2, isNegative, decimalMatch, hexMatch;
      if (source === "")
        return null;
      match = $.$get$_BigIntImpl__parseRE().firstMatch$1(source);
      if (match == null)
        return null;
      t1 = match._match;
      t2 = t1.length;
      if (1 >= t2)
        return A.ioore(t1, 1);
      isNegative = t1[1] === "-";
      if (4 >= t2)
        return A.ioore(t1, 4);
      decimalMatch = t1[4];
      hexMatch = t1[3];
      if (5 >= t2)
        return A.ioore(t1, 5);
      if (decimalMatch != null)
        return A._BigIntImpl__parseDecimal(decimalMatch, isNegative);
      if (hexMatch != null)
        return A._BigIntImpl__parseHex(hexMatch, 2, isNegative);
      return null;
    },
    _BigIntImpl__normalize(used, digits) {
      var t2,
        t1 = digits.length;
      while (true) {
        if (used > 0) {
          t2 = used - 1;
          if (!(t2 < t1))
            return A.ioore(digits, t2);
          t2 = digits[t2] === 0;
        } else
          t2 = false;
        if (!t2)
          break;
        --used;
      }
      return used;
    },
    _BigIntImpl__cloneDigits(digits, from, to, $length) {
      var t1, i, t2,
        resultDigits = new Uint16Array($length),
        n = to - from;
      for (t1 = digits.length, i = 0; i < n; ++i) {
        t2 = from + i;
        if (!(t2 >= 0 && t2 < t1))
          return A.ioore(digits, t2);
        t2 = digits[t2];
        if (!(i < $length))
          return A.ioore(resultDigits, i);
        resultDigits[i] = t2;
      }
      return resultDigits;
    },
    _BigIntImpl__BigIntImpl$_fromInt(value) {
      var digits, t1, i, i0,
        isNegative = value < 0;
      if (isNegative) {
        if (value === -9223372036854776e3) {
          digits = new Uint16Array(4);
          digits[3] = 32768;
          t1 = A._BigIntImpl__normalize(4, digits);
          return new A._BigIntImpl(t1 !== 0 || false, digits, t1);
        }
        value = -value;
      }
      if (value < 65536) {
        digits = new Uint16Array(1);
        digits[0] = value;
        t1 = A._BigIntImpl__normalize(1, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      if (value <= 4294967295) {
        digits = new Uint16Array(2);
        digits[0] = value & 65535;
        digits[1] = B.JSInt_methods._shrOtherPositive$1(value, 16);
        t1 = A._BigIntImpl__normalize(2, digits);
        return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
      }
      t1 = B.JSInt_methods._tdivFast$1(B.JSInt_methods.get$bitLength(value) - 1, 16) + 1;
      digits = new Uint16Array(t1);
      for (i = 0; value !== 0; i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(digits, i);
        digits[i] = value & 65535;
        value = B.JSInt_methods._tdivFast$1(value, 65536);
      }
      t1 = A._BigIntImpl__normalize(t1, digits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, digits, t1);
    },
    _BigIntImpl__dlShiftDigits(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, t3, t4;
      if (xUsed === 0)
        return 0;
      if (n === 0 && resultDigits === xDigits)
        return xUsed;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.length; i >= 0; --i) {
        t3 = i + n;
        if (!(i < t1))
          return A.ioore(xDigits, i);
        t4 = xDigits[i];
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = t4;
      }
      for (i = n - 1; i >= 0; --i) {
        if (!(i < t2))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      return xUsed + n;
    },
    _BigIntImpl__lsh(xDigits, xUsed, n, resultDigits) {
      var i, t1, t2, carry, digit, t3, t4,
        digitShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, carryBitShift) - 1;
      for (i = xUsed - 1, t1 = xDigits.length, t2 = resultDigits.length, carry = 0; i >= 0; --i) {
        if (!(i < t1))
          return A.ioore(xDigits, i);
        digit = xDigits[i];
        t3 = i + digitShift + 1;
        t4 = B.JSInt_methods.$shr(digit, carryBitShift);
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(resultDigits, t3);
        resultDigits[t3] = (t4 | carry) >>> 0;
        carry = B.JSInt_methods.$shl((digit & bitMask) >>> 0, bitShift);
      }
      if (!(digitShift >= 0 && digitShift < t2))
        return A.ioore(resultDigits, digitShift);
      resultDigits[digitShift] = carry;
    },
    _BigIntImpl__lShiftDigits(xDigits, xUsed, n, resultDigits) {
      var resultUsed, t1, i, t2,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16);
      if (B.JSInt_methods.$mod(n, 16) === 0)
        return A._BigIntImpl__dlShiftDigits(xDigits, xUsed, digitsShift, resultDigits);
      resultUsed = xUsed + digitsShift + 1;
      A._BigIntImpl__lsh(xDigits, xUsed, n, resultDigits);
      for (t1 = resultDigits.length, i = digitsShift; --i, i >= 0;) {
        if (!(i < t1))
          return A.ioore(resultDigits, i);
        resultDigits[i] = 0;
      }
      t2 = resultUsed - 1;
      if (!(t2 >= 0 && t2 < t1))
        return A.ioore(resultDigits, t2);
      if (resultDigits[t2] === 0)
        resultUsed = t2;
      return resultUsed;
    },
    _BigIntImpl__rsh(xDigits, xUsed, n, resultDigits) {
      var carry, last, t2, i, t3, digit,
        digitsShift = B.JSInt_methods._tdivFast$1(n, 16),
        bitShift = B.JSInt_methods.$mod(n, 16),
        carryBitShift = 16 - bitShift,
        bitMask = B.JSInt_methods.$shl(1, bitShift) - 1,
        t1 = xDigits.length;
      if (!(digitsShift >= 0 && digitsShift < t1))
        return A.ioore(xDigits, digitsShift);
      carry = B.JSInt_methods.$shr(xDigits[digitsShift], bitShift);
      last = xUsed - digitsShift - 1;
      for (t2 = resultDigits.length, i = 0; i < last; ++i) {
        t3 = i + digitsShift + 1;
        if (!(t3 < t1))
          return A.ioore(xDigits, t3);
        digit = xDigits[t3];
        t3 = B.JSInt_methods.$shl((digit & bitMask) >>> 0, carryBitShift);
        if (!(i < t2))
          return A.ioore(resultDigits, i);
        resultDigits[i] = (t3 | carry) >>> 0;
        carry = B.JSInt_methods.$shr(digit, bitShift);
      }
      if (!(last >= 0 && last < t2))
        return A.ioore(resultDigits, last);
      resultDigits[last] = carry;
    },
    _BigIntImpl__compareDigits(digits, used, otherDigits, otherUsed) {
      var i, t1, t2, t3,
        result = used - otherUsed;
      if (result === 0)
        for (i = used - 1, t1 = digits.length, t2 = otherDigits.length; i >= 0; --i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          t3 = digits[i];
          if (!(i < t2))
            return A.ioore(otherDigits, i);
          result = t3 - otherDigits[i];
          if (result !== 0)
            return result;
        }
      return result;
    },
    _BigIntImpl__absAdd(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 + otherDigits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = B.JSInt_methods._shrOtherPositive$1(carry, 16);
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = B.JSInt_methods._shrOtherPositive$1(carry, 16);
      }
      if (!(used >= 0 && used < t3))
        return A.ioore(resultDigits, used);
      resultDigits[used] = carry;
    },
    _BigIntImpl__absSub(digits, used, otherDigits, otherUsed, resultDigits) {
      var t1, t2, t3, carry, i, t4;
      for (t1 = digits.length, t2 = otherDigits.length, t3 = resultDigits.length, carry = 0, i = 0; i < otherUsed; ++i) {
        if (!(i < t1))
          return A.ioore(digits, i);
        t4 = digits[i];
        if (!(i < t2))
          return A.ioore(otherDigits, i);
        carry += t4 - otherDigits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
      for (i = otherUsed; i < used; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        carry += digits[i];
        if (!(i < t3))
          return A.ioore(resultDigits, i);
        resultDigits[i] = carry & 65535;
        carry = 0 - (B.JSInt_methods._shrOtherPositive$1(carry, 16) & 1);
      }
    },
    _BigIntImpl__mulAdd(x, multiplicandDigits, i, accumulatorDigits, j, n) {
      var t1, t2, c, i0, t3, combined, j0, l;
      if (x === 0)
        return;
      for (t1 = multiplicandDigits.length, t2 = accumulatorDigits.length, c = 0; --n, n >= 0; j = j0, i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(multiplicandDigits, i);
        t3 = multiplicandDigits[i];
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        combined = x * t3 + accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = combined & 65535;
        c = B.JSInt_methods._tdivFast$1(combined, 65536);
      }
      for (; c !== 0; j = j0) {
        if (!(j >= 0 && j < t2))
          return A.ioore(accumulatorDigits, j);
        l = accumulatorDigits[j] + c;
        j0 = j + 1;
        accumulatorDigits[j] = l & 65535;
        c = B.JSInt_methods._tdivFast$1(l, 65536);
      }
    },
    _BigIntImpl__estimateQuotientDigit(topDigitDivisor, digits, i) {
      var t2, t3, quotientDigit,
        t1 = digits.length;
      if (!(i >= 0 && i < t1))
        return A.ioore(digits, i);
      t2 = digits[i];
      if (t2 === topDigitDivisor)
        return 65535;
      t3 = i - 1;
      if (!(t3 >= 0 && t3 < t1))
        return A.ioore(digits, t3);
      quotientDigit = B.JSInt_methods.$tdiv((t2 << 16 | digits[t3]) >>> 0, topDigitDivisor);
      if (quotientDigit > 65535)
        return 65535;
      return quotientDigit;
    },
    _symbolMapToStringMap(map) {
      var result = new A.JsLinkedHashMap(type$.JsLinkedHashMap_String_dynamic);
      map.forEach$1(0, new A._symbolMapToStringMap_closure(result));
      return result;
    },
    identityHashCode(object) {
      return A.objectHashCode(object);
    },
    Function_apply($function, positionalArguments, namedArguments) {
      return A.Primitives_applyFunction($function, positionalArguments, namedArguments == null ? null : A._symbolMapToStringMap(namedArguments));
    },
    Expando__checkType(object) {
      var t1;
      if (typeof object != "number")
        t1 = false;
      else
        t1 = true;
      if (t1)
        A.Expando__badExpandoKey(object);
    },
    Expando__badExpandoKey(object) {
      throw A.wrapException(A.ArgumentError$value(object, "object", "Expandos are not allowed on strings, numbers, bools, records or null"));
    },
    int_parse(source, radix) {
      var value = A.Primitives_parseInt(source, radix);
      if (value != null)
        return value;
      throw A.wrapException(A.FormatException$(source, null, null));
    },
    Error__throw(error, stackTrace) {
      error = A.wrapException(error);
      if (error == null)
        error = type$.Object._as(error);
      error.stack = stackTrace.toString$0(0);
      throw error;
      throw A.wrapException("unreachable");
    },
    DateTime$fromMillisecondsSinceEpoch(millisecondsSinceEpoch, isUtc) {
      var t1;
      if (Math.abs(millisecondsSinceEpoch) <= 864e13)
        t1 = false;
      else
        t1 = true;
      if (t1)
        A.throwExpression(A.ArgumentError$("DateTime is outside valid range: " + millisecondsSinceEpoch, null));
      A.checkNotNullable(isUtc, "isUtc", type$.bool);
      return new A.DateTime(millisecondsSinceEpoch, isUtc);
    },
    List_List$filled($length, fill, growable, $E) {
      var i,
        result = growable ? J.JSArray_JSArray$growable($length, $E) : J.JSArray_JSArray$fixed($length, $E);
      if ($length !== 0 && fill != null)
        for (i = 0; i < result.length; ++i)
          result[i] = fill;
      return result;
    },
    List_List$from(elements, growable, $E) {
      var t1,
        list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, $E._as(t1.get$current(t1)));
      if (growable)
        return list;
      return J.JSArray_markFixedList(list, $E);
    },
    List_List$of(elements, growable, $E) {
      var t1;
      if (growable)
        return A.List_List$_of(elements, $E);
      t1 = J.JSArray_markFixedList(A.List_List$_of(elements, $E), $E);
      return t1;
    },
    List_List$_of(elements, $E) {
      var list, t1;
      if (Array.isArray(elements))
        return A._setArrayType(elements.slice(0), $E._eval$1("JSArray<0>"));
      list = A._setArrayType([], $E._eval$1("JSArray<0>"));
      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
        B.JSArray_methods.add$1(list, t1.get$current(t1));
      return list;
    },
    String_String$fromCharCodes(charCodes, start, end) {
      var t1, t2, maxLength, array, len;
      A.RangeError_checkNotNegative(start, "start");
      t1 = end == null;
      t2 = !t1;
      if (t2) {
        maxLength = end - start;
        if (maxLength < 0)
          throw A.wrapException(A.RangeError$range(end, start, null, "end", null));
        if (maxLength === 0)
          return "";
      }
      if (Array.isArray(charCodes)) {
        array = charCodes;
        len = array.length;
        if (t1)
          end = len;
        return A.Primitives_stringFromCharCodes(start > 0 || end < len ? array.slice(start, end) : array);
      }
      if (type$.NativeUint8List._is(charCodes))
        return A.String__stringFromUint8List(charCodes, start, end);
      if (t2)
        charCodes = J.take$1$ax(charCodes, end);
      if (start > 0)
        charCodes = J.skip$1$ax(charCodes, start);
      return A.Primitives_stringFromCharCodes(A.List_List$of(charCodes, true, type$.int));
    },
    String__stringFromUint8List(charCodes, start, endOrNull) {
      var len = charCodes.length;
      if (start >= len)
        return "";
      return A.Primitives_stringFromNativeUint8List(charCodes, start, endOrNull == null || endOrNull > len ? len : endOrNull);
    },
    RegExp_RegExp(source, caseSensitive, multiLine) {
      return new A.JSSyntaxRegExp(source, A.JSSyntaxRegExp_makeNative(source, multiLine, caseSensitive, false, false, false));
    },
    identical(a, b) {
      return a == null ? b == null : a === b;
    },
    StringBuffer__writeAll(string, objects, separator) {
      var iterator = J.get$iterator$ax(objects);
      if (!iterator.moveNext$0())
        return string;
      if (separator.length === 0) {
        do
          string += A.S(iterator.get$current(iterator));
        while (iterator.moveNext$0());
      } else {
        string += A.S(iterator.get$current(iterator));
        for (; iterator.moveNext$0();)
          string = string + separator + A.S(iterator.get$current(iterator));
      }
      return string;
    },
    NoSuchMethodError_NoSuchMethodError$withInvocation(receiver, invocation) {
      return new A.NoSuchMethodError(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments());
    },
    _Uri__uriEncode(canonicalTable, text, encoding, spaceToPlus) {
      var t1, bytes, i, t2, byte, t3,
        _s16_ = "0123456789ABCDEF";
      if (encoding === B.C_Utf8Codec) {
        t1 = $.$get$_Uri__needsNoEncoding();
        t1 = t1._nativeRegExp.test(text);
      } else
        t1 = false;
      if (t1)
        return text;
      bytes = B.C_Utf8Encoder.convert$1(text);
      for (t1 = bytes.length, i = 0, t2 = ""; i < t1; ++i) {
        byte = bytes[i];
        if (byte < 128) {
          t3 = byte >>> 4;
          if (!(t3 < 8))
            return A.ioore(canonicalTable, t3);
          t3 = (canonicalTable[t3] & 1 << (byte & 15)) !== 0;
        } else
          t3 = false;
        if (t3)
          t2 += A.Primitives_stringFromCharCode(byte);
        else
          t2 = spaceToPlus && byte === 32 ? t2 + "+" : t2 + "%" + _s16_[byte >>> 4 & 15] + _s16_[byte & 15];
      }
      return t2.charCodeAt(0) == 0 ? t2 : t2;
    },
    StackTrace_current() {
      return A.getTraceFromException(new Error());
    },
    DateTime__fourDigits(n) {
      var absN = Math.abs(n),
        sign = n < 0 ? "-" : "";
      if (absN >= 1000)
        return "" + n;
      if (absN >= 100)
        return sign + "0" + absN;
      if (absN >= 10)
        return sign + "00" + absN;
      return sign + "000" + absN;
    },
    DateTime__threeDigits(n) {
      if (n >= 100)
        return "" + n;
      if (n >= 10)
        return "0" + n;
      return "00" + n;
    },
    DateTime__twoDigits(n) {
      if (n >= 10)
        return "" + n;
      return "0" + n;
    },
    Duration$(microseconds, milliseconds) {
      return new A.Duration(microseconds + 1000 * milliseconds);
    },
    Error_safeToString(object) {
      if (typeof object == "number" || A._isBool(object) || object == null)
        return J.toString$0$(object);
      if (typeof object == "string")
        return JSON.stringify(object);
      return A.Primitives_safeToString(object);
    },
    Error_throwWithStackTrace(error, stackTrace) {
      A.checkNotNullable(error, "error", type$.Object);
      A.checkNotNullable(stackTrace, "stackTrace", type$.StackTrace);
      A.Error__throw(error, stackTrace);
    },
    AssertionError$(message) {
      return new A.AssertionError(message);
    },
    ArgumentError$(message, $name) {
      return new A.ArgumentError(false, null, $name, message);
    },
    ArgumentError$value(value, $name, message) {
      return new A.ArgumentError(true, value, $name, message);
    },
    ArgumentError$notNull($name) {
      return new A.ArgumentError(false, null, $name, "Must not be null");
    },
    ArgumentError_checkNotNull(argument, $name, $T) {
      return argument;
    },
    RangeError$(message) {
      var _null = null;
      return new A.RangeError(_null, _null, false, _null, _null, message);
    },
    RangeError$value(value, $name) {
      return new A.RangeError(null, null, true, value, $name, "Value not in range");
    },
    RangeError$range(invalidValue, minValue, maxValue, $name, message) {
      return new A.RangeError(minValue, maxValue, true, invalidValue, $name, "Invalid value");
    },
    RangeError_checkValidRange(start, end, $length) {
      if (0 > start || start > $length)
        throw A.wrapException(A.RangeError$range(start, 0, $length, "start", null));
      if (end != null) {
        if (start > end || end > $length)
          throw A.wrapException(A.RangeError$range(end, start, $length, "end", null));
        return end;
      }
      return $length;
    },
    RangeError_checkNotNegative(value, $name) {
      if (value < 0)
        throw A.wrapException(A.RangeError$range(value, 0, null, $name, null));
      return value;
    },
    IndexError$withLength(invalidValue, $length, indexable, message, $name) {
      return new A.IndexError($length, true, invalidValue, $name, "Index out of range");
    },
    UnsupportedError$(message) {
      return new A.UnsupportedError(message);
    },
    UnimplementedError$(message) {
      return new A.UnimplementedError(message);
    },
    StateError$(message) {
      return new A.StateError(message);
    },
    ConcurrentModificationError$(modifiedObject) {
      return new A.ConcurrentModificationError(modifiedObject);
    },
    Exception_Exception(message) {
      return new A._Exception(message);
    },
    FormatException$(message, source, offset) {
      return new A.FormatException(message, source, offset);
    },
    Iterable_iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
      var parts, t1;
      if (A.isToStringVisiting(iterable)) {
        if (leftDelimiter === "(" && rightDelimiter === ")")
          return "(...)";
        return leftDelimiter + "..." + rightDelimiter;
      }
      parts = A._setArrayType([], type$.JSArray_String);
      B.JSArray_methods.add$1($.toStringVisiting, iterable);
      try {
        A._iterablePartsToStrings(iterable, parts);
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      t1 = A.StringBuffer__writeAll(leftDelimiter, type$.Iterable_dynamic._as(parts), ", ") + rightDelimiter;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    Iterable_iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
      var buffer, t1;
      if (A.isToStringVisiting(iterable))
        return leftDelimiter + "..." + rightDelimiter;
      buffer = new A.StringBuffer(leftDelimiter);
      B.JSArray_methods.add$1($.toStringVisiting, iterable);
      try {
        t1 = buffer;
        t1._contents = A.StringBuffer__writeAll(t1._contents, iterable, ", ");
      } finally {
        if (0 >= $.toStringVisiting.length)
          return A.ioore($.toStringVisiting, -1);
        $.toStringVisiting.pop();
      }
      buffer._contents += rightDelimiter;
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _iterablePartsToStrings(iterable, parts) {
      var next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision,
        it = J.get$iterator$ax(iterable),
        $length = 0, count = 0;
      while (true) {
        if (!($length < 80 || count < 3))
          break;
        if (!it.moveNext$0())
          return;
        next = A.S(it.get$current(it));
        B.JSArray_methods.add$1(parts, next);
        $length += next.length + 2;
        ++count;
      }
      if (!it.moveNext$0()) {
        if (count <= 5)
          return;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        ultimateString = parts.pop();
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        penultimateString = parts.pop();
      } else {
        penultimate = it.get$current(it);
        ++count;
        if (!it.moveNext$0()) {
          if (count <= 4) {
            B.JSArray_methods.add$1(parts, A.S(penultimate));
            return;
          }
          ultimateString = A.S(penultimate);
          if (0 >= parts.length)
            return A.ioore(parts, -1);
          penultimateString = parts.pop();
          $length += ultimateString.length + 2;
        } else {
          ultimate = it.get$current(it);
          ++count;
          for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
            ultimate0 = it.get$current(it);
            ++count;
            if (count > 100) {
              while (true) {
                if (!($length > 75 && count > 3))
                  break;
                if (0 >= parts.length)
                  return A.ioore(parts, -1);
                $length -= parts.pop().length + 2;
                --count;
              }
              B.JSArray_methods.add$1(parts, "...");
              return;
            }
          }
          penultimateString = A.S(penultimate);
          ultimateString = A.S(ultimate);
          $length += ultimateString.length + penultimateString.length + 4;
        }
      }
      if (count > parts.length + 2) {
        $length += 5;
        elision = "...";
      } else
        elision = null;
      while (true) {
        if (!($length > 80 && parts.length > 3))
          break;
        if (0 >= parts.length)
          return A.ioore(parts, -1);
        $length -= parts.pop().length + 2;
        if (elision == null) {
          $length += 5;
          elision = "...";
        }
      }
      if (elision != null)
        B.JSArray_methods.add$1(parts, elision);
      B.JSArray_methods.add$1(parts, penultimateString);
      B.JSArray_methods.add$1(parts, ultimateString);
    },
    Map_castFrom(source, $K, $V, K2, V2) {
      return new A.CastMap(source, $K._eval$1("@<0>")._bind$1($V)._bind$1(K2)._bind$1(V2)._eval$1("CastMap<1,2,3,4>"));
    },
    Object_hash(object1, object2, object3, object4) {
      var t1;
      if (B.C_SentinelValue === object3) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2));
      }
      if (B.C_SentinelValue === object4) {
        t1 = J.get$hashCode$(object1);
        object2 = J.get$hashCode$(object2);
        object3 = J.get$hashCode$(object3);
        return A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3));
      }
      t1 = J.get$hashCode$(object1);
      object2 = J.get$hashCode$(object2);
      object3 = J.get$hashCode$(object3);
      object4 = J.get$hashCode$(object4);
      object4 = A.SystemHash_finish(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine(A.SystemHash_combine($.$get$_hashSeed(), t1), object2), object3), object4));
      return object4;
    },
    print(object) {
      var toZone = $.printToZone;
      if (toZone == null)
        A.printString(object);
      else
        toZone.call$1(object);
    },
    Uri_parse(uri) {
      var delta, indices, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, isSimple, scheme, t1, t2, schemeAuth, queryStart0, pathStart0, userInfoStart, userInfo, host, portNumber, port, path, query, _null = null,
        end = uri.length;
      if (end >= 5) {
        if (4 >= end)
          return A.ioore(uri, 4);
        delta = ((uri.charCodeAt(4) ^ 58) * 3 | uri.charCodeAt(0) ^ 100 | uri.charCodeAt(1) ^ 97 | uri.charCodeAt(2) ^ 116 | uri.charCodeAt(3) ^ 97) >>> 0;
        if (delta === 0)
          return A.UriData__parse(end < end ? B.JSString_methods.substring$2(uri, 0, end) : uri, 5, _null).get$uri();
        else if (delta === 32)
          return A.UriData__parse(B.JSString_methods.substring$2(uri, 5, end), 0, _null).get$uri();
      }
      indices = A.List_List$filled(8, 0, false, type$.int);
      B.JSArray_methods.$indexSet(indices, 0, 0);
      B.JSArray_methods.$indexSet(indices, 1, -1);
      B.JSArray_methods.$indexSet(indices, 2, -1);
      B.JSArray_methods.$indexSet(indices, 7, -1);
      B.JSArray_methods.$indexSet(indices, 3, 0);
      B.JSArray_methods.$indexSet(indices, 4, 0);
      B.JSArray_methods.$indexSet(indices, 5, end);
      B.JSArray_methods.$indexSet(indices, 6, end);
      if (A._scan(uri, 0, end, 0, indices) >= 14)
        B.JSArray_methods.$indexSet(indices, 7, end);
      schemeEnd = indices[1];
      if (schemeEnd >= 0)
        if (A._scan(uri, 0, schemeEnd, 20, indices) === 20)
          indices[7] = schemeEnd;
      hostStart = indices[2] + 1;
      portStart = indices[3];
      pathStart = indices[4];
      queryStart = indices[5];
      fragmentStart = indices[6];
      if (fragmentStart < queryStart)
        queryStart = fragmentStart;
      if (pathStart < hostStart)
        pathStart = queryStart;
      else if (pathStart <= schemeEnd)
        pathStart = schemeEnd + 1;
      if (portStart < hostStart)
        portStart = pathStart;
      isSimple = indices[7] < 0;
      if (isSimple)
        if (hostStart > schemeEnd + 3) {
          scheme = _null;
          isSimple = false;
        } else {
          t1 = portStart > 0;
          if (t1 && portStart + 1 === pathStart) {
            scheme = _null;
            isSimple = false;
          } else {
            if (!B.JSString_methods.startsWith$2(uri, "\\", pathStart))
              if (hostStart > 0)
                t2 = B.JSString_methods.startsWith$2(uri, "\\", hostStart - 1) || B.JSString_methods.startsWith$2(uri, "\\", hostStart - 2);
              else
                t2 = false;
            else
              t2 = true;
            if (t2) {
              scheme = _null;
              isSimple = false;
            } else {
              if (!(queryStart < end && queryStart === pathStart + 2 && B.JSString_methods.startsWith$2(uri, "..", pathStart)))
                t2 = queryStart > pathStart + 2 && B.JSString_methods.startsWith$2(uri, "/..", queryStart - 3);
              else
                t2 = true;
              if (t2) {
                scheme = _null;
                isSimple = false;
              } else {
                if (schemeEnd === 4)
                  if (B.JSString_methods.startsWith$2(uri, "file", 0)) {
                    if (hostStart <= 0) {
                      if (!B.JSString_methods.startsWith$2(uri, "/", pathStart)) {
                        schemeAuth = "file:///";
                        delta = 3;
                      } else {
                        schemeAuth = "file://";
                        delta = 2;
                      }
                      uri = schemeAuth + B.JSString_methods.substring$2(uri, pathStart, end);
                      schemeEnd -= 0;
                      t1 = delta - 0;
                      queryStart += t1;
                      fragmentStart += t1;
                      end = uri.length;
                      hostStart = 7;
                      portStart = 7;
                      pathStart = 7;
                    } else if (pathStart === queryStart) {
                      ++fragmentStart;
                      queryStart0 = queryStart + 1;
                      uri = B.JSString_methods.replaceRange$3(uri, pathStart, queryStart, "/");
                      ++end;
                      queryStart = queryStart0;
                    }
                    scheme = "file";
                  } else if (B.JSString_methods.startsWith$2(uri, "http", 0)) {
                    if (t1 && portStart + 3 === pathStart && B.JSString_methods.startsWith$2(uri, "80", portStart + 1)) {
                      fragmentStart -= 3;
                      pathStart0 = pathStart - 3;
                      queryStart -= 3;
                      uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                      end -= 3;
                      pathStart = pathStart0;
                    }
                    scheme = "http";
                  } else
                    scheme = _null;
                else if (schemeEnd === 5 && B.JSString_methods.startsWith$2(uri, "https", 0)) {
                  if (t1 && portStart + 4 === pathStart && B.JSString_methods.startsWith$2(uri, "443", portStart + 1)) {
                    fragmentStart -= 4;
                    pathStart0 = pathStart - 4;
                    queryStart -= 4;
                    uri = B.JSString_methods.replaceRange$3(uri, portStart, pathStart, "");
                    end -= 3;
                    pathStart = pathStart0;
                  }
                  scheme = "https";
                } else
                  scheme = _null;
                isSimple = true;
              }
            }
          }
        }
      else
        scheme = _null;
      if (isSimple) {
        if (end < uri.length) {
          uri = B.JSString_methods.substring$2(uri, 0, end);
          schemeEnd -= 0;
          hostStart -= 0;
          portStart -= 0;
          pathStart -= 0;
          queryStart -= 0;
          fragmentStart -= 0;
        }
        return new A._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
      }
      if (scheme == null)
        if (schemeEnd > 0)
          scheme = A._Uri__makeScheme(uri, 0, schemeEnd);
        else {
          if (schemeEnd === 0)
            A._Uri__fail(uri, 0, "Invalid empty scheme");
          scheme = "";
        }
      if (hostStart > 0) {
        userInfoStart = schemeEnd + 3;
        userInfo = userInfoStart < hostStart ? A._Uri__makeUserInfo(uri, userInfoStart, hostStart - 1) : "";
        host = A._Uri__makeHost(uri, hostStart, portStart, false);
        t1 = portStart + 1;
        if (t1 < pathStart) {
          portNumber = A.Primitives_parseInt(B.JSString_methods.substring$2(uri, t1, pathStart), _null);
          port = A._Uri__makePort(portNumber == null ? A.throwExpression(A.FormatException$("Invalid port", uri, t1)) : portNumber, scheme);
        } else
          port = _null;
      } else {
        port = _null;
        host = port;
        userInfo = "";
      }
      path = A._Uri__makePath(uri, pathStart, queryStart, _null, scheme, host != null);
      query = queryStart < fragmentStart ? A._Uri__makeQuery(uri, queryStart + 1, fragmentStart, _null) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragmentStart < end ? A._Uri__makeFragment(uri, fragmentStart + 1, end) : _null);
    },
    Uri__parseIPv4Address(host, start, end) {
      var t1, i, partStart, partIndex, char, part, partIndex0,
        _s43_ = "IPv4 address should contain exactly 4 parts",
        _s37_ = "each part must be in the range 0..255",
        error = new A.Uri__parseIPv4Address_error(host),
        result = new Uint8Array(4);
      for (t1 = host.length, i = start, partStart = i, partIndex = 0; i < end; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(host, i);
        char = host.charCodeAt(i);
        if (char !== 46) {
          if ((char ^ 48) > 9)
            error.call$2("invalid character", i);
        } else {
          if (partIndex === 3)
            error.call$2(_s43_, i);
          part = A.int_parse(B.JSString_methods.substring$2(host, partStart, i), null);
          if (part > 255)
            error.call$2(_s37_, partStart);
          partIndex0 = partIndex + 1;
          if (!(partIndex < 4))
            return A.ioore(result, partIndex);
          result[partIndex] = part;
          partStart = i + 1;
          partIndex = partIndex0;
        }
      }
      if (partIndex !== 3)
        error.call$2(_s43_, end);
      part = A.int_parse(B.JSString_methods.substring$2(host, partStart, end), null);
      if (part > 255)
        error.call$2(_s37_, partStart);
      if (!(partIndex < 4))
        return A.ioore(result, partIndex);
      result[partIndex] = part;
      return result;
    },
    Uri_parseIPv6Address(host, start, end) {
      var parts, i, partStart, wildcardSeen, seenDot, char, atEnd, last, bytes, wildCardLength, index, value, j, t2, _null = null,
        error = new A.Uri_parseIPv6Address_error(host),
        parseHex = new A.Uri_parseIPv6Address_parseHex(error, host),
        t1 = host.length;
      if (t1 < 2)
        error.call$2("address is too short", _null);
      parts = A._setArrayType([], type$.JSArray_int);
      for (i = start, partStart = i, wildcardSeen = false, seenDot = false; i < end; ++i) {
        if (!(i >= 0 && i < t1))
          return A.ioore(host, i);
        char = host.charCodeAt(i);
        if (char === 58) {
          if (i === start) {
            ++i;
            if (!(i < t1))
              return A.ioore(host, i);
            if (host.charCodeAt(i) !== 58)
              error.call$2("invalid start colon.", i);
            partStart = i;
          }
          if (i === partStart) {
            if (wildcardSeen)
              error.call$2("only one wildcard `::` is allowed", i);
            B.JSArray_methods.add$1(parts, -1);
            wildcardSeen = true;
          } else
            B.JSArray_methods.add$1(parts, parseHex.call$2(partStart, i));
          partStart = i + 1;
        } else if (char === 46)
          seenDot = true;
      }
      if (parts.length === 0)
        error.call$2("too few parts", _null);
      atEnd = partStart === end;
      t1 = B.JSArray_methods.get$last(parts);
      if (atEnd && t1 !== -1)
        error.call$2("expected a part after last `:`", end);
      if (!atEnd)
        if (!seenDot)
          B.JSArray_methods.add$1(parts, parseHex.call$2(partStart, end));
        else {
          last = A.Uri__parseIPv4Address(host, partStart, end);
          B.JSArray_methods.add$1(parts, (last[0] << 8 | last[1]) >>> 0);
          B.JSArray_methods.add$1(parts, (last[2] << 8 | last[3]) >>> 0);
        }
      if (wildcardSeen) {
        if (parts.length > 7)
          error.call$2("an address with a wildcard must have less than 7 parts", _null);
      } else if (parts.length !== 8)
        error.call$2("an address without a wildcard must contain exactly 8 parts", _null);
      bytes = new Uint8Array(16);
      for (t1 = parts.length, wildCardLength = 9 - t1, i = 0, index = 0; i < t1; ++i) {
        value = parts[i];
        if (value === -1)
          for (j = 0; j < wildCardLength; ++j) {
            if (!(index >= 0 && index < 16))
              return A.ioore(bytes, index);
            bytes[index] = 0;
            t2 = index + 1;
            if (!(t2 < 16))
              return A.ioore(bytes, t2);
            bytes[t2] = 0;
            index += 2;
          }
        else {
          t2 = B.JSInt_methods._shrOtherPositive$1(value, 8);
          if (!(index >= 0 && index < 16))
            return A.ioore(bytes, index);
          bytes[index] = t2;
          t2 = index + 1;
          if (!(t2 < 16))
            return A.ioore(bytes, t2);
          bytes[t2] = value & 255;
          index += 2;
        }
      }
      return bytes;
    },
    _Uri$_internal(scheme, _userInfo, _host, _port, path, _query, _fragment) {
      return new A._Uri(scheme, _userInfo, _host, _port, path, _query, _fragment);
    },
    _Uri__defaultPort(scheme) {
      if (scheme === "http")
        return 80;
      if (scheme === "https")
        return 443;
      return 0;
    },
    _Uri__fail(uri, index, message) {
      throw A.wrapException(A.FormatException$(message, uri, index));
    },
    _Uri__makePort(port, scheme) {
      if (port != null && port === A._Uri__defaultPort(scheme))
        return null;
      return port;
    },
    _Uri__makeHost(host, start, end, strictIPv6) {
      var t1, t2, index, zoneIDstart, zoneID, i;
      if (host == null)
        return null;
      if (start === end)
        return "";
      t1 = host.length;
      if (!(start >= 0 && start < t1))
        return A.ioore(host, start);
      if (host.charCodeAt(start) === 91) {
        t2 = end - 1;
        if (!(t2 >= 0 && t2 < t1))
          return A.ioore(host, t2);
        if (host.charCodeAt(t2) !== 93)
          A._Uri__fail(host, start, "Missing end `]` to match `[` in host");
        t1 = start + 1;
        index = A._Uri__checkZoneID(host, t1, t2);
        if (index < t2) {
          zoneIDstart = index + 1;
          zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, t2, "%25");
        } else
          zoneID = "";
        A.Uri_parseIPv6Address(host, t1, index);
        return B.JSString_methods.substring$2(host, start, index).toLowerCase() + zoneID + "]";
      }
      for (i = start; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(host, i);
        if (host.charCodeAt(i) === 58) {
          index = B.JSString_methods.indexOf$2(host, "%", start);
          index = index >= start && index < end ? index : end;
          if (index < end) {
            zoneIDstart = index + 1;
            zoneID = A._Uri__normalizeZoneID(host, B.JSString_methods.startsWith$2(host, "25", zoneIDstart) ? index + 3 : zoneIDstart, end, "%25");
          } else
            zoneID = "";
          A.Uri_parseIPv6Address(host, start, index);
          return "[" + B.JSString_methods.substring$2(host, start, index) + zoneID + "]";
        }
      }
      return A._Uri__normalizeRegName(host, start, end);
    },
    _Uri__checkZoneID(host, start, end) {
      var index = B.JSString_methods.indexOf$2(host, "%", start);
      return index >= start && index < end ? index : end;
    },
    _Uri__normalizeZoneID(host, start, end, prefix) {
      var t1, index, sectionStart, isNormalized, char, replacement, t2, t3, tail, sourceLength, slice,
        buffer = prefix !== "" ? new A.StringBuffer(prefix) : null;
      for (t1 = host.length, index = start, sectionStart = index, isNormalized = true; index < end;) {
        if (!(index >= 0 && index < t1))
          return A.ioore(host, index);
        char = host.charCodeAt(index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t2 = replacement == null;
          if (t2 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          t3 = buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
          if (t2)
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
          else if (replacement === "%")
            A._Uri__fail(host, index, "ZoneID should not contain % anymore");
          buffer._contents = t3 + replacement;
          index += 3;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t2 = char >>> 4;
            if (!(t2 < 8))
              return A.ioore(B.List_M1A, t2);
            t2 = (B.List_M1A[t2] & 1 << (char & 15)) !== 0;
          } else
            t2 = false;
          if (t2) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new A.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if ((char & 64512) === 55296 && index + 1 < end) {
              t2 = index + 1;
              if (!(t2 < t1))
                return A.ioore(host, t2);
              tail = host.charCodeAt(t2);
              if ((tail & 64512) === 56320) {
                char = (char & 1023) << 10 | tail & 1023 | 65536;
                sourceLength = 2;
              } else
                sourceLength = 1;
            } else
              sourceLength = 1;
            slice = B.JSString_methods.substring$2(host, sectionStart, index);
            if (buffer == null) {
              buffer = new A.StringBuffer("");
              t2 = buffer;
            } else
              t2 = buffer;
            t2._contents += slice;
            t2._contents += A._Uri__escapeChar(char);
            index += sourceLength;
            sectionStart = index;
          }
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end)
        buffer._contents += B.JSString_methods.substring$2(host, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__normalizeRegName(host, start, end) {
      var t1, index, sectionStart, buffer, isNormalized, char, replacement, t2, slice, t3, sourceLength, tail;
      for (t1 = host.length, index = start, sectionStart = index, buffer = null, isNormalized = true; index < end;) {
        if (!(index >= 0 && index < t1))
          return A.ioore(host, index);
        char = host.charCodeAt(index);
        if (char === 37) {
          replacement = A._Uri__normalizeEscape(host, index, true);
          t2 = replacement == null;
          if (t2 && isNormalized) {
            index += 3;
            continue;
          }
          if (buffer == null)
            buffer = new A.StringBuffer("");
          slice = B.JSString_methods.substring$2(host, sectionStart, index);
          t3 = buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
          if (t2) {
            replacement = B.JSString_methods.substring$2(host, index, index + 3);
            sourceLength = 3;
          } else if (replacement === "%") {
            replacement = "%25";
            sourceLength = 1;
          } else
            sourceLength = 3;
          buffer._contents = t3 + replacement;
          index += sourceLength;
          sectionStart = index;
          isNormalized = true;
        } else {
          if (char < 127) {
            t2 = char >>> 4;
            if (!(t2 < 8))
              return A.ioore(B.List_ejq, t2);
            t2 = (B.List_ejq[t2] & 1 << (char & 15)) !== 0;
          } else
            t2 = false;
          if (t2) {
            if (isNormalized && 65 <= char && 90 >= char) {
              if (buffer == null)
                buffer = new A.StringBuffer("");
              if (sectionStart < index) {
                buffer._contents += B.JSString_methods.substring$2(host, sectionStart, index);
                sectionStart = index;
              }
              isNormalized = false;
            }
            ++index;
          } else {
            if (char <= 93) {
              t2 = char >>> 4;
              if (!(t2 < 8))
                return A.ioore(B.List_YmH, t2);
              t2 = (B.List_YmH[t2] & 1 << (char & 15)) !== 0;
            } else
              t2 = false;
            if (t2)
              A._Uri__fail(host, index, "Invalid character");
            else {
              if ((char & 64512) === 55296 && index + 1 < end) {
                t2 = index + 1;
                if (!(t2 < t1))
                  return A.ioore(host, t2);
                tail = host.charCodeAt(t2);
                if ((tail & 64512) === 56320) {
                  char = (char & 1023) << 10 | tail & 1023 | 65536;
                  sourceLength = 2;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              slice = B.JSString_methods.substring$2(host, sectionStart, index);
              if (!isNormalized)
                slice = slice.toLowerCase();
              if (buffer == null) {
                buffer = new A.StringBuffer("");
                t2 = buffer;
              } else
                t2 = buffer;
              t2._contents += slice;
              t2._contents += A._Uri__escapeChar(char);
              index += sourceLength;
              sectionStart = index;
            }
          }
        }
      }
      if (buffer == null)
        return B.JSString_methods.substring$2(host, start, end);
      if (sectionStart < end) {
        slice = B.JSString_methods.substring$2(host, sectionStart, end);
        buffer._contents += !isNormalized ? slice.toLowerCase() : slice;
      }
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__makeScheme(scheme, start, end) {
      var t1, i, containsUpperCase, codeUnit, t2;
      if (start === end)
        return "";
      t1 = scheme.length;
      if (!(start < t1))
        return A.ioore(scheme, start);
      if (!A._Uri__isAlphabeticCharacter(scheme.charCodeAt(start)))
        A._Uri__fail(scheme, start, "Scheme not starting with alphabetic character");
      for (i = start, containsUpperCase = false; i < end; ++i) {
        if (!(i < t1))
          return A.ioore(scheme, i);
        codeUnit = scheme.charCodeAt(i);
        if (codeUnit < 128) {
          t2 = codeUnit >>> 4;
          if (!(t2 < 8))
            return A.ioore(B.List_MMm, t2);
          t2 = (B.List_MMm[t2] & 1 << (codeUnit & 15)) !== 0;
        } else
          t2 = false;
        if (!t2)
          A._Uri__fail(scheme, i, "Illegal scheme character");
        if (65 <= codeUnit && codeUnit <= 90)
          containsUpperCase = true;
      }
      scheme = B.JSString_methods.substring$2(scheme, start, end);
      return A._Uri__canonicalizeScheme(containsUpperCase ? scheme.toLowerCase() : scheme);
    },
    _Uri__canonicalizeScheme(scheme) {
      if (scheme === "http")
        return "http";
      if (scheme === "file")
        return "file";
      if (scheme === "https")
        return "https";
      if (scheme === "package")
        return "package";
      return scheme;
    },
    _Uri__makeUserInfo(userInfo, start, end) {
      if (userInfo == null)
        return "";
      return A._Uri__normalizeOrSubstring(userInfo, start, end, B.List_OL3, false, false);
    },
    _Uri__makePath(path, start, end, pathSegments, scheme, hasAuthority) {
      var t1, result,
        isFile = scheme === "file",
        ensureLeadingSlash = isFile || hasAuthority;
      if (path == null) {
        if (pathSegments == null)
          return isFile ? "/" : "";
        t1 = A._arrayInstanceType(pathSegments);
        result = new A.MappedListIterable(pathSegments, t1._eval$1("String(1)")._as(new A._Uri__makePath_closure()), t1._eval$1("MappedListIterable<1,String>")).join$1(0, "/");
      } else if (pathSegments != null)
        throw A.wrapException(A.ArgumentError$("Both path and pathSegments specified", null));
      else
        result = A._Uri__normalizeOrSubstring(path, start, end, B.List_XRg, true, true);
      if (result.length === 0) {
        if (isFile)
          return "/";
      } else if (ensureLeadingSlash && !B.JSString_methods.startsWith$1(result, "/"))
        result = "/" + result;
      return A._Uri__normalizePath(result, scheme, hasAuthority);
    },
    _Uri__normalizePath(path, scheme, hasAuthority) {
      var t1 = scheme.length === 0;
      if (t1 && !hasAuthority && !B.JSString_methods.startsWith$1(path, "/") && !B.JSString_methods.startsWith$1(path, "\\"))
        return A._Uri__normalizeRelativePath(path, !t1 || hasAuthority);
      return A._Uri__removeDotSegments(path);
    },
    _Uri__makeQuery(query, start, end, queryParameters) {
      if (query != null)
        return A._Uri__normalizeOrSubstring(query, start, end, B.List_oFp, true, false);
      return null;
    },
    _Uri__makeFragment(fragment, start, end) {
      if (fragment == null)
        return null;
      return A._Uri__normalizeOrSubstring(fragment, start, end, B.List_oFp, true, false);
    },
    _Uri__normalizeEscape(source, index, lowerCase) {
      var t3, firstDigit, secondDigit, firstDigitValue, secondDigitValue, value,
        t1 = index + 2,
        t2 = source.length;
      if (t1 >= t2)
        return "%";
      t3 = index + 1;
      if (!(t3 >= 0 && t3 < t2))
        return A.ioore(source, t3);
      firstDigit = source.charCodeAt(t3);
      if (!(t1 >= 0))
        return A.ioore(source, t1);
      secondDigit = source.charCodeAt(t1);
      firstDigitValue = A.hexDigitValue(firstDigit);
      secondDigitValue = A.hexDigitValue(secondDigit);
      if (firstDigitValue < 0 || secondDigitValue < 0)
        return "%";
      value = firstDigitValue * 16 + secondDigitValue;
      if (value < 127) {
        t1 = B.JSInt_methods._shrOtherPositive$1(value, 4);
        if (!(t1 < 8))
          return A.ioore(B.List_M1A, t1);
        t1 = (B.List_M1A[t1] & 1 << (value & 15)) !== 0;
      } else
        t1 = false;
      if (t1)
        return A.Primitives_stringFromCharCode(lowerCase && 65 <= value && 90 >= value ? (value | 32) >>> 0 : value);
      if (firstDigit >= 97 || secondDigit >= 97)
        return B.JSString_methods.substring$2(source, index, index + 3).toUpperCase();
      return null;
    },
    _Uri__escapeChar(char) {
      var codeUnits, t1, flag, encodedBytes, index, byte, t2, t3,
        _s16_ = "0123456789ABCDEF";
      if (char < 128) {
        codeUnits = new Uint8Array(3);
        codeUnits[0] = 37;
        t1 = char >>> 4;
        if (!(t1 < 16))
          return A.ioore(_s16_, t1);
        codeUnits[1] = _s16_.charCodeAt(t1);
        codeUnits[2] = _s16_.charCodeAt(char & 15);
      } else {
        if (char > 2047)
          if (char > 65535) {
            flag = 240;
            encodedBytes = 4;
          } else {
            flag = 224;
            encodedBytes = 3;
          }
        else {
          flag = 192;
          encodedBytes = 2;
        }
        t1 = 3 * encodedBytes;
        codeUnits = new Uint8Array(t1);
        for (index = 0; --encodedBytes, encodedBytes >= 0; flag = 128) {
          byte = B.JSInt_methods._shrReceiverPositive$1(char, 6 * encodedBytes) & 63 | flag;
          if (!(index < t1))
            return A.ioore(codeUnits, index);
          codeUnits[index] = 37;
          t2 = index + 1;
          t3 = byte >>> 4;
          if (!(t3 < 16))
            return A.ioore(_s16_, t3);
          if (!(t2 < t1))
            return A.ioore(codeUnits, t2);
          codeUnits[t2] = _s16_.charCodeAt(t3);
          t3 = index + 2;
          if (!(t3 < t1))
            return A.ioore(codeUnits, t3);
          codeUnits[t3] = _s16_.charCodeAt(byte & 15);
          index += 3;
        }
      }
      return A.String_String$fromCharCodes(codeUnits, 0, null);
    },
    _Uri__normalizeOrSubstring(component, start, end, charTable, escapeDelimiters, replaceBackslash) {
      var t1 = A._Uri__normalize(component, start, end, charTable, escapeDelimiters, replaceBackslash);
      return t1 == null ? B.JSString_methods.substring$2(component, start, end) : t1;
    },
    _Uri__normalize(component, start, end, charTable, escapeDelimiters, replaceBackslash) {
      var t1, t2, index, sectionStart, buffer, char, t3, replacement, sourceLength, tail, t4, _null = null;
      for (t1 = !escapeDelimiters, t2 = component.length, index = start, sectionStart = index, buffer = _null; index < end;) {
        if (!(index >= 0 && index < t2))
          return A.ioore(component, index);
        char = component.charCodeAt(index);
        if (char < 127) {
          t3 = char >>> 4;
          if (!(t3 < 8))
            return A.ioore(charTable, t3);
          t3 = (charTable[t3] & 1 << (char & 15)) !== 0;
        } else
          t3 = false;
        if (t3)
          ++index;
        else {
          if (char === 37) {
            replacement = A._Uri__normalizeEscape(component, index, false);
            if (replacement == null) {
              index += 3;
              continue;
            }
            if ("%" === replacement) {
              replacement = "%25";
              sourceLength = 1;
            } else
              sourceLength = 3;
          } else if (char === 92 && replaceBackslash) {
            replacement = "/";
            sourceLength = 1;
          } else {
            if (t1)
              if (char <= 93) {
                t3 = char >>> 4;
                if (!(t3 < 8))
                  return A.ioore(B.List_YmH, t3);
                t3 = (B.List_YmH[t3] & 1 << (char & 15)) !== 0;
              } else
                t3 = false;
            else
              t3 = false;
            if (t3) {
              A._Uri__fail(component, index, "Invalid character");
              sourceLength = _null;
              replacement = sourceLength;
            } else {
              if ((char & 64512) === 55296) {
                t3 = index + 1;
                if (t3 < end) {
                  if (!(t3 < t2))
                    return A.ioore(component, t3);
                  tail = component.charCodeAt(t3);
                  if ((tail & 64512) === 56320) {
                    char = (char & 1023) << 10 | tail & 1023 | 65536;
                    sourceLength = 2;
                  } else
                    sourceLength = 1;
                } else
                  sourceLength = 1;
              } else
                sourceLength = 1;
              replacement = A._Uri__escapeChar(char);
            }
          }
          if (buffer == null) {
            buffer = new A.StringBuffer("");
            t3 = buffer;
          } else
            t3 = buffer;
          t4 = t3._contents += B.JSString_methods.substring$2(component, sectionStart, index);
          t3._contents = t4 + A.S(replacement);
          if (typeof sourceLength !== "number")
            return A.iae(sourceLength);
          index += sourceLength;
          sectionStart = index;
        }
      }
      if (buffer == null)
        return _null;
      if (sectionStart < end)
        buffer._contents += B.JSString_methods.substring$2(component, sectionStart, end);
      t1 = buffer._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    _Uri__mayContainDotSegments(path) {
      if (B.JSString_methods.startsWith$1(path, "."))
        return true;
      return B.JSString_methods.indexOf$1(path, "/.") !== -1;
    },
    _Uri__removeDotSegments(path) {
      var output, t1, t2, appendSlash, _i, segment, t3;
      if (!A._Uri__mayContainDotSegments(path))
        return path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (J.$eq$(segment, "..")) {
          t3 = output.length;
          if (t3 !== 0) {
            if (0 >= t3)
              return A.ioore(output, -1);
            output.pop();
            if (output.length === 0)
              B.JSArray_methods.add$1(output, "");
          }
          appendSlash = true;
        } else if ("." === segment)
          appendSlash = true;
        else {
          B.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      if (appendSlash)
        B.JSArray_methods.add$1(output, "");
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__normalizeRelativePath(path, allowScheme) {
      var output, t1, t2, appendSlash, _i, segment;
      if (!A._Uri__mayContainDotSegments(path))
        return !allowScheme ? A._Uri__escapeScheme(path) : path;
      output = A._setArrayType([], type$.JSArray_String);
      for (t1 = path.split("/"), t2 = t1.length, appendSlash = false, _i = 0; _i < t2; ++_i) {
        segment = t1[_i];
        if (".." === segment)
          if (output.length !== 0 && B.JSArray_methods.get$last(output) !== "..") {
            if (0 >= output.length)
              return A.ioore(output, -1);
            output.pop();
            appendSlash = true;
          } else {
            B.JSArray_methods.add$1(output, "..");
            appendSlash = false;
          }
        else if ("." === segment)
          appendSlash = true;
        else {
          B.JSArray_methods.add$1(output, segment);
          appendSlash = false;
        }
      }
      t1 = output.length;
      if (t1 !== 0)
        if (t1 === 1) {
          if (0 >= t1)
            return A.ioore(output, 0);
          t1 = output[0].length === 0;
        } else
          t1 = false;
      else
        t1 = true;
      if (t1)
        return "./";
      if (appendSlash || B.JSArray_methods.get$last(output) === "..")
        B.JSArray_methods.add$1(output, "");
      if (!allowScheme) {
        if (0 >= output.length)
          return A.ioore(output, 0);
        B.JSArray_methods.$indexSet(output, 0, A._Uri__escapeScheme(output[0]));
      }
      return B.JSArray_methods.join$1(output, "/");
    },
    _Uri__escapeScheme(path) {
      var i, char, t2,
        t1 = path.length;
      if (t1 >= 2 && A._Uri__isAlphabeticCharacter(path.charCodeAt(0)))
        for (i = 1; i < t1; ++i) {
          char = path.charCodeAt(i);
          if (char === 58)
            return B.JSString_methods.substring$2(path, 0, i) + "%3A" + B.JSString_methods.substring$1(path, i + 1);
          if (char <= 127) {
            t2 = char >>> 4;
            if (!(t2 < 8))
              return A.ioore(B.List_MMm, t2);
            t2 = (B.List_MMm[t2] & 1 << (char & 15)) === 0;
          } else
            t2 = true;
          if (t2)
            break;
        }
      return path;
    },
    _Uri__isAlphabeticCharacter(codeUnit) {
      var lowerCase = codeUnit | 32;
      return 97 <= lowerCase && lowerCase <= 122;
    },
    UriData__parse(text, start, sourceUri) {
      var t1, i, slashIndex, char, equalsIndex, lastSeparator, t2, data,
        _s17_ = "Invalid MIME type",
        indices = A._setArrayType([start - 1], type$.JSArray_int);
      for (t1 = text.length, i = start, slashIndex = -1, char = null; i < t1; ++i) {
        char = text.charCodeAt(i);
        if (char === 44 || char === 59)
          break;
        if (char === 47) {
          if (slashIndex < 0) {
            slashIndex = i;
            continue;
          }
          throw A.wrapException(A.FormatException$(_s17_, text, i));
        }
      }
      if (slashIndex < 0 && i > start)
        throw A.wrapException(A.FormatException$(_s17_, text, i));
      for (; char !== 44;) {
        B.JSArray_methods.add$1(indices, i);
        ++i;
        for (equalsIndex = -1; i < t1; ++i) {
          if (!(i >= 0))
            return A.ioore(text, i);
          char = text.charCodeAt(i);
          if (char === 61) {
            if (equalsIndex < 0)
              equalsIndex = i;
          } else if (char === 59 || char === 44)
            break;
        }
        if (equalsIndex >= 0)
          B.JSArray_methods.add$1(indices, equalsIndex);
        else {
          lastSeparator = B.JSArray_methods.get$last(indices);
          if (char !== 44 || i !== lastSeparator + 7 || !B.JSString_methods.startsWith$2(text, "base64", lastSeparator + 1))
            throw A.wrapException(A.FormatException$("Expecting '='", text, i));
          break;
        }
      }
      B.JSArray_methods.add$1(indices, i);
      t2 = i + 1;
      if ((indices.length & 1) === 1)
        text = B.C_Base64Codec.normalize$3(0, text, t2, t1);
      else {
        data = A._Uri__normalize(text, t2, t1, B.List_oFp, true, false);
        if (data != null)
          text = B.JSString_methods.replaceRange$3(text, t2, t1, data);
      }
      return new A.UriData(text, indices, sourceUri);
    },
    _createTables() {
      var _i, t1, t2, t3, b,
        _s77_ = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$&'()*+,;=",
        _s1_ = ".", _s1_0 = ":", _s1_1 = "/", _s1_2 = "\\", _s1_3 = "?", _s1_4 = "#", _s2_ = "/\\",
        tables = J.JSArray_JSArray$allocateGrowable(22, type$.Uint8List);
      for (_i = 0; _i < 22; ++_i)
        tables[_i] = new Uint8Array(96);
      t1 = new A._createTables_build(tables);
      t2 = new A._createTables_setChars();
      t3 = new A._createTables_setRange();
      b = t1.call$2(0, 225);
      t2.call$3(b, _s77_, 1);
      t2.call$3(b, _s1_, 14);
      t2.call$3(b, _s1_0, 34);
      t2.call$3(b, _s1_1, 3);
      t2.call$3(b, _s1_2, 227);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(14, 225);
      t2.call$3(b, _s77_, 1);
      t2.call$3(b, _s1_, 15);
      t2.call$3(b, _s1_0, 34);
      t2.call$3(b, _s2_, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(15, 225);
      t2.call$3(b, _s77_, 1);
      t2.call$3(b, "%", 225);
      t2.call$3(b, _s1_0, 34);
      t2.call$3(b, _s1_1, 9);
      t2.call$3(b, _s1_2, 233);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(1, 225);
      t2.call$3(b, _s77_, 1);
      t2.call$3(b, _s1_0, 34);
      t2.call$3(b, _s1_1, 10);
      t2.call$3(b, _s1_2, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(2, 235);
      t2.call$3(b, _s77_, 139);
      t2.call$3(b, _s1_1, 131);
      t2.call$3(b, _s1_2, 131);
      t2.call$3(b, _s1_, 146);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(3, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s1_1, 68);
      t2.call$3(b, _s1_2, 68);
      t2.call$3(b, _s1_, 18);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(4, 229);
      t2.call$3(b, _s77_, 5);
      t3.call$3(b, "AZ", 229);
      t2.call$3(b, _s1_0, 102);
      t2.call$3(b, "@", 68);
      t2.call$3(b, "[", 232);
      t2.call$3(b, _s1_1, 138);
      t2.call$3(b, _s1_2, 138);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(5, 229);
      t2.call$3(b, _s77_, 5);
      t3.call$3(b, "AZ", 229);
      t2.call$3(b, _s1_0, 102);
      t2.call$3(b, "@", 68);
      t2.call$3(b, _s1_1, 138);
      t2.call$3(b, _s1_2, 138);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(6, 231);
      t3.call$3(b, "19", 7);
      t2.call$3(b, "@", 68);
      t2.call$3(b, _s1_1, 138);
      t2.call$3(b, _s1_2, 138);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(7, 231);
      t3.call$3(b, "09", 7);
      t2.call$3(b, "@", 68);
      t2.call$3(b, _s1_1, 138);
      t2.call$3(b, _s1_2, 138);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      t2.call$3(t1.call$2(8, 8), "]", 5);
      b = t1.call$2(9, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s1_, 16);
      t2.call$3(b, _s2_, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(16, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s1_, 17);
      t2.call$3(b, _s2_, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(17, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s1_1, 9);
      t2.call$3(b, _s1_2, 233);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(10, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s1_, 18);
      t2.call$3(b, _s1_1, 10);
      t2.call$3(b, _s1_2, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(18, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s1_, 19);
      t2.call$3(b, _s2_, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(19, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s2_, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(11, 235);
      t2.call$3(b, _s77_, 11);
      t2.call$3(b, _s1_1, 10);
      t2.call$3(b, _s1_2, 234);
      t2.call$3(b, _s1_3, 172);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(12, 236);
      t2.call$3(b, _s77_, 12);
      t2.call$3(b, _s1_3, 12);
      t2.call$3(b, _s1_4, 205);
      b = t1.call$2(13, 237);
      t2.call$3(b, _s77_, 13);
      t2.call$3(b, _s1_3, 13);
      t3.call$3(t1.call$2(20, 245), "az", 21);
      b = t1.call$2(21, 245);
      t3.call$3(b, "az", 21);
      t3.call$3(b, "09", 21);
      t2.call$3(b, "+-.", 21);
      return tables;
    },
    _scan(uri, start, end, state, indices) {
      var t1, i, table, char, transition,
        tables = $.$get$_scannerTables();
      for (t1 = uri.length, i = start; i < end; ++i) {
        if (!(state >= 0 && state < tables.length))
          return A.ioore(tables, state);
        table = tables[state];
        if (!(i < t1))
          return A.ioore(uri, i);
        char = uri.charCodeAt(i) ^ 96;
        transition = table[char > 95 ? 31 : char];
        state = transition & 31;
        B.JSArray_methods.$indexSet(indices, transition >>> 5, i);
      }
      return state;
    },
    _caseInsensitiveCompareStart(prefix, string, start) {
      var t1, t2, result, i, t3, stringChar, delta, lowerChar;
      for (t1 = prefix.length, t2 = string.length, result = 0, i = 0; i < t1; ++i) {
        t3 = start + i;
        if (!(t3 < t2))
          return A.ioore(string, t3);
        stringChar = string.charCodeAt(t3);
        delta = prefix.charCodeAt(i) ^ stringChar;
        if (delta !== 0) {
          if (delta === 32) {
            lowerChar = stringChar | delta;
            if (97 <= lowerChar && lowerChar <= 122) {
              result = 32;
              continue;
            }
          }
          return -1;
        }
      }
      return result;
    },
    _BigIntImpl: function _BigIntImpl(t0, t1, t2) {
      this._isNegative = t0;
      this._digits = t1;
      this._used = t2;
    },
    _BigIntImpl_hashCode_combine: function _BigIntImpl_hashCode_combine() {
    },
    _BigIntImpl_hashCode_finish: function _BigIntImpl_hashCode_finish() {
    },
    _symbolMapToStringMap_closure: function _symbolMapToStringMap_closure(t0) {
      this.result = t0;
    },
    NoSuchMethodError_toString_closure: function NoSuchMethodError_toString_closure(t0, t1) {
      this._box_0 = t0;
      this.sb = t1;
    },
    DateTime: function DateTime(t0, t1) {
      this._value = t0;
      this.isUtc = t1;
    },
    Duration: function Duration(t0) {
      this._duration = t0;
    },
    Error: function Error() {
    },
    AssertionError: function AssertionError(t0) {
      this.message = t0;
    },
    TypeError: function TypeError() {
    },
    ArgumentError: function ArgumentError(t0, t1, t2, t3) {
      var _ = this;
      _._hasValue = t0;
      _.invalidValue = t1;
      _.name = t2;
      _.message = t3;
    },
    RangeError: function RangeError(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _.start = t0;
      _.end = t1;
      _._hasValue = t2;
      _.invalidValue = t3;
      _.name = t4;
      _.message = t5;
    },
    IndexError: function IndexError(t0, t1, t2, t3, t4) {
      var _ = this;
      _.length = t0;
      _._hasValue = t1;
      _.invalidValue = t2;
      _.name = t3;
      _.message = t4;
    },
    NoSuchMethodError: function NoSuchMethodError(t0, t1, t2, t3) {
      var _ = this;
      _._core$_receiver = t0;
      _._core$_memberName = t1;
      _._core$_arguments = t2;
      _._namedArguments = t3;
    },
    UnsupportedError: function UnsupportedError(t0) {
      this.message = t0;
    },
    UnimplementedError: function UnimplementedError(t0) {
      this.message = t0;
    },
    StateError: function StateError(t0) {
      this.message = t0;
    },
    ConcurrentModificationError: function ConcurrentModificationError(t0) {
      this.modifiedObject = t0;
    },
    OutOfMemoryError: function OutOfMemoryError() {
    },
    StackOverflowError: function StackOverflowError() {
    },
    _Exception: function _Exception(t0) {
      this.message = t0;
    },
    FormatException: function FormatException(t0, t1, t2) {
      this.message = t0;
      this.source = t1;
      this.offset = t2;
    },
    IntegerDivisionByZeroException: function IntegerDivisionByZeroException() {
    },
    Iterable: function Iterable() {
    },
    Null: function Null() {
    },
    Object: function Object() {
    },
    _StringStackTrace: function _StringStackTrace(t0) {
      this._stackTrace = t0;
    },
    StringBuffer: function StringBuffer(t0) {
      this._contents = t0;
    },
    Uri__parseIPv4Address_error: function Uri__parseIPv4Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_error: function Uri_parseIPv6Address_error(t0) {
      this.host = t0;
    },
    Uri_parseIPv6Address_parseHex: function Uri_parseIPv6Address_parseHex(t0, t1) {
      this.error = t0;
      this.host = t1;
    },
    _Uri: function _Uri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode_FI = _.___Uri_pathSegments_FI = _.___Uri__text_FI = $;
    },
    _Uri__makePath_closure: function _Uri__makePath_closure() {
    },
    UriData: function UriData(t0, t1, t2) {
      this._text = t0;
      this._separatorIndices = t1;
      this._uriCache = t2;
    },
    _createTables_build: function _createTables_build(t0) {
      this.tables = t0;
    },
    _createTables_setChars: function _createTables_setChars() {
    },
    _createTables_setRange: function _createTables_setRange() {
    },
    _SimpleUri: function _SimpleUri(t0, t1, t2, t3, t4, t5, t6, t7) {
      var _ = this;
      _._uri = t0;
      _._schemeEnd = t1;
      _._hostStart = t2;
      _._portStart = t3;
      _._pathStart = t4;
      _._queryStart = t5;
      _._fragmentStart = t6;
      _._schemeCache = t7;
      _._hashCodeCache = null;
    },
    _DataUri: function _DataUri(t0, t1, t2, t3, t4, t5, t6) {
      var _ = this;
      _.scheme = t0;
      _._userInfo = t1;
      _._host = t2;
      _._port = t3;
      _.path = t4;
      _._query = t5;
      _._fragment = t6;
      _.___Uri_hashCode_FI = _.___Uri_pathSegments_FI = _.___Uri__text_FI = $;
    },
    Expando: function Expando(t0, t1) {
      this._jsWeakMap = t0;
      this.$ti = t1;
    },
    CustomEvent_CustomEvent(type, detail) {
      var e, t1, exception,
        canBubble = true,
        cancelable = true;
      detail = detail;
      t1 = document.createEvent("CustomEvent");
      t1.toString;
      e = type$.CustomEvent._as(t1);
      e._dartDetail = detail;
      if (type$.List_dynamic._is(detail) || type$.Map_dynamic_dynamic._is(detail) || typeof detail == "string" || typeof detail == "number")
        try {
          detail = new A._StructuredCloneDart2Js([], []).walk$1(detail);
          J._initCustomEvent$4$x(e, type, canBubble, cancelable, detail);
        } catch (exception) {
          J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
        }
      else
        J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
      return e;
    },
    Element_Element$html(html, treeSanitizer, validator) {
      var t2,
        t1 = document.body;
      t1.toString;
      t2 = type$._ChildNodeListLazy;
      return type$.Element._as(new A.WhereIterable(new A._ChildNodeListLazy(B.BodyElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator)), t2._eval$1("bool(ListBase.E)")._as(new A.Element_Element$html_closure()), t2._eval$1("WhereIterable<ListBase.E>")).get$single(0));
    },
    Element__safeTagName(element) {
      var t1, exception,
        result = "element tag unavailable";
      try {
        t1 = element.tagName;
        t1.toString;
        result = t1;
      } catch (exception) {
      }
      return result;
    },
    EventSource__factoryEventSource(url, eventSourceInitDict) {
      var t1 = new EventSource(url, A.convertDartToNative_Dictionary(eventSourceInitDict));
      t1.toString;
      return t1;
    },
    HttpRequest_request(url, method, responseType, withCredentials) {
      var t3, t4,
        t1 = new A._Future($.Zone__current, type$._Future_HttpRequest),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_HttpRequest),
        t2 = new XMLHttpRequest();
      t2.toString;
      B.HttpRequest_methods.open$3$async(t2, method, url, true);
      if (withCredentials != null)
        B.HttpRequest_methods.set$withCredentials(t2, withCredentials);
      if (responseType != null)
        t2.responseType = responseType;
      t3 = type$.nullable_void_Function_ProgressEvent;
      t4 = type$.ProgressEvent;
      A._EventStreamSubscription$(t2, "load", t3._as(new A.HttpRequest_request_closure(t2, completer)), false, t4);
      A._EventStreamSubscription$(t2, "error", t3._as(completer.get$completeError()), false, t4);
      t2.send();
      return t1;
    },
    ScriptElement___new_tearOff() {
      var t1 = document.createElement("script");
      t1.toString;
      return t1;
    },
    WebSocket_WebSocket(url, protocols) {
      var t1 = new WebSocket(url);
      t1.toString;
      return t1;
    },
    _EventStreamSubscription$(_target, _eventType, onData, _useCapture, $T) {
      var t1 = onData == null ? null : A._wrapZone(new A._EventStreamSubscription_closure(onData), type$.Event);
      t1 = new A._EventStreamSubscription(_target, _eventType, t1, false, $T._eval$1("_EventStreamSubscription<0>"));
      t1._tryResume$0();
      return t1;
    },
    _Html5NodeValidator$(uriPolicy) {
      var t1 = document.createElement("a");
      t1.toString;
      t1 = new A._SameOriginUriPolicy(t1, type$.Location._as(window.location));
      t1 = new A._Html5NodeValidator(t1);
      t1._Html5NodeValidator$1$uriPolicy(uriPolicy);
      return t1;
    },
    _Html5NodeValidator__standardAttributeValidator(element, attributeName, value, context) {
      type$.Element._as(element);
      A._asString(attributeName);
      A._asString(value);
      type$._Html5NodeValidator._as(context);
      return true;
    },
    _Html5NodeValidator__uriAttributeValidator(element, attributeName, value, context) {
      var t1, t2, t3, t4, t5;
      type$.Element._as(element);
      A._asString(attributeName);
      A._asString(value);
      t1 = type$._Html5NodeValidator._as(context).uriPolicy;
      t2 = t1._hiddenAnchor;
      B.AnchorElement_methods.set$href(t2, value);
      t3 = t2.hostname;
      t1 = t1._loc;
      if (t3 == t1.hostname) {
        t4 = t2.port;
        t5 = t1.port;
        t5.toString;
        if (t4 === t5) {
          t4 = t2.protocol;
          t1 = t1.protocol;
          t1.toString;
          t1 = t4 === t1;
        } else
          t1 = false;
      } else
        t1 = false;
      if (!t1)
        if (t3 === "")
          if (t2.port === "") {
            t1 = t2.protocol;
            t1 = t1 === ":" || t1 === "";
          } else
            t1 = false;
        else
          t1 = false;
      else
        t1 = true;
      return t1;
    },
    _TemplatingNodeValidator$() {
      var t1 = type$.String,
        t2 = A.LinkedHashSet_LinkedHashSet$from(B.List_AuK, t1),
        t3 = A._setArrayType(["TEMPLATE"], type$.JSArray_String),
        t4 = type$.String_Function_String._as(new A._TemplatingNodeValidator_closure());
      t1 = new A._TemplatingNodeValidator(t2, A.LinkedHashSet_LinkedHashSet(t1), A.LinkedHashSet_LinkedHashSet(t1), A.LinkedHashSet_LinkedHashSet(t1), null);
      t1._SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes(null, new A.MappedListIterable(B.List_AuK, t4, type$.MappedListIterable_String_String), t3, null);
      return t1;
    },
    _convertNativeToDart_XHR_Response(o) {
      if (type$.Document._is(o))
        return o;
      return new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(o, true);
    },
    _DOMWindowCrossFrame__createSafe(w) {
      var t1 = window;
      t1.toString;
      if (w === t1)
        return type$.WindowBase._as(w);
      else
        return new A._DOMWindowCrossFrame();
    },
    _wrapZone(callback, $T) {
      var t1 = $.Zone__current;
      if (t1 === B.C__RootZone)
        return callback;
      return t1.bindUnaryCallbackGuarded$1$1(callback, $T);
    },
    HtmlElement: function HtmlElement() {
    },
    AccessibleNodeList: function AccessibleNodeList() {
    },
    AnchorElement: function AnchorElement() {
    },
    AreaElement: function AreaElement() {
    },
    BaseElement: function BaseElement() {
    },
    Blob: function Blob() {
    },
    BodyElement: function BodyElement() {
    },
    CharacterData: function CharacterData() {
    },
    CloseEvent: function CloseEvent() {
    },
    CssPerspective: function CssPerspective() {
    },
    CssRule: function CssRule() {
    },
    CssStyleDeclaration: function CssStyleDeclaration() {
    },
    CssStyleDeclarationBase: function CssStyleDeclarationBase() {
    },
    CssStyleValue: function CssStyleValue() {
    },
    CssTransformComponent: function CssTransformComponent() {
    },
    CssTransformValue: function CssTransformValue() {
    },
    CssUnparsedValue: function CssUnparsedValue() {
    },
    CustomEvent: function CustomEvent() {
    },
    DataTransferItemList: function DataTransferItemList() {
    },
    Document: function Document() {
    },
    DomException: function DomException() {
    },
    DomImplementation: function DomImplementation() {
    },
    DomRectList: function DomRectList() {
    },
    DomRectReadOnly: function DomRectReadOnly() {
    },
    DomStringList: function DomStringList() {
    },
    DomTokenList: function DomTokenList() {
    },
    _FrozenElementList: function _FrozenElementList(t0, t1) {
      this._nodeList = t0;
      this.$ti = t1;
    },
    Element: function Element() {
    },
    Element_Element$html_closure: function Element_Element$html_closure() {
    },
    Event: function Event() {
    },
    EventSource: function EventSource() {
    },
    EventTarget: function EventTarget() {
    },
    File: function File() {
    },
    FileList: function FileList() {
    },
    FileWriter: function FileWriter() {
    },
    FormElement: function FormElement() {
    },
    Gamepad: function Gamepad() {
    },
    History: function History() {
    },
    HtmlCollection: function HtmlCollection() {
    },
    HtmlDocument: function HtmlDocument() {
    },
    HttpRequest: function HttpRequest() {
    },
    HttpRequest_request_closure: function HttpRequest_request_closure(t0, t1) {
      this.xhr = t0;
      this.completer = t1;
    },
    HttpRequestEventTarget: function HttpRequestEventTarget() {
    },
    ImageData: function ImageData() {
    },
    KeyboardEvent: function KeyboardEvent() {
    },
    Location: function Location() {
    },
    MediaList: function MediaList() {
    },
    MessageEvent: function MessageEvent() {
    },
    MessagePort: function MessagePort() {
    },
    MidiInputMap: function MidiInputMap() {
    },
    MidiInputMap_keys_closure: function MidiInputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MidiOutputMap: function MidiOutputMap() {
    },
    MidiOutputMap_keys_closure: function MidiOutputMap_keys_closure(t0) {
      this.keys = t0;
    },
    MimeType: function MimeType() {
    },
    MimeTypeArray: function MimeTypeArray() {
    },
    _ChildNodeListLazy: function _ChildNodeListLazy(t0) {
      this._this = t0;
    },
    Node: function Node() {
    },
    NodeList: function NodeList() {
    },
    Plugin: function Plugin() {
    },
    PluginArray: function PluginArray() {
    },
    ProgressEvent: function ProgressEvent() {
    },
    RtcStatsReport: function RtcStatsReport() {
    },
    RtcStatsReport_keys_closure: function RtcStatsReport_keys_closure(t0) {
      this.keys = t0;
    },
    ScriptElement: function ScriptElement() {
    },
    SelectElement: function SelectElement() {
    },
    SharedArrayBuffer: function SharedArrayBuffer() {
    },
    SourceBuffer: function SourceBuffer() {
    },
    SourceBufferList: function SourceBufferList() {
    },
    SpeechGrammar: function SpeechGrammar() {
    },
    SpeechGrammarList: function SpeechGrammarList() {
    },
    SpeechRecognitionResult: function SpeechRecognitionResult() {
    },
    Storage: function Storage() {
    },
    Storage_keys_closure: function Storage_keys_closure(t0) {
      this.keys = t0;
    },
    StyleSheet: function StyleSheet() {
    },
    TableElement: function TableElement() {
    },
    TableRowElement: function TableRowElement() {
    },
    TableSectionElement: function TableSectionElement() {
    },
    TemplateElement: function TemplateElement() {
    },
    TextTrack: function TextTrack() {
    },
    TextTrackCue: function TextTrackCue() {
    },
    TextTrackCueList: function TextTrackCueList() {
    },
    TextTrackList: function TextTrackList() {
    },
    TimeRanges: function TimeRanges() {
    },
    Touch: function Touch() {
    },
    TouchList: function TouchList() {
    },
    TrackDefaultList: function TrackDefaultList() {
    },
    UIEvent: function UIEvent() {
    },
    Url: function Url() {
    },
    VideoTrackList: function VideoTrackList() {
    },
    WebSocket: function WebSocket() {
    },
    Window: function Window() {
    },
    WorkerGlobalScope: function WorkerGlobalScope() {
    },
    _Attr: function _Attr() {
    },
    _CssRuleList: function _CssRuleList() {
    },
    _DomRect: function _DomRect() {
    },
    _GamepadList: function _GamepadList() {
    },
    _NamedNodeMap: function _NamedNodeMap() {
    },
    _SpeechRecognitionResultList: function _SpeechRecognitionResultList() {
    },
    _StyleSheetList: function _StyleSheetList() {
    },
    _AttributeMap: function _AttributeMap() {
    },
    _ElementAttributeMap: function _ElementAttributeMap(t0) {
      this._element = t0;
    },
    EventStreamProvider: function EventStreamProvider(t0, t1) {
      this._eventType = t0;
      this.$ti = t1;
    },
    _EventStream: function _EventStream(t0, t1, t2, t3) {
      var _ = this;
      _._target = t0;
      _._eventType = t1;
      _._useCapture = t2;
      _.$ti = t3;
    },
    _EventStreamSubscription: function _EventStreamSubscription(t0, t1, t2, t3, t4) {
      var _ = this;
      _._pauseCount = 0;
      _._target = t0;
      _._eventType = t1;
      _._onData = t2;
      _._useCapture = t3;
      _.$ti = t4;
    },
    _EventStreamSubscription_closure: function _EventStreamSubscription_closure(t0) {
      this.onData = t0;
    },
    _EventStreamSubscription_onData_closure: function _EventStreamSubscription_onData_closure(t0) {
      this.handleData = t0;
    },
    _Html5NodeValidator: function _Html5NodeValidator(t0) {
      this.uriPolicy = t0;
    },
    ImmutableListMixin: function ImmutableListMixin() {
    },
    NodeValidatorBuilder: function NodeValidatorBuilder(t0) {
      this._validators = t0;
    },
    NodeValidatorBuilder_allowsElement_closure: function NodeValidatorBuilder_allowsElement_closure(t0) {
      this.element = t0;
    },
    NodeValidatorBuilder_allowsAttribute_closure: function NodeValidatorBuilder_allowsAttribute_closure(t0, t1, t2) {
      this.element = t0;
      this.attributeName = t1;
      this.value = t2;
    },
    _SimpleNodeValidator: function _SimpleNodeValidator() {
    },
    _SimpleNodeValidator_closure: function _SimpleNodeValidator_closure() {
    },
    _SimpleNodeValidator_closure0: function _SimpleNodeValidator_closure0() {
    },
    _TemplatingNodeValidator: function _TemplatingNodeValidator(t0, t1, t2, t3, t4) {
      var _ = this;
      _._templateAttrs = t0;
      _.allowedElements = t1;
      _.allowedAttributes = t2;
      _.allowedUriAttributes = t3;
      _.uriPolicy = t4;
    },
    _TemplatingNodeValidator_closure: function _TemplatingNodeValidator_closure() {
    },
    _SvgNodeValidator: function _SvgNodeValidator() {
    },
    FixedSizeListIterator: function FixedSizeListIterator(t0, t1, t2) {
      var _ = this;
      _._array = t0;
      _._html$_length = t1;
      _._position = -1;
      _._current = null;
      _.$ti = t2;
    },
    _DOMWindowCrossFrame: function _DOMWindowCrossFrame() {
    },
    _SameOriginUriPolicy: function _SameOriginUriPolicy(t0, t1) {
      this._hiddenAnchor = t0;
      this._loc = t1;
    },
    _ValidatingTreeSanitizer: function _ValidatingTreeSanitizer(t0) {
      this.validator = t0;
      this.numTreeModifications = 0;
    },
    _ValidatingTreeSanitizer_sanitizeTree_walk: function _ValidatingTreeSanitizer_sanitizeTree_walk(t0) {
      this.$this = t0;
    },
    _CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase: function _CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase() {
    },
    _DomRectList_JavaScriptObject_ListMixin: function _DomRectList_JavaScriptObject_ListMixin() {
    },
    _DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin: function _DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _DomStringList_JavaScriptObject_ListMixin: function _DomStringList_JavaScriptObject_ListMixin() {
    },
    _DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin: function _DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _FileList_JavaScriptObject_ListMixin: function _FileList_JavaScriptObject_ListMixin() {
    },
    _FileList_JavaScriptObject_ListMixin_ImmutableListMixin: function _FileList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _HtmlCollection_JavaScriptObject_ListMixin: function _HtmlCollection_JavaScriptObject_ListMixin() {
    },
    _HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin: function _HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _MidiInputMap_JavaScriptObject_MapMixin: function _MidiInputMap_JavaScriptObject_MapMixin() {
    },
    _MidiOutputMap_JavaScriptObject_MapMixin: function _MidiOutputMap_JavaScriptObject_MapMixin() {
    },
    _MimeTypeArray_JavaScriptObject_ListMixin: function _MimeTypeArray_JavaScriptObject_ListMixin() {
    },
    _MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin: function _MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _NodeList_JavaScriptObject_ListMixin: function _NodeList_JavaScriptObject_ListMixin() {
    },
    _NodeList_JavaScriptObject_ListMixin_ImmutableListMixin: function _NodeList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _PluginArray_JavaScriptObject_ListMixin: function _PluginArray_JavaScriptObject_ListMixin() {
    },
    _PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin: function _PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _RtcStatsReport_JavaScriptObject_MapMixin: function _RtcStatsReport_JavaScriptObject_MapMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin: function _SourceBufferList_EventTarget_ListMixin() {
    },
    _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin: function _SourceBufferList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _SpeechGrammarList_JavaScriptObject_ListMixin: function _SpeechGrammarList_JavaScriptObject_ListMixin() {
    },
    _SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin: function _SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _Storage_JavaScriptObject_MapMixin: function _Storage_JavaScriptObject_MapMixin() {
    },
    _TextTrackCueList_JavaScriptObject_ListMixin: function _TextTrackCueList_JavaScriptObject_ListMixin() {
    },
    _TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin: function _TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin: function _TextTrackList_EventTarget_ListMixin() {
    },
    _TextTrackList_EventTarget_ListMixin_ImmutableListMixin: function _TextTrackList_EventTarget_ListMixin_ImmutableListMixin() {
    },
    _TouchList_JavaScriptObject_ListMixin: function _TouchList_JavaScriptObject_ListMixin() {
    },
    _TouchList_JavaScriptObject_ListMixin_ImmutableListMixin: function _TouchList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __CssRuleList_JavaScriptObject_ListMixin: function __CssRuleList_JavaScriptObject_ListMixin() {
    },
    __CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin: function __CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __GamepadList_JavaScriptObject_ListMixin: function __GamepadList_JavaScriptObject_ListMixin() {
    },
    __GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin: function __GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __NamedNodeMap_JavaScriptObject_ListMixin: function __NamedNodeMap_JavaScriptObject_ListMixin() {
    },
    __NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin: function __NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __SpeechRecognitionResultList_JavaScriptObject_ListMixin: function __SpeechRecognitionResultList_JavaScriptObject_ListMixin() {
    },
    __SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin: function __SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    __StyleSheetList_JavaScriptObject_ListMixin: function __StyleSheetList_JavaScriptObject_ListMixin() {
    },
    __StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin: function __StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _convertNativeToDart_Value(value) {
      var t1, values, i;
      if (value == null)
        return value;
      if (typeof value == "string" || typeof value == "number" || A._isBool(value))
        return value;
      if (A.isJavaScriptSimpleObject(value))
        return A.convertNativeToDart_Dictionary(value);
      t1 = Array.isArray(value);
      t1.toString;
      if (t1) {
        values = [];
        i = 0;
        while (true) {
          t1 = value.length;
          t1.toString;
          if (!(i < t1))
            break;
          values.push(A._convertNativeToDart_Value(value[i]));
          ++i;
        }
        return values;
      }
      return value;
    },
    convertNativeToDart_Dictionary(object) {
      var dict, keys, t1, _i, key, t2;
      if (object == null)
        return null;
      dict = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = Object.getOwnPropertyNames(object);
      for (t1 = keys.length, _i = 0; _i < keys.length; keys.length === t1 || (0, A.throwConcurrentModificationError)(keys), ++_i) {
        key = keys[_i];
        t2 = key;
        t2.toString;
        dict.$indexSet(0, t2, A._convertNativeToDart_Value(object[key]));
      }
      return dict;
    },
    _convertDartToNative_Value(value) {
      var array;
      if (value == null)
        return value;
      if (typeof value == "string" || typeof value == "number" || A._isBool(value))
        return value;
      if (type$.Map_dynamic_dynamic._is(value))
        return A.convertDartToNative_Dictionary(value);
      if (type$.List_dynamic._is(value)) {
        array = [];
        J.forEach$1$ax(value, new A._convertDartToNative_Value_closure(array));
        value = array;
      }
      return value;
    },
    convertDartToNative_Dictionary(dict) {
      var object = {};
      J.forEach$1$ax(dict, new A.convertDartToNative_Dictionary_closure(object));
      return object;
    },
    isJavaScriptSimpleObject(value) {
      var proto = Object.getPrototypeOf(value),
        t1 = proto === Object.prototype;
      t1.toString;
      if (!t1) {
        t1 = proto === null;
        t1.toString;
      } else
        t1 = true;
      return t1;
    },
    _StructuredClone: function _StructuredClone() {
    },
    _StructuredClone_walk_closure: function _StructuredClone_walk_closure(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _StructuredClone_walk_closure0: function _StructuredClone_walk_closure0(t0, t1) {
      this._box_0 = t0;
      this.$this = t1;
    },
    _AcceptStructuredClone: function _AcceptStructuredClone() {
    },
    _AcceptStructuredClone_walk_closure: function _AcceptStructuredClone_walk_closure(t0, t1) {
      this.$this = t0;
      this.map = t1;
    },
    _convertDartToNative_Value_closure: function _convertDartToNative_Value_closure(t0) {
      this.array = t0;
    },
    convertDartToNative_Dictionary_closure: function convertDartToNative_Dictionary_closure(t0) {
      this.object = t0;
    },
    _StructuredCloneDart2Js: function _StructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
    },
    _AcceptStructuredCloneDart2Js: function _AcceptStructuredCloneDart2Js(t0, t1) {
      this.values = t0;
      this.copies = t1;
      this.mustCopy = false;
    },
    KeyRange: function KeyRange() {
    },
    _callDartFunction(callback, captureThis, $self, $arguments) {
      var arguments0, t1, dartArgs;
      A._asBool(captureThis);
      type$.List_dynamic._as($arguments);
      if (captureThis) {
        arguments0 = [$self];
        B.JSArray_methods.addAll$1(arguments0, $arguments);
        $arguments = arguments0;
      }
      t1 = type$.dynamic;
      dartArgs = A.List_List$from(J.map$1$1$ax($arguments, A.js___convertToDart$closure(), t1), true, t1);
      return A._convertToJS(A.Function_apply(type$.Function._as(callback), dartArgs, null));
    },
    JsObject_JsObject$fromBrowserObject(object) {
      var t1 = false;
      if (t1)
        throw A.wrapException(A.ArgumentError$("object cannot be a num, string, bool, or null", null));
      return A._wrapToDart(A._convertToJS(object));
    },
    JsObject__convertDataTree(data) {
      return new A.JsObject__convertDataTree__convert(new A._IdentityHashMap(type$._IdentityHashMap_dynamic_dynamic)).call$1(data);
    },
    _castToJsObject(o) {
      return o;
    },
    _defineProperty(o, $name, value) {
      var exception;
      try {
        if (Object.isExtensible(o) && !Object.prototype.hasOwnProperty.call(o, $name)) {
          Object.defineProperty(o, $name, {value: value});
          return true;
        }
      } catch (exception) {
      }
      return false;
    },
    _getOwnProperty(o, $name) {
      if (Object.prototype.hasOwnProperty.call(o, $name))
        return o[$name];
      return null;
    },
    _convertToJS(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || A._isBool(o))
        return o;
      if (o instanceof A.JsObject)
        return o._jsObject;
      if (A.isBrowserObject(o))
        return o;
      if (type$.TypedData._is(o))
        return o;
      if (o instanceof A.DateTime)
        return A.Primitives_lazyAsJsDate(o);
      if (type$.Function._is(o))
        return A._getJsProxy(o, "$dart_jsFunction", new A._convertToJS_closure());
      return A._getJsProxy(o, "_$dart_jsObject", new A._convertToJS_closure0($.$get$_dartProxyCtor()));
    },
    _getJsProxy(o, propertyName, createProxy) {
      var jsProxy = A._getOwnProperty(o, propertyName);
      if (jsProxy == null) {
        jsProxy = createProxy.call$1(o);
        A._defineProperty(o, propertyName, jsProxy);
      }
      return jsProxy;
    },
    _convertToDart(o) {
      if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
        return o;
      else if (o instanceof Object && A.isBrowserObject(o))
        return o;
      else if (o instanceof Object && type$.TypedData._is(o))
        return o;
      else if (o instanceof Date)
        return A.DateTime$fromMillisecondsSinceEpoch(A._asInt(o.getTime()), false);
      else if (o.constructor === $.$get$_dartProxyCtor())
        return o.o;
      else
        return A._wrapToDart(o);
    },
    _wrapToDart(o) {
      if (typeof o == "function")
        return A._getDartProxy(o, $.$get$DART_CLOSURE_PROPERTY_NAME(), new A._wrapToDart_closure());
      if (o instanceof Array)
        return A._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new A._wrapToDart_closure0());
      return A._getDartProxy(o, $.$get$_DART_OBJECT_PROPERTY_NAME(), new A._wrapToDart_closure1());
    },
    _getDartProxy(o, propertyName, createProxy) {
      var dartProxy = A._getOwnProperty(o, propertyName);
      if (dartProxy == null || !(o instanceof Object)) {
        dartProxy = createProxy.call$1(o);
        A._defineProperty(o, propertyName, dartProxy);
      }
      return dartProxy;
    },
    JsObject__convertDataTree__convert: function JsObject__convertDataTree__convert(t0) {
      this._convertedObjects = t0;
    },
    _convertToJS_closure: function _convertToJS_closure() {
    },
    _convertToJS_closure0: function _convertToJS_closure0(t0) {
      this.ctor = t0;
    },
    _wrapToDart_closure: function _wrapToDart_closure() {
    },
    _wrapToDart_closure0: function _wrapToDart_closure0() {
    },
    _wrapToDart_closure1: function _wrapToDart_closure1() {
    },
    JsObject: function JsObject(t0) {
      this._jsObject = t0;
    },
    JsFunction: function JsFunction(t0) {
      this._jsObject = t0;
    },
    JsArray: function JsArray(t0, t1) {
      this._jsObject = t0;
      this.$ti = t1;
    },
    _JsArray_JsObject_ListMixin: function _JsArray_JsObject_ListMixin() {
    },
    _convertDartFunctionFast(f) {
      var ret,
        existing = f.$dart_jsFunction;
      if (existing != null)
        return existing;
      ret = function(_call, f) {
        return function() {
          return _call(f, Array.prototype.slice.apply(arguments));
        };
      }(A._callDartFunctionFast, f);
      ret[$.$get$DART_CLOSURE_PROPERTY_NAME()] = f;
      f.$dart_jsFunction = ret;
      return ret;
    },
    _callDartFunctionFast(callback, $arguments) {
      type$.List_dynamic._as($arguments);
      return A.Function_apply(type$.Function._as(callback), $arguments, null);
    },
    allowInterop(f, $F) {
      if (typeof f == "function")
        return f;
      else
        return $F._as(A._convertDartFunctionFast(f));
    },
    promiseToFuture(jsPromise, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new A._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      jsPromise.then(A.convertDartClosureToJS(new A.promiseToFuture_closure(completer, $T), 1), A.convertDartClosureToJS(new A.promiseToFuture_closure0(completer), 1));
      return t1;
    },
    promiseToFuture_closure: function promiseToFuture_closure(t0, t1) {
      this.completer = t0;
      this.T = t1;
    },
    promiseToFuture_closure0: function promiseToFuture_closure0(t0) {
      this.completer = t0;
    },
    NullRejectionException: function NullRejectionException(t0) {
      this.isUndefined = t0;
    },
    Random_Random(seed) {
      var t1;
      if (seed == null)
        t1 = B.C__JSRandom;
      else {
        t1 = new A._Random();
        t1._Random$1(seed);
      }
      return t1;
    },
    _JSRandom: function _JSRandom() {
    },
    _Random: function _Random() {
      this._hi = this._lo = 0;
    },
    Length: function Length() {
    },
    LengthList: function LengthList() {
    },
    Number: function Number() {
    },
    NumberList: function NumberList() {
    },
    PointList: function PointList() {
    },
    ScriptElement0: function ScriptElement0() {
    },
    StringList: function StringList() {
    },
    SvgElement: function SvgElement() {
    },
    Transform: function Transform() {
    },
    TransformList: function TransformList() {
    },
    _LengthList_JavaScriptObject_ListMixin: function _LengthList_JavaScriptObject_ListMixin() {
    },
    _LengthList_JavaScriptObject_ListMixin_ImmutableListMixin: function _LengthList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _NumberList_JavaScriptObject_ListMixin: function _NumberList_JavaScriptObject_ListMixin() {
    },
    _NumberList_JavaScriptObject_ListMixin_ImmutableListMixin: function _NumberList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _StringList_JavaScriptObject_ListMixin: function _StringList_JavaScriptObject_ListMixin() {
    },
    _StringList_JavaScriptObject_ListMixin_ImmutableListMixin: function _StringList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    _TransformList_JavaScriptObject_ListMixin: function _TransformList_JavaScriptObject_ListMixin() {
    },
    _TransformList_JavaScriptObject_ListMixin_ImmutableListMixin: function _TransformList_JavaScriptObject_ListMixin_ImmutableListMixin() {
    },
    AudioBuffer: function AudioBuffer() {
    },
    AudioParamMap: function AudioParamMap() {
    },
    AudioParamMap_keys_closure: function AudioParamMap_keys_closure(t0) {
      this.keys = t0;
    },
    AudioTrackList: function AudioTrackList() {
    },
    BaseAudioContext: function BaseAudioContext() {
    },
    OfflineAudioContext: function OfflineAudioContext() {
    },
    _AudioParamMap_JavaScriptObject_MapMixin: function _AudioParamMap_JavaScriptObject_MapMixin() {
    },
    AsyncMemoizer: function AsyncMemoizer(t0, t1) {
      this._async_memoizer$_completer = t0;
      this.$ti = t1;
    },
    DelegatingStreamSink: function DelegatingStreamSink() {
    },
    ErrorResult: function ErrorResult(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    ValueResult: function ValueResult(t0, t1) {
      this.value = t0;
      this.$ti = t1;
    },
    StreamQueue: function StreamQueue(t0, t1, t2, t3) {
      var _ = this;
      _._stream_queue$_source = t0;
      _._stream_queue$_subscription = null;
      _._isDone = false;
      _._eventsReceived = 0;
      _._eventQueue = t1;
      _._requestQueue = t2;
      _.$ti = t3;
    },
    StreamQueue__ensureListening_closure: function StreamQueue__ensureListening_closure(t0) {
      this.$this = t0;
    },
    StreamQueue__ensureListening_closure1: function StreamQueue__ensureListening_closure1(t0) {
      this.$this = t0;
    },
    StreamQueue__ensureListening_closure0: function StreamQueue__ensureListening_closure0(t0) {
      this.$this = t0;
    },
    _NextRequest: function _NextRequest(t0, t1) {
      this._stream_queue$_completer = t0;
      this.$ti = t1;
    },
    _HasNextRequest: function _HasNextRequest(t0, t1) {
      this._stream_queue$_completer = t0;
      this.$ti = t1;
    },
    hashObjects(objects) {
      return A._finish(B.JSArray_methods.fold$1$2(objects, 0, new A.hashObjects_closure(), type$.int));
    },
    _combine(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    _finish(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    hashObjects_closure: function hashObjects_closure() {
    },
    BuiltList_BuiltList$from(iterable, $E) {
      var t1;
      if (iterable instanceof A._BuiltList) {
        t1 = A.createRuntimeType($E);
        t1 = A.createRuntimeType(iterable.$ti._precomputed1) === t1;
      } else
        t1 = false;
      if (t1)
        return $E._eval$1("BuiltList<0>")._as(iterable);
      else {
        t1 = new A._BuiltList(A.List_List$from(iterable, false, $E), $E._eval$1("_BuiltList<0>"));
        t1._list$_maybeCheckForNull$0();
        return t1;
      }
    },
    ListBuilder_ListBuilder(iterable, $E) {
      var t1 = new A.ListBuilder($E._eval$1("ListBuilder<0>"));
      t1.replace$1(0, iterable);
      return t1;
    },
    BuiltList: function BuiltList() {
    },
    _BuiltList: function _BuiltList(t0, t1) {
      this._list = t0;
      this._list$_hashCode = null;
      this.$ti = t1;
    },
    ListBuilder: function ListBuilder(t0) {
      this.__ListBuilder__list_A = $;
      this._listOwner = null;
      this.$ti = t0;
    },
    BuiltListMultimap_BuiltListMultimap($K, $V) {
      var t1 = A._BuiltListMultimap$copy(B.Map_empty0.get$keys(B.Map_empty0), new A.BuiltListMultimap_BuiltListMultimap_closure(B.Map_empty0), $K, $V);
      return t1;
    },
    _BuiltListMultimap$copy(keys, lookup, $K, $V) {
      var t1 = new A._BuiltListMultimap(A.LinkedHashMap_LinkedHashMap$_empty($K, $V._eval$1("BuiltList<0>")), A.BuiltList_BuiltList$from(B.List_empty, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltListMultimap<1,2>"));
      t1._BuiltListMultimap$copy$2(keys, lookup, $K, $V);
      return t1;
    },
    ListMultimapBuilder_ListMultimapBuilder($K, $V) {
      var t1 = new A.ListMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("ListMultimapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty0);
      return t1;
    },
    BuiltListMultimap: function BuiltListMultimap() {
    },
    BuiltListMultimap_BuiltListMultimap_closure: function BuiltListMultimap_BuiltListMultimap_closure(t0) {
      this.multimap = t0;
    },
    BuiltListMultimap_hashCode_closure: function BuiltListMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltListMultimap: function _BuiltListMultimap(t0, t1, t2) {
      var _ = this;
      _._list_multimap$_map = t0;
      _._emptyList = t1;
      _._list_multimap$_keys = _._list_multimap$_hashCode = null;
      _.$ti = t2;
    },
    ListMultimapBuilder: function ListMultimapBuilder(t0) {
      var _ = this;
      _.__ListMultimapBuilder__builtMap_A = $;
      _._list_multimap$_builtMapOwner = null;
      _.__ListMultimapBuilder__builderMap_A = $;
      _.$ti = t0;
    },
    ListMultimapBuilder_replace_closure: function ListMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    BuiltMap_BuiltMap($K, $V) {
      var t1 = new A._BuiltMap(null, A.LinkedHashMap_LinkedHashMap$_empty($K, $V), $K._eval$1("@<0>")._bind$1($V)._eval$1("_BuiltMap<1,2>"));
      t1._BuiltMap$copyAndCheckTypes$2(B.Map_empty0.get$keys(B.Map_empty0), new A.BuiltMap_BuiltMap_closure(B.Map_empty0), $K, $V);
      return t1;
    },
    MapBuilder_MapBuilder($K, $V) {
      var t1 = new A.MapBuilder(null, $, null, $K._eval$1("@<0>")._bind$1($V)._eval$1("MapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty0);
      return t1;
    },
    BuiltMap: function BuiltMap() {
    },
    BuiltMap_BuiltMap_closure: function BuiltMap_BuiltMap_closure(t0) {
      this.map = t0;
    },
    BuiltMap_hashCode_closure: function BuiltMap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltMap: function _BuiltMap(t0, t1, t2) {
      var _ = this;
      _._mapFactory = t0;
      _._map$_map = t1;
      _._map$_keys = _._map$_hashCode = null;
      _.$ti = t2;
    },
    MapBuilder: function MapBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._mapFactory = t0;
      _.__MapBuilder__map_A = t1;
      _._mapOwner = t2;
      _.$ti = t3;
    },
    MapBuilder_replace_closure: function MapBuilder_replace_closure(t0, t1) {
      this.$this = t0;
      this.replacement = t1;
    },
    BuiltSet_BuiltSet$from(iterable, $E) {
      var t1 = new A._BuiltSet(null, A.LinkedHashSet_LinkedHashSet$from(iterable, $E), $E._eval$1("_BuiltSet<0>"));
      t1._maybeCheckForNull$0();
      return t1;
    },
    SetBuilder_SetBuilder($E) {
      var t1 = new A.SetBuilder(null, $, null, $E._eval$1("SetBuilder<0>"));
      t1.replace$1(0, B.List_empty);
      return t1;
    },
    BuiltSet: function BuiltSet() {
    },
    BuiltSet_hashCode_closure: function BuiltSet_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSet: function _BuiltSet(t0, t1, t2) {
      var _ = this;
      _._setFactory = t0;
      _._set$_set = t1;
      _._set$_hashCode = null;
      _.$ti = t2;
    },
    SetBuilder: function SetBuilder(t0, t1, t2, t3) {
      var _ = this;
      _._setFactory = t0;
      _.__SetBuilder__set_A = t1;
      _._setOwner = t2;
      _.$ti = t3;
    },
    SetMultimapBuilder_SetMultimapBuilder($K, $V) {
      var t1 = new A.SetMultimapBuilder($K._eval$1("@<0>")._bind$1($V)._eval$1("SetMultimapBuilder<1,2>"));
      t1.replace$1(0, B.Map_empty0);
      return t1;
    },
    BuiltSetMultimap: function BuiltSetMultimap() {
    },
    BuiltSetMultimap_hashCode_closure: function BuiltSetMultimap_hashCode_closure(t0) {
      this.$this = t0;
    },
    _BuiltSetMultimap: function _BuiltSetMultimap(t0, t1, t2) {
      var _ = this;
      _._set_multimap$_map = t0;
      _._emptySet = t1;
      _._set_multimap$_keys = _._set_multimap$_hashCode = null;
      _.$ti = t2;
    },
    SetMultimapBuilder: function SetMultimapBuilder(t0) {
      var _ = this;
      _.__SetMultimapBuilder__builtMap_A = $;
      _._builtMapOwner = null;
      _.__SetMultimapBuilder__builderMap_A = $;
      _.$ti = t0;
    },
    SetMultimapBuilder_replace_closure: function SetMultimapBuilder_replace_closure(t0) {
      this.multimap = t0;
    },
    $jc(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $jf(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    BuiltValueNullFieldError_checkNotNull(value, type, field, $T) {
      if (value == null)
        throw A.wrapException(new A.BuiltValueNullFieldError(type, field));
      return value;
    },
    BuiltValueNestedFieldError$(type, field, error) {
      return new A.BuiltValueNestedFieldError(type, field, error);
    },
    EnumClass: function EnumClass() {
    },
    newBuiltValueToStringHelper_closure: function newBuiltValueToStringHelper_closure() {
    },
    IndentingBuiltValueToStringHelper: function IndentingBuiltValueToStringHelper(t0) {
      this._result = t0;
    },
    BuiltValueNullFieldError: function BuiltValueNullFieldError(t0, t1) {
      this.type = t0;
      this.field = t1;
    },
    BuiltValueNestedFieldError: function BuiltValueNestedFieldError(t0, t1, t2) {
      this.type = t0;
      this.field = t1;
      this.error = t2;
    },
    JsonObject_JsonObject(value) {
      if (typeof value == "number")
        return new A.NumJsonObject(value);
      else if (typeof value == "string")
        return new A.StringJsonObject(value);
      else if (A._isBool(value))
        return new A.BoolJsonObject(value);
      else if (type$.List_nullable_Object._is(value))
        return new A.ListJsonObject(new A.UnmodifiableListView(value, type$.UnmodifiableListView_nullable_Object));
      else if (type$.Map_of_String_and_nullable_Object._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(value, type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else if (type$.Map_dynamic_dynamic._is(value))
        return new A.MapJsonObject(new A.UnmodifiableMapView(J.cast$2$0$ax(value, type$.String, type$.nullable_Object), type$.UnmodifiableMapView_of_String_and_nullable_Object));
      else
        throw A.wrapException(A.ArgumentError$value(value, "value", "Must be bool, List<Object?>, Map<String?, Object?>, num or String"));
    },
    JsonObject: function JsonObject() {
    },
    BoolJsonObject: function BoolJsonObject(t0) {
      this.value = t0;
    },
    ListJsonObject: function ListJsonObject(t0) {
      this.value = t0;
    },
    MapJsonObject: function MapJsonObject(t0) {
      this.value = t0;
    },
    NumJsonObject: function NumJsonObject(t0) {
      this.value = t0;
    },
    StringJsonObject: function StringJsonObject(t0) {
      this.value = t0;
    },
    Serializers_Serializers() {
      var t1 = type$.Type,
        t2 = type$.Serializer_dynamic,
        t3 = type$.String;
      t2 = new A.BuiltJsonSerializersBuilder(A.MapBuilder_MapBuilder(t1, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(t3, t2), A.MapBuilder_MapBuilder(type$.FullType, type$.Function), A.ListBuilder_ListBuilder(B.List_empty, type$.SerializerPlugin));
      t2.add$1(0, new A.BigIntSerializer(A.BuiltList_BuiltList$from([B.Type_BigInt_8OV, A.getRuntimeTypeOfDartObject($.$get$_BigIntImpl_zero())], t1)));
      t2.add$1(0, new A.BoolSerializer(A.BuiltList_BuiltList$from([B.Type_bool_lhE], t1)));
      t3 = type$.Object;
      t2.add$1(0, new A.BuiltListSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltList_iTR, A.getRuntimeTypeOfDartObject(A.BuiltList_BuiltList$from(B.List_empty, t3))], t1)));
      t2.add$1(0, new A.BuiltListMultimapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltListMultimap_2Mt, A.getRuntimeTypeOfDartObject(A.BuiltListMultimap_BuiltListMultimap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltMapSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltMap_qd4, A.getRuntimeTypeOfDartObject(A.BuiltMap_BuiltMap(t3, t3))], t1)));
      t2.add$1(0, new A.BuiltSetSerializer(A.BuiltList_BuiltList$from([B.Type_BuiltSet_fcN, A.getRuntimeTypeOfDartObject(A.BuiltSet_BuiltSet$from(B.List_empty, t3))], t1)));
      t2.add$1(0, new A.BuiltSetMultimapSerializer(A.BuiltSet_BuiltSet$from([B.Type_BuiltSetMultimap_9Fi], t1)));
      t2.add$1(0, new A.DateTimeSerializer(A.BuiltList_BuiltList$from([B.Type_DateTime_8AS], t1)));
      t2.add$1(0, new A.DoubleSerializer(A.BuiltList_BuiltList$from([B.Type_double_K1J], t1)));
      t2.add$1(0, new A.DurationSerializer(A.BuiltList_BuiltList$from([B.Type_Duration_SnA], t1)));
      t2.add$1(0, new A.IntSerializer(A.BuiltList_BuiltList$from([B.Type_int_tHn], t1)));
      t2.add$1(0, new A.Int32Serializer(A.BuiltList_BuiltList$from([B.Type_Int32_Mhf], t1)));
      t2.add$1(0, new A.Int64Serializer(A.BuiltList_BuiltList$from([B.Type_Int64_ww8], t1)));
      t2.add$1(0, new A.JsonObjectSerializer(A.BuiltList_BuiltList$from([B.Type_JsonObject_gyf, B.Type_BoolJsonObject_8HQ, B.Type_ListJsonObject_yPV, B.Type_MapJsonObject_bBG, B.Type_NumJsonObject_H9C, B.Type_StringJsonObject_GAC], t1)));
      t2.add$1(0, new A.NullSerializer(A.BuiltList_BuiltList$from([B.Type_Null_Yyn], t1)));
      t2.add$1(0, new A.NumSerializer(A.BuiltList_BuiltList$from([B.Type_num_cv7], t1)));
      t2.add$1(0, new A.RegExpSerializer(A.BuiltList_BuiltList$from([B.Type_RegExp_Eeh, $.$get$_runtimeType()], t1)));
      t2.add$1(0, new A.StringSerializer(A.BuiltList_BuiltList$from([B.Type_String_k8F], t1)));
      t2.add$1(0, new A.Uint8ListSerializer());
      t2.add$1(0, new A.UriSerializer(A.BuiltList_BuiltList$from([B.Type_Uri_EFX, A.getRuntimeTypeOfDartObject(A.Uri_parse("http://example.com")), A.getRuntimeTypeOfDartObject(A.Uri_parse("http://example.com:"))], t1)));
      t2.addBuilderFactory$2(B.FullType_WUY, new A.Serializers_Serializers_closure());
      t2.addBuilderFactory$2(B.FullType_fA4, new A.Serializers_Serializers_closure0());
      t2.addBuilderFactory$2(B.FullType_6Ps, new A.Serializers_Serializers_closure1());
      t2.addBuilderFactory$2(B.FullType_KVM, new A.Serializers_Serializers_closure2());
      t2.addBuilderFactory$2(B.FullType_gsm, new A.Serializers_Serializers_closure3());
      return t2.build$0();
    },
    FullType__getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    DeserializationError_DeserializationError(json, type, error) {
      var limitedJson = J.toString$0$(json),
        t1 = limitedJson.length;
      if (t1 > 80)
        B.JSString_methods.replaceRange$3(limitedJson, 77, t1, "...");
      return new A.DeserializationError(type, error);
    },
    Serializers_Serializers_closure: function Serializers_Serializers_closure() {
    },
    Serializers_Serializers_closure0: function Serializers_Serializers_closure0() {
    },
    Serializers_Serializers_closure1: function Serializers_Serializers_closure1() {
    },
    Serializers_Serializers_closure2: function Serializers_Serializers_closure2() {
    },
    Serializers_Serializers_closure3: function Serializers_Serializers_closure3() {
    },
    FullType: function FullType(t0, t1, t2) {
      this.root = t0;
      this.parameters = t1;
      this.nullable = t2;
    },
    DeserializationError: function DeserializationError(t0, t1) {
      this.type = t0;
      this.error = t1;
    },
    BigIntSerializer: function BigIntSerializer(t0) {
      this.types = t0;
    },
    BoolSerializer: function BoolSerializer(t0) {
      this.types = t0;
    },
    BuiltJsonSerializersBuilder$_(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins) {
      return new A.BuiltJsonSerializersBuilder(_typeToSerializer, _wireNameToSerializer, _typeNameToSerializer, _builderFactories, _plugins);
    },
    _getRawName(type) {
      var $name = J.toString$0$(type),
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
      return genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
    },
    BuiltJsonSerializers: function BuiltJsonSerializers(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _.builderFactories = t3;
      _.serializerPlugins = t4;
    },
    BuiltJsonSerializersBuilder: function BuiltJsonSerializersBuilder(t0, t1, t2, t3, t4) {
      var _ = this;
      _._typeToSerializer = t0;
      _._wireNameToSerializer = t1;
      _._typeNameToSerializer = t2;
      _._builderFactories = t3;
      _._plugins = t4;
    },
    BuiltListMultimapSerializer: function BuiltListMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltListMultimapSerializer_serialize_closure: function BuiltListMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListMultimapSerializer_deserialize_closure: function BuiltListMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltListSerializer: function BuiltListSerializer(t0) {
      this.types = t0;
    },
    BuiltListSerializer_serialize_closure: function BuiltListSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltListSerializer_deserialize_closure: function BuiltListSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltMapSerializer: function BuiltMapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer: function BuiltSetMultimapSerializer(t0) {
      this.types = t0;
    },
    BuiltSetMultimapSerializer_serialize_closure: function BuiltSetMultimapSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetMultimapSerializer_deserialize_closure: function BuiltSetMultimapSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.valueType = t1;
    },
    BuiltSetSerializer: function BuiltSetSerializer(t0) {
      this.types = t0;
    },
    BuiltSetSerializer_serialize_closure: function BuiltSetSerializer_serialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    BuiltSetSerializer_deserialize_closure: function BuiltSetSerializer_deserialize_closure(t0, t1) {
      this.serializers = t0;
      this.elementType = t1;
    },
    DateTimeSerializer: function DateTimeSerializer(t0) {
      this.types = t0;
    },
    DoubleSerializer: function DoubleSerializer(t0) {
      this.types = t0;
    },
    DurationSerializer: function DurationSerializer(t0) {
      this.types = t0;
    },
    Int32Serializer: function Int32Serializer(t0) {
      this.types = t0;
    },
    Int64Serializer: function Int64Serializer(t0) {
      this.types = t0;
    },
    IntSerializer: function IntSerializer(t0) {
      this.types = t0;
    },
    JsonObjectSerializer: function JsonObjectSerializer(t0) {
      this.types = t0;
    },
    NullSerializer: function NullSerializer(t0) {
      this.types = t0;
    },
    NumSerializer: function NumSerializer(t0) {
      this.types = t0;
    },
    RegExpSerializer: function RegExpSerializer(t0) {
      this.types = t0;
    },
    StringSerializer: function StringSerializer(t0) {
      this.types = t0;
    },
    Uint8ListSerializer: function Uint8ListSerializer() {
    },
    UriSerializer: function UriSerializer(t0) {
      this.types = t0;
    },
    DefaultEquality: function DefaultEquality(t0) {
      this.$ti = t0;
    },
    IterableEquality: function IterableEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    ListEquality: function ListEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _UnorderedEquality: function _UnorderedEquality() {
    },
    SetEquality: function SetEquality(t0, t1) {
      this._elementEquality = t0;
      this.$ti = t1;
    },
    _MapEntry: function _MapEntry(t0, t1, t2) {
      this.equality = t0;
      this.key = t1;
      this.value = t2;
    },
    MapEquality: function MapEquality(t0, t1, t2) {
      this._keyEquality = t0;
      this._valueEquality = t1;
      this.$ti = t2;
    },
    DeepCollectionEquality: function DeepCollectionEquality() {
    },
    QueueList__computeInitialCapacity(initialCapacity) {
      return 8;
    },
    QueueList: function QueueList(t0, t1, t2, t3) {
      var _ = this;
      _._queue_list$_table = t0;
      _._queue_list$_head = t1;
      _._queue_list$_tail = t2;
      _.$ti = t3;
    },
    _CastQueueList: function _CastQueueList(t0, t1, t2, t3, t4) {
      var _ = this;
      _._queue_list$_delegate = t0;
      _._queue_list$_table = t1;
      _._queue_list$_head = t2;
      _._queue_list$_tail = t3;
      _.$ti = t4;
    },
    _QueueList_Object_ListMixin: function _QueueList_Object_ListMixin() {
    },
    _$valueOf($name) {
      switch ($name) {
        case "started":
          return B.BuildStatus_started;
        case "succeeded":
          return B.BuildStatus_succeeded;
        case "failed":
          return B.BuildStatus_failed;
        default:
          throw A.wrapException(A.ArgumentError$($name, null));
      }
    },
    BuildStatus: function BuildStatus(t0) {
      this.name = t0;
    },
    BuildResult: function BuildResult() {
    },
    _$BuildStatusSerializer: function _$BuildStatusSerializer() {
    },
    _$BuildResultSerializer: function _$BuildResultSerializer() {
    },
    _$BuildResult: function _$BuildResult(t0) {
      this.status = t0;
    },
    BuildResultBuilder: function BuildResultBuilder() {
      this._status = this._build_result$_$v = null;
    },
    ConnectRequest: function ConnectRequest() {
    },
    _$ConnectRequestSerializer: function _$ConnectRequestSerializer() {
    },
    _$ConnectRequest: function _$ConnectRequest(t0, t1, t2) {
      this.appId = t0;
      this.instanceId = t1;
      this.entrypointPath = t2;
    },
    ConnectRequestBuilder: function ConnectRequestBuilder() {
      var _ = this;
      _._entrypointPath = _._instanceId = _._appId = _._$v = null;
    },
    DebugEvent: function DebugEvent() {
    },
    BatchedDebugEvents: function BatchedDebugEvents() {
    },
    _$DebugEventSerializer: function _$DebugEventSerializer() {
    },
    _$BatchedDebugEventsSerializer: function _$BatchedDebugEventsSerializer() {
    },
    _$DebugEvent: function _$DebugEvent(t0, t1, t2) {
      this.kind = t0;
      this.eventData = t1;
      this.timestamp = t2;
    },
    DebugEventBuilder: function DebugEventBuilder() {
      var _ = this;
      _._timestamp = _._eventData = _._debug_event$_kind = _._debug_event$_$v = null;
    },
    _$BatchedDebugEvents: function _$BatchedDebugEvents(t0) {
      this.events = t0;
    },
    BatchedDebugEventsBuilder: function BatchedDebugEventsBuilder() {
      this._events = this._debug_event$_$v = null;
    },
    DebugInfo: function DebugInfo() {
    },
    _$DebugInfoSerializer: function _$DebugInfoSerializer() {
    },
    _$DebugInfo: function _$DebugInfo(t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12) {
      var _ = this;
      _.appEntrypointPath = t0;
      _.appId = t1;
      _.appInstanceId = t2;
      _.appOrigin = t3;
      _.appUrl = t4;
      _.authUrl = t5;
      _.dwdsVersion = t6;
      _.extensionUrl = t7;
      _.isInternalBuild = t8;
      _.isFlutterApp = t9;
      _.workspaceName = t10;
      _.tabUrl = t11;
      _.tabId = t12;
    },
    DebugInfoBuilder: function DebugInfoBuilder() {
      var _ = this;
      _._tabId = _._tabUrl = _._workspaceName = _._isFlutterApp = _._isInternalBuild = _._extensionUrl = _._dwdsVersion = _._authUrl = _._appUrl = _._appOrigin = _._appInstanceId = _._debug_info$_appId = _._appEntrypointPath = _._debug_info$_$v = null;
    },
    DevToolsRequest: function DevToolsRequest() {
    },
    DevToolsResponse: function DevToolsResponse() {
    },
    _$DevToolsRequestSerializer: function _$DevToolsRequestSerializer() {
    },
    _$DevToolsResponseSerializer: function _$DevToolsResponseSerializer() {
    },
    _$DevToolsRequest: function _$DevToolsRequest(t0, t1, t2, t3, t4) {
      var _ = this;
      _.appId = t0;
      _.instanceId = t1;
      _.contextId = t2;
      _.tabUrl = t3;
      _.uriOnly = t4;
    },
    DevToolsRequestBuilder: function DevToolsRequestBuilder() {
      var _ = this;
      _._uriOnly = _._devtools_request$_tabUrl = _._contextId = _._devtools_request$_instanceId = _._devtools_request$_appId = _._devtools_request$_$v = null;
    },
    _$DevToolsResponse: function _$DevToolsResponse(t0, t1, t2) {
      this.success = t0;
      this.promptExtension = t1;
      this.error = t2;
    },
    DevToolsResponseBuilder: function DevToolsResponseBuilder() {
      var _ = this;
      _._error = _._promptExtension = _._success = _._devtools_request$_$v = null;
    },
    ErrorResponse: function ErrorResponse() {
    },
    _$ErrorResponseSerializer: function _$ErrorResponseSerializer() {
    },
    _$ErrorResponse: function _$ErrorResponse(t0, t1) {
      this.error = t0;
      this.stackTrace = t1;
    },
    ErrorResponseBuilder: function ErrorResponseBuilder() {
      this._error_response$_stackTrace = this._error_response$_error = this._error_response$_$v = null;
    },
    ExtensionRequest: function ExtensionRequest() {
    },
    ExtensionResponse: function ExtensionResponse() {
    },
    ExtensionEvent: function ExtensionEvent() {
    },
    BatchedEvents: function BatchedEvents() {
    },
    _$ExtensionRequestSerializer: function _$ExtensionRequestSerializer() {
    },
    _$ExtensionResponseSerializer: function _$ExtensionResponseSerializer() {
    },
    _$ExtensionEventSerializer: function _$ExtensionEventSerializer() {
    },
    _$BatchedEventsSerializer: function _$BatchedEventsSerializer() {
    },
    _$ExtensionRequest: function _$ExtensionRequest(t0, t1, t2) {
      this.id = t0;
      this.command = t1;
      this.commandParams = t2;
    },
    ExtensionRequestBuilder: function ExtensionRequestBuilder() {
      var _ = this;
      _._commandParams = _._command = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionResponse: function _$ExtensionResponse(t0, t1, t2, t3) {
      var _ = this;
      _.id = t0;
      _.success = t1;
      _.result = t2;
      _.error = t3;
    },
    ExtensionResponseBuilder: function ExtensionResponseBuilder() {
      var _ = this;
      _._extension_request$_error = _._extension_request$_result = _._extension_request$_success = _._id = _._extension_request$_$v = null;
    },
    _$ExtensionEvent: function _$ExtensionEvent(t0, t1) {
      this.params = t0;
      this.method = t1;
    },
    ExtensionEventBuilder: function ExtensionEventBuilder() {
      this._extension_request$_method = this._params = this._extension_request$_$v = null;
    },
    _$BatchedEvents: function _$BatchedEvents(t0) {
      this.events = t0;
    },
    BatchedEventsBuilder: function BatchedEventsBuilder() {
      this._extension_request$_events = this._extension_request$_$v = null;
    },
    IsolateExit: function IsolateExit() {
    },
    IsolateStart: function IsolateStart() {
    },
    _$IsolateExitSerializer: function _$IsolateExitSerializer() {
    },
    _$IsolateStartSerializer: function _$IsolateStartSerializer() {
    },
    _$IsolateExit: function _$IsolateExit() {
    },
    IsolateExitBuilder: function IsolateExitBuilder() {
      this._isolate_events$_$v = null;
    },
    _$IsolateStart: function _$IsolateStart() {
    },
    IsolateStartBuilder: function IsolateStartBuilder() {
      this._isolate_events$_$v = null;
    },
    RegisterEvent: function RegisterEvent() {
    },
    _$RegisterEventSerializer: function _$RegisterEventSerializer() {
    },
    _$RegisterEvent: function _$RegisterEvent(t0, t1) {
      this.eventData = t0;
      this.timestamp = t1;
    },
    RegisterEventBuilder: function RegisterEventBuilder() {
      this._register_event$_timestamp = this._register_event$_eventData = this._register_event$_$v = null;
    },
    RunRequest: function RunRequest() {
    },
    _$RunRequestSerializer: function _$RunRequestSerializer() {
    },
    _$RunRequest: function _$RunRequest() {
    },
    _$serializers_closure: function _$serializers_closure() {
    },
    _$serializers_closure0: function _$serializers_closure0() {
    },
    BatchedStreamController: function BatchedStreamController(t0, t1, t2, t3, t4, t5) {
      var _ = this;
      _._checkDelayMilliseconds = t0;
      _._batchDelayMilliseconds = t1;
      _._inputController = t2;
      _.__BatchedStreamController__inputQueue_A = $;
      _._outputController = t3;
      _._completer = t4;
      _.$ti = t5;
    },
    BatchedStreamController__hasEventOrTimeOut_closure: function BatchedStreamController__hasEventOrTimeOut_closure() {
    },
    BatchedStreamController__hasEventDuring_closure: function BatchedStreamController__hasEventDuring_closure() {
    },
    SocketClient: function SocketClient() {
    },
    SseSocketClient: function SseSocketClient(t0) {
      this._sockets$_client = t0;
    },
    WebSocketClient: function WebSocketClient(t0) {
      this._channel = t0;
    },
    WebSocketClient_stream_closure: function WebSocketClient_stream_closure() {
    },
    safeUnawaited(future) {
      future.catchError$1(new A.safeUnawaited_closure());
    },
    safeUnawaited_closure: function safeUnawaited_closure() {
    },
    Int32: function Int32(t0) {
      this._i = t0;
    },
    Int64__parseRadix(s, radix, throwOnError) {
      var i, negative, t1, d0, d1, d2, digit, d00, d10;
      if (B.JSString_methods.startsWith$1(s, "-")) {
        i = 1;
        negative = true;
      } else {
        i = 0;
        negative = false;
      }
      t1 = s.length;
      if (i >= t1)
        throw A.wrapException(A.FormatException$("No digits", s, i));
      for (d0 = 0, d1 = 0, d2 = 0; i < t1; ++i, d1 = d10, d0 = d00) {
        digit = A.decodeDigit(s.charCodeAt(i));
        if (digit < radix) {
          d0 = d0 * radix + digit;
          d00 = d0 & 4194303;
          d1 = d1 * radix + B.JSInt_methods._shrOtherPositive$1(d0, 22);
          d10 = d1 & 4194303;
          d2 = d2 * radix + (d1 >>> 22) & 1048575;
        } else
          throw A.wrapException(A.FormatException$("Not radix digit", s, i));
      }
      if (negative)
        return A.Int64__sub(0, 0, 0, d0, d1, d2);
      return new A.Int64(d0 & 4194303, d1 & 4194303, d2 & 1048575);
    },
    Int64_Int64(value) {
      var negative, v2, v1, t1, t2, t3;
      if (value < 0) {
        value = -value;
        negative = true;
      } else
        negative = false;
      v2 = B.JSInt_methods._tdivFast$1(value, 17592186044416);
      value -= v2 * 17592186044416;
      v1 = B.JSInt_methods._tdivFast$1(value, 4194304);
      t1 = value - v1 * 4194304 & 4194303;
      t2 = v1 & 4194303;
      t3 = v2 & 1048575;
      return negative ? A.Int64__sub(0, 0, 0, t1, t2, t3) : new A.Int64(t1, t2, t3);
    },
    Int64__promote(value) {
      if (value instanceof A.Int64)
        return value;
      else if (A._isInt(value))
        return A.Int64_Int64(value);
      else if (value instanceof A.Int32)
        return A.Int64_Int64(value._i);
      throw A.wrapException(A.ArgumentError$value(value, "other", "not an int, Int32 or Int64"));
    },
    Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign) {
      var d4, d3, fatRadix, chunk1, chunk2, chunk3, q, q0, q1, q2, q3, chunk10, residue;
      if (d0 === 0 && d1 === 0 && d2 === 0)
        return "0";
      d4 = (d2 << 4 | d1 >>> 18) >>> 0;
      d3 = d1 >>> 8 & 1023;
      d2 = (d1 << 2 | d0 >>> 20) & 1023;
      d1 = d0 >>> 10 & 1023;
      d0 &= 1023;
      if (!(radix < 37))
        return A.ioore(B.List_Icz, radix);
      fatRadix = B.List_Icz[radix];
      chunk1 = "";
      chunk2 = "";
      chunk3 = "";
      while (true) {
        if (!!(d4 === 0 && d3 === 0))
          break;
        q = B.JSInt_methods.$tdiv(d4, fatRadix);
        d3 += d4 - q * fatRadix << 10 >>> 0;
        q0 = B.JSInt_methods.$tdiv(d3, fatRadix);
        d2 += d3 - q0 * fatRadix << 10 >>> 0;
        q1 = B.JSInt_methods.$tdiv(d2, fatRadix);
        d1 += d2 - q1 * fatRadix << 10 >>> 0;
        q2 = B.JSInt_methods.$tdiv(d1, fatRadix);
        d0 += d1 - q2 * fatRadix << 10 >>> 0;
        q3 = B.JSInt_methods.$tdiv(d0, fatRadix);
        chunk10 = B.JSString_methods.substring$1(B.JSInt_methods.toRadixString$1(fatRadix + (d0 - q3 * fatRadix), radix), 1);
        chunk3 = chunk2;
        chunk2 = chunk1;
        chunk1 = chunk10;
        d3 = q0;
        d4 = q;
        d2 = q1;
        d1 = q2;
        d0 = q3;
      }
      residue = (d2 << 20 >>> 0) + (d1 << 10 >>> 0) + d0;
      return sign + (residue === 0 ? "" : B.JSInt_methods.toRadixString$1(residue, radix)) + chunk1 + chunk2 + chunk3;
    },
    Int64__sub(a0, a1, a2, b0, b1, b2) {
      var diff0 = a0 - b0,
        diff1 = a1 - b1 - (B.JSInt_methods._shrOtherPositive$1(diff0, 22) & 1);
      return new A.Int64(diff0 & 4194303, diff1 & 4194303, a2 - b2 - (B.JSInt_methods._shrOtherPositive$1(diff1, 22) & 1) & 1048575);
    },
    Int64: function Int64(t0, t1, t2) {
      this._l = t0;
      this._m = t1;
      this._h = t2;
    },
    stronglyConnectedComponents(nodes, edges, $T) {
      var t2, t3, _i, t4, index, t5, state, node, iterator, index0, lowLink, t6, next, component, t7, result0, _null = null,
        result = A._setArrayType([], $T._eval$1("JSArray<List<0>>")),
        t1 = type$.int,
        lowLinks = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        indexes = A.HashMap_HashMap(_null, _null, _null, $T, t1),
        onStack = A.HashSet_HashSet(_null, _null, $T),
        lastVisited = A.ListQueue$($T);
      t1 = A._setArrayType([], $T._eval$1("JSArray<_StackState<0>>"));
      for (t2 = nodes.length, t3 = $T._eval$1("_StackState<0>"), _i = 0; _i < nodes.length; nodes.length === t2 || (0, A.throwConcurrentModificationError)(nodes), ++_i)
        t1.push(new A._StackState(nodes[_i], _null, t3));
      $label0$0:
        for (t2 = lastVisited.$ti._precomputed1, t4 = $T._eval$1("JSArray<0>"), index = 0; t5 = t1.length, t5 !== 0;) {
          if (0 >= t5)
            return A.ioore(t1, -1);
          state = t1.pop();
          node = state.node;
          iterator = state.iterator;
          if (iterator == null) {
            if (indexes.containsKey$1(0, node))
              continue $label0$0;
            indexes.$indexSet(0, node, index);
            lowLinks.$indexSet(0, node, index);
            index0 = index + 1;
            iterator = J.get$iterator$ax(edges.call$1(node));
            if (!iterator.moveNext$0()) {
              B.JSArray_methods.add$1(result, A._setArrayType([node], t4));
              index = index0;
              continue $label0$0;
            }
            lastVisited._collection$_add$1(0, t2._as(node));
            onStack.add$1(0, node);
            lowLink = index;
            index = index0;
          } else {
            t5 = lowLinks.$index(0, node);
            t5.toString;
            t6 = lowLinks.$index(0, iterator.get$current(iterator));
            t6.toString;
            lowLink = Math.min(A.checkNum(t5), A.checkNum(t6));
          }
          do {
            next = iterator.get$current(iterator);
            if (!indexes.containsKey$1(0, next)) {
              B.JSArray_methods.add$1(t1, new A._StackState(node, iterator, t3));
              B.JSArray_methods.add$1(t1, new A._StackState(next, _null, t3));
              continue $label0$0;
            } else if (onStack.contains$1(0, next)) {
              t5 = indexes.$index(0, next);
              t5.toString;
              lowLink = Math.min(lowLink, A.checkNum(t5));
              lowLinks.$indexSet(0, node, lowLink);
            }
          } while (iterator.moveNext$0());
          if (lowLink === indexes.$index(0, node)) {
            component = A._setArrayType([], t4);
            do {
              t5 = lastVisited._head;
              t6 = lastVisited._tail;
              if (t5 === t6)
                A.throwExpression(A.IterableElementError_noElement());
              ++lastVisited._modificationCount;
              t5 = lastVisited._table;
              t7 = t5.length;
              t6 = (t6 - 1 & t7 - 1) >>> 0;
              lastVisited._tail = t6;
              if (!(t6 >= 0 && t6 < t7))
                return A.ioore(t5, t6);
              result0 = t5[t6];
              if (result0 == null)
                result0 = t2._as(result0);
              B.JSArray_methods.$indexSet(t5, t6, _null);
              onStack.remove$1(0, result0);
              B.JSArray_methods.add$1(component, result0);
            } while (!A.boolConversionCheck(A._defaultEquals(result0, node)));
            B.JSArray_methods.add$1(result, component);
          }
        }
      return result;
    },
    _defaultEquals(a, b) {
      return J.$eq$(a, b);
    },
    _StackState: function _StackState(t0, t1, t2) {
      this.node = t0;
      this.iterator = t1;
      this.$ti = t2;
    },
    Level: function Level(t0, t1) {
      this.name = t0;
      this.value = t1;
    },
    LogRecord: function LogRecord(t0, t1, t2) {
      this.level = t0;
      this.message = t1;
      this.loggerName = t2;
    },
    Logger_Logger($name) {
      return $.Logger__loggers.putIfAbsent$2(0, $name, new A.Logger_Logger_closure($name));
    },
    Logger: function Logger(t0, t1, t2) {
      var _ = this;
      _.name = t0;
      _.parent = t1;
      _._level = null;
      _._children = t2;
    },
    Logger_Logger_closure: function Logger_Logger_closure(t0) {
      this.name = t0;
    },
    Pool: function Pool(t0, t1, t2, t3, t4) {
      var _ = this;
      _._requestedResources = t0;
      _._onReleaseCallbacks = t1;
      _._onReleaseCompleters = t2;
      _._maxAllocatedResources = t3;
      _._allocatedResources = 0;
      _._timer = null;
      _._closeMemo = t4;
    },
    Pool__runOnRelease_closure: function Pool__runOnRelease_closure(t0) {
      this.$this = t0;
    },
    Pool__runOnRelease_closure0: function Pool__runOnRelease_closure0(t0) {
      this.$this = t0;
    },
    PoolResource: function PoolResource(t0) {
      this._pool = t0;
      this._released = false;
    },
    SseClient$(serverUrl, debugKey) {
      var t3, t4, t5, _null = null,
        t1 = type$.String,
        t2 = A.StreamController_StreamController(_null, _null, false, t1);
      t1 = A.StreamController_StreamController(_null, _null, false, t1);
      t3 = A.Logger_Logger("SseClient");
      t4 = $.Zone__current;
      t5 = A.generateUuidV4();
      t1 = new A.SseClient(debugKey + "-" + t5, t2, t1, t3, new A._AsyncCompleter(new A._Future(t4, type$._Future_dynamic), type$._AsyncCompleter_dynamic));
      t1.SseClient$2$debugKey(serverUrl, debugKey);
      return t1;
    },
    SseClient: function SseClient(t0, t1, t2, t3, t4) {
      var _ = this;
      _._clientId = t0;
      _._incomingController = t1;
      _._outgoingController = t2;
      _._logger = t3;
      _._onConnected = t4;
      _._lastMessageId = -1;
      _.__SseClient__serverUrl_A = _.__SseClient__eventSource_A = $;
      _._errorTimer = null;
    },
    SseClient_closure: function SseClient_closure(t0) {
      this.$this = t0;
    },
    SseClient_closure0: function SseClient_closure0(t0) {
      this.$this = t0;
    },
    SseClient_closure1: function SseClient_closure1(t0) {
      this.$this = t0;
    },
    SseClient__closure: function SseClient__closure(t0, t1) {
      this.$this = t0;
      this.error = t1;
    },
    SseClient__onOutgoingMessage_closure: function SseClient__onOutgoingMessage_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.message = t2;
    },
    _FetchOptions: function _FetchOptions() {
    },
    generateUuidV4() {
      var t1 = new A.generateUuidV4__printDigits(),
        t2 = new A.generateUuidV4__bitsDigits(t1, new A.generateUuidV4__generateBits(B.C__JSRandom)),
        t3 = B.C__JSRandom.nextInt$1(4);
      return A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + "-" + A.S(t2.call$2(16, 4)) + "-4" + A.S(t2.call$2(12, 3)) + "-" + A.S(t1.call$2(8 + t3, 1)) + A.S(t2.call$2(12, 3)) + "-" + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4));
    },
    generateUuidV4__generateBits: function generateUuidV4__generateBits(t0) {
      this.random = t0;
    },
    generateUuidV4__printDigits: function generateUuidV4__printDigits() {
    },
    generateUuidV4__bitsDigits: function generateUuidV4__bitsDigits(t0, t1) {
      this._printDigits = t0;
      this._generateBits = t1;
    },
    GuaranteeChannel$(innerStream, innerSink, allowSinkErrors, $T) {
      var t2, t1 = {};
      t1.innerStream = innerStream;
      t2 = new A.GuaranteeChannel($T._eval$1("GuaranteeChannel<0>"));
      t2.GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, t1, $T);
      return t2;
    },
    GuaranteeChannel: function GuaranteeChannel(t0) {
      var _ = this;
      _.__GuaranteeChannel__streamController_F = _.__GuaranteeChannel__sink_F = $;
      _._guarantee_channel$_subscription = null;
      _._disconnected = false;
      _.$ti = t0;
    },
    GuaranteeChannel_closure: function GuaranteeChannel_closure(t0, t1, t2) {
      this._box_0 = t0;
      this.$this = t1;
      this.T = t2;
    },
    GuaranteeChannel__closure: function GuaranteeChannel__closure(t0) {
      this.$this = t0;
    },
    _GuaranteeSink: function _GuaranteeSink(t0, t1, t2, t3, t4) {
      var _ = this;
      _._inner = t0;
      _._guarantee_channel$_channel = t1;
      _._doneCompleter = t2;
      _._closed = _._disconnected = false;
      _._addStreamCompleter = _._addStreamSubscription = null;
      _._allowErrors = t3;
      _.$ti = t4;
    },
    _GuaranteeSink__addError_closure: function _GuaranteeSink__addError_closure() {
    },
    StreamChannelController: function StreamChannelController(t0) {
      this.__StreamChannelController__foreign_F = this.__StreamChannelController__local_F = $;
      this.$ti = t0;
    },
    StreamChannelMixin: function StreamChannelMixin() {
    },
    Uuid: function Uuid() {
    },
    HtmlWebSocketChannel$connect(url, protocols) {
      var t2, t3, localToForeignController, foreignToLocalController, t4, t5, _null = null,
        t1 = A.WebSocket_WebSocket(url.toString$0(0), protocols);
      B.WebSocket_methods.set$binaryType(t1, "arraybuffer");
      t2 = new A.StreamChannelController(type$.StreamChannelController_dynamic);
      t3 = type$.dynamic;
      localToForeignController = A.StreamController_StreamController(_null, _null, true, t3);
      foreignToLocalController = A.StreamController_StreamController(_null, _null, true, t3);
      t4 = A._instanceType(foreignToLocalController);
      t5 = A._instanceType(localToForeignController);
      t2.set$__StreamChannelController__local_F(A.GuaranteeChannel$(new A._ControllerStream(foreignToLocalController, t4._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(localToForeignController, t5._eval$1("_StreamSinkWrapper<1>")), true, t3));
      t3 = A.GuaranteeChannel$(new A._ControllerStream(localToForeignController, t5._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(foreignToLocalController, t4._eval$1("_StreamSinkWrapper<1>")), false, t3);
      t2.__StreamChannelController__foreign_F !== $ && A.throwLateFieldAI("_foreign");
      t2.set$__StreamChannelController__foreign_F(t3);
      t2 = new A.HtmlWebSocketChannel(t1, t2);
      t2.HtmlWebSocketChannel$1(t1);
      return t2;
    },
    HtmlWebSocketChannel: function HtmlWebSocketChannel(t0, t1) {
      var _ = this;
      _.innerWebSocket = t0;
      _._localCloseReason = _._localCloseCode = null;
      _.__HtmlWebSocketChannel__readyCompleter_A = $;
      _._html0$_controller = t1;
      _.__HtmlWebSocketChannel_sink_FI = $;
    },
    HtmlWebSocketChannel_closure: function HtmlWebSocketChannel_closure(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure0: function HtmlWebSocketChannel_closure0(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure1: function HtmlWebSocketChannel_closure1(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel_closure2: function HtmlWebSocketChannel_closure2(t0) {
      this.$this = t0;
    },
    HtmlWebSocketChannel__listen_closure: function HtmlWebSocketChannel__listen_closure(t0) {
      this.$this = t0;
    },
    _HtmlWebSocketSink: function _HtmlWebSocketSink(t0, t1) {
      this._html0$_channel = t0;
      this._sink = t1;
    },
    WebSocketChannel: function WebSocketChannel(t0, t1) {
      this._webSocket = t0;
      this.ready = t1;
    },
    WebSocketChannelException: function WebSocketChannelException(t0) {
      this.message = t0;
    },
    main() {
      return A.runZonedGuarded(new A.main_closure(), new A.main_closure0(), type$.Future_void);
    },
    _trySendEvent(sink, serialized, $T) {
      var exception;
      try {
        sink.add$1(0, serialized);
      } catch (exception) {
        if (A.unwrapException(exception) instanceof A.StateError)
          A.print("Cannot send event " + A.S(serialized) + ". Injected client connection is closed.");
        else
          throw exception;
      }
    },
    _launchCommunicationWithDebugExtension() {
      var t1, t2;
      A._listenForDebugExtensionAuthRequest();
      t1 = $.$get$serializers();
      t2 = new A.DebugInfoBuilder();
      type$.nullable_void_Function_DebugInfoBuilder._as(new A._launchCommunicationWithDebugExtension_closure()).call$1(t2);
      self.window.top.document.dispatchEvent(A.CustomEvent_CustomEvent("dart-app-ready", B.C_JsonCodec.encode$2$toEncodable(t1.serialize$1(t2._debug_info$_build$0()), null)));
    },
    _listenForDebugExtensionAuthRequest() {
      var t1 = window;
      t1.toString;
      B.Window_methods.addEventListener$2(t1, "message", A.allowInterop(new A._listenForDebugExtensionAuthRequest_closure(), type$.dynamic_Function_Event));
    },
    _authenticateUser(authUrl) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, responseText;
      var $async$_authenticateUser = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$goto = 3;
              return A._asyncAwait(A.HttpRequest_request(authUrl, "GET", null, true), $async$_authenticateUser);
            case 3:
              // returning from await.
              responseText = $async$result.responseText;
              $async$returnValue = B.JSString_methods.contains$1(responseText == null ? "" : responseText, "Dart Debug Authentication Success!");
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_authenticateUser, $async$completer);
    },
    _authUrl() {
      var extensionUrl, authUrl,
        t1 = window;
      t1.toString;
      extensionUrl = A._asStringQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$dartExtensionUri"));
      if (extensionUrl == null)
        return null;
      authUrl = A.Uri_parse(extensionUrl).replace$1$path(0, "$dwdsExtensionAuthentication");
      switch (authUrl.scheme) {
        case "ws":
          return authUrl.replace$1$scheme(0, "http").get$_text();
        case "wss":
          return authUrl.replace$1$scheme(0, "https").get$_text();
        default:
          return authUrl.get$_text();
      }
    },
    main_closure: function main_closure() {
    },
    main__closure: function main__closure(t0) {
      this.manager = t0;
    },
    main__closure0: function main__closure0(t0) {
      this.client = t0;
    },
    main___closure2: function main___closure2(t0) {
      this.events = t0;
    },
    main__closure1: function main__closure1(t0) {
      this.debugEventController = t0;
    },
    main___closure1: function main___closure1(t0, t1) {
      this.kind = t0;
      this.eventData = t1;
    },
    main__closure2: function main__closure2(t0) {
      this.client = t0;
    },
    main___closure0: function main___closure0(t0) {
      this.eventData = t0;
    },
    main__closure3: function main__closure3(t0) {
      this.client = t0;
    },
    main___closure: function main___closure() {
    },
    main__closure4: function main__closure4(t0) {
      this.manager = t0;
    },
    main__closure5: function main__closure5() {
    },
    main__closure6: function main__closure6() {
    },
    main__closure7: function main__closure7() {
    },
    main_closure0: function main_closure0() {
    },
    _launchCommunicationWithDebugExtension_closure: function _launchCommunicationWithDebugExtension_closure() {
    },
    _listenForDebugExtensionAuthRequest_closure: function _listenForDebugExtensionAuthRequest_closure() {
    },
    DdcRestarter: function DdcRestarter() {
    },
    DdcRestarter_restart_closure0: function DdcRestarter_restart_closure0(t0) {
      this.reloadCompleter = t0;
    },
    DdcRestarter_restart_closure: function DdcRestarter_restart_closure(t0) {
      this.sub = t0;
    },
    ReloadingManager: function ReloadingManager(t0, t1) {
      this._client = t0;
      this._restarter = t1;
    },
    toPromise(future, $T) {
      return new self.Promise(A.allowInterop(new A.toPromise_closure(future, $T), $T._eval$1("~(~(0),~(@))")), $T);
    },
    toFuture(promise, $T) {
      var t1 = new A._Future($.Zone__current, $T._eval$1("_Future<0>")),
        completer = new A._AsyncCompleter(t1, $T._eval$1("_AsyncCompleter<0>"));
      J.then$2$x(promise, A.allowInterop($T._eval$1("~([0/?])")._as(completer.get$complete(completer)), $T._eval$1("@(0)")), A.allowInterop(new A.toFuture_closure(completer), type$.dynamic_Function_dynamic));
      return t1;
    },
    Promise: function Promise() {
    },
    toPromise_closure: function toPromise_closure(t0, t1) {
      this.future = t0;
      this.T = t1;
    },
    toFuture_closure: function toFuture_closure(t0) {
      this.completer = t0;
    },
    HotReloadFailedException$(_s) {
      return new A.HotReloadFailedException(_s);
    },
    RequireRestarter_create() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.RequireRestarter),
        $async$returnValue, reloader, t1, t2, t3;
      var $async$RequireRestarter_create = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.String;
              t2 = A.HashMap_HashMap(null, null, null, t1, type$.int);
              t3 = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_bool), type$._AsyncCompleter_bool);
              t3.complete$1(0, true);
              reloader = new A.RequireRestarter(t2, t3);
              reloader.set$__RequireRestarter__dirtyModules_A(type$.SplayTreeSet_String._as(A.SplayTreeSet$(reloader.get$_moduleTopologicalCompare(), null, t1)));
              $async$goto = 3;
              return A._asyncAwait(reloader._initialize$0(), $async$RequireRestarter_create);
            case 3:
              // returning from await.
              $async$returnValue = reloader;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$RequireRestarter_create, $async$completer);
    },
    RequireLoader: function RequireLoader() {
    },
    HotReloadFailedException: function HotReloadFailedException(t0) {
      this._s = t0;
    },
    JsError: function JsError() {
    },
    JsMap: function JsMap() {
    },
    RequireRestarter: function RequireRestarter(t0, t1) {
      this._moduleOrdering = t0;
      this.__RequireRestarter__dirtyModules_A = $;
      this._running = t1;
    },
    RequireRestarter__reload_closure: function RequireRestarter__reload_closure(t0) {
      this.childModule = t0;
    },
    RequireRestarter__reloadModule_closure: function RequireRestarter__reloadModule_closure(t0, t1) {
      this.completer = t0;
      this.stackTrace = t1;
    },
    _findNonce() {
      var t2, elements, t3, t4, nonceValue,
        t1 = window.document;
      t1.toString;
      t2 = type$.Element;
      A.checkTypeBound(t2, t2, "T", "querySelectorAll");
      t1 = t1.querySelectorAll("script");
      t1.toString;
      t2 = type$._FrozenElementList_Element;
      elements = new A._FrozenElementList(t1, t2);
      for (t1 = new A.ListIterator(elements, elements.get$length(0), t2._eval$1("ListIterator<ListBase.E>")), t3 = type$.HtmlElement, t2 = t2._eval$1("ListBase.E"); t1.moveNext$0();) {
        t4 = t1.__internal$_current;
        t4 = t3._as(t4 == null ? t2._as(t4) : t4);
        nonceValue = t4.nonce;
        if (nonceValue == null)
          nonceValue = t4.getAttribute("nonce");
        if (nonceValue != null) {
          t4 = $.$get$_noncePattern();
          t4 = t4._nativeRegExp.test(nonceValue);
        } else
          t4 = false;
        if (t4)
          return nonceValue;
      }
      return null;
    },
    runMain() {
      var scriptElement = $.$get$_createScript().call$0(),
        t1 = J.getInterceptor$x(scriptElement);
      t1.setInnerHtml$1(scriptElement, "window.$dartRunMain();");
      document.body.appendChild(scriptElement).toString;
      A.Future_Future$microtask(t1.get$remove(scriptElement), type$.void);
    },
    _createScript_closure: function _createScript_closure() {
    },
    _createScript__closure: function _createScript__closure(t0) {
      this.nonce = t0;
    },
    isBrowserObject(o) {
      return type$.Blob._is(o) || type$.Event._is(o) || type$.KeyRange._is(o) || type$.ImageData._is(o) || type$.Node._is(o) || type$.Window._is(o) || type$.WorkerGlobalScope._is(o);
    },
    printString(string) {
      if (typeof dartPrint == "function") {
        dartPrint(string);
        return;
      }
      if (typeof console == "object" && typeof console.log != "undefined") {
        console.log(string);
        return;
      }
      if (typeof print == "function") {
        print(string);
        return;
      }
      throw "Unable to print message: " + String(string);
    },
    decodeDigit(c) {
      var letter,
        digit = c ^ 48;
      if (digit < 10)
        return digit;
      letter = (c | 32) - 97;
      if (letter >= 0)
        return letter + 10;
      else
        return 255;
    },
    UuidUtil_mathRNG() {
      var i, t1,
        b = new Uint8Array(16),
        rand = $.$get$UuidUtil__random();
      for (i = 0; i < 16; ++i) {
        t1 = rand.nextInt$1(256);
        if (!(i < 16))
          return A.ioore(b, i);
        b[i] = t1;
      }
      return b;
    }
  },
  B = {};
  var holders = [A, J, B];
  var $ = {};
  A.JS_CONST.prototype = {};
  J.Interceptor.prototype = {
    $eq(receiver, other) {
      return receiver === other;
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    toString$0(receiver) {
      return "Instance of '" + A.Primitives_objectTypeName(receiver) + "'";
    },
    noSuchMethod$1(receiver, invocation) {
      throw A.wrapException(A.NoSuchMethodError_NoSuchMethodError$withInvocation(receiver, type$.Invocation._as(invocation)));
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(A._instanceTypeFromConstructor(this));
    }
  };
  J.JSBool.prototype = {
    toString$0(receiver) {
      return String(receiver);
    },
    get$hashCode(receiver) {
      return receiver ? 519018 : 218159;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.bool);
    },
    $isTrustedGetRuntimeType: 1,
    $isbool: 1
  };
  J.JSNull.prototype = {
    $eq(receiver, other) {
      return null == other;
    },
    toString$0(receiver) {
      return "null";
    },
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.Null);
    },
    $isTrustedGetRuntimeType: 1,
    $isNull: 1
  };
  J.JavaScriptObject.prototype = {$isJSObject: 1};
  J.LegacyJavaScriptObject.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    get$runtimeType(receiver) {
      return B.Type_JSObject_8k0;
    },
    toString$0(receiver) {
      return String(receiver);
    },
    $isPromise: 1,
    $isJsError: 1,
    then$1$1(receiver, p0) {
      return receiver.then(p0);
    },
    then$2(receiver, p0, p1) {
      return receiver.then(p0, p1);
    },
    get$digestsPath(obj) {
      return obj.digestsPath;
    },
    get$moduleParentsGraph(obj) {
      return obj.moduleParentsGraph;
    },
    forceLoadModule$3(receiver, p0, p1, p2) {
      return receiver.forceLoadModule(p0, p1, p2);
    },
    get$message(obj) {
      return obj.message;
    },
    $get$1(receiver, p0) {
      return receiver.get(p0);
    },
    get$keys(obj) {
      return obj.keys;
    },
    keys$0(receiver) {
      return receiver.keys();
    }
  };
  J.PlainJavaScriptObject.prototype = {};
  J.UnknownJavaScriptObject.prototype = {};
  J.JavaScriptFunction.prototype = {
    toString$0(receiver) {
      var dartClosure = receiver[$.$get$DART_CLOSURE_PROPERTY_NAME()];
      if (dartClosure == null)
        return this.super$LegacyJavaScriptObject$toString(receiver);
      return "JavaScript function for " + J.toString$0$(dartClosure);
    },
    $isFunction: 1
  };
  J.JavaScriptBigInt.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    toString$0(receiver) {
      return String(receiver);
    }
  };
  J.JavaScriptSymbol.prototype = {
    get$hashCode(receiver) {
      return 0;
    },
    toString$0(receiver) {
      return String(receiver);
    }
  };
  J.JSArray.prototype = {
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A._arrayInstanceType(receiver)._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    add$1(receiver, value) {
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("add"));
      receiver.push(value);
    },
    addAll$1(receiver, collection) {
      var t1;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(collection);
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("addAll"));
      if (Array.isArray(collection)) {
        this._addAllFromArray$1(receiver, collection);
        return;
      }
      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
        receiver.push(t1.get$current(t1));
    },
    _addAllFromArray$1(receiver, array) {
      var len, i;
      type$.JSArray_dynamic._as(array);
      len = array.length;
      if (len === 0)
        return;
      if (receiver === array)
        throw A.wrapException(A.ConcurrentModificationError$(receiver));
      for (i = 0; i < len; ++i)
        receiver.push(array[i]);
    },
    clear$0(receiver) {
      if (!!receiver.fixed$length)
        A.throwExpression(A.UnsupportedError$("clear"));
      receiver.length = 0;
    },
    forEach$1(receiver, f) {
      var end, i;
      A._arrayInstanceType(receiver)._eval$1("~(1)")._as(f);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        f.call$1(receiver[i]);
        if (receiver.length !== end)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
    },
    map$1$1(receiver, f, $T) {
      var t1 = A._arrayInstanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(receiver, f) {
      return this.map$1$1(receiver, f, type$.dynamic);
    },
    join$1(receiver, separator) {
      var i,
        list = A.List_List$filled(receiver.length, "", false, type$.String);
      for (i = 0; i < receiver.length; ++i)
        this.$indexSet(list, i, A.S(receiver[i]));
      return list.join(separator);
    },
    take$1(receiver, n) {
      return A.SubListIterable$(receiver, 0, A.checkNotNullable(n, "count", type$.int), A._arrayInstanceType(receiver)._precomputed1);
    },
    skip$1(receiver, n) {
      return A.SubListIterable$(receiver, n, null, A._arrayInstanceType(receiver)._precomputed1);
    },
    fold$1$2(receiver, initialValue, combine, $T) {
      var $length, value, i;
      $T._as(initialValue);
      A._arrayInstanceType(receiver)._bind$1($T)._eval$1("1(1,2)")._as(combine);
      $length = receiver.length;
      for (value = initialValue, i = 0; i < $length; ++i) {
        value = combine.call$2(value, receiver[i]);
        if (receiver.length !== $length)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return value;
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      var t1 = receiver.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, "start", null));
      if (start === t1)
        return A._setArrayType([], A._arrayInstanceType(receiver));
      return A._setArrayType(receiver.slice(start, t1), A._arrayInstanceType(receiver));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, receiver.length);
      return A.SubListIterable$(receiver, start, end, A._arrayInstanceType(receiver)._precomputed1);
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    get$last(receiver) {
      var t1 = receiver.length;
      if (t1 > 0)
        return receiver[t1 - 1];
      throw A.wrapException(A.IterableElementError_noElement());
    },
    setRange$4(receiver, start, end, iterable, skipCount) {
      var $length, otherList, otherStart, t1, i;
      A._arrayInstanceType(receiver)._eval$1("Iterable<1>")._as(iterable);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("setRange"));
      A.RangeError_checkValidRange(start, end, receiver.length);
      $length = end - start;
      if ($length === 0)
        return;
      A.RangeError_checkNotNegative(skipCount, "skipCount");
      if (type$.List_dynamic._is(iterable)) {
        otherList = iterable;
        otherStart = skipCount;
      } else {
        otherList = J.skip$1$ax(iterable, skipCount).toList$1$growable(0, false);
        otherStart = 0;
      }
      t1 = J.getInterceptor$asx(otherList);
      if (otherStart + $length > t1.get$length(otherList))
        throw A.wrapException(A.IterableElementError_tooFew());
      if (otherStart < start)
        for (i = $length - 1; i >= 0; --i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
      else
        for (i = 0; i < $length; ++i)
          receiver[start + i] = t1.$index(otherList, otherStart + i);
    },
    any$1(receiver, test) {
      var end, i;
      A._arrayInstanceType(receiver)._eval$1("bool(1)")._as(test);
      end = receiver.length;
      for (i = 0; i < end; ++i) {
        if (A.boolConversionCheck(test.call$1(receiver[i])))
          return true;
        if (receiver.length !== end)
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    sort$1(receiver, compare) {
      var len, a, b, undefineds, i,
        t1 = A._arrayInstanceType(receiver);
      t1._eval$1("int(1,1)?")._as(compare);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("sort"));
      len = receiver.length;
      if (len < 2)
        return;
      if (compare == null)
        compare = J._interceptors_JSArray__compareAny$closure();
      if (len === 2) {
        a = receiver[0];
        b = receiver[1];
        t1 = compare.call$2(a, b);
        if (typeof t1 !== "number")
          return t1.$gt();
        if (t1 > 0) {
          receiver[0] = b;
          receiver[1] = a;
        }
        return;
      }
      if (t1._precomputed1._is(null)) {
        for (undefineds = 0, i = 0; i < receiver.length; ++i)
          if (receiver[i] === void 0) {
            receiver[i] = null;
            ++undefineds;
          }
      } else
        undefineds = 0;
      receiver.sort(A.convertDartClosureToJS(compare, 2));
      if (undefineds > 0)
        this._replaceSomeNullsWithUndefined$1(receiver, undefineds);
    },
    sort$0(receiver) {
      return this.sort$1(receiver, null);
    },
    _replaceSomeNullsWithUndefined$1(receiver, count) {
      var i0,
        i = receiver.length;
      for (; i0 = i - 1, i > 0; i = i0)
        if (receiver[i0] === null) {
          receiver[i0] = void 0;
          --count;
          if (count === 0)
            break;
        }
    },
    contains$1(receiver, other) {
      var i;
      for (i = 0; i < receiver.length; ++i)
        if (J.$eq$(receiver[i], other))
          return true;
      return false;
    },
    get$isEmpty(receiver) {
      return receiver.length === 0;
    },
    get$isNotEmpty(receiver) {
      return receiver.length !== 0;
    },
    toString$0(receiver) {
      return A.Iterable_iterableToFullString(receiver, "[", "]");
    },
    toList$1$growable(receiver, growable) {
      var t1 = A._setArrayType(receiver.slice(0), A._arrayInstanceType(receiver));
      return t1;
    },
    toList$0(receiver) {
      return this.toList$1$growable(receiver, true);
    },
    get$iterator(receiver) {
      return new J.ArrayIterator(receiver, receiver.length, A._arrayInstanceType(receiver)._eval$1("ArrayIterator<1>"));
    },
    get$hashCode(receiver) {
      return A.Primitives_objectHashCode(receiver);
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._arrayInstanceType(receiver)._precomputed1._as(value);
      if (!!receiver.immutable$list)
        A.throwExpression(A.UnsupportedError$("indexed set"));
      if (!(index >= 0 && index < receiver.length))
        throw A.wrapException(A.diagnoseIndexError(receiver, index));
      receiver[index] = value;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(A._arrayInstanceType(receiver));
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  J.JSUnmodifiableArray.prototype = {};
  J.ArrayIterator.prototype = {
    get$current(_) {
      var t1 = this.__interceptors$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t2, _this = this,
        t1 = _this._iterable,
        $length = t1.length;
      if (_this.__interceptors$_length !== $length) {
        t1 = A.throwConcurrentModificationError(t1);
        throw A.wrapException(t1);
      }
      t2 = _this._index;
      if (t2 >= $length) {
        _this.set$__interceptors$_current(null);
        return false;
      }
      _this.set$__interceptors$_current(t1[t2]);
      ++_this._index;
      return true;
    },
    set$__interceptors$_current(_current) {
      this.__interceptors$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  J.JSNumber.prototype = {
    compareTo$1(receiver, b) {
      var bIsNegative;
      A._asNum(b);
      if (receiver < b)
        return -1;
      else if (receiver > b)
        return 1;
      else if (receiver === b) {
        if (receiver === 0) {
          bIsNegative = this.get$isNegative(b);
          if (this.get$isNegative(receiver) === bIsNegative)
            return 0;
          if (this.get$isNegative(receiver))
            return -1;
          return 1;
        }
        return 0;
      } else if (isNaN(receiver)) {
        if (isNaN(b))
          return 0;
        return 1;
      } else
        return -1;
    },
    get$isNegative(receiver) {
      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
    },
    ceil$0(receiver) {
      var truncated, d;
      if (receiver >= 0) {
        if (receiver <= 2147483647) {
          truncated = receiver | 0;
          return receiver === truncated ? truncated : truncated + 1;
        }
      } else if (receiver >= -2147483648)
        return receiver | 0;
      d = Math.ceil(receiver);
      if (isFinite(d))
        return d;
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".ceil()"));
    },
    floor$0(receiver) {
      var truncated, d;
      if (receiver >= 0) {
        if (receiver <= 2147483647)
          return receiver | 0;
      } else if (receiver >= -2147483648) {
        truncated = receiver | 0;
        return receiver === truncated ? truncated : truncated - 1;
      }
      d = Math.floor(receiver);
      if (isFinite(d))
        return d;
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".floor()"));
    },
    round$0(receiver) {
      if (receiver > 0) {
        if (receiver !== 1 / 0)
          return Math.round(receiver);
      } else if (receiver > -1 / 0)
        return 0 - Math.round(0 - receiver);
      throw A.wrapException(A.UnsupportedError$("" + receiver + ".round()"));
    },
    toRadixString$1(receiver, radix) {
      var result, t1, t2, match, exponent;
      if (radix < 2 || radix > 36)
        throw A.wrapException(A.RangeError$range(radix, 2, 36, "radix", null));
      result = receiver.toString(radix);
      t1 = result.length;
      t2 = t1 - 1;
      if (!(t2 >= 0))
        return A.ioore(result, t2);
      if (result.charCodeAt(t2) !== 41)
        return result;
      match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
      if (match == null)
        A.throwExpression(A.UnsupportedError$("Unexpected toString result: " + result));
      t1 = match.length;
      if (1 >= t1)
        return A.ioore(match, 1);
      result = match[1];
      if (3 >= t1)
        return A.ioore(match, 3);
      exponent = +match[3];
      t1 = match[2];
      if (t1 != null) {
        result += t1;
        exponent -= t1.length;
      }
      return result + B.JSString_methods.$mul("0", exponent);
    },
    toString$0(receiver) {
      if (receiver === 0 && 1 / receiver < 0)
        return "-0.0";
      else
        return "" + receiver;
    },
    get$hashCode(receiver) {
      var absolute, floorLog2, factor, scaled,
        intValue = receiver | 0;
      if (receiver === intValue)
        return intValue & 536870911;
      absolute = Math.abs(receiver);
      floorLog2 = Math.log(absolute) / 0.6931471805599453 | 0;
      factor = Math.pow(2, floorLog2);
      scaled = absolute < 1 ? absolute / factor : factor / absolute;
      return ((scaled * 9007199254740992 | 0) + (scaled * 3542243181176521 | 0)) * 599197 + floorLog2 * 1259 & 536870911;
    },
    $mod(receiver, other) {
      var result = receiver % other;
      if (result === 0)
        return 0;
      if (result > 0)
        return result;
      return result + other;
    },
    $tdiv(receiver, other) {
      if ((receiver | 0) === receiver)
        if (other >= 1 || other < -1)
          return receiver / other | 0;
      return this._tdivSlow$1(receiver, other);
    },
    _tdivFast$1(receiver, other) {
      return (receiver | 0) === receiver ? receiver / other | 0 : this._tdivSlow$1(receiver, other);
    },
    _tdivSlow$1(receiver, other) {
      var quotient = receiver / other;
      if (quotient >= -2147483648 && quotient <= 2147483647)
        return quotient | 0;
      if (quotient > 0) {
        if (quotient !== 1 / 0)
          return Math.floor(quotient);
      } else if (quotient > -1 / 0)
        return Math.ceil(quotient);
      throw A.wrapException(A.UnsupportedError$("Result of truncating division is " + A.S(quotient) + ": " + A.S(receiver) + " ~/ " + other));
    },
    $shl(receiver, other) {
      if (other < 0)
        throw A.wrapException(A.argumentErrorValue(other));
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    _shlPositive$1(receiver, other) {
      return other > 31 ? 0 : receiver << other >>> 0;
    },
    $shr(receiver, other) {
      var t1;
      if (other < 0)
        throw A.wrapException(A.argumentErrorValue(other));
      if (receiver > 0)
        t1 = this._shrBothPositive$1(receiver, other);
      else {
        t1 = other > 31 ? 31 : other;
        t1 = receiver >> t1 >>> 0;
      }
      return t1;
    },
    _shrOtherPositive$1(receiver, other) {
      var t1;
      if (receiver > 0)
        t1 = this._shrBothPositive$1(receiver, other);
      else {
        t1 = other > 31 ? 31 : other;
        t1 = receiver >> t1 >>> 0;
      }
      return t1;
    },
    _shrReceiverPositive$1(receiver, other) {
      if (0 > other)
        throw A.wrapException(A.argumentErrorValue(other));
      return this._shrBothPositive$1(receiver, other);
    },
    _shrBothPositive$1(receiver, other) {
      return other > 31 ? 0 : receiver >>> other;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.num);
    },
    $isComparable: 1,
    $isdouble: 1,
    $isnum: 1
  };
  J.JSInt.prototype = {
    get$bitLength(receiver) {
      var wordBits,
        t1 = receiver < 0 ? -receiver - 1 : receiver,
        nonneg = t1;
      for (wordBits = 32; nonneg >= 4294967296;) {
        nonneg = this._tdivFast$1(nonneg, 4294967296);
        wordBits += 32;
      }
      return wordBits - Math.clz32(nonneg);
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.int);
    },
    $isTrustedGetRuntimeType: 1,
    $isint: 1
  };
  J.JSNumNotInt.prototype = {
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.double);
    },
    $isTrustedGetRuntimeType: 1
  };
  J.JSString.prototype = {
    allMatches$2(receiver, string, start) {
      var t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._StringAllMatchesIterable(string, receiver, start);
    },
    allMatches$1(receiver, string) {
      return this.allMatches$2(receiver, string, 0);
    },
    matchAsPrefix$2(receiver, string, start) {
      var t1, t2, i, t3, _null = null;
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, _null, _null));
      t1 = receiver.length;
      t2 = string.length;
      if (start + t1 > t2)
        return _null;
      for (i = 0; i < t1; ++i) {
        t3 = start + i;
        if (!(t3 >= 0 && t3 < t2))
          return A.ioore(string, t3);
        if (string.charCodeAt(t3) !== receiver.charCodeAt(i))
          return _null;
      }
      return new A.StringMatch(start, receiver);
    },
    $add(receiver, other) {
      return receiver + other;
    },
    endsWith$1(receiver, other) {
      var otherLength = other.length,
        t1 = receiver.length;
      if (otherLength > t1)
        return false;
      return other === this.substring$1(receiver, t1 - otherLength);
    },
    replaceRange$3(receiver, start, end, replacement) {
      var e = A.RangeError_checkValidRange(start, end, receiver.length);
      return A.stringReplaceRangeUnchecked(receiver, start, e, replacement);
    },
    startsWith$2(receiver, pattern, index) {
      var endIndex;
      if (index < 0 || index > receiver.length)
        throw A.wrapException(A.RangeError$range(index, 0, receiver.length, null, null));
      if (typeof pattern == "string") {
        endIndex = index + pattern.length;
        if (endIndex > receiver.length)
          return false;
        return pattern === receiver.substring(index, endIndex);
      }
      return J.matchAsPrefix$2$s(pattern, receiver, index) != null;
    },
    startsWith$1(receiver, pattern) {
      return this.startsWith$2(receiver, pattern, 0);
    },
    substring$2(receiver, start, end) {
      return receiver.substring(start, A.RangeError_checkValidRange(start, end, receiver.length));
    },
    substring$1(receiver, start) {
      return this.substring$2(receiver, start, null);
    },
    toLowerCase$0(receiver) {
      return receiver.toLowerCase();
    },
    $mul(receiver, times) {
      var s, result;
      if (0 >= times)
        return "";
      if (times === 1 || receiver.length === 0)
        return receiver;
      if (times !== times >>> 0)
        throw A.wrapException(B.C_OutOfMemoryError);
      for (s = receiver, result = ""; true;) {
        if ((times & 1) === 1)
          result = s + result;
        times = times >>> 1;
        if (times === 0)
          break;
        s += s;
      }
      return result;
    },
    padLeft$2(receiver, width, padding) {
      var delta = width - receiver.length;
      if (delta <= 0)
        return receiver;
      return this.$mul(padding, delta) + receiver;
    },
    indexOf$2(receiver, pattern, start) {
      var t1;
      if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = receiver.indexOf(pattern, start);
      return t1;
    },
    indexOf$1(receiver, pattern) {
      return this.indexOf$2(receiver, pattern, 0);
    },
    lastIndexOf$2(receiver, pattern, start) {
      var t1, t2;
      if (start == null)
        start = receiver.length;
      else if (start < 0 || start > receiver.length)
        throw A.wrapException(A.RangeError$range(start, 0, receiver.length, null, null));
      t1 = pattern.length;
      t2 = receiver.length;
      if (start + t1 > t2)
        start = t2 - t1;
      return receiver.lastIndexOf(pattern, start);
    },
    lastIndexOf$1(receiver, pattern) {
      return this.lastIndexOf$2(receiver, pattern, null);
    },
    contains$1(receiver, other) {
      return A.stringContainsUnchecked(receiver, other, 0);
    },
    compareTo$1(receiver, other) {
      var t1;
      A._asString(other);
      if (receiver === other)
        t1 = 0;
      else
        t1 = receiver < other ? -1 : 1;
      return t1;
    },
    toString$0(receiver) {
      return receiver;
    },
    get$hashCode(receiver) {
      var t1, hash, i;
      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
        hash = hash + receiver.charCodeAt(i) & 536870911;
        hash = hash + ((hash & 524287) << 10) & 536870911;
        hash ^= hash >> 6;
      }
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    get$runtimeType(receiver) {
      return A.createRuntimeType(type$.String);
    },
    get$length(receiver) {
      return receiver.length;
    },
    $isTrustedGetRuntimeType: 1,
    $isComparable: 1,
    $isPattern: 1,
    $isString: 1
  };
  A._CastIterableBase.prototype = {
    get$iterator(_) {
      var t1 = A._instanceType(this);
      return new A.CastIterator(J.get$iterator$ax(this.get$__internal$_source()), t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("CastIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.get$__internal$_source());
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.get$__internal$_source());
    },
    get$isNotEmpty(_) {
      return J.get$isNotEmpty$asx(this.get$__internal$_source());
    },
    skip$1(_, count) {
      var t1 = A._instanceType(this);
      return A.CastIterable_CastIterable(J.skip$1$ax(this.get$__internal$_source(), count), t1._precomputed1, t1._rest[1]);
    },
    take$1(_, count) {
      var t1 = A._instanceType(this);
      return A.CastIterable_CastIterable(J.take$1$ax(this.get$__internal$_source(), count), t1._precomputed1, t1._rest[1]);
    },
    elementAt$1(_, index) {
      return A._instanceType(this)._rest[1]._as(J.elementAt$1$ax(this.get$__internal$_source(), index));
    },
    get$first(_) {
      return A._instanceType(this)._rest[1]._as(J.get$first$ax(this.get$__internal$_source()));
    },
    contains$1(_, other) {
      return J.contains$1$asx(this.get$__internal$_source(), other);
    },
    toString$0(_) {
      return J.toString$0$(this.get$__internal$_source());
    }
  };
  A.CastIterator.prototype = {
    moveNext$0() {
      return this.__internal$_source.moveNext$0();
    },
    get$current(_) {
      var t1 = this.__internal$_source;
      return this.$ti._rest[1]._as(t1.get$current(t1));
    },
    $isIterator: 1
  };
  A.CastIterable.prototype = {
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A._EfficientLengthCastIterable.prototype = {$isEfficientLengthIterable: 1};
  A._CastListBase.prototype = {
    $index(_, index) {
      return this.$ti._rest[1]._as(J.$index$asx(this.__internal$_source, index));
    },
    $indexSet(_, index, value) {
      var t1 = this.$ti;
      J.$indexSet$ax(this.__internal$_source, index, t1._precomputed1._as(t1._rest[1]._as(value)));
    },
    sort$1(_, compare) {
      var t1;
      this.$ti._eval$1("int(2,2)?")._as(compare);
      t1 = compare == null ? null : new A._CastListBase_sort_closure(this, compare);
      J.sort$1$ax(this.__internal$_source, t1);
    },
    getRange$2(_, start, end) {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(J.getRange$2$ax(this.__internal$_source, start, end), t1._precomputed1, t1._rest[1]);
    },
    $isEfficientLengthIterable: 1,
    $isList: 1
  };
  A._CastListBase_sort_closure.prototype = {
    call$2(v1, v2) {
      var t1 = this.$this.$ti,
        t2 = t1._precomputed1;
      t2._as(v1);
      t2._as(v2);
      t1 = t1._rest[1];
      return this.compare.call$2(t1._as(v1), t1._as(v2));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1,1)");
    }
  };
  A.CastList.prototype = {
    cast$1$0(_, $R) {
      return new A.CastList(this.__internal$_source, this.$ti._eval$1("@<1>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    get$__internal$_source() {
      return this.__internal$_source;
    }
  };
  A.CastMap.prototype = {
    cast$2$0(_, RK, RV) {
      var t1 = this.$ti;
      return new A.CastMap(this.__internal$_source, t1._eval$1("@<1>")._bind$1(t1._rest[1])._bind$1(RK)._bind$1(RV)._eval$1("CastMap<1,2,3,4>"));
    },
    containsKey$1(_, key) {
      return J.containsKey$1$x(this.__internal$_source, key);
    },
    $index(_, key) {
      return this.$ti._eval$1("4?")._as(J.$index$asx(this.__internal$_source, key));
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      t1._rest[2]._as(key);
      t1._rest[3]._as(value);
      J.$indexSet$ax(this.__internal$_source, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    forEach$1(_, f) {
      J.forEach$1$ax(this.__internal$_source, new A.CastMap_forEach_closure(this, this.$ti._eval$1("~(3,4)")._as(f)));
    },
    get$keys(_) {
      var t1 = this.$ti;
      return A.CastIterable_CastIterable(J.get$keys$x(this.__internal$_source), t1._precomputed1, t1._rest[2]);
    },
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.__internal$_source);
    }
  };
  A.CastMap_forEach_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      this.f.call$2(t1._rest[2]._as(key), t1._rest[3]._as(value));
    },
    $signature() {
      return this.$this.$ti._eval$1("~(1,2)");
    }
  };
  A.LateError.prototype = {
    toString$0(_) {
      return "LateInitializationError: " + this._message;
    }
  };
  A.nullFuture_closure.prototype = {
    call$0() {
      return A.Future_Future$value(null, type$.Null);
    },
    $signature: 25
  };
  A.SentinelValue.prototype = {};
  A.EfficientLengthIterable.prototype = {};
  A.ListIterable.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A.ListIterator(_this, _this.get$length(_this), A._instanceType(_this)._eval$1("ListIterator<ListIterable.E>"));
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$first(_) {
      if (this.get$length(this) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.elementAt$1(0, 0);
    },
    contains$1(_, element) {
      var i, _this = this,
        $length = _this.get$length(_this);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(_this.elementAt$1(0, i), element))
          return true;
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return false;
    },
    join$1(_, separator) {
      var first, t1, i, _this = this,
        $length = _this.get$length(_this);
      if (separator.length !== 0) {
        if ($length === 0)
          return "";
        first = A.S(_this.elementAt$1(0, 0));
        if ($length !== _this.get$length(_this))
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        for (t1 = first, i = 1; i < $length; ++i) {
          t1 = t1 + separator + A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      } else {
        for (i = 0, t1 = ""; i < $length; ++i) {
          t1 += A.S(_this.elementAt$1(0, i));
          if ($length !== _this.get$length(_this))
            throw A.wrapException(A.ConcurrentModificationError$(_this));
        }
        return t1.charCodeAt(0) == 0 ? t1 : t1;
      }
    },
    join$0(_) {
      return this.join$1(0, "");
    },
    where$1(_, test) {
      return this.super$Iterable$where(0, A._instanceType(this)._eval$1("bool(ListIterable.E)")._as(test));
    },
    map$1$1(_, toElement, $T) {
      var t1 = A._instanceType(this);
      return new A.MappedListIterable(this, t1._bind$1($T)._eval$1("1(ListIterable.E)")._as(toElement), t1._eval$1("@<ListIterable.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    },
    skip$1(_, count) {
      return A.SubListIterable$(this, count, null, A._instanceType(this)._eval$1("ListIterable.E"));
    },
    take$1(_, count) {
      return A.SubListIterable$(this, 0, A.checkNotNullable(count, "count", type$.int), A._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$1$growable(_, growable) {
      return A.List_List$of(this, true, A._instanceType(this)._eval$1("ListIterable.E"));
    },
    toList$0(_) {
      return this.toList$1$growable(0, true);
    }
  };
  A.SubListIterable.prototype = {
    get$_endIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength > $length)
        return $length;
      return endOrLength;
    },
    get$_startIndex() {
      var $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this._start;
      if (t1 > $length)
        return $length;
      return t1;
    },
    get$length(_) {
      var endOrLength,
        $length = J.get$length$asx(this.__internal$_iterable),
        t1 = this._start;
      if (t1 >= $length)
        return 0;
      endOrLength = this._endOrLength;
      if (endOrLength == null || endOrLength >= $length)
        return $length - t1;
      if (typeof endOrLength !== "number")
        return endOrLength.$sub();
      return endOrLength - t1;
    },
    elementAt$1(_, index) {
      var _this = this,
        realIndex = _this.get$_startIndex() + index;
      if (index < 0 || realIndex >= _this.get$_endIndex())
        throw A.wrapException(A.IndexError$withLength(index, _this.get$length(0), _this, null, "index"));
      return J.elementAt$1$ax(_this.__internal$_iterable, realIndex);
    },
    skip$1(_, count) {
      var newStart, endOrLength, _this = this;
      A.RangeError_checkNotNegative(count, "count");
      newStart = _this._start + count;
      endOrLength = _this._endOrLength;
      if (endOrLength != null && newStart >= endOrLength)
        return new A.EmptyIterable(_this.$ti._eval$1("EmptyIterable<1>"));
      return A.SubListIterable$(_this.__internal$_iterable, newStart, endOrLength, _this.$ti._precomputed1);
    },
    take$1(_, count) {
      var endOrLength, t1, newEnd, _this = this;
      A.RangeError_checkNotNegative(count, "count");
      endOrLength = _this._endOrLength;
      t1 = _this._start;
      newEnd = t1 + count;
      if (endOrLength == null)
        return A.SubListIterable$(_this.__internal$_iterable, t1, newEnd, _this.$ti._precomputed1);
      else {
        if (endOrLength < newEnd)
          return _this;
        return A.SubListIterable$(_this.__internal$_iterable, t1, newEnd, _this.$ti._precomputed1);
      }
    },
    toList$1$growable(_, growable) {
      var $length, result, i, _this = this,
        start = _this._start,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        end = t2.get$length(t1),
        endOrLength = _this._endOrLength;
      if (endOrLength != null && endOrLength < end)
        end = endOrLength;
      $length = end - start;
      if ($length <= 0) {
        t1 = J.JSArray_JSArray$fixed(0, _this.$ti._precomputed1);
        return t1;
      }
      result = A.List_List$filled($length, t2.elementAt$1(t1, start), false, _this.$ti._precomputed1);
      for (i = 1; i < $length; ++i) {
        B.JSArray_methods.$indexSet(result, i, t2.elementAt$1(t1, start + i));
        if (t2.get$length(t1) < end)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
      return result;
    }
  };
  A.ListIterator.prototype = {
    get$current(_) {
      var t1 = this.__internal$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t3, _this = this,
        t1 = _this.__internal$_iterable,
        t2 = J.getInterceptor$asx(t1),
        $length = t2.get$length(t1);
      if (_this.__internal$_length !== $length)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      t3 = _this.__internal$_index;
      if (t3 >= $length) {
        _this.set$__internal$_current(null);
        return false;
      }
      _this.set$__internal$_current(t2.elementAt$1(t1, t3));
      ++_this.__internal$_index;
      return true;
    },
    set$__internal$_current(_current) {
      this.__internal$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.MappedIterable.prototype = {
    get$iterator(_) {
      var t1 = A._instanceType(this);
      return new A.MappedIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MappedIterator<1,2>"));
    },
    get$length(_) {
      return J.get$length$asx(this.__internal$_iterable);
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this.__internal$_iterable);
    },
    get$first(_) {
      return this._f.call$1(J.get$first$ax(this.__internal$_iterable));
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_iterable, index));
    }
  };
  A.EfficientLengthMappedIterable.prototype = {$isEfficientLengthIterable: 1};
  A.MappedIterator.prototype = {
    moveNext$0() {
      var _this = this,
        t1 = _this._iterator;
      if (t1.moveNext$0()) {
        _this.set$__internal$_current(_this._f.call$1(t1.get$current(t1)));
        return true;
      }
      _this.set$__internal$_current(null);
      return false;
    },
    get$current(_) {
      var t1 = this.__internal$_current;
      return t1 == null ? this.$ti._rest[1]._as(t1) : t1;
    },
    set$__internal$_current(_current) {
      this.__internal$_current = this.$ti._eval$1("2?")._as(_current);
    },
    $isIterator: 1
  };
  A.MappedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      return this._f.call$1(J.elementAt$1$ax(this.__internal$_source, index));
    }
  };
  A.WhereIterable.prototype = {
    get$iterator(_) {
      return new A.WhereIterator(J.get$iterator$ax(this.__internal$_iterable), this._f, this.$ti._eval$1("WhereIterator<1>"));
    },
    map$1$1(_, toElement, $T) {
      var t1 = this.$ti;
      return new A.MappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(toElement), t1._eval$1("@<1>")._bind$1($T)._eval$1("MappedIterable<1,2>"));
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    }
  };
  A.WhereIterator.prototype = {
    moveNext$0() {
      var t1, t2;
      for (t1 = this._iterator, t2 = this._f; t1.moveNext$0();)
        if (A.boolConversionCheck(t2.call$1(t1.get$current(t1))))
          return true;
      return false;
    },
    get$current(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    },
    $isIterator: 1
  };
  A.TakeIterable.prototype = {
    get$iterator(_) {
      return new A.TakeIterator(J.get$iterator$ax(this.__internal$_iterable), this._takeCount, A._instanceType(this)._eval$1("TakeIterator<1>"));
    }
  };
  A.EfficientLengthTakeIterable.prototype = {
    get$length(_) {
      var iterableLength = J.get$length$asx(this.__internal$_iterable),
        t1 = this._takeCount;
      if (iterableLength > t1)
        return t1;
      return iterableLength;
    },
    $isEfficientLengthIterable: 1
  };
  A.TakeIterator.prototype = {
    moveNext$0() {
      if (--this._remaining >= 0)
        return this._iterator.moveNext$0();
      this._remaining = -1;
      return false;
    },
    get$current(_) {
      var t1;
      if (this._remaining < 0) {
        this.$ti._precomputed1._as(null);
        return null;
      }
      t1 = this._iterator;
      return t1.get$current(t1);
    },
    $isIterator: 1
  };
  A.SkipIterable.prototype = {
    skip$1(_, count) {
      A.ArgumentError_checkNotNull(count, "count", type$.int);
      A.RangeError_checkNotNegative(count, "count");
      return new A.SkipIterable(this.__internal$_iterable, this._skipCount + count, A._instanceType(this)._eval$1("SkipIterable<1>"));
    },
    get$iterator(_) {
      return new A.SkipIterator(J.get$iterator$ax(this.__internal$_iterable), this._skipCount, A._instanceType(this)._eval$1("SkipIterator<1>"));
    }
  };
  A.EfficientLengthSkipIterable.prototype = {
    get$length(_) {
      var $length = J.get$length$asx(this.__internal$_iterable) - this._skipCount;
      if ($length >= 0)
        return $length;
      return 0;
    },
    skip$1(_, count) {
      A.ArgumentError_checkNotNull(count, "count", type$.int);
      A.RangeError_checkNotNegative(count, "count");
      return new A.EfficientLengthSkipIterable(this.__internal$_iterable, this._skipCount + count, this.$ti);
    },
    $isEfficientLengthIterable: 1
  };
  A.SkipIterator.prototype = {
    moveNext$0() {
      var t1, i;
      for (t1 = this._iterator, i = 0; i < this._skipCount; ++i)
        t1.moveNext$0();
      this._skipCount = 0;
      return t1.moveNext$0();
    },
    get$current(_) {
      var t1 = this._iterator;
      return t1.get$current(t1);
    },
    $isIterator: 1
  };
  A.EmptyIterable.prototype = {
    get$iterator(_) {
      return B.C_EmptyIterator;
    },
    get$isEmpty(_) {
      return true;
    },
    get$length(_) {
      return 0;
    },
    get$first(_) {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    elementAt$1(_, index) {
      throw A.wrapException(A.RangeError$range(index, 0, 0, "index", null));
    },
    contains$1(_, element) {
      return false;
    },
    map$1$1(_, toElement, $T) {
      this.$ti._bind$1($T)._eval$1("1(2)")._as(toElement);
      return new A.EmptyIterable($T._eval$1("EmptyIterable<0>"));
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    },
    skip$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return this;
    },
    take$1(_, count) {
      A.RangeError_checkNotNegative(count, "count");
      return this;
    }
  };
  A.EmptyIterator.prototype = {
    moveNext$0() {
      return false;
    },
    get$current(_) {
      throw A.wrapException(A.IterableElementError_noElement());
    },
    $isIterator: 1
  };
  A.FixedLengthListMixin.prototype = {};
  A.UnmodifiableListMixin.prototype = {
    $indexSet(_, index, value) {
      A._instanceType(this)._eval$1("UnmodifiableListMixin.E")._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    },
    sort$1(_, compare) {
      A._instanceType(this)._eval$1("int(UnmodifiableListMixin.E,UnmodifiableListMixin.E)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot modify an unmodifiable list"));
    }
  };
  A.UnmodifiableListBase.prototype = {};
  A.ReversedListIterable.prototype = {
    get$length(_) {
      return J.get$length$asx(this.__internal$_source);
    },
    elementAt$1(_, index) {
      var t1 = this.__internal$_source,
        t2 = J.getInterceptor$asx(t1);
      return t2.elementAt$1(t1, t2.get$length(t1) - 1 - index);
    }
  };
  A.Symbol.prototype = {
    get$hashCode(_) {
      var hash = this._hashCode;
      if (hash != null)
        return hash;
      hash = 664597 * B.JSString_methods.get$hashCode(this._name) & 536870911;
      this._hashCode = hash;
      return hash;
    },
    toString$0(_) {
      return 'Symbol("' + this._name + '")';
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Symbol && this._name === other._name;
    },
    $isSymbol0: 1
  };
  A.__CastListBase__CastIterableBase_ListMixin.prototype = {};
  A.ConstantMapView.prototype = {};
  A.ConstantMap.prototype = {
    cast$2$0(_, RK, RV) {
      var t1 = A._instanceType(this);
      return A.Map_castFrom(this, t1._precomputed1, t1._rest[1], RK, RV);
    },
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      A.ConstantMap__throwUnmodifiable();
    },
    map$2$1(_, transform, K2, V2) {
      var result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      this.forEach$1(0, new A.ConstantMap_map_closure(this, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result));
      return result;
    },
    map$1(_, transform) {
      var t1 = type$.dynamic;
      return this.map$2$1(0, transform, t1, t1);
    },
    $isMap: 1
  };
  A.ConstantMap_map_closure.prototype = {
    call$2(key, value) {
      var t1 = A._instanceType(this.$this),
        entry = this.transform.call$2(t1._precomputed1._as(key), t1._rest[1]._as(value));
      this.result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.ConstantStringMap.prototype = {
    get$length(_) {
      return this._values.length;
    },
    get$__js_helper$_keys() {
      var keys = this.$keys;
      if (keys == null) {
        keys = Object.keys(this._jsIndex);
        this.$keys = keys;
      }
      return keys;
    },
    containsKey$1(_, key) {
      if (typeof key != "string")
        return false;
      if ("__proto__" === key)
        return false;
      return this._jsIndex.hasOwnProperty(key);
    },
    $index(_, key) {
      if (!this.containsKey$1(0, key))
        return null;
      return this._values[this._jsIndex[key]];
    },
    forEach$1(_, f) {
      var keys, values, t1, i;
      this.$ti._eval$1("~(1,2)")._as(f);
      keys = this.get$__js_helper$_keys();
      values = this._values;
      for (t1 = keys.length, i = 0; i < t1; ++i)
        f.call$2(keys[i], values[i]);
    },
    get$keys(_) {
      return new A._KeysOrValues(this.get$__js_helper$_keys(), this.$ti._eval$1("_KeysOrValues<1>"));
    }
  };
  A._KeysOrValues.prototype = {
    get$length(_) {
      return this._elements.length;
    },
    get$isEmpty(_) {
      return 0 === this._elements.length;
    },
    get$isNotEmpty(_) {
      return 0 !== this._elements.length;
    },
    get$iterator(_) {
      var t1 = this._elements;
      return new A._KeysOrValuesOrElementsIterator(t1, t1.length, this.$ti._eval$1("_KeysOrValuesOrElementsIterator<1>"));
    }
  };
  A._KeysOrValuesOrElementsIterator.prototype = {
    get$current(_) {
      var t1 = this.__js_helper$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        t1 = _this.__js_helper$_index;
      if (t1 >= _this._length) {
        _this.set$__js_helper$_current(null);
        return false;
      }
      _this.set$__js_helper$_current(_this._elements[t1]);
      ++_this.__js_helper$_index;
      return true;
    },
    set$__js_helper$_current(_current) {
      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.JSInvocationMirror.prototype = {
    get$memberName() {
      var t1 = this._memberName;
      return t1;
    },
    get$positionalArguments() {
      var t1, argumentCount, list, index, _this = this;
      if (_this.__js_helper$_kind === 1)
        return B.List_empty;
      t1 = _this._arguments;
      argumentCount = t1.length - _this._namedArgumentNames.length - _this._typeArgumentCount;
      if (argumentCount === 0)
        return B.List_empty;
      list = [];
      for (index = 0; index < argumentCount; ++index) {
        if (!(index < t1.length))
          return A.ioore(t1, index);
        list.push(t1[index]);
      }
      return J.JSArray_markUnmodifiableList(list);
    },
    get$namedArguments() {
      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4, _this = this;
      if (_this.__js_helper$_kind !== 0)
        return B.Map_empty;
      t1 = _this._namedArgumentNames;
      namedArgumentCount = t1.length;
      t2 = _this._arguments;
      namedArgumentsStartIndex = t2.length - namedArgumentCount - _this._typeArgumentCount;
      if (namedArgumentCount === 0)
        return B.Map_empty;
      map = new A.JsLinkedHashMap(type$.JsLinkedHashMap_Symbol_dynamic);
      for (i = 0; i < namedArgumentCount; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        t3 = t1[i];
        t4 = namedArgumentsStartIndex + i;
        if (!(t4 >= 0 && t4 < t2.length))
          return A.ioore(t2, t4);
        map.$indexSet(0, new A.Symbol(t3), t2[t4]);
      }
      return new A.ConstantMapView(map, type$.ConstantMapView_Symbol_dynamic);
    },
    $isInvocation: 1
  };
  A.Primitives_functionNoSuchMethod_closure.prototype = {
    call$2($name, argument) {
      var t1;
      A._asString($name);
      t1 = this._box_0;
      t1.names = t1.names + "$" + $name;
      B.JSArray_methods.add$1(this.namedArgumentList, $name);
      B.JSArray_methods.add$1(this.$arguments, argument);
      ++t1.argumentCount;
    },
    $signature: 6
  };
  A.TypeErrorDecoder.prototype = {
    matchTypeError$1(message) {
      var result, t1, _this = this,
        match = new RegExp(_this._pattern).exec(message);
      if (match == null)
        return null;
      result = Object.create(null);
      t1 = _this._arguments;
      if (t1 !== -1)
        result.arguments = match[t1 + 1];
      t1 = _this._argumentsExpr;
      if (t1 !== -1)
        result.argumentsExpr = match[t1 + 1];
      t1 = _this._expr;
      if (t1 !== -1)
        result.expr = match[t1 + 1];
      t1 = _this._method;
      if (t1 !== -1)
        result.method = match[t1 + 1];
      t1 = _this._receiver;
      if (t1 !== -1)
        result.receiver = match[t1 + 1];
      return result;
    }
  };
  A.NullError.prototype = {
    toString$0(_) {
      return "Null check operator used on a null value";
    }
  };
  A.JsNoSuchMethodError.prototype = {
    toString$0(_) {
      var t2, _this = this,
        _s38_ = "NoSuchMethodError: method not found: '",
        t1 = _this._method;
      if (t1 == null)
        return "NoSuchMethodError: " + _this.__js_helper$_message;
      t2 = _this._receiver;
      if (t2 == null)
        return _s38_ + t1 + "' (" + _this.__js_helper$_message + ")";
      return _s38_ + t1 + "' on '" + t2 + "' (" + _this.__js_helper$_message + ")";
    }
  };
  A.UnknownJsTypeError.prototype = {
    toString$0(_) {
      var t1 = this.__js_helper$_message;
      return t1.length === 0 ? "Error" : "Error: " + t1;
    }
  };
  A.NullThrownFromJavaScriptException.prototype = {
    toString$0(_) {
      return "Throw of null ('" + (this._irritant === null ? "null" : "undefined") + "' from JavaScript)";
    }
  };
  A.ExceptionAndStackTrace.prototype = {};
  A._StackTrace.prototype = {
    toString$0(_) {
      var trace,
        t1 = this._trace;
      if (t1 != null)
        return t1;
      t1 = this._exception;
      trace = t1 !== null && typeof t1 === "object" ? t1.stack : null;
      return this._trace = trace == null ? "" : trace;
    },
    $isStackTrace: 1
  };
  A.Closure.prototype = {
    toString$0(_) {
      var $constructor = this.constructor,
        $name = $constructor == null ? null : $constructor.name;
      return "Closure '" + A.unminifyOrTag($name == null ? "unknown" : $name) + "'";
    },
    get$runtimeType(_) {
      var rti = A.closureFunctionType(this);
      return A.createRuntimeType(rti == null ? A.instanceType(this) : rti);
    },
    $isFunction: 1,
    get$$call() {
      return this;
    },
    "call*": "call$1",
    $requiredArgCount: 1,
    $defaultValues: null
  };
  A.Closure0Args.prototype = {"call*": "call$0", $requiredArgCount: 0};
  A.Closure2Args.prototype = {"call*": "call$2", $requiredArgCount: 2};
  A.TearOffClosure.prototype = {};
  A.StaticClosure.prototype = {
    toString$0(_) {
      var $name = this.$static_name;
      if ($name == null)
        return "Closure of unknown static method";
      return "Closure '" + A.unminifyOrTag($name) + "'";
    }
  };
  A.BoundClosure.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      if (!(other instanceof A.BoundClosure))
        return false;
      return this.$_target === other.$_target && this._receiver === other._receiver;
    },
    get$hashCode(_) {
      return (A.objectHashCode(this._receiver) ^ A.Primitives_objectHashCode(this.$_target)) >>> 0;
    },
    toString$0(_) {
      return "Closure '" + this.$_name + "' of " + ("Instance of '" + A.Primitives_objectTypeName(this._receiver) + "'");
    }
  };
  A._CyclicInitializationError.prototype = {
    toString$0(_) {
      return "Reading static variable '" + this.variableName + "' during its initialization";
    }
  };
  A.RuntimeError.prototype = {
    toString$0(_) {
      return "RuntimeError: " + this.message;
    }
  };
  A._AssertionError.prototype = {
    toString$0(_) {
      return "Assertion failed: " + A.Error_safeToString(this.message);
    }
  };
  A._Required.prototype = {};
  A.JsLinkedHashMap.prototype = {
    get$length(_) {
      return this._length;
    },
    get$isEmpty(_) {
      return this._length === 0;
    },
    get$keys(_) {
      return new A.LinkedHashMapKeyIterable(this, A._instanceType(this)._eval$1("LinkedHashMapKeyIterable<1>"));
    },
    containsKey$1(_, key) {
      var strings, nums;
      if (typeof key == "string") {
        strings = this._strings;
        if (strings == null)
          return false;
        return strings[key] != null;
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = this._nums;
        if (nums == null)
          return false;
        return nums[key] != null;
      } else
        return this.internalContainsKey$1(key);
    },
    internalContainsKey$1(key) {
      var rest = this.__js_helper$_rest;
      if (rest == null)
        return false;
      return this.internalFindBucketIndex$2(rest[this.internalComputeHashCode$1(key)], key) >= 0;
    },
    addAll$1(_, other) {
      A._instanceType(this)._eval$1("Map<1,2>")._as(other).forEach$1(0, new A.JsLinkedHashMap_addAll_closure(this));
    },
    $index(_, key) {
      var strings, cell, t1, nums, _null = null;
      if (typeof key == "string") {
        strings = this._strings;
        if (strings == null)
          return _null;
        cell = strings[key];
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = this._nums;
        if (nums == null)
          return _null;
        cell = nums[key];
        t1 = cell == null ? _null : cell.hashMapCellValue;
        return t1;
      } else
        return this.internalGet$1(key);
    },
    internalGet$1(key) {
      var bucket, index,
        rest = this.__js_helper$_rest;
      if (rest == null)
        return null;
      bucket = rest[this.internalComputeHashCode$1(key)];
      index = this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      return bucket[index].hashMapCellValue;
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string") {
        strings = _this._strings;
        _this._addHashTableEntry$3(strings == null ? _this._strings = _this._newHashTable$0() : strings, key, value);
      } else if (typeof key == "number" && (key & 0x3fffffff) === key) {
        nums = _this._nums;
        _this._addHashTableEntry$3(nums == null ? _this._nums = _this._newHashTable$0() : nums, key, value);
      } else
        _this.internalSet$2(key, value);
    },
    internalSet$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this.__js_helper$_rest;
      if (rest == null)
        rest = _this.__js_helper$_rest = _this._newHashTable$0();
      hash = _this.internalComputeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [_this._newLinkedCell$2(key, value)];
      else {
        index = _this.internalFindBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index].hashMapCellValue = value;
        else
          bucket.push(_this._newLinkedCell$2(key, value));
      }
    },
    putIfAbsent$2(_, key, ifAbsent) {
      var t2, value, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._eval$1("2()")._as(ifAbsent);
      if (_this.containsKey$1(0, key)) {
        t2 = _this.$index(0, key);
        return t2 == null ? t1._rest[1]._as(t2) : t2;
      }
      value = ifAbsent.call$0();
      _this.$indexSet(0, key, value);
      return value;
    },
    remove$1(_, key) {
      var _this = this;
      if (typeof key == "string")
        return _this._removeHashTableEntry$2(_this._strings, key);
      else if (typeof key == "number" && (key & 0x3fffffff) === key)
        return _this._removeHashTableEntry$2(_this._nums, key);
      else
        return _this.internalRemove$1(key);
    },
    internalRemove$1(key) {
      var hash, bucket, index, cell, _this = this,
        rest = _this.__js_helper$_rest;
      if (rest == null)
        return null;
      hash = _this.internalComputeHashCode$1(key);
      bucket = rest[hash];
      index = _this.internalFindBucketIndex$2(bucket, key);
      if (index < 0)
        return null;
      cell = bucket.splice(index, 1)[0];
      _this._unlinkCell$1(cell);
      if (bucket.length === 0)
        delete rest[hash];
      return cell.hashMapCellValue;
    },
    forEach$1(_, action) {
      var cell, modifications, _this = this;
      A._instanceType(_this)._eval$1("~(1,2)")._as(action);
      cell = _this._first;
      modifications = _this._modifications;
      for (; cell != null;) {
        action.call$2(cell.hashMapCellKey, cell.hashMapCellValue);
        if (modifications !== _this._modifications)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
        cell = cell._next;
      }
    },
    _addHashTableEntry$3(table, key, value) {
      var cell,
        t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      cell = table[key];
      if (cell == null)
        table[key] = this._newLinkedCell$2(key, value);
      else
        cell.hashMapCellValue = value;
    },
    _removeHashTableEntry$2(table, key) {
      var cell;
      if (table == null)
        return null;
      cell = table[key];
      if (cell == null)
        return null;
      this._unlinkCell$1(cell);
      delete table[key];
      return cell.hashMapCellValue;
    },
    _modified$0() {
      this._modifications = this._modifications + 1 & 1073741823;
    },
    _newLinkedCell$2(key, value) {
      var _this = this,
        t1 = A._instanceType(_this),
        cell = new A.LinkedHashMapCell(t1._precomputed1._as(key), t1._rest[1]._as(value));
      if (_this._first == null)
        _this._first = _this._last = cell;
      else {
        t1 = _this._last;
        t1.toString;
        cell._previous = t1;
        _this._last = t1._next = cell;
      }
      ++_this._length;
      _this._modified$0();
      return cell;
    },
    _unlinkCell$1(cell) {
      var _this = this,
        previous = cell._previous,
        next = cell._next;
      if (previous == null)
        _this._first = next;
      else
        previous._next = next;
      if (next == null)
        _this._last = previous;
      else
        next._previous = previous;
      --_this._length;
      _this._modified$0();
    },
    internalComputeHashCode$1(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    internalFindBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i].hashMapCellKey, key))
          return i;
      return -1;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this);
    },
    _newHashTable$0() {
      var table = Object.create(null);
      table["<non-identifier-key>"] = table;
      delete table["<non-identifier-key>"];
      return table;
    },
    $isLinkedHashMap: 1
  };
  A.JsLinkedHashMap_addAll_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this,
        t2 = A._instanceType(t1);
      t1.$indexSet(0, t2._precomputed1._as(key), t2._rest[1]._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(1,2)");
    }
  };
  A.LinkedHashMapCell.prototype = {};
  A.LinkedHashMapKeyIterable.prototype = {
    get$length(_) {
      return this._map._length;
    },
    get$isEmpty(_) {
      return this._map._length === 0;
    },
    get$iterator(_) {
      var t1 = this._map,
        t2 = new A.LinkedHashMapKeyIterator(t1, t1._modifications, this.$ti._eval$1("LinkedHashMapKeyIterator<1>"));
      t2._cell = t1._first;
      return t2;
    },
    contains$1(_, element) {
      return this._map.containsKey$1(0, element);
    }
  };
  A.LinkedHashMapKeyIterator.prototype = {
    get$current(_) {
      return this.__js_helper$_current;
    },
    moveNext$0() {
      var cell, _this = this,
        t1 = _this._map;
      if (_this._modifications !== t1._modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      cell = _this._cell;
      if (cell == null) {
        _this.set$__js_helper$_current(null);
        return false;
      } else {
        _this.set$__js_helper$_current(cell.hashMapCellKey);
        _this._cell = cell._next;
        return true;
      }
    },
    set$__js_helper$_current(_current) {
      this.__js_helper$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.initHooks_closure.prototype = {
    call$1(o) {
      return this.getTag(o);
    },
    $signature: 1
  };
  A.initHooks_closure0.prototype = {
    call$2(o, tag) {
      return this.getUnknownTag(o, tag);
    },
    $signature: 84
  };
  A.initHooks_closure1.prototype = {
    call$1(tag) {
      return this.prototypeForTag(A._asString(tag));
    },
    $signature: 85
  };
  A.JSSyntaxRegExp.prototype = {
    toString$0(_) {
      return "RegExp/" + this.pattern + "/" + this._nativeRegExp.flags;
    },
    get$_nativeGlobalVersion() {
      var _this = this,
        t1 = _this._nativeGlobalRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeGlobalRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern, t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
    },
    get$_nativeAnchoredVersion() {
      var _this = this,
        t1 = _this._nativeAnchoredRegExp;
      if (t1 != null)
        return t1;
      t1 = _this._nativeRegExp;
      return _this._nativeAnchoredRegExp = A.JSSyntaxRegExp_makeNative(_this.pattern + "|()", t1.multiline, !t1.ignoreCase, t1.unicode, t1.dotAll, true);
    },
    firstMatch$1(string) {
      var m = this._nativeRegExp.exec(string);
      if (m == null)
        return null;
      return new A._MatchImplementation(m);
    },
    allMatches$2(_, string, start) {
      var t1 = string.length;
      if (start > t1)
        throw A.wrapException(A.RangeError$range(start, 0, t1, null, null));
      return new A._AllMatchesIterable(this, string, start);
    },
    allMatches$1(_, string) {
      return this.allMatches$2(0, string, 0);
    },
    _execGlobal$2(string, start) {
      var match,
        regexp = this.get$_nativeGlobalVersion();
      if (regexp == null)
        regexp = type$.Object._as(regexp);
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      return new A._MatchImplementation(match);
    },
    _execAnchored$2(string, start) {
      var match,
        regexp = this.get$_nativeAnchoredVersion();
      if (regexp == null)
        regexp = type$.Object._as(regexp);
      regexp.lastIndex = start;
      match = regexp.exec(string);
      if (match == null)
        return null;
      if (0 >= match.length)
        return A.ioore(match, -1);
      if (match.pop() != null)
        return null;
      return new A._MatchImplementation(match);
    },
    matchAsPrefix$2(_, string, start) {
      if (start < 0 || start > string.length)
        throw A.wrapException(A.RangeError$range(start, 0, string.length, null, null));
      return this._execAnchored$2(string, start);
    },
    $isPattern: 1,
    $isRegExp: 1
  };
  A._MatchImplementation.prototype = {
    get$end(_) {
      var t1 = this._match;
      return t1.index + t1[0].length;
    },
    $isMatch: 1,
    $isRegExpMatch: 1
  };
  A._AllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._AllMatchesIterator(this._re, this._string, this.__js_helper$_start);
    }
  };
  A._AllMatchesIterator.prototype = {
    get$current(_) {
      var t1 = this.__js_helper$_current;
      return t1 == null ? type$.RegExpMatch._as(t1) : t1;
    },
    moveNext$0() {
      var t1, t2, t3, match, nextIndex, _this = this,
        string = _this._string;
      if (string == null)
        return false;
      t1 = _this._nextIndex;
      t2 = string.length;
      if (t1 <= t2) {
        t3 = _this._regExp;
        match = t3._execGlobal$2(string, t1);
        if (match != null) {
          _this.__js_helper$_current = match;
          nextIndex = match.get$end(0);
          if (match._match.index === nextIndex) {
            if (t3._nativeRegExp.unicode) {
              t1 = _this._nextIndex;
              t3 = t1 + 1;
              if (t3 < t2) {
                if (!(t1 >= 0 && t1 < t2))
                  return A.ioore(string, t1);
                t1 = string.charCodeAt(t1);
                if (t1 >= 55296 && t1 <= 56319) {
                  if (!(t3 >= 0))
                    return A.ioore(string, t3);
                  t1 = string.charCodeAt(t3);
                  t1 = t1 >= 56320 && t1 <= 57343;
                } else
                  t1 = false;
              } else
                t1 = false;
            } else
              t1 = false;
            nextIndex = (t1 ? nextIndex + 1 : nextIndex) + 1;
          }
          _this._nextIndex = nextIndex;
          return true;
        }
      }
      _this._string = _this.__js_helper$_current = null;
      return false;
    },
    $isIterator: 1
  };
  A.StringMatch.prototype = {$isMatch: 1};
  A._StringAllMatchesIterable.prototype = {
    get$iterator(_) {
      return new A._StringAllMatchesIterator(this._input, this._pattern, this.__js_helper$_index);
    },
    get$first(_) {
      var t1 = this._pattern,
        index = this._input.indexOf(t1, this.__js_helper$_index);
      if (index >= 0)
        return new A.StringMatch(index, t1);
      throw A.wrapException(A.IterableElementError_noElement());
    }
  };
  A._StringAllMatchesIterator.prototype = {
    moveNext$0() {
      var index, end, _this = this,
        t1 = _this.__js_helper$_index,
        t2 = _this._pattern,
        t3 = t2.length,
        t4 = _this._input,
        t5 = t4.length;
      if (t1 + t3 > t5) {
        _this.__js_helper$_current = null;
        return false;
      }
      index = t4.indexOf(t2, t1);
      if (index < 0) {
        _this.__js_helper$_index = t5 + 1;
        _this.__js_helper$_current = null;
        return false;
      }
      end = index + t3;
      _this.__js_helper$_current = new A.StringMatch(index, t2);
      _this.__js_helper$_index = end === _this.__js_helper$_index ? end + 1 : end;
      return true;
    },
    get$current(_) {
      var t1 = this.__js_helper$_current;
      t1.toString;
      return t1;
    },
    $isIterator: 1
  };
  A._Cell.prototype = {
    readLocal$1$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        A.throwExpression(new A.LateError("Local '" + this.__late_helper$_name + "' has not been initialized."));
      return t1;
    },
    readLocal$0() {
      return this.readLocal$1$0(type$.dynamic);
    },
    _readField$0() {
      var t1 = this.__late_helper$_value;
      if (t1 === this)
        throw A.wrapException(A.LateError$fieldNI(this.__late_helper$_name));
      return t1;
    }
  };
  A.NativeByteBuffer.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteBuffer_RkP;
    },
    $isTrustedGetRuntimeType: 1,
    $isNativeByteBuffer: 1,
    $isByteBuffer: 1
  };
  A.NativeTypedData.prototype = {$isNativeTypedData: 1, $isTypedData: 1};
  A.NativeByteData.prototype = {
    get$runtimeType(receiver) {
      return B.Type_ByteData_zNC;
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeTypedArray.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isJavaScriptIndexingBehavior: 1
  };
  A.NativeTypedArrayOfDouble.prototype = {
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      A._asDouble(value);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeTypedArrayOfInt.prototype = {
    $indexSet(receiver, index, value) {
      A._asInt(value);
      A._checkValidIndex(index, receiver, receiver.length);
      receiver[index] = value;
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.NativeFloat32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float32List_LB7;
    },
    sublist$2(receiver, start, end) {
      return new Float32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeFloat64List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Float64List_LB7;
    },
    sublist$2(receiver, start, end) {
      return new Float64Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeInt16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int16List_uXf;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeInt32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int32List_O50;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeInt8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Int8List_ekJ;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Int8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeUint16List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint16List_2bx;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint16Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isUint16List: 1
  };
  A.NativeUint32List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint32List_2bx;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint32Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeUint8ClampedList.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8ClampedList_Jik;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8ClampedArray(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1
  };
  A.NativeUint8List.prototype = {
    get$runtimeType(receiver) {
      return B.Type_Uint8List_WLA;
    },
    get$length(receiver) {
      return receiver.length;
    },
    $index(receiver, index) {
      A._checkValidIndex(index, receiver, receiver.length);
      return receiver[index];
    },
    sublist$2(receiver, start, end) {
      return new Uint8Array(receiver.subarray(start, A._checkValidRange(start, end, receiver.length)));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    $isTrustedGetRuntimeType: 1,
    $isNativeUint8List: 1,
    $isUint8List: 1
  };
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.prototype = {};
  A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.prototype = {};
  A.Rti.prototype = {
    _eval$1(recipe) {
      return A._Universe_evalInEnvironment(init.typeUniverse, this, recipe);
    },
    _bind$1(typeOrTuple) {
      return A._Universe_bind(init.typeUniverse, this, typeOrTuple);
    }
  };
  A._FunctionParameters.prototype = {};
  A._Type.prototype = {
    toString$0(_) {
      return A._rtiToString(this._rti, null);
    },
    $isType: 1
  };
  A._Error.prototype = {
    toString$0(_) {
      return this.__rti$_message;
    }
  };
  A._TypeError.prototype = {$isTypeError: 1};
  A._AsyncRun__initializeScheduleImmediate_internalCallback.prototype = {
    call$1(_) {
      var t1 = this._box_0,
        f = t1.storedCallback;
      t1.storedCallback = null;
      f.call$0();
    },
    $signature: 7
  };
  A._AsyncRun__initializeScheduleImmediate_closure.prototype = {
    call$1(callback) {
      var t1, t2;
      this._box_0.storedCallback = type$.void_Function._as(callback);
      t1 = this.div;
      t2 = this.span;
      t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2);
    },
    $signature: 65
  };
  A._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 5
  };
  A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback.prototype = {
    call$0() {
      this.callback.call$0();
    },
    $signature: 5
  };
  A._TimerImpl.prototype = {
    _TimerImpl$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setTimeout(A.convertDartClosureToJS(new A._TimerImpl_internalCallback(this, callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("`setTimeout()` not found."));
    },
    _TimerImpl$periodic$2(milliseconds, callback) {
      if (self.setTimeout != null)
        this._handle = self.setInterval(A.convertDartClosureToJS(new A._TimerImpl$periodic_closure(this, milliseconds, Date.now(), callback), 0), milliseconds);
      else
        throw A.wrapException(A.UnsupportedError$("Periodic timer."));
    },
    get$isActive() {
      return this._handle != null;
    },
    cancel$0(_) {
      var t1;
      if (self.setTimeout != null) {
        t1 = this._handle;
        if (t1 == null)
          return;
        if (this._once)
          self.clearTimeout(t1);
        else
          self.clearInterval(t1);
        this._handle = null;
      } else
        throw A.wrapException(A.UnsupportedError$("Canceling a timer."));
    },
    $isTimer: 1
  };
  A._TimerImpl_internalCallback.prototype = {
    call$0() {
      var t1 = this.$this;
      t1._handle = null;
      t1._tick = 1;
      this.callback.call$0();
    },
    $signature: 0
  };
  A._TimerImpl$periodic_closure.prototype = {
    call$0() {
      var duration, _this = this,
        t1 = _this.$this,
        tick = t1._tick + 1,
        t2 = _this.milliseconds;
      if (t2 > 0) {
        duration = Date.now() - _this.start;
        if (duration > (tick + 1) * t2)
          tick = B.JSInt_methods.$tdiv(duration, t2);
      }
      t1._tick = tick;
      _this.callback.call$1(t1);
    },
    $signature: 5
  };
  A._AsyncAwaitCompleter.prototype = {
    complete$1(_, value) {
      var t2, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/?")._as(value);
      if (value == null)
        value = t1._precomputed1._as(value);
      if (!_this.isSync)
        _this._future._asyncComplete$1(value);
      else {
        t2 = _this._future;
        if (t1._eval$1("Future<1>")._is(value))
          t2._chainFuture$1(value);
        else
          t2._completeWithValue$1(value);
      }
    },
    completeError$2(e, st) {
      var t1 = this._future;
      if (this.isSync)
        t1._completeError$2(e, st);
      else
        t1._asyncCompleteError$2(e, st);
    },
    $isCompleter: 1
  };
  A._awaitOnObject_closure.prototype = {
    call$1(result) {
      return this.bodyFunction.call$2(0, result);
    },
    $signature: 3
  };
  A._awaitOnObject_closure0.prototype = {
    call$2(error, stackTrace) {
      this.bodyFunction.call$2(1, new A.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace)));
    },
    $signature: 52
  };
  A._wrapJsFunctionForAsync_closure.prototype = {
    call$2(errorCode, result) {
      this.$protected(A._asInt(errorCode), result);
    },
    $signature: 51
  };
  A.AsyncError.prototype = {
    toString$0(_) {
      return A.S(this.error);
    },
    $isError: 1,
    get$stackTrace() {
      return this.stackTrace;
    }
  };
  A.Future_Future$microtask_closure.prototype = {
    call$0() {
      var e, s, exception;
      try {
        this.result._complete$1(this.computation.call$0());
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._completeWithErrorCallback(this.result, e, s);
      }
    },
    $signature: 0
  };
  A._Completer.prototype = {
    completeError$2(error, stackTrace) {
      var replacement;
      A.checkNotNullable(error, "error", type$.Object);
      if ((this.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      this._completeError$2(error, stackTrace);
    },
    completeError$1(error) {
      return this.completeError$2(error, null);
    },
    $isCompleter: 1
  };
  A._AsyncCompleter.prototype = {
    complete$1(_, value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._asyncComplete$1(t1._eval$1("1/")._as(value));
    },
    complete$0(_) {
      return this.complete$1(0, null);
    },
    _completeError$2(error, stackTrace) {
      this.future._asyncCompleteError$2(error, stackTrace);
    }
  };
  A._SyncCompleter.prototype = {
    complete$1(_, value) {
      var t2,
        t1 = this.$ti;
      t1._eval$1("1/?")._as(value);
      t2 = this.future;
      if ((t2._state & 30) !== 0)
        throw A.wrapException(A.StateError$("Future already completed"));
      t2._complete$1(t1._eval$1("1/")._as(value));
    },
    _completeError$2(error, stackTrace) {
      this.future._completeError$2(error, stackTrace);
    }
  };
  A._FutureListener.prototype = {
    matchesErrorTest$1(asyncError) {
      if ((this.state & 15) !== 6)
        return true;
      return this.result._zone.runUnary$2$2(type$.bool_Function_Object._as(this.callback), asyncError.error, type$.bool, type$.Object);
    },
    handleError$1(asyncError) {
      var exception, _this = this,
        errorCallback = _this.errorCallback,
        result = null,
        t1 = type$.dynamic,
        t2 = type$.Object,
        t3 = asyncError.error,
        t4 = _this.result._zone;
      if (type$.dynamic_Function_Object_StackTrace._is(errorCallback))
        result = t4.runBinary$3$3(errorCallback, t3, asyncError.stackTrace, t1, t2, type$.StackTrace);
      else
        result = t4.runUnary$2$2(type$.dynamic_Function_Object._as(errorCallback), t3, t1, t2);
      try {
        t1 = _this.$ti._eval$1("2/")._as(result);
        return t1;
      } catch (exception) {
        if (type$.TypeError._is(A.unwrapException(exception))) {
          if ((_this.state & 1) !== 0)
            throw A.wrapException(A.ArgumentError$("The error handler of Future.then must return a value of the returned future's type", "onError"));
          throw A.wrapException(A.ArgumentError$("The error handler of Future.catchError must return a value of the future's type", "onError"));
        } else
          throw exception;
      }
    }
  };
  A._Future.prototype = {
    _setChained$1(source) {
      this._state = this._state & 1 | 4;
      this._resultOrListeners = source;
    },
    then$1$2$onError(_, f, onError, $R) {
      var currentZone, result, t2,
        t1 = this.$ti;
      t1._bind$1($R)._eval$1("1/(2)")._as(f);
      currentZone = $.Zone__current;
      if (currentZone === B.C__RootZone) {
        if (onError != null && !type$.dynamic_Function_Object_StackTrace._is(onError) && !type$.dynamic_Function_Object._is(onError))
          throw A.wrapException(A.ArgumentError$value(onError, "onError", string$.Error_));
      } else {
        f = currentZone.registerUnaryCallback$2$1(f, $R._eval$1("0/"), t1._precomputed1);
        if (onError != null)
          onError = A._registerErrorHandler(onError, currentZone);
      }
      result = new A._Future($.Zone__current, $R._eval$1("_Future<0>"));
      t2 = onError == null ? 1 : 3;
      this._addListener$1(new A._FutureListener(result, t2, f, onError, t1._eval$1("@<1>")._bind$1($R)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    then$1$1(_, f, $R) {
      return this.then$1$2$onError(0, f, null, $R);
    },
    _thenAwait$1$2(f, onError, $E) {
      var result,
        t1 = this.$ti;
      t1._bind$1($E)._eval$1("1/(2)")._as(f);
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this._addListener$1(new A._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    catchError$1(onError) {
      var t1 = this.$ti,
        t2 = $.Zone__current,
        result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone)
        onError = A._registerErrorHandler(onError, t2);
      this._addListener$1(new A._FutureListener(result, 2, null, onError, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    whenComplete$1(action) {
      var t1, t2, result;
      type$.dynamic_Function._as(action);
      t1 = this.$ti;
      t2 = $.Zone__current;
      result = new A._Future(t2, t1);
      if (t2 !== B.C__RootZone)
        action = t2.registerCallback$1$1(action, type$.dynamic);
      this._addListener$1(new A._FutureListener(result, 8, action, null, t1._eval$1("@<1>")._bind$1(t1._precomputed1)._eval$1("_FutureListener<1,2>")));
      return result;
    },
    _setErrorObject$1(error) {
      this._state = this._state & 1 | 16;
      this._resultOrListeners = error;
    },
    _cloneResult$1(source) {
      this._state = source._state & 30 | this._state & 1;
      this._resultOrListeners = source._resultOrListeners;
    },
    _addListener$1(listener) {
      var source, _this = this,
        t1 = _this._state;
      if (t1 <= 3) {
        listener._nextListener = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listener;
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._addListener$1(listener);
            return;
          }
          _this._cloneResult$1(source);
        }
        _this._zone.scheduleMicrotask$1(new A._Future__addListener_closure(_this, listener));
      }
    },
    _prependListeners$1(listeners) {
      var t1, existingListeners, next, cursor, next0, source, _this = this, _box_0 = {};
      _box_0.listeners = listeners;
      if (listeners == null)
        return;
      t1 = _this._state;
      if (t1 <= 3) {
        existingListeners = type$.nullable__FutureListener_dynamic_dynamic._as(_this._resultOrListeners);
        _this._resultOrListeners = listeners;
        if (existingListeners != null) {
          next = listeners._nextListener;
          for (cursor = listeners; next != null; cursor = next, next = next0)
            next0 = next._nextListener;
          cursor._nextListener = existingListeners;
        }
      } else {
        if ((t1 & 4) !== 0) {
          source = type$._Future_dynamic._as(_this._resultOrListeners);
          if ((source._state & 24) === 0) {
            source._prependListeners$1(listeners);
            return;
          }
          _this._cloneResult$1(source);
        }
        _box_0.listeners = _this._reverseListeners$1(listeners);
        _this._zone.scheduleMicrotask$1(new A._Future__prependListeners_closure(_box_0, _this));
      }
    },
    _removeListeners$0() {
      var current = type$.nullable__FutureListener_dynamic_dynamic._as(this._resultOrListeners);
      this._resultOrListeners = null;
      return this._reverseListeners$1(current);
    },
    _reverseListeners$1(listeners) {
      var current, prev, next;
      for (current = listeners, prev = null; current != null; prev = current, current = next) {
        next = current._nextListener;
        current._nextListener = prev;
      }
      return prev;
    },
    _chainForeignFuture$1(source) {
      var e, s, exception, _this = this;
      _this._state ^= 2;
      try {
        source.then$1$2$onError(0, new A._Future__chainForeignFuture_closure(_this), new A._Future__chainForeignFuture_closure0(_this), type$.Null);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A.scheduleMicrotask(new A._Future__chainForeignFuture_closure1(_this, e, s));
      }
    },
    _complete$1(value) {
      var listeners, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value))
        if (t1._is(value))
          A._Future__chainCoreFutureSync(value, _this);
        else
          _this._chainForeignFuture$1(value);
      else {
        listeners = _this._removeListeners$0();
        t1._precomputed1._as(value);
        _this._state = 8;
        _this._resultOrListeners = value;
        A._Future__propagateToListeners(_this, listeners);
      }
    },
    _completeWithValue$1(value) {
      var listeners, _this = this;
      _this.$ti._precomputed1._as(value);
      listeners = _this._removeListeners$0();
      _this._state = 8;
      _this._resultOrListeners = value;
      A._Future__propagateToListeners(_this, listeners);
    },
    _completeError$2(error, stackTrace) {
      var listeners;
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      listeners = this._removeListeners$0();
      this._setErrorObject$1(A.AsyncError$(error, stackTrace));
      A._Future__propagateToListeners(this, listeners);
    },
    _asyncComplete$1(value) {
      var t1 = this.$ti;
      t1._eval$1("1/")._as(value);
      if (t1._eval$1("Future<1>")._is(value)) {
        this._chainFuture$1(value);
        return;
      }
      this._asyncCompleteWithValue$1(value);
    },
    _asyncCompleteWithValue$1(value) {
      var _this = this;
      _this.$ti._precomputed1._as(value);
      _this._state ^= 2;
      _this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteWithValue_closure(_this, value));
    },
    _chainFuture$1(value) {
      var t1 = this.$ti;
      t1._eval$1("Future<1>")._as(value);
      if (t1._is(value)) {
        A._Future__chainCoreFutureAsync(value, this);
        return;
      }
      this._chainForeignFuture$1(value);
    },
    _asyncCompleteError$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      this._state ^= 2;
      this._zone.scheduleMicrotask$1(new A._Future__asyncCompleteError_closure(this, error, stackTrace));
    },
    timeout$2$onTimeout(_, timeLimit, onTimeout) {
      var t3, _future, _this = this, t1 = {},
        t2 = _this.$ti;
      t2._eval$1("1/()?")._as(onTimeout);
      if ((_this._state & 24) !== 0) {
        t1 = new A._Future($.Zone__current, t2);
        t1._asyncComplete$1(_this);
        return t1;
      }
      t3 = $.Zone__current;
      _future = new A._Future(t3, t2);
      t1.timer = null;
      t1.timer = A.Timer_Timer(timeLimit, new A._Future_timeout_closure(_this, _future, t3, t3.registerCallback$1$1(onTimeout, t2._eval$1("1/"))));
      _this.then$1$2$onError(0, new A._Future_timeout_closure0(t1, _this, _future), new A._Future_timeout_closure1(t1, _future), type$.Null);
      return _future;
    },
    $isFuture: 1
  };
  A._Future__addListener_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this.listener);
    },
    $signature: 0
  };
  A._Future__prependListeners_closure.prototype = {
    call$0() {
      A._Future__propagateToListeners(this.$this, this._box_0.listeners);
    },
    $signature: 0
  };
  A._Future__chainForeignFuture_closure.prototype = {
    call$1(value) {
      var error, stackTrace, exception,
        t1 = this.$this;
      t1._state ^= 2;
      try {
        t1._completeWithValue$1(t1.$ti._precomputed1._as(value));
      } catch (exception) {
        error = A.unwrapException(exception);
        stackTrace = A.getTraceFromException(exception);
        t1._completeError$2(error, stackTrace);
      }
    },
    $signature: 7
  };
  A._Future__chainForeignFuture_closure0.prototype = {
    call$2(error, stackTrace) {
      this.$this._completeError$2(type$.Object._as(error), type$.StackTrace._as(stackTrace));
    },
    $signature: 8
  };
  A._Future__chainForeignFuture_closure1.prototype = {
    call$0() {
      this.$this._completeError$2(this.e, this.s);
    },
    $signature: 0
  };
  A._Future__chainCoreFutureAsync_closure.prototype = {
    call$0() {
      A._Future__chainCoreFutureSync(this._box_0.source, this.target);
    },
    $signature: 0
  };
  A._Future__asyncCompleteWithValue_closure.prototype = {
    call$0() {
      this.$this._completeWithValue$1(this.value);
    },
    $signature: 0
  };
  A._Future__asyncCompleteError_closure.prototype = {
    call$0() {
      this.$this._completeError$2(this.error, this.stackTrace);
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback.prototype = {
    call$0() {
      var e, s, t1, exception, t2, originalSource, _this = this, completeResult = null;
      try {
        t1 = _this._box_0.listener;
        completeResult = t1.result._zone.run$1$1(type$.dynamic_Function._as(t1.callback), type$.dynamic);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = _this.hasError && type$.AsyncError._as(_this._box_1.source._resultOrListeners).error === e;
        t2 = _this._box_0;
        if (t1)
          t2.listenerValueOrError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        else
          t2.listenerValueOrError = A.AsyncError$(e, s);
        t2.listenerHasError = true;
        return;
      }
      if (completeResult instanceof A._Future && (completeResult._state & 24) !== 0) {
        if ((completeResult._state & 16) !== 0) {
          t1 = _this._box_0;
          t1.listenerValueOrError = type$.AsyncError._as(completeResult._resultOrListeners);
          t1.listenerHasError = true;
        }
        return;
      }
      if (completeResult instanceof A._Future) {
        originalSource = _this._box_1.source;
        t1 = _this._box_0;
        t1.listenerValueOrError = J.then$1$1$x(completeResult, new A._Future__propagateToListeners_handleWhenCompleteCallback_closure(originalSource), type$.dynamic);
        t1.listenerHasError = false;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleWhenCompleteCallback_closure.prototype = {
    call$1(_) {
      return this.originalSource;
    },
    $signature: 49
  };
  A._Future__propagateToListeners_handleValueCallback.prototype = {
    call$0() {
      var e, s, t1, t2, t3, t4, t5, exception;
      try {
        t1 = this._box_0;
        t2 = t1.listener;
        t3 = t2.$ti;
        t4 = t3._precomputed1;
        t5 = t4._as(this.sourceResult);
        t1.listenerValueOrError = t2.result._zone.runUnary$2$2(t3._eval$1("2/(1)")._as(t2.callback), t5, t3._eval$1("2/"), t4);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = this._box_0;
        t1.listenerValueOrError = A.AsyncError$(e, s);
        t1.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._Future__propagateToListeners_handleError.prototype = {
    call$0() {
      var asyncError, e, s, t1, exception, t2, _this = this;
      try {
        asyncError = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t1 = _this._box_0;
        if (t1.listener.matchesErrorTest$1(asyncError) && t1.listener.errorCallback != null) {
          t1.listenerValueOrError = t1.listener.handleError$1(asyncError);
          t1.listenerHasError = false;
        }
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t1 = type$.AsyncError._as(_this._box_1.source._resultOrListeners);
        t2 = _this._box_0;
        if (t1.error === e)
          t2.listenerValueOrError = t1;
        else
          t2.listenerValueOrError = A.AsyncError$(e, s);
        t2.listenerHasError = true;
      }
    },
    $signature: 0
  };
  A._Future_timeout_closure.prototype = {
    call$0() {
      var e, s, exception, _this = this;
      try {
        _this._future._complete$1(_this.zone.run$1$1(_this.onTimeoutHandler, _this.$this.$ti._eval$1("1/")));
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        _this._future._completeError$2(e, s);
      }
    },
    $signature: 0
  };
  A._Future_timeout_closure0.prototype = {
    call$1(v) {
      var t1;
      this.$this.$ti._precomputed1._as(v);
      t1 = this._box_0;
      if (t1.timer.get$isActive()) {
        t1.timer.cancel$0(0);
        this._future._completeWithValue$1(v);
      }
    },
    $signature() {
      return this.$this.$ti._eval$1("Null(1)");
    }
  };
  A._Future_timeout_closure1.prototype = {
    call$2(e, s) {
      var t1;
      type$.Object._as(e);
      type$.StackTrace._as(s);
      t1 = this._box_0;
      if (t1.timer.get$isActive()) {
        t1.timer.cancel$0(0);
        this._future._completeError$2(e, s);
      }
    },
    $signature: 8
  };
  A._AsyncCallbackEntry.prototype = {};
  A.Stream.prototype = {
    map$1$1(_, convert, $S) {
      var t1 = A._instanceType(this);
      return new A._MapStream(t1._bind$1($S)._eval$1("1(Stream.T)")._as(convert), this, t1._eval$1("@<Stream.T>")._bind$1($S)._eval$1("_MapStream<1,2>"));
    },
    map$1(_, convert) {
      return this.map$1$1(0, convert, type$.dynamic);
    },
    get$length(_) {
      var t1 = {},
        future = new A._Future($.Zone__current, type$._Future_int);
      t1.count = 0;
      this.listen$4$cancelOnError$onDone$onError(new A.Stream_length_closure(t1, this), true, new A.Stream_length_closure0(t1, future), future.get$_completeError());
      return future;
    },
    get$first(_) {
      var future = new A._Future($.Zone__current, A._instanceType(this)._eval$1("_Future<Stream.T>")),
        subscription = this.listen$4$cancelOnError$onDone$onError(null, true, new A.Stream_first_closure(future), future.get$_completeError());
      subscription.onData$1(new A.Stream_first_closure0(this, subscription, future));
      return future;
    }
  };
  A.Stream_length_closure.prototype = {
    call$1(_) {
      A._instanceType(this.$this)._eval$1("Stream.T")._as(_);
      ++this._box_0.count;
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A.Stream_length_closure0.prototype = {
    call$0() {
      this.future._complete$1(this._box_0.count);
    },
    $signature: 0
  };
  A.Stream_first_closure.prototype = {
    call$0() {
      var e, s, t1, exception;
      try {
        t1 = A.IterableElementError_noElement();
        throw A.wrapException(t1);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._completeWithErrorCallback(this.future, e, s);
      }
    },
    $signature: 0
  };
  A.Stream_first_closure0.prototype = {
    call$1(value) {
      A._cancelAndValue(this.subscription, this.future, A._instanceType(this.$this)._eval$1("Stream.T")._as(value));
    },
    $signature() {
      return A._instanceType(this.$this)._eval$1("~(Stream.T)");
    }
  };
  A._StreamController.prototype = {
    get$_pendingEvents() {
      var t1, _this = this;
      if ((_this._state & 8) === 0)
        return A._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData);
      t1 = A._instanceType(_this);
      return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData());
    },
    _ensurePendingEvents$0() {
      var events, t1, _this = this;
      if ((_this._state & 8) === 0) {
        events = _this._varData;
        if (events == null)
          events = _this._varData = new A._PendingEvents(A._instanceType(_this)._eval$1("_PendingEvents<1>"));
        return A._instanceType(_this)._eval$1("_PendingEvents<1>")._as(events);
      }
      t1 = A._instanceType(_this);
      events = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$varData();
      return t1._eval$1("_PendingEvents<1>")._as(events);
    },
    get$_subscription() {
      var varData = this._varData;
      if ((this._state & 8) !== 0)
        varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData).get$varData();
      return A._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData);
    },
    _badEventState$0() {
      if ((this._state & 4) !== 0)
        return new A.StateError("Cannot add event after closing");
      return new A.StateError("Cannot add event while adding a stream");
    },
    _ensureDoneFuture$0() {
      var t1 = this._doneFuture;
      if (t1 == null)
        t1 = this._doneFuture = (this._state & 2) !== 0 ? $.$get$Future__nullFuture() : new A._Future($.Zone__current, type$._Future_void);
      return t1;
    },
    add$1(_, value) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(value);
      t2 = _this._state;
      if (t2 >= 4)
        throw A.wrapException(_this._badEventState$0());
      if ((t2 & 1) !== 0)
        _this._sendData$1(value);
      else if ((t2 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new A._DelayedData(value, t1._eval$1("_DelayedData<1>")));
    },
    addError$2(error, stackTrace) {
      var replacement, _this = this,
        t1 = type$.Object;
      t1._as(error);
      type$.nullable_StackTrace._as(stackTrace);
      A.checkNotNullable(error, "error", t1);
      if (_this._state >= 4)
        throw A.wrapException(_this._badEventState$0());
      replacement = $.Zone__current.errorCallback$2(error, stackTrace);
      if (replacement != null) {
        error = replacement.error;
        stackTrace = replacement.stackTrace;
      } else if (stackTrace == null)
        stackTrace = A.AsyncError_defaultStackTrace(error);
      t1 = _this._state;
      if ((t1 & 1) !== 0)
        _this._sendError$2(error, stackTrace);
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, new A._DelayedError(error, stackTrace));
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    close$0(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 4) !== 0)
        return _this._ensureDoneFuture$0();
      if (t1 >= 4)
        throw A.wrapException(_this._badEventState$0());
      t1 = _this._state = t1 | 4;
      if ((t1 & 1) !== 0)
        _this._sendDone$0();
      else if ((t1 & 3) === 0)
        _this._ensurePendingEvents$0().add$1(0, B.C__DelayedDone);
      return _this._ensureDoneFuture$0();
    },
    _subscribe$4(onData, onError, onDone, cancelOnError) {
      var t2, t3, t4, t5, t6, subscription, pendingEvents, addState, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      if ((_this._state & 3) !== 0)
        throw A.wrapException(A.StateError$("Stream has already been listened to."));
      t2 = $.Zone__current;
      t3 = cancelOnError ? 1 : 0;
      t4 = A._BufferingStreamSubscription__registerDataHandler(t2, onData, t1._precomputed1);
      t5 = A._BufferingStreamSubscription__registerErrorHandler(t2, onError);
      t6 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      subscription = new A._ControllerSubscription(_this, t4, t5, t2.registerCallback$1$1(t6, type$.void), t2, t3, t1._eval$1("_ControllerSubscription<1>"));
      pendingEvents = _this.get$_pendingEvents();
      t3 = _this._state |= 1;
      if ((t3 & 8) !== 0) {
        addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData);
        addState.set$varData(subscription);
        addState.resume$0(0);
      } else
        _this._varData = subscription;
      subscription._setPendingEvents$1(pendingEvents);
      subscription._guardCallback$1(new A._StreamController__subscribe_closure(_this));
      return subscription;
    },
    _recordCancel$1(subscription) {
      var result, onCancel, cancelResult, e, s, exception, result0, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("StreamSubscription<1>")._as(subscription);
      result = null;
      if ((_this._state & 8) !== 0)
        result = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).cancel$0(0);
      _this._varData = null;
      _this._state = _this._state & 4294967286 | 2;
      onCancel = _this.onCancel;
      if (onCancel != null)
        if (result == null)
          try {
            cancelResult = onCancel.call$0();
            if (cancelResult instanceof A._Future)
              result = cancelResult;
          } catch (exception) {
            e = A.unwrapException(exception);
            s = A.getTraceFromException(exception);
            result0 = new A._Future($.Zone__current, type$._Future_void);
            result0._asyncCompleteError$2(e, s);
            result = result0;
          }
        else
          result = result.whenComplete$1(onCancel);
      t1 = new A._StreamController__recordCancel_complete(_this);
      if (result != null)
        result = result.whenComplete$1(t1);
      else
        t1.call$0();
      return result;
    },
    $isStreamSink: 1,
    $isStreamController: 1,
    $is_StreamControllerLifecycle: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._StreamController__subscribe_closure.prototype = {
    call$0() {
      A._runGuarded(this.$this.onListen);
    },
    $signature: 0
  };
  A._StreamController__recordCancel_complete.prototype = {
    call$0() {
      var doneFuture = this.$this._doneFuture;
      if (doneFuture != null && (doneFuture._state & 30) === 0)
        doneFuture._asyncComplete$1(null);
    },
    $signature: 0
  };
  A._SyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      this.$ti._precomputed1._as(data);
      this.get$_subscription()._add$1(0, data);
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addError$2(error, stackTrace);
    },
    _sendDone$0() {
      this.get$_subscription()._close$0();
    }
  };
  A._AsyncStreamControllerDispatch.prototype = {
    _sendData$1(data) {
      var t1 = this.$ti;
      t1._precomputed1._as(data);
      this.get$_subscription()._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<1>")));
    },
    _sendError$2(error, stackTrace) {
      this.get$_subscription()._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _sendDone$0() {
      this.get$_subscription()._addPending$1(B.C__DelayedDone);
    }
  };
  A._AsyncStreamController.prototype = {};
  A._SyncStreamController.prototype = {};
  A._ControllerStream.prototype = {
    get$hashCode(_) {
      return (A.Primitives_objectHashCode(this._controller) ^ 892482866) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return other instanceof A._ControllerStream && other._controller === this._controller;
    }
  };
  A._ControllerSubscription.prototype = {
    _onCancel$0() {
      return this._controller._recordCancel$1(this);
    },
    _onPause$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).pause$0(0);
      A._runGuarded(t1.onPause);
    },
    _onResume$0() {
      var t1 = this._controller,
        t2 = A._instanceType(t1);
      t2._eval$1("StreamSubscription<1>")._as(this);
      if ((t1._state & 8) !== 0)
        t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).resume$0(0);
      A._runGuarded(t1.onResume);
    }
  };
  A._StreamSinkWrapper.prototype = {
    add$1(_, data) {
      this._async$_target.add$1(0, this.$ti._precomputed1._as(data));
    },
    $isStreamSink: 1
  };
  A._BufferingStreamSubscription.prototype = {
    _setPendingEvents$1(pendingEvents) {
      var _this = this;
      A._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(pendingEvents);
      if (pendingEvents == null)
        return;
      _this.set$_pending(pendingEvents);
      if (pendingEvents.lastPendingEvent != null) {
        _this._state = (_this._state | 64) >>> 0;
        pendingEvents.schedule$1(_this);
      }
    },
    onData$1(handleData) {
      var t1 = A._instanceType(this);
      this.set$_async$_onData(A._BufferingStreamSubscription__registerDataHandler(this._zone, t1._eval$1("~(_BufferingStreamSubscription.T)?")._as(handleData), t1._eval$1("_BufferingStreamSubscription.T")));
    },
    pause$0(_) {
      var t2, t3, _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t2 = (t1 + 128 | 4) >>> 0;
      _this._state = t2;
      if (t1 < 128) {
        t3 = _this._pending;
        if (t3 != null)
          if (t3._state === 1)
            t3._state = 3;
      }
      if ((t1 & 4) === 0 && (t2 & 32) === 0)
        _this._guardCallback$1(_this.get$_onPause());
    },
    resume$0(_) {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 >= 128) {
        t1 = _this._state = t1 - 128;
        if (t1 < 128)
          if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent != null)
            _this._pending.schedule$1(_this);
          else {
            t1 = (t1 & 4294967291) >>> 0;
            _this._state = t1;
            if ((t1 & 32) === 0)
              _this._guardCallback$1(_this.get$_onResume());
          }
      }
    },
    cancel$0(_) {
      var _this = this,
        t1 = (_this._state & 4294967279) >>> 0;
      _this._state = t1;
      if ((t1 & 8) === 0)
        _this._cancel$0();
      t1 = _this._cancelFuture;
      return t1 == null ? $.$get$Future__nullFuture() : t1;
    },
    asFuture$1$1(futureValue, $E) {
      var result, t1 = {};
      t1.resultValue = null;
      if (!$E._is(null))
        throw A.wrapException(A.ArgumentError$notNull("futureValue"));
      $E._as(futureValue);
      t1.resultValue = futureValue;
      result = new A._Future($.Zone__current, $E._eval$1("_Future<0>"));
      this.set$_onDone(new A._BufferingStreamSubscription_asFuture_closure(t1, result));
      this._onError = new A._BufferingStreamSubscription_asFuture_closure0(this, result);
      return result;
    },
    _cancel$0() {
      var t2, _this = this,
        t1 = _this._state = (_this._state | 8) >>> 0;
      if ((t1 & 64) !== 0) {
        t2 = _this._pending;
        if (t2._state === 1)
          t2._state = 3;
      }
      if ((t1 & 32) === 0)
        _this.set$_pending(null);
      _this._cancelFuture = _this._onCancel$0();
    },
    _add$1(_, data) {
      var t2, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("_BufferingStreamSubscription.T")._as(data);
      t2 = _this._state;
      if ((t2 & 8) !== 0)
        return;
      if (t2 < 32)
        _this._sendData$1(data);
      else
        _this._addPending$1(new A._DelayedData(data, t1._eval$1("_DelayedData<_BufferingStreamSubscription.T>")));
    },
    _addError$2(error, stackTrace) {
      var t1 = this._state;
      if ((t1 & 8) !== 0)
        return;
      if (t1 < 32)
        this._sendError$2(error, stackTrace);
      else
        this._addPending$1(new A._DelayedError(error, stackTrace));
    },
    _close$0() {
      var _this = this,
        t1 = _this._state;
      if ((t1 & 8) !== 0)
        return;
      t1 = (t1 | 2) >>> 0;
      _this._state = t1;
      if (t1 < 32)
        _this._sendDone$0();
      else
        _this._addPending$1(B.C__DelayedDone);
    },
    _onPause$0() {
    },
    _onResume$0() {
    },
    _onCancel$0() {
      return null;
    },
    _addPending$1($event) {
      var t1, _this = this,
        pending = _this._pending;
      if (pending == null) {
        pending = new A._PendingEvents(A._instanceType(_this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>"));
        _this.set$_pending(pending);
      }
      pending.add$1(0, $event);
      t1 = _this._state;
      if ((t1 & 64) === 0) {
        t1 = (t1 | 64) >>> 0;
        _this._state = t1;
        if (t1 < 128)
          pending.schedule$1(_this);
      }
    },
    _sendData$1(data) {
      var t2, _this = this,
        t1 = A._instanceType(_this)._eval$1("_BufferingStreamSubscription.T");
      t1._as(data);
      t2 = _this._state;
      _this._state = (t2 | 32) >>> 0;
      _this._zone.runUnaryGuarded$1$2(_this._async$_onData, data, t1);
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t2 & 4) !== 0);
    },
    _sendError$2(error, stackTrace) {
      var cancelFuture, _this = this,
        t1 = _this._state,
        t2 = new A._BufferingStreamSubscription__sendError_sendError(_this, error, stackTrace);
      if ((t1 & 1) !== 0) {
        _this._state = (t1 | 16) >>> 0;
        _this._cancel$0();
        cancelFuture = _this._cancelFuture;
        if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
          cancelFuture.whenComplete$1(t2);
        else
          t2.call$0();
      } else {
        t2.call$0();
        _this._checkState$1((t1 & 4) !== 0);
      }
    },
    _sendDone$0() {
      var cancelFuture, _this = this,
        t1 = new A._BufferingStreamSubscription__sendDone_sendDone(_this);
      _this._cancel$0();
      _this._state = (_this._state | 16) >>> 0;
      cancelFuture = _this._cancelFuture;
      if (cancelFuture != null && cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(t1);
      else
        t1.call$0();
    },
    _guardCallback$1(callback) {
      var t1, _this = this;
      type$.void_Function._as(callback);
      t1 = _this._state;
      _this._state = (t1 | 32) >>> 0;
      callback.call$0();
      _this._state = (_this._state & 4294967263) >>> 0;
      _this._checkState$1((t1 & 4) !== 0);
    },
    _checkState$1(wasInputPaused) {
      var t2, isInputPaused, _this = this,
        t1 = _this._state;
      if ((t1 & 64) !== 0 && _this._pending.lastPendingEvent == null) {
        t1 = _this._state = (t1 & 4294967231) >>> 0;
        if ((t1 & 4) !== 0)
          if (t1 < 128) {
            t2 = _this._pending;
            t2 = t2 == null ? null : t2.lastPendingEvent == null;
            t2 = t2 !== false;
          } else
            t2 = false;
        else
          t2 = false;
        if (t2) {
          t1 = (t1 & 4294967291) >>> 0;
          _this._state = t1;
        }
      }
      for (; true; wasInputPaused = isInputPaused) {
        if ((t1 & 8) !== 0) {
          _this.set$_pending(null);
          return;
        }
        isInputPaused = (t1 & 4) !== 0;
        if (wasInputPaused === isInputPaused)
          break;
        _this._state = (t1 ^ 32) >>> 0;
        if (isInputPaused)
          _this._onPause$0();
        else
          _this._onResume$0();
        t1 = (_this._state & 4294967263) >>> 0;
        _this._state = t1;
      }
      if ((t1 & 64) !== 0 && t1 < 128)
        _this._pending.schedule$1(_this);
    },
    set$_async$_onData(_onData) {
      this._async$_onData = A._instanceType(this)._eval$1("~(_BufferingStreamSubscription.T)")._as(_onData);
    },
    set$_onDone(_onDone) {
      this._onDone = type$.void_Function._as(_onDone);
    },
    set$_pending(_pending) {
      this._pending = A._instanceType(this)._eval$1("_PendingEvents<_BufferingStreamSubscription.T>?")._as(_pending);
    },
    $isStreamSubscription: 1,
    $is_EventSink: 1,
    $is_EventDispatch: 1
  };
  A._BufferingStreamSubscription_asFuture_closure.prototype = {
    call$0() {
      this.result._complete$1(this._box_0.resultValue);
    },
    $signature: 0
  };
  A._BufferingStreamSubscription_asFuture_closure0.prototype = {
    call$2(error, stackTrace) {
      var cancelFuture, t1;
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      cancelFuture = this.$this.cancel$0(0);
      t1 = this.result;
      if (cancelFuture !== $.$get$Future__nullFuture())
        cancelFuture.whenComplete$1(new A._BufferingStreamSubscription_asFuture__closure(t1, error, stackTrace));
      else
        t1._completeError$2(error, stackTrace);
    },
    $signature: 8
  };
  A._BufferingStreamSubscription_asFuture__closure.prototype = {
    call$0() {
      this.result._completeError$2(this.error, this.stackTrace);
    },
    $signature: 5
  };
  A._BufferingStreamSubscription__sendError_sendError.prototype = {
    call$0() {
      var onError, t3, t4,
        t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
        return;
      t1._state = (t2 | 32) >>> 0;
      onError = t1._onError;
      t2 = this.error;
      t3 = type$.Object;
      t4 = t1._zone;
      if (type$.void_Function_Object_StackTrace._is(onError))
        t4.runBinaryGuarded$2$3(onError, t2, this.stackTrace, t3, type$.StackTrace);
      else
        t4.runUnaryGuarded$1$2(type$.void_Function_Object._as(onError), t2, t3);
      t1._state = (t1._state & 4294967263) >>> 0;
    },
    $signature: 0
  };
  A._BufferingStreamSubscription__sendDone_sendDone.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1._state;
      if ((t2 & 16) === 0)
        return;
      t1._state = (t2 | 42) >>> 0;
      t1._zone.runGuarded$1(t1._onDone);
      t1._state = (t1._state & 4294967263) >>> 0;
    },
    $signature: 0
  };
  A._StreamImpl.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return this._controller._subscribe$4(t1._eval$1("~(1)?")._as(onData), onError, onDone, cancelOnError === true);
    },
    listen$1(onData) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    },
    listen$2$cancelOnError(onData, cancelOnError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, cancelOnError, null, null);
    },
    listen$2$onDone(onData, onDone) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, null);
    }
  };
  A._DelayedEvent.prototype = {
    set$next(_, next) {
      this.next = type$.nullable__DelayedEvent_dynamic._as(next);
    },
    get$next(receiver) {
      return this.next;
    }
  };
  A._DelayedData.prototype = {
    perform$1(dispatch) {
      this.$ti._eval$1("_EventDispatch<1>")._as(dispatch)._sendData$1(this.value);
    }
  };
  A._DelayedError.prototype = {
    perform$1(dispatch) {
      dispatch._sendError$2(this.error, this.stackTrace);
    }
  };
  A._DelayedDone.prototype = {
    perform$1(dispatch) {
      dispatch._sendDone$0();
    },
    get$next(_) {
      return null;
    },
    set$next(_, _0) {
      throw A.wrapException(A.StateError$("No events after a done."));
    },
    $is_DelayedEvent: 1
  };
  A._PendingEvents.prototype = {
    schedule$1(dispatch) {
      var t1, _this = this;
      _this.$ti._eval$1("_EventDispatch<1>")._as(dispatch);
      t1 = _this._state;
      if (t1 === 1)
        return;
      if (t1 >= 1) {
        _this._state = 1;
        return;
      }
      A.scheduleMicrotask(new A._PendingEvents_schedule_closure(_this, dispatch));
      _this._state = 1;
    },
    add$1(_, $event) {
      var _this = this,
        lastEvent = _this.lastPendingEvent;
      if (lastEvent == null)
        _this.firstPendingEvent = _this.lastPendingEvent = $event;
      else {
        lastEvent.set$next(0, $event);
        _this.lastPendingEvent = $event;
      }
    }
  };
  A._PendingEvents_schedule_closure.prototype = {
    call$0() {
      var t2, $event, nextEvent,
        t1 = this.$this,
        oldState = t1._state;
      t1._state = 0;
      if (oldState === 3)
        return;
      t2 = t1.$ti._eval$1("_EventDispatch<1>")._as(this.dispatch);
      $event = t1.firstPendingEvent;
      nextEvent = $event.get$next($event);
      t1.firstPendingEvent = nextEvent;
      if (nextEvent == null)
        t1.lastPendingEvent = null;
      $event.perform$1(t2);
    },
    $signature: 0
  };
  A._StreamIterator.prototype = {};
  A._cancelAndValue_closure.prototype = {
    call$0() {
      return this.future._complete$1(this.value);
    },
    $signature: 0
  };
  A._ForwardingStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t2, t3, t4, t5, t6, t7,
        t1 = this.$ti;
      t1._eval$1("~(2)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      t2 = t1._rest[1];
      t3 = $.Zone__current;
      t4 = cancelOnError === true ? 1 : 0;
      t5 = A._BufferingStreamSubscription__registerDataHandler(t3, onData, t2);
      t6 = A._BufferingStreamSubscription__registerErrorHandler(t3, onError);
      t7 = onDone == null ? A.async___nullDoneHandler$closure() : onDone;
      t2 = new A._ForwardingStreamSubscription(this, t5, t6, t3.registerCallback$1$1(t7, type$.void), t3, t4, t1._eval$1("@<1>")._bind$1(t2)._eval$1("_ForwardingStreamSubscription<1,2>"));
      t2.set$_subscription(this._source.listen$3$onDone$onError(t2.get$_handleData(), t2.get$_handleDone(), t2.get$_handleError()));
      return t2;
    },
    listen$2$onError(onData, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, onError);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._ForwardingStreamSubscription.prototype = {
    _add$1(_, data) {
      this.$ti._rest[1]._as(data);
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_add(0, data);
    },
    _addError$2(error, stackTrace) {
      if ((this._state & 2) !== 0)
        return;
      this.super$_BufferingStreamSubscription$_addError(error, stackTrace);
    },
    _onPause$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.pause$0(0);
    },
    _onResume$0() {
      var t1 = this._subscription;
      if (t1 != null)
        t1.resume$0(0);
    },
    _onCancel$0() {
      var subscription = this._subscription;
      if (subscription != null) {
        this.set$_subscription(null);
        return subscription.cancel$0(0);
      }
      return null;
    },
    _handleData$1(data) {
      this._stream._handleData$2(this.$ti._precomputed1._as(data), this);
    },
    _handleError$2(error, stackTrace) {
      var t1;
      type$.StackTrace._as(stackTrace);
      t1 = error == null ? type$.Object._as(error) : error;
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._addError$2(t1, stackTrace);
    },
    _handleDone$0() {
      this._stream.$ti._eval$1("_EventSink<2>")._as(this)._close$0();
    },
    set$_subscription(_subscription) {
      this._subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A._MapStream.prototype = {
    _handleData$2(inputEvent, sink) {
      var outputEvent, e, s, exception, error, stackTrace, replacement,
        t1 = this.$ti;
      t1._precomputed1._as(inputEvent);
      t1._eval$1("_EventSink<2>")._as(sink);
      outputEvent = null;
      try {
        outputEvent = this._transform.call$1(inputEvent);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        error = e;
        stackTrace = s;
        replacement = $.Zone__current.errorCallback$2(error, stackTrace);
        if (replacement != null) {
          error = replacement.error;
          stackTrace = replacement.stackTrace;
        }
        sink._addError$2(error, stackTrace);
        return;
      }
      sink._add$1(0, outputEvent);
    }
  };
  A._ZoneFunction.prototype = {};
  A._ZoneSpecification.prototype = {$isZoneSpecification: 1};
  A._ZoneDelegate.prototype = {$isZoneDelegate: 1};
  A._Zone.prototype = {
    _processUncaughtError$3(zone, error, stackTrace) {
      var implZone, handler, parentDelegate, parentZone, currentZone, e, s, implementation, t1, exception;
      type$.StackTrace._as(stackTrace);
      implementation = this.get$_handleUncaughtError();
      implZone = implementation.zone;
      if (implZone === B.C__RootZone) {
        A._rootHandleError(error, stackTrace);
        return;
      }
      handler = implementation.$function;
      parentDelegate = implZone.get$_parentDelegate();
      t1 = J.get$parent$z(implZone);
      t1.toString;
      parentZone = t1;
      currentZone = $.Zone__current;
      try {
        $.Zone__current = parentZone;
        handler.call$5(implZone, parentDelegate, zone, error, stackTrace);
        $.Zone__current = currentZone;
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        $.Zone__current = currentZone;
        t1 = error === e ? stackTrace : s;
        parentZone._processUncaughtError$3(implZone, e, t1);
      }
    },
    $isZone: 1
  };
  A._CustomZone.prototype = {
    get$_delegate() {
      var t1 = this._delegateCache;
      return t1 == null ? this._delegateCache = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      return this.parent.get$_delegate();
    },
    get$errorZone() {
      return this._handleUncaughtError.zone;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        this.run$1$1(f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        this.runUnary$2$2(f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) {
      var e, s, exception;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        this.runBinary$3$3(f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._CustomZone_bindCallback_closure(this, this.registerCallback$1$1($R._eval$1("0()")._as(f), $R), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._CustomZone_bindUnaryCallback_closure(this, this.registerUnaryCallback$2$1($R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $R, $T), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._CustomZone_bindCallbackGuarded_closure(this, this.registerCallback$1$1(type$.void_Function._as(f), type$.void));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._CustomZone_bindUnaryCallbackGuarded_closure(this, this.registerUnaryCallback$2$1($T._eval$1("~(0)")._as(f), type$.void, $T), $T);
    },
    handleUncaughtError$2(error, stackTrace) {
      this._processUncaughtError$3(this, error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      var implementation = this._fork,
        t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(f);
      implementation = this._run;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      implementation = this._runUnary;
      t1 = implementation.zone;
      return implementation.$function.call$2$5(t1, t1.get$_parentDelegate(), this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, T1, T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      implementation = this._runBinary;
      t1 = implementation.zone;
      return implementation.$function.call$3$6(t1, t1.get$_parentDelegate(), this, f, arg1, arg2, $R, T1, T2);
    },
    registerCallback$1$1(callback, $R) {
      var implementation, t1;
      $R._eval$1("0()")._as(callback);
      implementation = this._registerCallback;
      t1 = implementation.zone;
      return implementation.$function.call$1$4(t1, t1.get$_parentDelegate(), this, callback, $R);
    },
    registerUnaryCallback$2$1(callback, $R, $T) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(callback);
      implementation = this._registerUnaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$2$4(t1, t1.get$_parentDelegate(), this, callback, $R, $T);
    },
    registerBinaryCallback$3$1(callback, $R, T1, T2) {
      var implementation, t1;
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(callback);
      implementation = this._registerBinaryCallback;
      t1 = implementation.zone;
      return implementation.$function.call$3$4(t1, t1.get$_parentDelegate(), this, callback, $R, T1, T2);
    },
    errorCallback$2(error, stackTrace) {
      var implementation, implementationZone;
      type$.nullable_StackTrace._as(stackTrace);
      A.checkNotNullable(error, "error", type$.Object);
      implementation = this._errorCallback;
      implementationZone = implementation.zone;
      if (implementationZone === B.C__RootZone)
        return null;
      return implementation.$function.call$5(implementationZone, implementationZone.get$_parentDelegate(), this, error, stackTrace);
    },
    scheduleMicrotask$1(f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._scheduleMicrotask;
      t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, f);
    },
    createTimer$2(duration, f) {
      var implementation, t1;
      type$.void_Function._as(f);
      implementation = this._createTimer;
      t1 = implementation.zone;
      return implementation.$function.call$5(t1, t1.get$_parentDelegate(), this, duration, f);
    },
    print$1(_, line) {
      var implementation = this._print,
        t1 = implementation.zone;
      return implementation.$function.call$4(t1, t1.get$_parentDelegate(), this, line);
    },
    set$_handleUncaughtError(_handleUncaughtError) {
      this._handleUncaughtError = type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace._as(_handleUncaughtError);
    },
    get$_run() {
      return this._run;
    },
    get$_runUnary() {
      return this._runUnary;
    },
    get$_runBinary() {
      return this._runBinary;
    },
    get$_registerCallback() {
      return this._registerCallback;
    },
    get$_registerUnaryCallback() {
      return this._registerUnaryCallback;
    },
    get$_registerBinaryCallback() {
      return this._registerBinaryCallback;
    },
    get$_errorCallback() {
      return this._errorCallback;
    },
    get$_scheduleMicrotask() {
      return this._scheduleMicrotask;
    },
    get$_createTimer() {
      return this._createTimer;
    },
    get$_createPeriodicTimer() {
      return this._createPeriodicTimer;
    },
    get$_print() {
      return this._print;
    },
    get$_fork() {
      return this._fork;
    },
    get$_handleUncaughtError() {
      return this._handleUncaughtError;
    },
    get$parent(receiver) {
      return this.parent;
    },
    get$_async$_map() {
      return this._async$_map;
    }
  };
  A._CustomZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.registered, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._CustomZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.registered, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._CustomZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.registered);
    },
    $signature: 0
  };
  A._CustomZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.registered, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A._rootHandleError_closure.prototype = {
    call$0() {
      A.Error_throwWithStackTrace(this.error, this.stackTrace);
    },
    $signature: 0
  };
  A._RootZone.prototype = {
    get$_run() {
      return B._ZoneFunction__RootZone__rootRun;
    },
    get$_runUnary() {
      return B._ZoneFunction__RootZone__rootRunUnary;
    },
    get$_runBinary() {
      return B._ZoneFunction__RootZone__rootRunBinary;
    },
    get$_registerCallback() {
      return B._ZoneFunction__RootZone__rootRegisterCallback;
    },
    get$_registerUnaryCallback() {
      return B._ZoneFunction_Eeh;
    },
    get$_registerBinaryCallback() {
      return B._ZoneFunction_7G2;
    },
    get$_errorCallback() {
      return B._ZoneFunction__RootZone__rootErrorCallback;
    },
    get$_scheduleMicrotask() {
      return B._ZoneFunction__RootZone__rootScheduleMicrotask;
    },
    get$_createTimer() {
      return B._ZoneFunction__RootZone__rootCreateTimer;
    },
    get$_createPeriodicTimer() {
      return B._ZoneFunction_3bB;
    },
    get$_print() {
      return B._ZoneFunction__RootZone__rootPrint;
    },
    get$_fork() {
      return B._ZoneFunction__RootZone__rootFork;
    },
    get$_handleUncaughtError() {
      return B._ZoneFunction_NMc;
    },
    get$parent(_) {
      return null;
    },
    get$_async$_map() {
      return $.$get$_RootZone__rootMap();
    },
    get$_delegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$_parentDelegate() {
      var t1 = $._RootZone__rootDelegate;
      return t1 == null ? $._RootZone__rootDelegate = new A._ZoneDelegate(this) : t1;
    },
    get$errorZone() {
      return this;
    },
    runGuarded$1(f) {
      var e, s, exception;
      type$.void_Function._as(f);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$0();
          return;
        }
        A._rootRun(null, null, this, f, type$.void);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runUnaryGuarded$1$2(f, arg, $T) {
      var e, s, exception;
      $T._eval$1("~(0)")._as(f);
      $T._as(arg);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$1(arg);
          return;
        }
        A._rootRunUnary(null, null, this, f, arg, type$.void, $T);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) {
      var e, s, exception;
      T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      try {
        if (B.C__RootZone === $.Zone__current) {
          f.call$2(arg1, arg2);
          return;
        }
        A._rootRunBinary(null, null, this, f, arg1, arg2, type$.void, T1, T2);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s));
      }
    },
    bindCallback$1$1(f, $R) {
      return new A._RootZone_bindCallback_closure(this, $R._eval$1("0()")._as(f), $R);
    },
    bindUnaryCallback$2$1(f, $R, $T) {
      return new A._RootZone_bindUnaryCallback_closure(this, $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f), $T, $R);
    },
    bindCallbackGuarded$1(f) {
      return new A._RootZone_bindCallbackGuarded_closure(this, type$.void_Function._as(f));
    },
    bindUnaryCallbackGuarded$1$1(f, $T) {
      return new A._RootZone_bindUnaryCallbackGuarded_closure(this, $T._eval$1("~(0)")._as(f), $T);
    },
    handleUncaughtError$2(error, stackTrace) {
      A._rootHandleError(error, type$.StackTrace._as(stackTrace));
    },
    fork$2$specification$zoneValues(specification, zoneValues) {
      return A._rootFork(null, null, this, specification, zoneValues);
    },
    run$1$1(f, $R) {
      $R._eval$1("0()")._as(f);
      if ($.Zone__current === B.C__RootZone)
        return f.call$0();
      return A._rootRun(null, null, this, f, $R);
    },
    runUnary$2$2(f, arg, $R, $T) {
      $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
      $T._as(arg);
      if ($.Zone__current === B.C__RootZone)
        return f.call$1(arg);
      return A._rootRunUnary(null, null, this, f, arg, $R, $T);
    },
    runBinary$3$3(f, arg1, arg2, $R, T1, T2) {
      $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
      T1._as(arg1);
      T2._as(arg2);
      if ($.Zone__current === B.C__RootZone)
        return f.call$2(arg1, arg2);
      return A._rootRunBinary(null, null, this, f, arg1, arg2, $R, T1, T2);
    },
    registerCallback$1$1(f, $R) {
      return $R._eval$1("0()")._as(f);
    },
    registerUnaryCallback$2$1(f, $R, $T) {
      return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f);
    },
    registerBinaryCallback$3$1(f, $R, T1, T2) {
      return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f);
    },
    errorCallback$2(error, stackTrace) {
      type$.nullable_StackTrace._as(stackTrace);
      return null;
    },
    scheduleMicrotask$1(f) {
      A._rootScheduleMicrotask(null, null, this, type$.void_Function._as(f));
    },
    createTimer$2(duration, f) {
      return A.Timer__createTimer(duration, type$.void_Function._as(f));
    },
    print$1(_, line) {
      A.printString(line);
    }
  };
  A._RootZone_bindCallback_closure.prototype = {
    call$0() {
      return this.$this.run$1$1(this.f, this.R);
    },
    $signature() {
      return this.R._eval$1("0()");
    }
  };
  A._RootZone_bindUnaryCallback_closure.prototype = {
    call$1(arg) {
      var _this = this,
        t1 = _this.T;
      return _this.$this.runUnary$2$2(_this.f, t1._as(arg), _this.R, t1);
    },
    $signature() {
      return this.R._eval$1("@<0>")._bind$1(this.T)._eval$1("1(2)");
    }
  };
  A._RootZone_bindCallbackGuarded_closure.prototype = {
    call$0() {
      return this.$this.runGuarded$1(this.f);
    },
    $signature: 0
  };
  A._RootZone_bindUnaryCallbackGuarded_closure.prototype = {
    call$1(arg) {
      var t1 = this.T;
      return this.$this.runUnaryGuarded$1$2(this.f, t1._as(arg), t1);
    },
    $signature() {
      return this.T._eval$1("~(0)");
    }
  };
  A.runZonedGuarded_closure.prototype = {
    call$5($self, $parent, zone, error, stackTrace) {
      var e, s, exception, t2,
        t1 = type$.StackTrace;
      t1._as(stackTrace);
      try {
        this.parentZone.runBinary$3$3(this.onError, error, stackTrace, type$.void, type$.Object, t1);
      } catch (exception) {
        e = A.unwrapException(exception);
        s = A.getTraceFromException(exception);
        t2 = $parent._delegationTarget;
        if (e === error)
          t2._processUncaughtError$3(zone, error, stackTrace);
        else
          t2._processUncaughtError$3(zone, type$.Object._as(e), t1._as(s));
      }
    },
    $signature: 71
  };
  A._HashMap.prototype = {
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$keys(_) {
      return new A._HashMapKeyIterable(this, A._instanceType(this)._eval$1("_HashMapKeyIterable<1>"));
    },
    containsKey$1(_, key) {
      var strings, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[key] != null;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[key] != null;
      } else
        return this._containsKey$1(key);
    },
    _containsKey$1(key) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(this._getBucket$2(rest, key), key) >= 0;
    },
    $index(_, key) {
      var strings, t1, nums;
      if (typeof key == "string" && key !== "__proto__") {
        strings = this._collection$_strings;
        t1 = strings == null ? null : A._HashMap__getTableEntry(strings, key);
        return t1;
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = this._collection$_nums;
        t1 = nums == null ? null : A._HashMap__getTableEntry(nums, key);
        return t1;
      } else
        return this._get$1(0, key);
    },
    _get$1(_, key) {
      var bucket, index,
        rest = this._collection$_rest;
      if (rest == null)
        return null;
      bucket = this._getBucket$2(rest, key);
      index = this._findBucketIndex$2(bucket, key);
      return index < 0 ? null : bucket[index + 1];
    },
    $indexSet(_, key, value) {
      var strings, nums, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (typeof key == "string" && key !== "__proto__") {
        strings = _this._collection$_strings;
        _this._collection$_addHashTableEntry$3(strings == null ? _this._collection$_strings = A._HashMap__newHashTable() : strings, key, value);
      } else if (typeof key == "number" && (key & 1073741823) === key) {
        nums = _this._collection$_nums;
        _this._collection$_addHashTableEntry$3(nums == null ? _this._collection$_nums = A._HashMap__newHashTable() : nums, key, value);
      } else
        _this._set$2(key, value);
    },
    _set$2(key, value) {
      var rest, hash, bucket, index, _this = this,
        t1 = A._instanceType(_this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashMap__newHashTable();
      hash = _this._computeHashCode$1(key);
      bucket = rest[hash];
      if (bucket == null) {
        A._HashMap__setTableEntry(rest, hash, [key, value]);
        ++_this._collection$_length;
        _this._keys = null;
      } else {
        index = _this._findBucketIndex$2(bucket, key);
        if (index >= 0)
          bucket[index + 1] = value;
        else {
          bucket.push(key, value);
          ++_this._collection$_length;
          _this._keys = null;
        }
      }
    },
    forEach$1(_, action) {
      var keys, $length, t2, i, key, t3, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("~(1,2)")._as(action);
      keys = _this._computeKeys$0();
      for ($length = keys.length, t2 = t1._precomputed1, t1 = t1._rest[1], i = 0; i < $length; ++i) {
        key = keys[i];
        t2._as(key);
        t3 = _this.$index(0, key);
        action.call$2(key, t3 == null ? t1._as(t3) : t3);
        if (keys !== _this._keys)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _computeKeys$0() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._keys;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_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._collection$_nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_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;
          }
        }
      }
      return _this._keys = result;
    },
    _collection$_addHashTableEntry$3(table, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      if (table[key] == null) {
        ++this._collection$_length;
        this._keys = null;
      }
      A._HashMap__setTableEntry(table, key, value);
    },
    _computeHashCode$1(key) {
      return J.get$hashCode$(key) & 1073741823;
    },
    _getBucket$2(table, key) {
      return table[this._computeHashCode$1(key)];
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2)
        if (J.$eq$(bucket[i], key))
          return i;
      return -1;
    },
    $isHashMap: 1
  };
  A._IdentityHashMap.prototype = {
    _computeHashCode$1(key) {
      return A.objectHashCode(key) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, i, t1;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; i += 2) {
        t1 = bucket[i];
        if (t1 == null ? key == null : t1 === key)
          return i;
      }
      return -1;
    }
  };
  A._CustomHashMap.prototype = {
    $index(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return null;
      return this.super$_HashMap$_get(0, key);
    },
    $indexSet(_, key, value) {
      var t1 = this.$ti;
      this.super$_HashMap$_set(t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(_, key) {
      if (!A.boolConversionCheck(this._validKey.call$1(key)))
        return false;
      return this.super$_HashMap$_containsKey(key);
    },
    _computeHashCode$1(key) {
      return this._hashCode.call$1(this.$ti._precomputed1._as(key)) & 1073741823;
    },
    _findBucketIndex$2(bucket, key) {
      var $length, t1, t2, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (t1 = this.$ti._precomputed1, t2 = this._equals, i = 0; i < $length; i += 2)
        if (A.boolConversionCheck(t2.call$2(bucket[i], t1._as(key))))
          return i;
      return -1;
    }
  };
  A._CustomHashMap_closure.prototype = {
    call$1(v) {
      return this.K._is(v);
    },
    $signature: 18
  };
  A._HashMapKeyIterable.prototype = {
    get$length(_) {
      return this._collection$_map._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_map._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_map._collection$_length !== 0;
    },
    get$iterator(_) {
      var t1 = this._collection$_map;
      return new A._HashMapKeyIterator(t1, t1._computeKeys$0(), this.$ti._eval$1("_HashMapKeyIterator<1>"));
    },
    contains$1(_, element) {
      return this._collection$_map.containsKey$1(0, element);
    }
  };
  A._HashMapKeyIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        keys = _this._keys,
        offset = _this._offset,
        t1 = _this._collection$_map;
      if (keys !== t1._keys)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= keys.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(keys[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._HashSet.prototype = {
    get$iterator(_) {
      return new A._HashSetIterator(this, this._computeElements$0(), A._instanceType(this)._eval$1("_HashSetIterator<1>"));
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        return strings == null ? false : strings[object] != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        return nums == null ? false : nums[object] != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = A._HashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = A._HashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1(_, element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._HashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [element];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(element);
      }
      ++_this._collection$_length;
      _this._collection$_elements = null;
      return true;
    },
    remove$1(_, object) {
      var _this = this;
      if (typeof object == "string" && object !== "__proto__")
        return _this._collection$_removeHashTableEntry$2(_this._collection$_strings, object);
      else if (typeof object == "number" && (object & 1073741823) === object)
        return _this._collection$_removeHashTableEntry$2(_this._collection$_nums, object);
      else
        return _this._remove$1(0, object);
    },
    _remove$1(_, object) {
      var hash, bucket, index, _this = this,
        rest = _this._collection$_rest;
      if (rest == null)
        return false;
      hash = _this._computeHashCode$1(object);
      bucket = rest[hash];
      index = _this._findBucketIndex$2(bucket, object);
      if (index < 0)
        return false;
      --_this._collection$_length;
      _this._collection$_elements = null;
      bucket.splice(index, 1);
      if (0 === bucket.length)
        delete rest[hash];
      return true;
    },
    _computeElements$0() {
      var strings, names, entries, index, i, nums, rest, bucket, $length, i0, _this = this,
        result = _this._collection$_elements;
      if (result != null)
        return result;
      result = A.List_List$filled(_this._collection$_length, null, false, type$.dynamic);
      strings = _this._collection$_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._collection$_nums;
      if (nums != null) {
        names = Object.getOwnPropertyNames(nums);
        entries = names.length;
        for (i = 0; i < entries; ++i) {
          result[index] = +names[i];
          ++index;
        }
      }
      rest = _this._collection$_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) {
            result[index] = bucket[i0];
            ++index;
          }
        }
      }
      return _this._collection$_elements = result;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (table[element] != null)
        return false;
      table[element] = 0;
      ++this._collection$_length;
      this._collection$_elements = null;
      return true;
    },
    _collection$_removeHashTableEntry$2(table, element) {
      if (table != null && table[element] != null) {
        delete table[element];
        --this._collection$_length;
        this._collection$_elements = null;
        return true;
      } else
        return false;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i], element))
          return i;
      return -1;
    }
  };
  A._HashSetIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        elements = _this._collection$_elements,
        offset = _this._offset,
        t1 = _this._set;
      if (elements !== t1._collection$_elements)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (offset >= elements.length) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(elements[offset]);
        _this._offset = offset + 1;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._LinkedHashSet.prototype = {
    get$iterator(_) {
      var _this = this,
        t1 = new A._LinkedHashSetIterator(_this, _this._collection$_modifications, A._instanceType(_this)._eval$1("_LinkedHashSetIterator<1>"));
      t1._collection$_cell = _this._collection$_first;
      return t1;
    },
    get$length(_) {
      return this._collection$_length;
    },
    get$isEmpty(_) {
      return this._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._collection$_length !== 0;
    },
    contains$1(_, object) {
      var strings, nums;
      if (typeof object == "string" && object !== "__proto__") {
        strings = this._collection$_strings;
        if (strings == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(strings[object]) != null;
      } else if (typeof object == "number" && (object & 1073741823) === object) {
        nums = this._collection$_nums;
        if (nums == null)
          return false;
        return type$.nullable__LinkedHashSetCell._as(nums[object]) != null;
      } else
        return this._contains$1(object);
    },
    _contains$1(object) {
      var rest = this._collection$_rest;
      if (rest == null)
        return false;
      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
    },
    get$first(_) {
      var first = this._collection$_first;
      if (first == null)
        throw A.wrapException(A.StateError$("No elements"));
      return A._instanceType(this)._precomputed1._as(first._collection$_element);
    },
    add$1(_, element) {
      var strings, nums, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      if (typeof element == "string" && element !== "__proto__") {
        strings = _this._collection$_strings;
        return _this._collection$_addHashTableEntry$2(strings == null ? _this._collection$_strings = A._LinkedHashSet__newHashTable() : strings, element);
      } else if (typeof element == "number" && (element & 1073741823) === element) {
        nums = _this._collection$_nums;
        return _this._collection$_addHashTableEntry$2(nums == null ? _this._collection$_nums = A._LinkedHashSet__newHashTable() : nums, element);
      } else
        return _this._collection$_add$1(0, element);
    },
    _collection$_add$1(_, element) {
      var rest, hash, bucket, _this = this;
      A._instanceType(_this)._precomputed1._as(element);
      rest = _this._collection$_rest;
      if (rest == null)
        rest = _this._collection$_rest = A._LinkedHashSet__newHashTable();
      hash = _this._computeHashCode$1(element);
      bucket = rest[hash];
      if (bucket == null)
        rest[hash] = [_this._collection$_newLinkedCell$1(element)];
      else {
        if (_this._findBucketIndex$2(bucket, element) >= 0)
          return false;
        bucket.push(_this._collection$_newLinkedCell$1(element));
      }
      return true;
    },
    _collection$_addHashTableEntry$2(table, element) {
      A._instanceType(this)._precomputed1._as(element);
      if (type$.nullable__LinkedHashSetCell._as(table[element]) != null)
        return false;
      table[element] = this._collection$_newLinkedCell$1(element);
      return true;
    },
    _collection$_newLinkedCell$1(element) {
      var _this = this,
        cell = new A._LinkedHashSetCell(A._instanceType(_this)._precomputed1._as(element));
      if (_this._collection$_first == null)
        _this._collection$_first = _this._collection$_last = cell;
      else
        _this._collection$_last = _this._collection$_last._collection$_next = cell;
      ++_this._collection$_length;
      _this._collection$_modifications = _this._collection$_modifications + 1 & 1073741823;
      return cell;
    },
    _computeHashCode$1(element) {
      return J.get$hashCode$(element) & 1073741823;
    },
    _findBucketIndex$2(bucket, element) {
      var $length, i;
      if (bucket == null)
        return -1;
      $length = bucket.length;
      for (i = 0; i < $length; ++i)
        if (J.$eq$(bucket[i]._collection$_element, element))
          return i;
      return -1;
    }
  };
  A._LinkedHashSetCell.prototype = {};
  A._LinkedHashSetIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var _this = this,
        cell = _this._collection$_cell,
        t1 = _this._set;
      if (_this._collection$_modifications !== t1._collection$_modifications)
        throw A.wrapException(A.ConcurrentModificationError$(t1));
      else if (cell == null) {
        _this.set$_collection$_current(null);
        return false;
      } else {
        _this.set$_collection$_current(_this.$ti._eval$1("1?")._as(cell._collection$_element));
        _this._collection$_cell = cell._collection$_next;
        return true;
      }
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.UnmodifiableListView.prototype = {
    cast$1$0(_, $R) {
      return new A.UnmodifiableListView(J.cast$1$0$ax(this._collection$_source, $R), $R._eval$1("UnmodifiableListView<0>"));
    },
    get$length(_) {
      return J.get$length$asx(this._collection$_source);
    },
    $index(_, index) {
      return J.elementAt$1$ax(this._collection$_source, index);
    }
  };
  A.LinkedHashMap_LinkedHashMap$from_closure.prototype = {
    call$2(k, v) {
      this.result.$indexSet(0, this.K._as(k), this.V._as(v));
    },
    $signature: 9
  };
  A.ListBase.prototype = {
    get$iterator(receiver) {
      return new A.ListIterator(receiver, this.get$length(receiver), A.instanceType(receiver)._eval$1("ListIterator<ListBase.E>"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    forEach$1(receiver, action) {
      var $length, i;
      A.instanceType(receiver)._eval$1("~(ListBase.E)")._as(action);
      $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        action.call$1(this.$index(receiver, i));
        if ($length !== this.get$length(receiver))
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
    },
    get$isEmpty(receiver) {
      return this.get$length(receiver) === 0;
    },
    get$isNotEmpty(receiver) {
      return !this.get$isEmpty(receiver);
    },
    get$first(receiver) {
      if (this.get$length(receiver) === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.$index(receiver, 0);
    },
    contains$1(receiver, element) {
      var i,
        $length = this.get$length(receiver);
      for (i = 0; i < $length; ++i) {
        if (J.$eq$(this.$index(receiver, i), element))
          return true;
        if ($length !== this.get$length(receiver))
          throw A.wrapException(A.ConcurrentModificationError$(receiver));
      }
      return false;
    },
    map$1$1(receiver, f, $T) {
      var t1 = A.instanceType(receiver);
      return new A.MappedListIterable(receiver, t1._bind$1($T)._eval$1("1(ListBase.E)")._as(f), t1._eval$1("@<ListBase.E>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(receiver, f) {
      return this.map$1$1(receiver, f, type$.dynamic);
    },
    skip$1(receiver, count) {
      return A.SubListIterable$(receiver, count, null, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    take$1(receiver, count) {
      return A.SubListIterable$(receiver, 0, A.checkNotNullable(count, "count", type$.int), A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    cast$1$0(receiver, $R) {
      return new A.CastList(receiver, A.instanceType(receiver)._eval$1("@<ListBase.E>")._bind$1($R)._eval$1("CastList<1,2>"));
    },
    sort$1(receiver, compare) {
      var t2,
        t1 = A.instanceType(receiver);
      t1._eval$1("int(ListBase.E,ListBase.E)?")._as(compare);
      t2 = compare == null ? A.collection_ListBase__compareAny$closure() : compare;
      A.Sort__doSort(receiver, 0, this.get$length(receiver) - 1, t2, t1._eval$1("ListBase.E"));
    },
    sublist$2(receiver, start, end) {
      var listLength = this.get$length(receiver);
      if (end == null)
        end = listLength;
      A.RangeError_checkValidRange(start, end, listLength);
      return A.List_List$from(this.getRange$2(receiver, start, end), true, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    sublist$1(receiver, start) {
      return this.sublist$2(receiver, start, null);
    },
    getRange$2(receiver, start, end) {
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      return A.SubListIterable$(receiver, start, end, A.instanceType(receiver)._eval$1("ListBase.E"));
    },
    fillRange$3(receiver, start, end, fill) {
      var value, i,
        t1 = A.instanceType(receiver);
      t1._eval$1("ListBase.E?")._as(fill);
      value = fill == null ? t1._eval$1("ListBase.E")._as(fill) : fill;
      A.RangeError_checkValidRange(start, end, this.get$length(receiver));
      for (i = start; i < end; ++i)
        this.$indexSet(receiver, i, value);
    },
    toString$0(receiver) {
      return A.Iterable_iterableToFullString(receiver, "[", "]");
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.MapBase.prototype = {
    cast$2$0(receiver, RK, RV) {
      var t1 = A.instanceType(receiver);
      return A.Map_castFrom(receiver, t1._eval$1("MapBase.K"), t1._eval$1("MapBase.V"), RK, RV);
    },
    forEach$1(receiver, action) {
      var t2, key, t3,
        t1 = A.instanceType(receiver);
      t1._eval$1("~(MapBase.K,MapBase.V)")._as(action);
      for (t2 = J.get$iterator$ax(this.get$keys(receiver)), t1 = t1._eval$1("MapBase.V"); t2.moveNext$0();) {
        key = t2.get$current(t2);
        t3 = this.$index(receiver, key);
        action.call$2(key, t3 == null ? t1._as(t3) : t3);
      }
    },
    map$2$1(receiver, transform, K2, V2) {
      var result, t2, key, t3, entry,
        t1 = A.instanceType(receiver);
      t1._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(MapBase.K,MapBase.V)")._as(transform);
      result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2);
      for (t2 = J.get$iterator$ax(this.get$keys(receiver)), t1 = t1._eval$1("MapBase.V"); t2.moveNext$0();) {
        key = t2.get$current(t2);
        t3 = this.$index(receiver, key);
        entry = transform.call$2(key, t3 == null ? t1._as(t3) : t3);
        result.$indexSet(0, entry.get$key(entry), entry.get$value(entry));
      }
      return result;
    },
    map$1(receiver, transform) {
      var t1 = type$.dynamic;
      return this.map$2$1(receiver, transform, t1, t1);
    },
    containsKey$1(receiver, key) {
      return J.contains$1$asx(this.get$keys(receiver), key);
    },
    get$length(receiver) {
      return J.get$length$asx(this.get$keys(receiver));
    },
    get$isEmpty(receiver) {
      return J.get$isEmpty$asx(this.get$keys(receiver));
    },
    toString$0(receiver) {
      return A.MapBase_mapToString(receiver);
    },
    $isMap: 1
  };
  A.MapBase_mapToString_closure.prototype = {
    call$2(k, v) {
      var t2,
        t1 = this._box_0;
      if (!t1.first)
        this.result._contents += ", ";
      t1.first = false;
      t1 = this.result;
      t2 = t1._contents += A.S(k);
      t1._contents = t2 + ": ";
      t1._contents += A.S(v);
    },
    $signature: 19
  };
  A._UnmodifiableMapMixin.prototype = {
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify unmodifiable map"));
    }
  };
  A.MapView.prototype = {
    cast$2$0(_, RK, RV) {
      return J.cast$2$0$ax(this._collection$_map, RK, RV);
    },
    $index(_, key) {
      return J.$index$asx(this._collection$_map, key);
    },
    $indexSet(_, key, value) {
      var t1 = A._instanceType(this);
      J.$indexSet$ax(this._collection$_map, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    containsKey$1(_, key) {
      return J.containsKey$1$x(this._collection$_map, key);
    },
    forEach$1(_, action) {
      J.forEach$1$ax(this._collection$_map, A._instanceType(this)._eval$1("~(1,2)")._as(action));
    },
    get$isEmpty(_) {
      return J.get$isEmpty$asx(this._collection$_map);
    },
    get$length(_) {
      return J.get$length$asx(this._collection$_map);
    },
    get$keys(_) {
      return J.get$keys$x(this._collection$_map);
    },
    toString$0(_) {
      return J.toString$0$(this._collection$_map);
    },
    map$2$1(_, transform, K2, V2) {
      return J.map$2$1$ax(this._collection$_map, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2);
    },
    map$1(_, transform) {
      var t1 = type$.dynamic;
      return this.map$2$1(0, transform, t1, t1);
    },
    $isMap: 1
  };
  A.UnmodifiableMapView.prototype = {
    cast$2$0(_, RK, RV) {
      return new A.UnmodifiableMapView(J.cast$2$0$ax(this._collection$_map, RK, RV), RK._eval$1("@<0>")._bind$1(RV)._eval$1("UnmodifiableMapView<1,2>"));
    }
  };
  A.ListQueue.prototype = {
    get$iterator(_) {
      var _this = this;
      return new A._ListQueueIterator(_this, _this._tail, _this._modificationCount, _this._head, _this.$ti._eval$1("_ListQueueIterator<1>"));
    },
    get$isEmpty(_) {
      return this._head === this._tail;
    },
    get$length(_) {
      return (this._tail - this._head & this._table.length - 1) >>> 0;
    },
    get$first(_) {
      var t2, _this = this,
        t1 = _this._head;
      if (t1 === _this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      t2 = _this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      t1 = t2[t1];
      return t1 == null ? _this.$ti._precomputed1._as(t1) : t1;
    },
    elementAt$1(_, index) {
      var t2, t3, _this = this,
        t1 = _this.get$length(0);
      if (0 > index || index >= t1)
        A.throwExpression(A.IndexError$withLength(index, t1, _this, null, "index"));
      t1 = _this._table;
      t2 = t1.length;
      t3 = (_this._head + index & t2 - 1) >>> 0;
      if (!(t3 >= 0 && t3 < t2))
        return A.ioore(t1, t3);
      t3 = t1[t3];
      return t3 == null ? _this.$ti._precomputed1._as(t3) : t3;
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    removeFirst$0() {
      var t2, result, _this = this,
        t1 = _this._head;
      if (t1 === _this._tail)
        throw A.wrapException(A.IterableElementError_noElement());
      ++_this._modificationCount;
      t2 = _this._table;
      if (!(t1 < t2.length))
        return A.ioore(t2, t1);
      result = t2[t1];
      if (result == null)
        result = _this.$ti._precomputed1._as(result);
      B.JSArray_methods.$indexSet(t2, t1, null);
      _this._head = (_this._head + 1 & _this._table.length - 1) >>> 0;
      return result;
    },
    _collection$_add$1(_, element) {
      var t2, t3, newTable, split, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(element);
      B.JSArray_methods.$indexSet(_this._table, _this._tail, element);
      t2 = _this._tail;
      t3 = _this._table.length;
      t2 = (t2 + 1 & t3 - 1) >>> 0;
      _this._tail = t2;
      if (_this._head === t2) {
        newTable = A.List_List$filled(t3 * 2, null, false, t1._eval$1("1?"));
        t1 = _this._table;
        t2 = _this._head;
        split = t1.length - t2;
        B.JSArray_methods.setRange$4(newTable, 0, split, t1, t2);
        B.JSArray_methods.setRange$4(newTable, split, split + _this._head, _this._table, 0);
        _this._head = 0;
        _this._tail = _this._table.length;
        _this.set$_table(newTable);
      }
      ++_this._modificationCount;
    },
    set$_table(_table) {
      this._table = this.$ti._eval$1("List<1?>")._as(_table);
    },
    $isQueue: 1
  };
  A._ListQueueIterator.prototype = {
    get$current(_) {
      var t1 = this._collection$_current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    moveNext$0() {
      var t2, t3, _this = this,
        t1 = _this._queue;
      if (_this._modificationCount !== t1._modificationCount)
        A.throwExpression(A.ConcurrentModificationError$(t1));
      t2 = _this._collection$_position;
      if (t2 === _this._end) {
        _this.set$_collection$_current(null);
        return false;
      }
      t3 = t1._table;
      if (!(t2 < t3.length))
        return A.ioore(t3, t2);
      _this.set$_collection$_current(t3[t2]);
      _this._collection$_position = (_this._collection$_position + 1 & t1._table.length - 1) >>> 0;
      return true;
    },
    set$_collection$_current(_current) {
      this._collection$_current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A.SetBase.prototype = {
    get$isEmpty(_) {
      return this.get$length(this) === 0;
    },
    get$isNotEmpty(_) {
      return this.get$length(this) !== 0;
    },
    addAll$1(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(A._instanceType(this)._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this.add$1(0, t1.get$current(t1));
    },
    containsAll$1(other) {
      var t1, t2, o;
      for (t1 = other._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1), t2 = t1.$ti._precomputed1; t1.moveNext$0();) {
        o = t1._collection$_current;
        if (!this.contains$1(0, o == null ? t2._as(o) : o))
          return false;
      }
      return true;
    },
    map$1$1(_, f, $T) {
      var t1 = A._instanceType(this);
      return new A.EfficientLengthMappedIterable(this, t1._bind$1($T)._eval$1("1(2)")._as(f), t1._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1(_, f) {
      return this.map$1$1(0, f, type$.dynamic);
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    take$1(_, n) {
      return A.TakeIterable_TakeIterable(this, n, A._instanceType(this)._precomputed1);
    },
    skip$1(_, n) {
      return A.SkipIterable_SkipIterable(this, n, A._instanceType(this)._precomputed1);
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current(it);
    },
    elementAt$1(_, index) {
      var iterator, skipCount;
      A.RangeError_checkNotNegative(index, "index");
      iterator = this.get$iterator(this);
      for (skipCount = index; iterator.moveNext$0();) {
        if (skipCount === 0)
          return iterator.get$current(iterator);
        --skipCount;
      }
      throw A.wrapException(A.IndexError$withLength(index, index - skipCount, this, null, "index"));
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isSet: 1
  };
  A._SetBase.prototype = {};
  A._SplayTreeNode.prototype = {
    set$_left(_, _left) {
      this._left = this.$ti._eval$1("_SplayTreeNode.1?")._as(_left);
    },
    set$_right(_, _right) {
      this._right = this.$ti._eval$1("_SplayTreeNode.1?")._as(_right);
    }
  };
  A._SplayTreeSetNode.prototype = {};
  A._SplayTree.prototype = {
    _splay$1(key) {
      var root, compare, comp, current, newTreeLeft, left, newTreeRight, right, currentLeft, currentLeft0, currentRight, currentRight0, _this = this, _null = null;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      root = _this._root;
      if (root == null) {
        _this._compare.call$2(key, key);
        return -1;
      }
      compare = _this._compare;
      for (comp = _null, current = root, newTreeLeft = comp, left = newTreeLeft, newTreeRight = left, right = newTreeRight; true;) {
        comp = compare.call$2(current.key, key);
        if (comp > 0) {
          currentLeft = current._left;
          if (currentLeft == null)
            break;
          comp = compare.call$2(currentLeft.key, key);
          if (comp > 0) {
            current.set$_left(0, currentLeft._right);
            currentLeft.set$_right(0, current);
            currentLeft0 = currentLeft._left;
            if (currentLeft0 == null) {
              current = currentLeft;
              break;
            }
            current = currentLeft;
            currentLeft = currentLeft0;
          }
          if (right == null)
            newTreeRight = current;
          else
            right.set$_left(0, current);
          right = current;
          current = currentLeft;
        } else {
          if (comp < 0) {
            currentRight = current._right;
            if (currentRight == null)
              break;
            comp = compare.call$2(currentRight.key, key);
            if (comp < 0) {
              current.set$_right(0, currentRight._left);
              currentRight.set$_left(0, current);
              currentRight0 = currentRight._right;
              if (currentRight0 == null) {
                current = currentRight;
                break;
              }
              current = currentRight;
              currentRight = currentRight0;
            }
            if (left == null)
              newTreeLeft = current;
            else
              left.set$_right(0, current);
          } else
            break;
          left = current;
          current = currentRight;
        }
      }
      if (left != null) {
        left.set$_right(0, current._left);
        current.set$_left(0, newTreeLeft);
      }
      if (right != null) {
        right.set$_left(0, current._right);
        current.set$_right(0, newTreeRight);
      }
      if (_this._root !== current) {
        _this.set$_root(current);
        ++_this._splayCount;
      }
      return comp;
    },
    _splayMin$1(node) {
      var nextLeft, current, nextLeft0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextLeft = node._left;
      for (current = node; nextLeft != null; current = nextLeft, nextLeft = nextLeft0) {
        current.set$_left(0, nextLeft._right);
        nextLeft.set$_right(0, current);
        nextLeft0 = nextLeft._left;
      }
      return current;
    },
    _splayMax$1(node) {
      var nextRight, current, nextRight0;
      this.$ti._eval$1("_SplayTree.1")._as(node);
      nextRight = node._right;
      for (current = node; nextRight != null; current = nextRight, nextRight = nextRight0) {
        current.set$_right(0, nextRight._left);
        nextRight.set$_left(0, current);
        nextRight0 = nextRight._right;
      }
      return current;
    },
    _remove$1(_, key) {
      var root, left, t1, root0, _this = this;
      _this.$ti._eval$1("_SplayTree.K")._as(key);
      if (_this._root == null)
        return null;
      if (_this._splay$1(key) !== 0)
        return null;
      root = _this._root;
      left = root._left;
      --_this._count;
      t1 = root._right;
      if (left == null)
        _this.set$_root(t1);
      else {
        root0 = _this._splayMax$1(left);
        root0.set$_right(0, t1);
        _this.set$_root(root0);
      }
      ++_this._modificationCount;
      return root;
    },
    _addNewRoot$2(node, comp) {
      var root, _this = this;
      _this.$ti._eval$1("_SplayTree.1")._as(node);
      ++_this._count;
      ++_this._modificationCount;
      root = _this._root;
      if (root == null) {
        _this.set$_root(node);
        return;
      }
      if (comp < 0) {
        node.set$_left(0, root);
        node.set$_right(0, root._right);
        root.set$_right(0, null);
      } else {
        node.set$_right(0, root);
        node.set$_left(0, root._left);
        root.set$_left(0, null);
      }
      _this.set$_root(node);
    },
    get$_collection$_first() {
      var _this = this,
        root = _this._root;
      if (root == null)
        return null;
      _this.set$_root(_this._splayMin$1(root));
      return _this._root;
    }
  };
  A._SplayTreeIterator.prototype = {
    get$current(_) {
      var t1 = this._path;
      if (t1.length === 0) {
        this.$ti._eval$1("_SplayTreeIterator.T")._as(null);
        return null;
      }
      return this.$ti._rest[1]._as(B.JSArray_methods.get$last(t1)).key;
    },
    moveNext$0() {
      var node, next, _this = this,
        t1 = _this._modificationCount,
        t2 = _this._tree,
        t3 = t2._modificationCount;
      if (t1 !== t3) {
        if (t1 == null) {
          _this._modificationCount = t3;
          node = t2._root;
          for (t1 = _this._path; node != null;) {
            B.JSArray_methods.add$1(t1, node);
            node = node._left;
          }
          return t1.length !== 0;
        }
        throw A.wrapException(A.ConcurrentModificationError$(t2));
      }
      t1 = _this._path;
      if (t1.length === 0)
        return false;
      if (_this._splayCount !== t2._splayCount) {
        t3 = _this.$ti._eval$1("_SplayTreeIterator.K")._as(B.JSArray_methods.get$last(t1).key);
        B.JSArray_methods.clear$0(t1);
        t2._splay$1(t3);
        t3 = t2._root;
        t3.toString;
        B.JSArray_methods.add$1(t1, t3);
        _this._splayCount = t2._splayCount;
      }
      node = B.JSArray_methods.get$last(t1);
      next = node._right;
      if (next != null) {
        for (; next != null;) {
          B.JSArray_methods.add$1(t1, next);
          next = next._left;
        }
        return true;
      }
      if (0 >= t1.length)
        return A.ioore(t1, -1);
      t1.pop();
      while (true) {
        if (!(t1.length !== 0 && B.JSArray_methods.get$last(t1)._right === node))
          break;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        node = t1.pop();
      }
      return t1.length !== 0;
    },
    $isIterator: 1
  };
  A._SplayTreeKeyIterator.prototype = {};
  A.SplayTreeSet.prototype = {
    get$iterator(_) {
      var t1 = this.$ti;
      return new A._SplayTreeKeyIterator(this, A._setArrayType([], t1._eval$1("JSArray<_SplayTreeSetNode<1>>")), this._splayCount, t1._eval$1("@<1>")._bind$1(t1._eval$1("_SplayTreeSetNode<1>"))._eval$1("_SplayTreeKeyIterator<1,2>"));
    },
    get$length(_) {
      return this._count;
    },
    get$isEmpty(_) {
      return this._root == null;
    },
    get$isNotEmpty(_) {
      return this._root != null;
    },
    get$first(_) {
      if (this._count === 0)
        throw A.wrapException(A.IterableElementError_noElement());
      return this.get$_collection$_first().key;
    },
    contains$1(_, element) {
      return A.boolConversionCheck(this._validKey.call$1(element)) && this._splay$1(this.$ti._precomputed1._as(element)) === 0;
    },
    add$1(_, element) {
      return this._collection$_add$1(0, this.$ti._precomputed1._as(element));
    },
    _collection$_add$1(_, element) {
      var compare,
        t1 = this.$ti;
      t1._precomputed1._as(element);
      compare = this._splay$1(element);
      if (compare === 0)
        return false;
      this._addNewRoot$2(new A._SplayTreeSetNode(element, t1._eval$1("_SplayTreeSetNode<1>")), compare);
      return true;
    },
    remove$1(_, object) {
      if (!A.boolConversionCheck(this._validKey.call$1(object)))
        return false;
      return this._remove$1(0, this.$ti._precomputed1._as(object)) != null;
    },
    addAll$1(_, elements) {
      var t1;
      for (t1 = J.get$iterator$ax(this.$ti._eval$1("Iterable<1>")._as(elements)); t1.moveNext$0();)
        this._collection$_add$1(0, t1.get$current(t1));
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    set$_root(_root) {
      this._root = this.$ti._eval$1("_SplayTreeSetNode<1>?")._as(_root);
    },
    $isEfficientLengthIterable: 1,
    $isSet: 1
  };
  A.SplayTreeSet_closure.prototype = {
    call$1(v) {
      return this.E._is(v);
    },
    $signature: 18
  };
  A._SplayTreeSet__SplayTree_Iterable.prototype = {};
  A._SplayTreeSet__SplayTree_Iterable_SetMixin.prototype = {};
  A._UnmodifiableMapView_MapView__UnmodifiableMapMixin.prototype = {};
  A._JsonMap.prototype = {
    $index(_, key) {
      var result,
        t1 = this._processed;
      if (t1 == null)
        return this._data.$index(0, key);
      else if (typeof key != "string")
        return null;
      else {
        result = t1[key];
        return typeof result == "undefined" ? this._process$1(key) : result;
      }
    },
    get$length(_) {
      return this._processed == null ? this._data._length : this._convert$_computeKeys$0().length;
    },
    get$isEmpty(_) {
      return this.get$length(0) === 0;
    },
    get$keys(_) {
      var t1;
      if (this._processed == null) {
        t1 = this._data;
        return new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>"));
      }
      return new A._JsonMapKeyIterable(this);
    },
    $indexSet(_, key, value) {
      var processed, original, _this = this;
      A._asString(key);
      if (_this._processed == null)
        _this._data.$indexSet(0, key, value);
      else if (_this.containsKey$1(0, key)) {
        processed = _this._processed;
        processed[key] = value;
        original = _this._original;
        if (original == null ? processed != null : original !== processed)
          original[key] = null;
      } else
        _this._upgrade$0().$indexSet(0, key, value);
    },
    containsKey$1(_, key) {
      if (this._processed == null)
        return this._data.containsKey$1(0, key);
      if (typeof key != "string")
        return false;
      return Object.prototype.hasOwnProperty.call(this._original, key);
    },
    forEach$1(_, f) {
      var keys, i, key, value, _this = this;
      type$.void_Function_String_dynamic._as(f);
      if (_this._processed == null)
        return _this._data.forEach$1(0, f);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; i < keys.length; ++i) {
        key = keys[i];
        value = _this._processed[key];
        if (typeof value == "undefined") {
          value = A._convertJsonToDartLazy(_this._original[key]);
          _this._processed[key] = value;
        }
        f.call$2(key, value);
        if (keys !== _this._data)
          throw A.wrapException(A.ConcurrentModificationError$(_this));
      }
    },
    _convert$_computeKeys$0() {
      var keys = type$.nullable_List_dynamic._as(this._data);
      if (keys == null)
        keys = this._data = A._setArrayType(Object.keys(this._original), type$.JSArray_String);
      return keys;
    },
    _upgrade$0() {
      var result, keys, i, t1, key, _this = this;
      if (_this._processed == null)
        return _this._data;
      result = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic);
      keys = _this._convert$_computeKeys$0();
      for (i = 0; t1 = keys.length, i < t1; ++i) {
        key = keys[i];
        result.$indexSet(0, key, _this.$index(0, key));
      }
      if (t1 === 0)
        B.JSArray_methods.add$1(keys, "");
      else
        B.JSArray_methods.clear$0(keys);
      _this._original = _this._processed = null;
      return _this._data = result;
    },
    _process$1(key) {
      var result;
      if (!Object.prototype.hasOwnProperty.call(this._original, key))
        return null;
      result = A._convertJsonToDartLazy(this._original[key]);
      return this._processed[key] = result;
    }
  };
  A._JsonMapKeyIterable.prototype = {
    get$length(_) {
      return this._parent.get$length(0);
    },
    elementAt$1(_, index) {
      var t1 = this._parent;
      if (t1._processed == null)
        t1 = t1.get$keys(0).elementAt$1(0, index);
      else {
        t1 = t1._convert$_computeKeys$0();
        if (!(index >= 0 && index < t1.length))
          return A.ioore(t1, index);
        t1 = t1[index];
      }
      return t1;
    },
    get$iterator(_) {
      var t1 = this._parent;
      if (t1._processed == null) {
        t1 = t1.get$keys(0);
        t1 = t1.get$iterator(t1);
      } else {
        t1 = t1._convert$_computeKeys$0();
        t1 = new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
      }
      return t1;
    },
    contains$1(_, key) {
      return this._parent.containsKey$1(0, key);
    }
  };
  A.Base64Codec.prototype = {
    get$encoder() {
      return B.C_Base64Encoder;
    },
    normalize$3(_, source, start, end) {
      var inverseAlphabet, t2, i, sliceStart, buffer, firstPadding, firstPaddingSourceIndex, paddingCount, i0, char, i1, digit1, t3, digit2, char0, value, endLength, $length,
        _s64_ = string$.ABCDEF,
        _s31_ = "Invalid base64 encoding length ",
        t1 = source.length;
      end = A.RangeError_checkValidRange(start, end, t1);
      inverseAlphabet = $.$get$_Base64Decoder__inverseAlphabet();
      for (t2 = inverseAlphabet.length, i = start, sliceStart = i, buffer = null, firstPadding = -1, firstPaddingSourceIndex = -1, paddingCount = 0; i < end; i = i0) {
        i0 = i + 1;
        if (!(i < t1))
          return A.ioore(source, i);
        char = source.charCodeAt(i);
        if (char === 37) {
          i1 = i0 + 2;
          if (i1 <= end) {
            if (!(i0 < t1))
              return A.ioore(source, i0);
            digit1 = A.hexDigitValue(source.charCodeAt(i0));
            t3 = i0 + 1;
            if (!(t3 < t1))
              return A.ioore(source, t3);
            digit2 = A.hexDigitValue(source.charCodeAt(t3));
            char0 = digit1 * 16 + digit2 - (digit2 & 256);
            if (char0 === 37)
              char0 = -1;
            i0 = i1;
          } else
            char0 = -1;
        } else
          char0 = char;
        if (0 <= char0 && char0 <= 127) {
          if (!(char0 >= 0 && char0 < t2))
            return A.ioore(inverseAlphabet, char0);
          value = inverseAlphabet[char0];
          if (value >= 0) {
            if (!(value < 64))
              return A.ioore(_s64_, value);
            char0 = _s64_.charCodeAt(value);
            if (char0 === char)
              continue;
            char = char0;
          } else {
            if (value === -1) {
              if (firstPadding < 0) {
                t3 = buffer == null ? null : buffer._contents.length;
                if (t3 == null)
                  t3 = 0;
                firstPadding = t3 + (i - sliceStart);
                firstPaddingSourceIndex = i;
              }
              ++paddingCount;
              if (char === 61)
                continue;
            }
            char = char0;
          }
          if (value !== -2) {
            if (buffer == null) {
              buffer = new A.StringBuffer("");
              t3 = buffer;
            } else
              t3 = buffer;
            t3._contents += B.JSString_methods.substring$2(source, sliceStart, i);
            t3._contents += A.Primitives_stringFromCharCode(char);
            sliceStart = i0;
            continue;
          }
        }
        throw A.wrapException(A.FormatException$("Invalid base64 data", source, i));
      }
      if (buffer != null) {
        t1 = buffer._contents += B.JSString_methods.substring$2(source, sliceStart, end);
        t2 = t1.length;
        if (firstPadding >= 0)
          A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, t2);
        else {
          endLength = B.JSInt_methods.$mod(t2 - 1, 4) + 1;
          if (endLength === 1)
            throw A.wrapException(A.FormatException$(_s31_, source, end));
          for (; endLength < 4;) {
            t1 += "=";
            buffer._contents = t1;
            ++endLength;
          }
        }
        t1 = buffer._contents;
        return B.JSString_methods.replaceRange$3(source, start, end, t1.charCodeAt(0) == 0 ? t1 : t1);
      }
      $length = end - start;
      if (firstPadding >= 0)
        A.Base64Codec__checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, $length);
      else {
        endLength = B.JSInt_methods.$mod($length, 4);
        if (endLength === 1)
          throw A.wrapException(A.FormatException$(_s31_, source, end));
        if (endLength > 1)
          source = B.JSString_methods.replaceRange$3(source, end, end, endLength === 2 ? "==" : "=");
      }
      return source;
    }
  };
  A.Base64Encoder.prototype = {
    convert$1(input) {
      var t1;
      type$.List_int._as(input);
      t1 = J.getInterceptor$asx(input);
      if (t1.get$isEmpty(input))
        return "";
      t1 = new A._Base64Encoder(string$.ABCDEF).encode$4(input, 0, t1.get$length(input), true);
      t1.toString;
      return A.String_String$fromCharCodes(t1, 0, null);
    }
  };
  A._Base64Encoder.prototype = {
    createBuffer$1(_, bufferLength) {
      return new Uint8Array(bufferLength);
    },
    encode$4(bytes, start, end, isLast) {
      var byteCount, fullChunks, bufferLength, output, _this = this;
      type$.List_int._as(bytes);
      byteCount = (_this._convert$_state & 3) + (end - start);
      fullChunks = B.JSInt_methods._tdivFast$1(byteCount, 3);
      bufferLength = fullChunks * 4;
      if (isLast && byteCount - fullChunks * 3 > 0)
        bufferLength += 4;
      output = _this.createBuffer$1(0, bufferLength);
      _this._convert$_state = A._Base64Encoder_encodeChunk(_this._alphabet, bytes, start, end, isLast, output, 0, _this._convert$_state);
      if (bufferLength > 0)
        return output;
      return null;
    }
  };
  A.Base64Decoder.prototype = {
    convert$1(input) {
      var end, decoder, t1;
      A._asString(input);
      end = A.RangeError_checkValidRange(0, null, input.length);
      if (0 === end)
        return new Uint8Array(0);
      decoder = new A._Base64Decoder();
      t1 = decoder.decode$3(0, input, 0, end);
      t1.toString;
      decoder.close$2(0, input, end);
      return t1;
    }
  };
  A._Base64Decoder.prototype = {
    decode$3(_, input, start, end) {
      var buffer, _this = this,
        t1 = _this._convert$_state;
      if (t1 < 0) {
        _this._convert$_state = A._Base64Decoder__checkPadding(input, start, end, t1);
        return null;
      }
      if (start === end)
        return new Uint8Array(0);
      buffer = A._Base64Decoder__allocateBuffer(input, start, end, t1);
      _this._convert$_state = A._Base64Decoder_decodeChunk(input, start, end, buffer, 0, _this._convert$_state);
      return buffer;
    },
    close$2(_, input, end) {
      var t1 = this._convert$_state;
      if (t1 < -1)
        throw A.wrapException(A.FormatException$("Missing padding character", input, end));
      if (t1 > 0)
        throw A.wrapException(A.FormatException$("Invalid length, must be multiple of four", input, end));
      this._convert$_state = -1;
    }
  };
  A.Codec.prototype = {};
  A.Converter.prototype = {$isStreamTransformer: 1};
  A.Encoding.prototype = {};
  A.JsonUnsupportedObjectError.prototype = {
    toString$0(_) {
      var safeString = A.Error_safeToString(this.unsupportedObject);
      return (this.cause != null ? "Converting object to an encodable object failed:" : "Converting object did not return an encodable object:") + " " + safeString;
    }
  };
  A.JsonCyclicError.prototype = {
    toString$0(_) {
      return "Cyclic error in JSON stringify";
    }
  };
  A.JsonCodec.prototype = {
    decode$2$reviver(_, source, reviver) {
      var t1 = A._parseJson(source, this.get$decoder()._reviver);
      return t1;
    },
    encode$2$toEncodable(value, toEncodable) {
      var t1 = A._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null);
      return t1;
    },
    get$encoder() {
      return B.JsonEncoder_null;
    },
    get$decoder() {
      return B.JsonDecoder_null;
    }
  };
  A.JsonEncoder.prototype = {};
  A.JsonDecoder.prototype = {};
  A._JsonStringifier.prototype = {
    writeStringContent$1(s) {
      var offset, i, charCode, t1, t2, _this = this,
        $length = s.length;
      for (offset = 0, i = 0; i < $length; ++i) {
        charCode = s.charCodeAt(i);
        if (charCode > 92) {
          if (charCode >= 55296) {
            t1 = charCode & 64512;
            if (t1 === 55296) {
              t2 = i + 1;
              t2 = !(t2 < $length && (s.charCodeAt(t2) & 64512) === 56320);
            } else
              t2 = false;
            if (!t2)
              if (t1 === 56320) {
                t1 = i - 1;
                t1 = !(t1 >= 0 && (s.charCodeAt(t1) & 64512) === 55296);
              } else
                t1 = false;
            else
              t1 = true;
            if (t1) {
              if (i > offset)
                _this.writeStringSlice$3(s, offset, i);
              offset = i + 1;
              _this.writeCharCode$1(92);
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(100);
              t1 = charCode >>> 8 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
            }
          }
          continue;
        }
        if (charCode < 32) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          switch (charCode) {
            case 8:
              _this.writeCharCode$1(98);
              break;
            case 9:
              _this.writeCharCode$1(116);
              break;
            case 10:
              _this.writeCharCode$1(110);
              break;
            case 12:
              _this.writeCharCode$1(102);
              break;
            case 13:
              _this.writeCharCode$1(114);
              break;
            default:
              _this.writeCharCode$1(117);
              _this.writeCharCode$1(48);
              _this.writeCharCode$1(48);
              t1 = charCode >>> 4 & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              t1 = charCode & 15;
              _this.writeCharCode$1(t1 < 10 ? 48 + t1 : 87 + t1);
              break;
          }
        } else if (charCode === 34 || charCode === 92) {
          if (i > offset)
            _this.writeStringSlice$3(s, offset, i);
          offset = i + 1;
          _this.writeCharCode$1(92);
          _this.writeCharCode$1(charCode);
        }
      }
      if (offset === 0)
        _this.writeString$1(s);
      else if (offset < $length)
        _this.writeStringSlice$3(s, offset, $length);
    },
    _checkCycle$1(object) {
      var t1, t2, i, t3;
      for (t1 = this._seen, t2 = t1.length, i = 0; i < t2; ++i) {
        t3 = t1[i];
        if (object == null ? t3 == null : object === t3)
          throw A.wrapException(new A.JsonCyclicError(object, null));
      }
      B.JSArray_methods.add$1(t1, object);
    },
    writeObject$1(object) {
      var customJson, e, t1, exception, _this = this;
      if (_this.writeJsonValue$1(object))
        return;
      _this._checkCycle$1(object);
      try {
        customJson = _this._toEncodable.call$1(object);
        if (!_this.writeJsonValue$1(customJson)) {
          t1 = A.JsonUnsupportedObjectError$(object, null, _this.get$_partialResult());
          throw A.wrapException(t1);
        }
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
      } catch (exception) {
        e = A.unwrapException(exception);
        t1 = A.JsonUnsupportedObjectError$(object, e, _this.get$_partialResult());
        throw A.wrapException(t1);
      }
    },
    writeJsonValue$1(object) {
      var t1, success, _this = this;
      if (typeof object == "number") {
        if (!isFinite(object))
          return false;
        _this.writeNumber$1(object);
        return true;
      } else if (object === true) {
        _this.writeString$1("true");
        return true;
      } else if (object === false) {
        _this.writeString$1("false");
        return true;
      } else if (object == null) {
        _this.writeString$1("null");
        return true;
      } else if (typeof object == "string") {
        _this.writeString$1('"');
        _this.writeStringContent$1(object);
        _this.writeString$1('"');
        return true;
      } else if (type$.List_dynamic._is(object)) {
        _this._checkCycle$1(object);
        _this.writeList$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return true;
      } else if (type$.Map_dynamic_dynamic._is(object)) {
        _this._checkCycle$1(object);
        success = _this.writeMap$1(object);
        t1 = _this._seen;
        if (0 >= t1.length)
          return A.ioore(t1, -1);
        t1.pop();
        return success;
      } else
        return false;
    },
    writeList$1(list) {
      var t1, i, _this = this;
      _this.writeString$1("[");
      t1 = J.getInterceptor$asx(list);
      if (t1.get$isNotEmpty(list)) {
        _this.writeObject$1(t1.$index(list, 0));
        for (i = 1; i < t1.get$length(list); ++i) {
          _this.writeString$1(",");
          _this.writeObject$1(t1.$index(list, i));
        }
      }
      _this.writeString$1("]");
    },
    writeMap$1(map) {
      var t2, keyValueList, i, separator, _this = this, _box_0 = {},
        t1 = J.getInterceptor$asx(map);
      if (t1.get$isEmpty(map)) {
        _this.writeString$1("{}");
        return true;
      }
      t2 = t1.get$length(map) * 2;
      keyValueList = A.List_List$filled(t2, null, false, type$.nullable_Object);
      i = _box_0.i = 0;
      _box_0.allStringKeys = true;
      t1.forEach$1(map, new A._JsonStringifier_writeMap_closure(_box_0, keyValueList));
      if (!_box_0.allStringKeys)
        return false;
      _this.writeString$1("{");
      for (separator = '"'; i < t2; i += 2, separator = ',"') {
        _this.writeString$1(separator);
        _this.writeStringContent$1(A._asString(keyValueList[i]));
        _this.writeString$1('":');
        t1 = i + 1;
        if (!(t1 < t2))
          return A.ioore(keyValueList, t1);
        _this.writeObject$1(keyValueList[t1]);
      }
      _this.writeString$1("}");
      return true;
    }
  };
  A._JsonStringifier_writeMap_closure.prototype = {
    call$2(key, value) {
      var t1, t2;
      if (typeof key != "string")
        this._box_0.allStringKeys = false;
      t1 = this.keyValueList;
      t2 = this._box_0;
      B.JSArray_methods.$indexSet(t1, t2.i++, key);
      B.JSArray_methods.$indexSet(t1, t2.i++, value);
    },
    $signature: 19
  };
  A._JsonStringStringifier.prototype = {
    get$_partialResult() {
      var t1 = this._convert$_sink;
      return t1 instanceof A.StringBuffer ? t1.toString$0(0) : null;
    },
    writeNumber$1(number) {
      this._convert$_sink.write$1(0, B.JSNumber_methods.toString$0(number));
    },
    writeString$1(string) {
      this._convert$_sink.write$1(0, string);
    },
    writeStringSlice$3(string, start, end) {
      this._convert$_sink.write$1(0, B.JSString_methods.substring$2(string, start, end));
    },
    writeCharCode$1(charCode) {
      this._convert$_sink.writeCharCode$1(charCode);
    }
  };
  A.Utf8Codec.prototype = {};
  A.Utf8Encoder.prototype = {
    convert$1(string) {
      var stringLength, end, $length, t1, encoder, t2;
      A._asString(string);
      stringLength = string.length;
      end = A.RangeError_checkValidRange(0, null, stringLength);
      $length = end - 0;
      if ($length === 0)
        return new Uint8Array(0);
      t1 = new Uint8Array($length * 3);
      encoder = new A._Utf8Encoder(t1);
      if (encoder._fillBuffer$3(string, 0, end) !== end) {
        t2 = end - 1;
        if (!(t2 >= 0 && t2 < stringLength))
          return A.ioore(string, t2);
        encoder._writeReplacementCharacter$0();
      }
      return B.NativeUint8List_methods.sublist$2(t1, 0, encoder._bufferIndex);
    }
  };
  A._Utf8Encoder.prototype = {
    _writeReplacementCharacter$0() {
      var _this = this,
        t1 = _this._buffer,
        t2 = _this._bufferIndex,
        t3 = _this._bufferIndex = t2 + 1,
        t4 = t1.length;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 239;
      t2 = _this._bufferIndex = t3 + 1;
      if (!(t3 < t4))
        return A.ioore(t1, t3);
      t1[t3] = 191;
      _this._bufferIndex = t2 + 1;
      if (!(t2 < t4))
        return A.ioore(t1, t2);
      t1[t2] = 189;
    },
    _writeSurrogate$2(leadingSurrogate, nextCodeUnit) {
      var rune, t1, t2, t3, t4, _this = this;
      if ((nextCodeUnit & 64512) === 56320) {
        rune = 65536 + ((leadingSurrogate & 1023) << 10) | nextCodeUnit & 1023;
        t1 = _this._buffer;
        t2 = _this._bufferIndex;
        t3 = _this._bufferIndex = t2 + 1;
        t4 = t1.length;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 18 | 240;
        t2 = _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune >>> 12 & 63 | 128;
        t3 = _this._bufferIndex = t2 + 1;
        if (!(t2 < t4))
          return A.ioore(t1, t2);
        t1[t2] = rune >>> 6 & 63 | 128;
        _this._bufferIndex = t3 + 1;
        if (!(t3 < t4))
          return A.ioore(t1, t3);
        t1[t3] = rune & 63 | 128;
        return true;
      } else {
        _this._writeReplacementCharacter$0();
        return false;
      }
    },
    _fillBuffer$3(str, start, end) {
      var t1, t2, t3, stringIndex, codeUnit, t4, t5, _this = this;
      if (start !== end) {
        t1 = end - 1;
        if (!(t1 >= 0 && t1 < str.length))
          return A.ioore(str, t1);
        t1 = (str.charCodeAt(t1) & 64512) === 55296;
      } else
        t1 = false;
      if (t1)
        --end;
      for (t1 = _this._buffer, t2 = t1.length, t3 = str.length, stringIndex = start; stringIndex < end; ++stringIndex) {
        if (!(stringIndex < t3))
          return A.ioore(str, stringIndex);
        codeUnit = str.charCodeAt(stringIndex);
        if (codeUnit <= 127) {
          t4 = _this._bufferIndex;
          if (t4 >= t2)
            break;
          _this._bufferIndex = t4 + 1;
          t1[t4] = codeUnit;
        } else {
          t4 = codeUnit & 64512;
          if (t4 === 55296) {
            if (_this._bufferIndex + 4 > t2)
              break;
            t4 = stringIndex + 1;
            if (!(t4 < t3))
              return A.ioore(str, t4);
            if (_this._writeSurrogate$2(codeUnit, str.charCodeAt(t4)))
              stringIndex = t4;
          } else if (t4 === 56320) {
            if (_this._bufferIndex + 3 > t2)
              break;
            _this._writeReplacementCharacter$0();
          } else if (codeUnit <= 2047) {
            t4 = _this._bufferIndex;
            t5 = t4 + 1;
            if (t5 >= t2)
              break;
            _this._bufferIndex = t5;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit >>> 6 | 192;
            _this._bufferIndex = t5 + 1;
            t1[t5] = codeUnit & 63 | 128;
          } else {
            t4 = _this._bufferIndex;
            if (t4 + 2 >= t2)
              break;
            t5 = _this._bufferIndex = t4 + 1;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit >>> 12 | 224;
            t4 = _this._bufferIndex = t5 + 1;
            if (!(t5 < t2))
              return A.ioore(t1, t5);
            t1[t5] = codeUnit >>> 6 & 63 | 128;
            _this._bufferIndex = t4 + 1;
            if (!(t4 < t2))
              return A.ioore(t1, t4);
            t1[t4] = codeUnit & 63 | 128;
          }
        }
      }
      return stringIndex;
    }
  };
  A._BigIntImpl.prototype = {
    $negate(_) {
      var t2, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return _this;
      t2 = !_this._isNegative;
      t3 = _this._digits;
      t1 = A._BigIntImpl__normalize(t1, t3);
      return new A._BigIntImpl(t1 === 0 ? false : t2, t3, t1);
    },
    _drShift$1(n) {
      var resultUsed, digits, resultDigits, t1, i, t2, t3, result, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used - n;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = digits.length, i = n; i < used; ++i) {
        t2 = i - n;
        if (!(i >= 0 && i < t1))
          return A.ioore(digits, i);
        t3 = digits[i];
        if (!(t2 < resultUsed))
          return A.ioore(resultDigits, t2);
        resultDigits[t2] = t3;
      }
      t2 = _this._isNegative;
      t3 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t3 === 0 ? false : t2, resultDigits, t3);
      if (t2)
        for (i = 0; i < n; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      return result;
    },
    $shr(_, shiftAmount) {
      var t1, digitShift, bitShift, resultUsed, digits, resultDigits, t2, result, i, _this = this;
      if (shiftAmount < 0)
        throw A.wrapException(A.ArgumentError$("shift-amount must be posititve " + shiftAmount, null));
      t1 = _this._used;
      if (t1 === 0)
        return _this;
      digitShift = B.JSInt_methods._tdivFast$1(shiftAmount, 16);
      bitShift = B.JSInt_methods.$mod(shiftAmount, 16);
      if (bitShift === 0)
        return _this._drShift$1(digitShift);
      resultUsed = t1 - digitShift;
      if (resultUsed <= 0)
        return _this._isNegative ? $.$get$_BigIntImpl__minusOne() : $.$get$_BigIntImpl_zero();
      digits = _this._digits;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__rsh(digits, t1, shiftAmount, resultDigits);
      t1 = _this._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      result = new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
      if (t1) {
        t1 = digits.length;
        if (!(digitShift >= 0 && digitShift < t1))
          return A.ioore(digits, digitShift);
        if ((digits[digitShift] & B.JSInt_methods.$shl(1, bitShift) - 1) >>> 0 !== 0)
          return result.$sub(0, $.$get$_BigIntImpl_one());
        for (i = 0; i < digitShift; ++i) {
          if (!(i < t1))
            return A.ioore(digits, i);
          if (digits[i] !== 0)
            return result.$sub(0, $.$get$_BigIntImpl_one());
        }
      }
      return result;
    },
    compareTo$1(_, other) {
      var t1, result;
      type$._BigIntImpl._as(other);
      t1 = this._isNegative;
      if (t1 === other._isNegative) {
        result = A._BigIntImpl__compareDigits(this._digits, this._used, other._digits, other._used);
        return t1 ? 0 - result : result;
      }
      return t1 ? -1 : 1;
    },
    _absAddSetSign$2(other, isNegative) {
      var resultUsed, resultDigits, t1, _this = this,
        used = _this._used,
        otherUsed = other._used;
      if (used < otherUsed)
        return other._absAddSetSign$2(_this, isNegative);
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultUsed = used + 1;
      resultDigits = new Uint16Array(resultUsed);
      A._BigIntImpl__absAdd(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    _absSubSetSign$2(other, isNegative) {
      var otherUsed, resultDigits, t1, _this = this,
        used = _this._used;
      if (used === 0)
        return $.$get$_BigIntImpl_zero();
      otherUsed = other._used;
      if (otherUsed === 0)
        return _this._isNegative === isNegative ? _this : _this.$negate(0);
      resultDigits = new Uint16Array(used);
      A._BigIntImpl__absSub(_this._digits, used, other._digits, otherUsed, resultDigits);
      t1 = A._BigIntImpl__normalize(used, resultDigits);
      return new A._BigIntImpl(t1 === 0 ? false : isNegative, resultDigits, t1);
    },
    $add(_, other) {
      var t2, isNegative, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return other;
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative === other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $sub(_, other) {
      var t2, isNegative, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return other.$negate(0);
      t2 = other._used;
      if (t2 === 0)
        return _this;
      isNegative = _this._isNegative;
      if (isNegative !== other._isNegative)
        return _this._absAddSetSign$2(other, isNegative);
      if (A._BigIntImpl__compareDigits(_this._digits, t1, other._digits, t2) >= 0)
        return _this._absSubSetSign$2(other, isNegative);
      return other._absSubSetSign$2(_this, !isNegative);
    },
    $mul(_, other) {
      var resultUsed, digits, otherDigits, resultDigits, t1, i, t2,
        used = this._used,
        otherUsed = other._used;
      if (used === 0 || otherUsed === 0)
        return $.$get$_BigIntImpl_zero();
      resultUsed = used + otherUsed;
      digits = this._digits;
      otherDigits = other._digits;
      resultDigits = new Uint16Array(resultUsed);
      for (t1 = otherDigits.length, i = 0; i < otherUsed;) {
        if (!(i < t1))
          return A.ioore(otherDigits, i);
        A._BigIntImpl__mulAdd(otherDigits[i], digits, 0, resultDigits, i, used);
        ++i;
      }
      t1 = this._isNegative !== other._isNegative;
      t2 = A._BigIntImpl__normalize(resultUsed, resultDigits);
      return new A._BigIntImpl(t2 === 0 ? false : t1, resultDigits, t2);
    },
    _div$1(other) {
      var lastQuo_used, quo_digits, t1, quo;
      if (this._used < other._used)
        return $.$get$_BigIntImpl_zero();
      this._divRem$1(other);
      lastQuo_used = $._BigIntImpl____lastQuoRemUsed._readField$0() - $._BigIntImpl____lastRemUsed._readField$0();
      quo_digits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastQuoRemUsed._readField$0(), lastQuo_used);
      t1 = A._BigIntImpl__normalize(lastQuo_used, quo_digits);
      quo = new A._BigIntImpl(false, quo_digits, t1);
      return this._isNegative !== other._isNegative && t1 > 0 ? quo.$negate(0) : quo;
    },
    _rem$1(other) {
      var remDigits, t1, rem, _this = this;
      if (_this._used < other._used)
        return _this;
      _this._divRem$1(other);
      remDigits = A._BigIntImpl__cloneDigits($._BigIntImpl____lastQuoRemDigits._readField$0(), 0, $._BigIntImpl____lastRemUsed._readField$0(), $._BigIntImpl____lastRemUsed._readField$0());
      t1 = A._BigIntImpl__normalize($._BigIntImpl____lastRemUsed._readField$0(), remDigits);
      rem = new A._BigIntImpl(false, remDigits, t1);
      if ($._BigIntImpl____lastRem_nsh._readField$0() > 0)
        rem = rem.$shr(0, $._BigIntImpl____lastRem_nsh._readField$0());
      return _this._isNegative && rem._used > 0 ? rem.$negate(0) : rem;
    },
    _divRem$1(other) {
      var yDigits, yUsed, t1, nsh, yDigits0, yUsed0, resultDigits, resultUsed0, topDigitDivisor, j, tmpDigits, tmpUsed, resultUsed1, t2, nyDigits, i, estimatedQuotientDigit, _this = this,
        resultUsed = _this._used;
      if (resultUsed === $._BigIntImpl__lastDividendUsed && other._used === $._BigIntImpl__lastDivisorUsed && _this._digits === $._BigIntImpl__lastDividendDigits && other._digits === $._BigIntImpl__lastDivisorDigits)
        return;
      yDigits = other._digits;
      yUsed = other._used;
      t1 = yUsed - 1;
      if (!(t1 >= 0 && t1 < yDigits.length))
        return A.ioore(yDigits, t1);
      nsh = 16 - B.JSInt_methods.get$bitLength(yDigits[t1]);
      if (nsh > 0) {
        yDigits0 = new Uint16Array(yUsed + 5);
        yUsed0 = A._BigIntImpl__lShiftDigits(yDigits, yUsed, nsh, yDigits0);
        resultDigits = new Uint16Array(resultUsed + 5);
        resultUsed0 = A._BigIntImpl__lShiftDigits(_this._digits, resultUsed, nsh, resultDigits);
      } else {
        resultDigits = A._BigIntImpl__cloneDigits(_this._digits, 0, resultUsed, resultUsed + 2);
        yUsed0 = yUsed;
        yDigits0 = yDigits;
        resultUsed0 = resultUsed;
      }
      t1 = yUsed0 - 1;
      if (!(t1 >= 0 && t1 < yDigits0.length))
        return A.ioore(yDigits0, t1);
      topDigitDivisor = yDigits0[t1];
      j = resultUsed0 - yUsed0;
      tmpDigits = new Uint16Array(resultUsed0);
      tmpUsed = A._BigIntImpl__dlShiftDigits(yDigits0, yUsed0, j, tmpDigits);
      resultUsed1 = resultUsed0 + 1;
      t1 = resultDigits.length;
      if (A._BigIntImpl__compareDigits(resultDigits, resultUsed0, tmpDigits, tmpUsed) >= 0) {
        if (!(resultUsed0 >= 0 && resultUsed0 < t1))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 1;
        A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
      } else {
        if (!(resultUsed0 >= 0 && resultUsed0 < t1))
          return A.ioore(resultDigits, resultUsed0);
        resultDigits[resultUsed0] = 0;
      }
      t2 = yUsed0 + 2;
      nyDigits = new Uint16Array(t2);
      if (!(yUsed0 >= 0 && yUsed0 < t2))
        return A.ioore(nyDigits, yUsed0);
      nyDigits[yUsed0] = 1;
      A._BigIntImpl__absSub(nyDigits, yUsed0 + 1, yDigits0, yUsed0, nyDigits);
      i = resultUsed0 - 1;
      for (; j > 0;) {
        estimatedQuotientDigit = A._BigIntImpl__estimateQuotientDigit(topDigitDivisor, resultDigits, i);
        --j;
        A._BigIntImpl__mulAdd(estimatedQuotientDigit, nyDigits, 0, resultDigits, j, yUsed0);
        if (!(i >= 0 && i < t1))
          return A.ioore(resultDigits, i);
        if (resultDigits[i] < estimatedQuotientDigit) {
          tmpUsed = A._BigIntImpl__dlShiftDigits(nyDigits, yUsed0, j, tmpDigits);
          A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
          for (; --estimatedQuotientDigit, resultDigits[i] < estimatedQuotientDigit;)
            A._BigIntImpl__absSub(resultDigits, resultUsed1, tmpDigits, tmpUsed, resultDigits);
        }
        --i;
      }
      $._BigIntImpl__lastDividendDigits = _this._digits;
      $._BigIntImpl__lastDividendUsed = resultUsed;
      $._BigIntImpl__lastDivisorDigits = yDigits;
      $._BigIntImpl__lastDivisorUsed = yUsed;
      $._BigIntImpl____lastQuoRemDigits.__late_helper$_value = resultDigits;
      $._BigIntImpl____lastQuoRemUsed.__late_helper$_value = resultUsed1;
      $._BigIntImpl____lastRemUsed.__late_helper$_value = yUsed0;
      $._BigIntImpl____lastRem_nsh.__late_helper$_value = nsh;
    },
    get$hashCode(_) {
      var hash, t2, t3, i,
        combine = new A._BigIntImpl_hashCode_combine(),
        t1 = this._used;
      if (t1 === 0)
        return 6707;
      hash = this._isNegative ? 83585 : 429689;
      for (t2 = this._digits, t3 = t2.length, i = 0; i < t1; ++i) {
        if (!(i < t3))
          return A.ioore(t2, i);
        hash = combine.call$2(hash, t2[i]);
      }
      return new A._BigIntImpl_hashCode_finish().call$1(hash);
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A._BigIntImpl && this.compareTo$1(0, other) === 0;
    },
    toString$0(_) {
      var decimalDigitChunks, rest, t2, digits4, t3, _this = this,
        t1 = _this._used;
      if (t1 === 0)
        return "0";
      if (t1 === 1) {
        if (_this._isNegative) {
          t1 = _this._digits;
          if (0 >= t1.length)
            return A.ioore(t1, 0);
          return B.JSInt_methods.toString$0(-t1[0]);
        }
        t1 = _this._digits;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        return B.JSInt_methods.toString$0(t1[0]);
      }
      decimalDigitChunks = A._setArrayType([], type$.JSArray_String);
      t1 = _this._isNegative;
      rest = t1 ? _this.$negate(0) : _this;
      for (; rest._used > 1;) {
        t2 = $.$get$_BigIntImpl__bigInt10000();
        if (t2._used === 0)
          A.throwExpression(B.C_IntegerDivisionByZeroException);
        digits4 = rest._rem$1(t2).toString$0(0);
        B.JSArray_methods.add$1(decimalDigitChunks, digits4);
        t3 = digits4.length;
        if (t3 === 1)
          B.JSArray_methods.add$1(decimalDigitChunks, "000");
        if (t3 === 2)
          B.JSArray_methods.add$1(decimalDigitChunks, "00");
        if (t3 === 3)
          B.JSArray_methods.add$1(decimalDigitChunks, "0");
        rest = rest._div$1(t2);
      }
      t2 = rest._digits;
      if (0 >= t2.length)
        return A.ioore(t2, 0);
      B.JSArray_methods.add$1(decimalDigitChunks, B.JSInt_methods.toString$0(t2[0]));
      if (t1)
        B.JSArray_methods.add$1(decimalDigitChunks, "-");
      return new A.ReversedListIterable(decimalDigitChunks, type$.ReversedListIterable_String).join$0(0);
    },
    $isBigInt: 1,
    $isComparable: 1
  };
  A._BigIntImpl_hashCode_combine.prototype = {
    call$2(hash, value) {
      hash = hash + value & 536870911;
      hash = hash + ((hash & 524287) << 10) & 536870911;
      return hash ^ hash >>> 6;
    },
    $signature: 20
  };
  A._BigIntImpl_hashCode_finish.prototype = {
    call$1(hash) {
      hash = hash + ((hash & 67108863) << 3) & 536870911;
      hash ^= hash >>> 11;
      return hash + ((hash & 16383) << 15) & 536870911;
    },
    $signature: 21
  };
  A._symbolMapToStringMap_closure.prototype = {
    call$2(key, value) {
      this.result.$indexSet(0, type$.Symbol._as(key)._name, value);
    },
    $signature: 22
  };
  A.NoSuchMethodError_toString_closure.prototype = {
    call$2(key, value) {
      var t1, t2, t3;
      type$.Symbol._as(key);
      t1 = this.sb;
      t2 = this._box_0;
      t3 = t1._contents += t2.comma;
      t3 += key._name;
      t1._contents = t3;
      t1._contents = t3 + ": ";
      t1._contents += A.Error_safeToString(value);
      t2.comma = ", ";
    },
    $signature: 22
  };
  A.DateTime.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.DateTime && this._value === other._value && this.isUtc === other.isUtc;
    },
    compareTo$1(_, other) {
      return B.JSInt_methods.compareTo$1(this._value, type$.DateTime._as(other)._value);
    },
    get$hashCode(_) {
      var t1 = this._value;
      return (t1 ^ B.JSInt_methods._shrOtherPositive$1(t1, 30)) & 1073741823;
    },
    toString$0(_) {
      var _this = this,
        y = A.DateTime__fourDigits(A.Primitives_getYear(_this)),
        m = A.DateTime__twoDigits(A.Primitives_getMonth(_this)),
        d = A.DateTime__twoDigits(A.Primitives_getDay(_this)),
        h = A.DateTime__twoDigits(A.Primitives_getHours(_this)),
        min = A.DateTime__twoDigits(A.Primitives_getMinutes(_this)),
        sec = A.DateTime__twoDigits(A.Primitives_getSeconds(_this)),
        ms = A.DateTime__threeDigits(A.Primitives_getMilliseconds(_this)),
        t1 = y + "-" + m;
      if (_this.isUtc)
        return t1 + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
      else
        return t1 + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
    },
    $isComparable: 1
  };
  A.Duration.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Duration && this._duration === other._duration;
    },
    get$hashCode(_) {
      return B.JSInt_methods.get$hashCode(this._duration);
    },
    compareTo$1(_, other) {
      return B.JSInt_methods.compareTo$1(this._duration, type$.Duration._as(other)._duration);
    },
    toString$0(_) {
      var sign, minutes, minutesPadding, seconds, secondsPadding,
        microseconds = this._duration,
        hours = B.JSInt_methods._tdivFast$1(microseconds, 3600000000),
        microseconds0 = microseconds % 3600000000;
      if (microseconds < 0) {
        hours = 0 - hours;
        microseconds = 0 - microseconds0;
        sign = "-";
      } else {
        microseconds = microseconds0;
        sign = "";
      }
      minutes = B.JSInt_methods._tdivFast$1(microseconds, 60000000);
      microseconds %= 60000000;
      minutesPadding = minutes < 10 ? "0" : "";
      seconds = B.JSInt_methods._tdivFast$1(microseconds, 1000000);
      secondsPadding = seconds < 10 ? "0" : "";
      return sign + hours + ":" + minutesPadding + minutes + ":" + secondsPadding + seconds + "." + B.JSString_methods.padLeft$2(B.JSInt_methods.toString$0(microseconds % 1000000), 6, "0");
    },
    $isComparable: 1
  };
  A.Error.prototype = {
    get$stackTrace() {
      return A.getTraceFromException(this.$thrownJsError);
    }
  };
  A.AssertionError.prototype = {
    toString$0(_) {
      var t1 = this.message;
      if (t1 != null)
        return "Assertion failed: " + A.Error_safeToString(t1);
      return "Assertion failed";
    }
  };
  A.TypeError.prototype = {};
  A.ArgumentError.prototype = {
    get$_errorName() {
      return "Invalid argument" + (!this._hasValue ? "(s)" : "");
    },
    get$_errorExplanation() {
      return "";
    },
    toString$0(_) {
      var _this = this,
        $name = _this.name,
        nameString = $name == null ? "" : " (" + $name + ")",
        message = _this.message,
        messageString = message == null ? "" : ": " + A.S(message),
        prefix = _this.get$_errorName() + nameString + messageString;
      if (!_this._hasValue)
        return prefix;
      return prefix + _this.get$_errorExplanation() + ": " + A.Error_safeToString(_this.get$invalidValue());
    },
    get$invalidValue() {
      return this.invalidValue;
    }
  };
  A.RangeError.prototype = {
    get$invalidValue() {
      return A._asNumQ(this.invalidValue);
    },
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      var explanation,
        start = this.start,
        end = this.end;
      if (start == null)
        explanation = end != null ? ": Not less than or equal to " + A.S(end) : "";
      else if (end == null)
        explanation = ": Not greater than or equal to " + A.S(start);
      else if (end > start)
        explanation = ": Not in inclusive range " + A.S(start) + ".." + A.S(end);
      else
        explanation = end < start ? ": Valid value range is empty" : ": Only valid value is " + A.S(start);
      return explanation;
    }
  };
  A.IndexError.prototype = {
    get$invalidValue() {
      return A._asInt(this.invalidValue);
    },
    get$_errorName() {
      return "RangeError";
    },
    get$_errorExplanation() {
      if (A._asInt(this.invalidValue) < 0)
        return ": index must not be negative";
      var t1 = this.length;
      if (t1 === 0)
        return ": no indices are valid";
      return ": index should be less than " + t1;
    },
    get$length(receiver) {
      return this.length;
    }
  };
  A.NoSuchMethodError.prototype = {
    toString$0(_) {
      var $arguments, t1, _i, t2, t3, argument, receiverText, actualParameters, _this = this, _box_0 = {},
        sb = new A.StringBuffer("");
      _box_0.comma = "";
      $arguments = _this._core$_arguments;
      for (t1 = $arguments.length, _i = 0, t2 = "", t3 = ""; _i < t1; ++_i, t3 = ", ") {
        argument = $arguments[_i];
        sb._contents = t2 + t3;
        t2 = sb._contents += A.Error_safeToString(argument);
        _box_0.comma = ", ";
      }
      _this._namedArguments.forEach$1(0, new A.NoSuchMethodError_toString_closure(_box_0, sb));
      receiverText = A.Error_safeToString(_this._core$_receiver);
      actualParameters = sb.toString$0(0);
      return "NoSuchMethodError: method not found: '" + _this._core$_memberName._name + "'\nReceiver: " + receiverText + "\nArguments: [" + actualParameters + "]";
    }
  };
  A.UnsupportedError.prototype = {
    toString$0(_) {
      return "Unsupported operation: " + this.message;
    }
  };
  A.UnimplementedError.prototype = {
    toString$0(_) {
      var message = this.message;
      return message != null ? "UnimplementedError: " + message : "UnimplementedError";
    }
  };
  A.StateError.prototype = {
    toString$0(_) {
      return "Bad state: " + this.message;
    }
  };
  A.ConcurrentModificationError.prototype = {
    toString$0(_) {
      var t1 = this.modifiedObject;
      if (t1 == null)
        return "Concurrent modification during iteration.";
      return "Concurrent modification during iteration: " + A.Error_safeToString(t1) + ".";
    }
  };
  A.OutOfMemoryError.prototype = {
    toString$0(_) {
      return "Out of Memory";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A.StackOverflowError.prototype = {
    toString$0(_) {
      return "Stack Overflow";
    },
    get$stackTrace() {
      return null;
    },
    $isError: 1
  };
  A._Exception.prototype = {
    toString$0(_) {
      return "Exception: " + this.message;
    }
  };
  A.FormatException.prototype = {
    toString$0(_) {
      var t1, lineEnd, lineNum, lineStart, previousCharWasCR, i, char, end, start, prefix, postfix,
        message = this.message,
        report = "" !== message ? "FormatException: " + message : "FormatException",
        offset = this.offset,
        source = this.source;
      if (typeof source == "string") {
        if (offset != null)
          t1 = offset < 0 || offset > source.length;
        else
          t1 = false;
        if (t1)
          offset = null;
        if (offset == null) {
          if (source.length > 78)
            source = B.JSString_methods.substring$2(source, 0, 75) + "...";
          return report + "\n" + source;
        }
        for (lineEnd = source.length, lineNum = 1, lineStart = 0, previousCharWasCR = false, i = 0; i < offset; ++i) {
          if (!(i < lineEnd))
            return A.ioore(source, i);
          char = source.charCodeAt(i);
          if (char === 10) {
            if (lineStart !== i || !previousCharWasCR)
              ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = false;
          } else if (char === 13) {
            ++lineNum;
            lineStart = i + 1;
            previousCharWasCR = true;
          }
        }
        report = lineNum > 1 ? report + (" (at line " + lineNum + ", character " + (offset - lineStart + 1) + ")\n") : report + (" (at character " + (offset + 1) + ")\n");
        for (i = offset; i < lineEnd; ++i) {
          if (!(i >= 0))
            return A.ioore(source, i);
          char = source.charCodeAt(i);
          if (char === 10 || char === 13) {
            lineEnd = i;
            break;
          }
        }
        if (lineEnd - lineStart > 78)
          if (offset - lineStart < 75) {
            end = lineStart + 75;
            start = lineStart;
            prefix = "";
            postfix = "...";
          } else {
            if (lineEnd - offset < 75) {
              start = lineEnd - 75;
              end = lineEnd;
              postfix = "";
            } else {
              start = offset - 36;
              end = offset + 36;
              postfix = "...";
            }
            prefix = "...";
          }
        else {
          end = lineEnd;
          start = lineStart;
          prefix = "";
          postfix = "";
        }
        return report + prefix + B.JSString_methods.substring$2(source, start, end) + postfix + "\n" + B.JSString_methods.$mul(" ", offset - start + prefix.length) + "^\n";
      } else
        return offset != null ? report + (" (at offset " + A.S(offset) + ")") : report;
    }
  };
  A.IntegerDivisionByZeroException.prototype = {
    get$stackTrace() {
      return null;
    },
    toString$0(_) {
      return "IntegerDivisionByZeroException";
    },
    $isError: 1
  };
  A.Iterable.prototype = {
    cast$1$0(_, $R) {
      return A.CastIterable_CastIterable(this, A.instanceType(this)._eval$1("Iterable.E"), $R);
    },
    map$1$1(_, toElement, $T) {
      var t1 = A.instanceType(this);
      return A.MappedIterable_MappedIterable(this, t1._bind$1($T)._eval$1("1(Iterable.E)")._as(toElement), t1._eval$1("Iterable.E"), $T);
    },
    map$1(_, toElement) {
      return this.map$1$1(0, toElement, type$.dynamic);
    },
    where$1(_, test) {
      var t1 = A.instanceType(this);
      return new A.WhereIterable(this, t1._eval$1("bool(Iterable.E)")._as(test), t1._eval$1("WhereIterable<Iterable.E>"));
    },
    contains$1(_, element) {
      var t1;
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        if (J.$eq$(t1.get$current(t1), element))
          return true;
      return false;
    },
    forEach$1(_, action) {
      var t1;
      A.instanceType(this)._eval$1("~(Iterable.E)")._as(action);
      for (t1 = this.get$iterator(this); t1.moveNext$0();)
        action.call$1(t1.get$current(t1));
    },
    toList$1$growable(_, growable) {
      return A.List_List$of(this, growable, A.instanceType(this)._eval$1("Iterable.E"));
    },
    toList$0(_) {
      return this.toList$1$growable(0, true);
    },
    get$length(_) {
      var count,
        it = this.get$iterator(this);
      for (count = 0; it.moveNext$0();)
        ++count;
      return count;
    },
    get$isEmpty(_) {
      return !this.get$iterator(this).moveNext$0();
    },
    get$isNotEmpty(_) {
      return !this.get$isEmpty(this);
    },
    take$1(_, count) {
      return A.TakeIterable_TakeIterable(this, count, A.instanceType(this)._eval$1("Iterable.E"));
    },
    skip$1(_, count) {
      return A.SkipIterable_SkipIterable(this, count, A.instanceType(this)._eval$1("Iterable.E"));
    },
    get$first(_) {
      var it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      return it.get$current(it);
    },
    get$single(_) {
      var result,
        it = this.get$iterator(this);
      if (!it.moveNext$0())
        throw A.wrapException(A.IterableElementError_noElement());
      result = it.get$current(it);
      if (it.moveNext$0())
        throw A.wrapException(A.IterableElementError_tooMany());
      return result;
    },
    elementAt$1(_, index) {
      var iterator, skipCount;
      A.RangeError_checkNotNegative(index, "index");
      iterator = this.get$iterator(this);
      for (skipCount = index; iterator.moveNext$0();) {
        if (skipCount === 0)
          return iterator.get$current(iterator);
        --skipCount;
      }
      throw A.wrapException(A.IndexError$withLength(index, index - skipCount, this, null, "index"));
    },
    toString$0(_) {
      return A.Iterable_iterableToShortString(this, "(", ")");
    }
  };
  A.Null.prototype = {
    get$hashCode(_) {
      return A.Object.prototype.get$hashCode.call(this, 0);
    },
    toString$0(_) {
      return "null";
    }
  };
  A.Object.prototype = {$isObject: 1,
    $eq(_, other) {
      return this === other;
    },
    get$hashCode(_) {
      return A.Primitives_objectHashCode(this);
    },
    toString$0(_) {
      return "Instance of '" + A.Primitives_objectTypeName(this) + "'";
    },
    noSuchMethod$1(_, invocation) {
      throw A.wrapException(A.NoSuchMethodError_NoSuchMethodError$withInvocation(this, type$.Invocation._as(invocation)));
    },
    get$runtimeType(_) {
      return A.getRuntimeTypeOfDartObject(this);
    },
    toString() {
      return this.toString$0(this);
    }
  };
  A._StringStackTrace.prototype = {
    toString$0(_) {
      return this._stackTrace;
    },
    $isStackTrace: 1
  };
  A.StringBuffer.prototype = {
    get$length(_) {
      return this._contents.length;
    },
    write$1(_, obj) {
      this._contents += A.S(obj);
    },
    writeCharCode$1(charCode) {
      this._contents += A.Primitives_stringFromCharCode(charCode);
    },
    toString$0(_) {
      var t1 = this._contents;
      return t1.charCodeAt(0) == 0 ? t1 : t1;
    },
    $isStringSink: 1
  };
  A.Uri__parseIPv4Address_error.prototype = {
    call$2(msg, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv4 address, " + msg, this.host, position));
    },
    $signature: 64
  };
  A.Uri_parseIPv6Address_error.prototype = {
    call$2(msg, position) {
      throw A.wrapException(A.FormatException$("Illegal IPv6 address, " + msg, this.host, position));
    },
    $signature: 63
  };
  A.Uri_parseIPv6Address_parseHex.prototype = {
    call$2(start, end) {
      var value;
      if (end - start > 4)
        this.error.call$2("an IPv6 part can only contain a maximum of 4 hex digits", start);
      value = A.int_parse(B.JSString_methods.substring$2(this.host, start, end), 16);
      if (value < 0 || value > 65535)
        this.error.call$2("each part must be in the range of `0x0..0xFFFF`", start);
      return value;
    },
    $signature: 20
  };
  A._Uri.prototype = {
    get$_text() {
      var t1, t2, t3, t4, _this = this,
        value = _this.___Uri__text_FI;
      if (value === $) {
        t1 = _this.scheme;
        t2 = t1.length !== 0 ? "" + t1 + ":" : "";
        t3 = _this._host;
        t4 = t3 == null;
        if (!t4 || t1 === "file") {
          t1 = t2 + "//";
          t2 = _this._userInfo;
          if (t2.length !== 0)
            t1 = t1 + t2 + "@";
          if (!t4)
            t1 += t3;
          t2 = _this._port;
          if (t2 != null)
            t1 = t1 + ":" + A.S(t2);
        } else
          t1 = t2;
        t1 += _this.path;
        t2 = _this._query;
        if (t2 != null)
          t1 = t1 + "?" + t2;
        t2 = _this._fragment;
        if (t2 != null)
          t1 = t1 + "#" + t2;
        value !== $ && A.throwLateFieldADI("_text");
        value = _this.___Uri__text_FI = t1.charCodeAt(0) == 0 ? t1 : t1;
      }
      return value;
    },
    get$hashCode(_) {
      var result, _this = this,
        value = _this.___Uri_hashCode_FI;
      if (value === $) {
        result = B.JSString_methods.get$hashCode(_this.get$_text());
        _this.___Uri_hashCode_FI !== $ && A.throwLateFieldADI("hashCode");
        _this.___Uri_hashCode_FI = result;
        value = result;
      }
      return value;
    },
    get$userInfo() {
      return this._userInfo;
    },
    get$host(_) {
      var host = this._host;
      if (host == null)
        return "";
      if (B.JSString_methods.startsWith$1(host, "["))
        return B.JSString_methods.substring$2(host, 1, host.length - 1);
      return host;
    },
    get$port(_) {
      var t1 = this._port;
      return t1 == null ? A._Uri__defaultPort(this.scheme) : t1;
    },
    get$query(_) {
      var t1 = this._query;
      return t1 == null ? "" : t1;
    },
    get$fragment() {
      var t1 = this._fragment;
      return t1 == null ? "" : t1;
    },
    isScheme$1(scheme) {
      var thisScheme = this.scheme;
      if (scheme.length !== thisScheme.length)
        return false;
      return A._caseInsensitiveCompareStart(scheme, thisScheme, 0) >= 0;
    },
    replace$2$path$scheme(_, path, scheme) {
      var schemeChanged, isFile, userInfo, port, host, hasAuthority, t1, currentPath, _this = this,
        scheme0 = _this.scheme;
      if (scheme != null) {
        scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
        schemeChanged = scheme !== scheme0;
      } else {
        scheme = scheme0;
        schemeChanged = false;
      }
      isFile = scheme === "file";
      userInfo = _this._userInfo;
      port = _this._port;
      if (schemeChanged)
        port = A._Uri__makePort(port, scheme);
      host = _this._host;
      if (!(host != null))
        host = userInfo.length !== 0 || port != null || isFile ? "" : null;
      hasAuthority = host != null;
      t1 = path == null;
      if (!t1 || false)
        path = A._Uri__makePath(path, 0, t1 ? 0 : path.length, null, scheme, hasAuthority);
      else {
        currentPath = _this.path;
        if (!isFile)
          t1 = hasAuthority && currentPath.length !== 0;
        else
          t1 = true;
        if (t1 && !B.JSString_methods.startsWith$1(currentPath, "/"))
          currentPath = "/" + currentPath;
        path = currentPath;
      }
      return A._Uri$_internal(scheme, userInfo, host, port, path, _this._query, _this._fragment);
    },
    replace$1$scheme(_, scheme) {
      return this.replace$2$path$scheme(0, null, scheme);
    },
    replace$1$path(_, path) {
      return this.replace$2$path$scheme(0, path, null);
    },
    get$hasAuthority() {
      return this._host != null;
    },
    get$hasQuery() {
      return this._query != null;
    },
    get$hasFragment() {
      return this._fragment != null;
    },
    toString$0(_) {
      return this.get$_text();
    },
    $eq(_, other) {
      var t1, t2, _this = this;
      if (other == null)
        return false;
      if (_this === other)
        return true;
      if (type$.Uri._is(other))
        if (_this.scheme === other.get$scheme())
          if (_this._host != null === other.get$hasAuthority())
            if (_this._userInfo === other.get$userInfo())
              if (_this.get$host(0) === other.get$host(other))
                if (_this.get$port(0) === other.get$port(other))
                  if (_this.path === other.get$path(other)) {
                    t1 = _this._query;
                    t2 = t1 == null;
                    if (!t2 === other.get$hasQuery()) {
                      if (t2)
                        t1 = "";
                      if (t1 === other.get$query(other)) {
                        t1 = _this._fragment;
                        t2 = t1 == null;
                        if (!t2 === other.get$hasFragment()) {
                          if (t2)
                            t1 = "";
                          t1 = t1 === other.get$fragment();
                        } else
                          t1 = false;
                      } else
                        t1 = false;
                    } else
                      t1 = false;
                  } else
                    t1 = false;
                else
                  t1 = false;
              else
                t1 = false;
            else
              t1 = false;
          else
            t1 = false;
        else
          t1 = false;
      else
        t1 = false;
      return t1;
    },
    $isUri: 1,
    get$scheme() {
      return this.scheme;
    },
    get$path(receiver) {
      return this.path;
    }
  };
  A._Uri__makePath_closure.prototype = {
    call$1(s) {
      return A._Uri__uriEncode(B.List_XRg0, A._asString(s), B.C_Utf8Codec, false);
    },
    $signature: 23
  };
  A.UriData.prototype = {
    get$uri() {
      var t2, queryIndex, end, query, _this = this, _null = null,
        t1 = _this._uriCache;
      if (t1 == null) {
        t1 = _this._separatorIndices;
        if (0 >= t1.length)
          return A.ioore(t1, 0);
        t2 = _this._text;
        t1 = t1[0] + 1;
        queryIndex = B.JSString_methods.indexOf$2(t2, "?", t1);
        end = t2.length;
        if (queryIndex >= 0) {
          query = A._Uri__normalizeOrSubstring(t2, queryIndex + 1, end, B.List_oFp, false, false);
          end = queryIndex;
        } else
          query = _null;
        t1 = _this._uriCache = new A._DataUri("data", "", _null, _null, A._Uri__normalizeOrSubstring(t2, t1, end, B.List_XRg, false, false), query, _null);
      }
      return t1;
    },
    toString$0(_) {
      var t2,
        t1 = this._separatorIndices;
      if (0 >= t1.length)
        return A.ioore(t1, 0);
      t2 = this._text;
      return t1[0] === -1 ? "data:" + t2 : t2;
    }
  };
  A._createTables_build.prototype = {
    call$2(state, defaultTransition) {
      var t1 = this.tables;
      if (!(state < t1.length))
        return A.ioore(t1, state);
      t1 = t1[state];
      B.NativeUint8List_methods.fillRange$3(t1, 0, 96, defaultTransition);
      return t1;
    },
    $signature: 62
  };
  A._createTables_setChars.prototype = {
    call$3(target, chars, transition) {
      var t1, i, t2;
      for (t1 = chars.length, i = 0; i < t1; ++i) {
        t2 = chars.charCodeAt(i) ^ 96;
        if (!(t2 < 96))
          return A.ioore(target, t2);
        target[t2] = transition;
      }
    },
    $signature: 24
  };
  A._createTables_setRange.prototype = {
    call$3(target, range, transition) {
      var i, n,
        t1 = range.length;
      if (0 >= t1)
        return A.ioore(range, 0);
      i = range.charCodeAt(0);
      if (1 >= t1)
        return A.ioore(range, 1);
      n = range.charCodeAt(1);
      for (; i <= n; ++i) {
        t1 = (i ^ 96) >>> 0;
        if (!(t1 < 96))
          return A.ioore(target, t1);
        target[t1] = transition;
      }
    },
    $signature: 24
  };
  A._SimpleUri.prototype = {
    get$hasAuthority() {
      return this._hostStart > 0;
    },
    get$hasPort() {
      return this._hostStart > 0 && this._portStart + 1 < this._pathStart;
    },
    get$hasQuery() {
      return this._queryStart < this._fragmentStart;
    },
    get$hasFragment() {
      return this._fragmentStart < this._uri.length;
    },
    isScheme$1(scheme) {
      var t1 = scheme.length;
      if (t1 === 0)
        return this._schemeEnd < 0;
      if (t1 !== this._schemeEnd)
        return false;
      return A._caseInsensitiveCompareStart(scheme, this._uri, 0) >= 0;
    },
    get$scheme() {
      var t1 = this._schemeCache;
      return t1 == null ? this._schemeCache = this._computeScheme$0() : t1;
    },
    _computeScheme$0() {
      var t2, _this = this,
        t1 = _this._schemeEnd;
      if (t1 <= 0)
        return "";
      t2 = t1 === 4;
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return "http";
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return "https";
      if (t2 && B.JSString_methods.startsWith$1(_this._uri, "file"))
        return "file";
      if (t1 === 7 && B.JSString_methods.startsWith$1(_this._uri, "package"))
        return "package";
      return B.JSString_methods.substring$2(_this._uri, 0, t1);
    },
    get$userInfo() {
      var t1 = this._hostStart,
        t2 = this._schemeEnd + 3;
      return t1 > t2 ? B.JSString_methods.substring$2(this._uri, t2, t1 - 1) : "";
    },
    get$host(_) {
      var t1 = this._hostStart;
      return t1 > 0 ? B.JSString_methods.substring$2(this._uri, t1, this._portStart) : "";
    },
    get$port(_) {
      var t1, _this = this;
      if (_this.get$hasPort())
        return A.int_parse(B.JSString_methods.substring$2(_this._uri, _this._portStart + 1, _this._pathStart), null);
      t1 = _this._schemeEnd;
      if (t1 === 4 && B.JSString_methods.startsWith$1(_this._uri, "http"))
        return 80;
      if (t1 === 5 && B.JSString_methods.startsWith$1(_this._uri, "https"))
        return 443;
      return 0;
    },
    get$path(_) {
      return B.JSString_methods.substring$2(this._uri, this._pathStart, this._queryStart);
    },
    get$query(_) {
      var t1 = this._queryStart,
        t2 = this._fragmentStart;
      return t1 < t2 ? B.JSString_methods.substring$2(this._uri, t1 + 1, t2) : "";
    },
    get$fragment() {
      var t1 = this._fragmentStart,
        t2 = this._uri;
      return t1 < t2.length ? B.JSString_methods.substring$1(t2, t1 + 1) : "";
    },
    replace$2$path$scheme(_, path, scheme) {
      var schemeChanged, isFile, t1, userInfo, port, host, hasAuthority, t2, query, fragment, _this = this, _null = null;
      if (scheme != null) {
        scheme = A._Uri__makeScheme(scheme, 0, scheme.length);
        schemeChanged = !(_this._schemeEnd === scheme.length && B.JSString_methods.startsWith$1(_this._uri, scheme));
      } else {
        scheme = _this.get$scheme();
        schemeChanged = false;
      }
      isFile = scheme === "file";
      t1 = _this._hostStart;
      userInfo = t1 > 0 ? B.JSString_methods.substring$2(_this._uri, _this._schemeEnd + 3, t1) : "";
      port = _this.get$hasPort() ? _this.get$port(0) : _null;
      if (schemeChanged)
        port = A._Uri__makePort(port, scheme);
      t1 = _this._hostStart;
      if (t1 > 0)
        host = B.JSString_methods.substring$2(_this._uri, t1, _this._portStart);
      else
        host = userInfo.length !== 0 || port != null || isFile ? "" : _null;
      hasAuthority = host != null;
      t1 = path == null;
      if (!t1 || false)
        path = A._Uri__makePath(path, 0, t1 ? 0 : path.length, _null, scheme, hasAuthority);
      else {
        path = B.JSString_methods.substring$2(_this._uri, _this._pathStart, _this._queryStart);
        if (!isFile)
          t1 = hasAuthority && path.length !== 0;
        else
          t1 = true;
        if (t1 && !B.JSString_methods.startsWith$1(path, "/"))
          path = "/" + path;
      }
      t1 = _this._queryStart;
      t2 = _this._fragmentStart;
      query = t1 < t2 ? B.JSString_methods.substring$2(_this._uri, t1 + 1, t2) : _null;
      t1 = _this._fragmentStart;
      t2 = _this._uri;
      fragment = t1 < t2.length ? B.JSString_methods.substring$1(t2, t1 + 1) : _null;
      return A._Uri$_internal(scheme, userInfo, host, port, path, query, fragment);
    },
    replace$1$scheme(_, scheme) {
      return this.replace$2$path$scheme(0, null, scheme);
    },
    replace$1$path(_, path) {
      return this.replace$2$path$scheme(0, path, null);
    },
    get$hashCode(_) {
      var t1 = this._hashCodeCache;
      return t1 == null ? this._hashCodeCache = B.JSString_methods.get$hashCode(this._uri) : t1;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (this === other)
        return true;
      return type$.Uri._is(other) && this._uri === other.toString$0(0);
    },
    toString$0(_) {
      return this._uri;
    },
    $isUri: 1
  };
  A._DataUri.prototype = {};
  A.Expando.prototype = {
    toString$0(_) {
      return "Expando:null";
    }
  };
  A.HtmlElement.prototype = {$isHtmlElement: 1};
  A.AccessibleNodeList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.AnchorElement.prototype = {
    set$href(receiver, value) {
      receiver.href = value;
    },
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    },
    $isAnchorElement: 1
  };
  A.AreaElement.prototype = {
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    }
  };
  A.BaseElement.prototype = {$isBaseElement: 1};
  A.Blob.prototype = {$isBlob: 1};
  A.BodyElement.prototype = {$isBodyElement: 1};
  A.CharacterData.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CloseEvent.prototype = {$isCloseEvent: 1};
  A.CssPerspective.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssRule.prototype = {$isCssRule: 1};
  A.CssStyleDeclaration.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A.CssStyleDeclarationBase.prototype = {};
  A.CssStyleValue.prototype = {};
  A.CssTransformComponent.prototype = {};
  A.CssTransformValue.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CssUnparsedValue.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.CustomEvent.prototype = {
    _initCustomEvent$4(receiver, type, bubbles, cancelable, detail) {
      return receiver.initCustomEvent(type, true, true, detail);
    },
    $isCustomEvent: 1
  };
  A.DataTransferItemList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.Document.prototype = {$isDocument: 1};
  A.DomException.prototype = {
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    }
  };
  A.DomImplementation.prototype = {
    createHtmlDocument$1(receiver, title) {
      var t1 = receiver.createHTMLDocument(title);
      t1.toString;
      return t1;
    }
  };
  A.DomRectList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Rectangle_num._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.DomRectReadOnly.prototype = {
    toString$0(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      return "Rectangle (" + A.S(t1) + ", " + A.S(t2) + ") " + A.S(this.get$width(receiver)) + " x " + A.S(this.get$height(receiver));
    },
    $eq(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = J.getInterceptor$x(other);
            t1 = this.get$width(receiver) === t1.get$width(other) && this.get$height(receiver) === t1.get$height(other);
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode(receiver) {
      var t2,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      return A.Object_hash(t1, t2, this.get$width(receiver), this.get$height(receiver));
    },
    get$_height(receiver) {
      return receiver.height;
    },
    get$height(receiver) {
      var t1 = this.get$_height(receiver);
      t1.toString;
      return t1;
    },
    get$_width(receiver) {
      return receiver.width;
    },
    get$width(receiver) {
      var t1 = this.get$_width(receiver);
      t1.toString;
      return t1;
    },
    $isRectangle: 1
  };
  A.DomStringList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      A._asString(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.DomTokenList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A._FrozenElementList.prototype = {
    get$length(_) {
      return this._nodeList.length;
    },
    $index(_, index) {
      var t1 = this._nodeList;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return this.$ti._precomputed1._as(t1[index]);
    },
    $indexSet(_, index, value) {
      this.$ti._precomputed1._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot modify list"));
    },
    sort$1(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort list"));
    },
    get$first(_) {
      return this.$ti._precomputed1._as(B.NodeList_methods.get$first(this._nodeList));
    }
  };
  A.Element.prototype = {
    get$attributes(receiver) {
      return new A._ElementAttributeMap(receiver);
    },
    toString$0(receiver) {
      var t1 = receiver.localName;
      t1.toString;
      return t1;
    },
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t1, t2, contextElement, fragment;
      if (treeSanitizer == null) {
        t1 = $.Element__defaultValidator;
        if (t1 == null) {
          t1 = A._setArrayType([], type$.JSArray_NodeValidator);
          t2 = new A.NodeValidatorBuilder(t1);
          B.JSArray_methods.add$1(t1, A._Html5NodeValidator$(null));
          B.JSArray_methods.add$1(t1, A._TemplatingNodeValidator$());
          $.Element__defaultValidator = t2;
          validator = t2;
        } else
          validator = t1;
        t1 = $.Element__defaultSanitizer;
        if (t1 == null) {
          validator.toString;
          t1 = new A._ValidatingTreeSanitizer(validator);
          $.Element__defaultSanitizer = t1;
          treeSanitizer = t1;
        } else {
          validator.toString;
          t1.validator = validator;
          treeSanitizer = t1;
        }
      }
      if ($.Element__parseDocument == null) {
        t1 = document;
        t2 = t1.implementation;
        t2.toString;
        t2 = B.DomImplementation_methods.createHtmlDocument$1(t2, "");
        $.Element__parseDocument = t2;
        t2 = t2.createRange();
        t2.toString;
        $.Element__parseRange = t2;
        t2 = $.Element__parseDocument.createElement("base");
        type$.BaseElement._as(t2);
        t1 = t1.baseURI;
        t1.toString;
        t2.href = t1;
        $.Element__parseDocument.head.appendChild(t2).toString;
      }
      t1 = $.Element__parseDocument;
      if (t1.body == null) {
        t2 = t1.createElement("body");
        B.HtmlDocument_methods.set$body(t1, type$.BodyElement._as(t2));
      }
      t1 = $.Element__parseDocument;
      if (type$.BodyElement._is(receiver)) {
        t1 = t1.body;
        t1.toString;
        contextElement = t1;
      } else {
        t1.toString;
        t2 = receiver.tagName;
        t2.toString;
        contextElement = t1.createElement(t2);
        $.Element__parseDocument.body.appendChild(contextElement).toString;
      }
      t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1) {
        t1 = receiver.tagName;
        t1.toString;
        t1 = !B.JSArray_methods.contains$1(B.List_ME0, t1);
      } else
        t1 = false;
      if (t1) {
        $.Element__parseRange.selectNodeContents(contextElement);
        t1 = $.Element__parseRange;
        t1 = t1.createContextualFragment(html);
        t1.toString;
        fragment = t1;
      } else {
        J.set$_innerHtml$x(contextElement, html);
        t1 = $.Element__parseDocument.createDocumentFragment();
        t1.toString;
        for (; t2 = contextElement.firstChild, t2 != null;)
          t1.appendChild(t2).toString;
        fragment = t1;
      }
      if (contextElement !== $.Element__parseDocument.body)
        J.remove$0$x(contextElement);
      treeSanitizer.sanitizeTree$1(fragment);
      document.adoptNode(fragment).toString;
      return fragment;
    },
    createFragment$2$treeSanitizer(receiver, html, treeSanitizer) {
      return this.createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, null);
    },
    setInnerHtml$1(receiver, html) {
      this.set$text(receiver, null);
      receiver.appendChild(this.createFragment$3$treeSanitizer$validator(receiver, html, null, null)).toString;
    },
    set$_innerHtml(receiver, value) {
      receiver.innerHTML = value;
    },
    $isElement: 1
  };
  A.Element_Element$html_closure.prototype = {
    call$1(e) {
      return type$.Element._is(type$.Node._as(e));
    },
    $signature: 58
  };
  A.Event.prototype = {$isEvent: 1};
  A.EventSource.prototype = {$isEventSource: 1};
  A.EventTarget.prototype = {
    addEventListener$3(receiver, type, listener, useCapture) {
      type$.nullable_dynamic_Function_Event._as(listener);
      if (listener != null)
        this._addEventListener$3(receiver, type, listener, useCapture);
    },
    addEventListener$2(receiver, type, listener) {
      return this.addEventListener$3(receiver, type, listener, null);
    },
    _addEventListener$3(receiver, type, listener, options) {
      return receiver.addEventListener(type, A.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), options);
    },
    _removeEventListener$3(receiver, type, listener, options) {
      return receiver.removeEventListener(type, A.convertDartClosureToJS(type$.nullable_dynamic_Function_Event._as(listener), 1), false);
    },
    $isEventTarget: 1
  };
  A.File.prototype = {$isFile: 1};
  A.FileList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.File._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1,
    $isFileList: 1
  };
  A.FileWriter.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.FormElement.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.Gamepad.prototype = {$isGamepad: 1};
  A.History.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A.HtmlCollection.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.HtmlDocument.prototype = {
    set$body(receiver, value) {
      receiver.body = value;
    }
  };
  A.HttpRequest.prototype = {
    open$3$async(receiver, method, url, async) {
      return receiver.open(method, url, true);
    },
    set$withCredentials(receiver, value) {
      receiver.withCredentials = true;
    },
    $isHttpRequest: 1
  };
  A.HttpRequest_request_closure.prototype = {
    call$1(e) {
      var t1, t2, accepted, unknownRedirect, t3;
      type$.ProgressEvent._as(e);
      t1 = this.xhr;
      t2 = t1.status;
      t2.toString;
      accepted = t2 >= 200 && t2 < 300;
      unknownRedirect = t2 > 307 && t2 < 400;
      t2 = accepted || t2 === 0 || t2 === 304 || unknownRedirect;
      t3 = this.completer;
      if (t2)
        t3.complete$1(0, t1);
      else
        t3.completeError$1(e);
    },
    $signature: 53
  };
  A.HttpRequestEventTarget.prototype = {};
  A.ImageData.prototype = {$isImageData: 1};
  A.KeyboardEvent.prototype = {$isKeyboardEvent: 1};
  A.Location.prototype = {
    get$origin(receiver) {
      var t2,
        t1 = "origin" in receiver;
      t1.toString;
      if (t1) {
        t1 = receiver.origin;
        t1.toString;
        return t1;
      }
      t1 = receiver.protocol;
      t1.toString;
      t2 = receiver.host;
      t2.toString;
      return t1 + "//" + t2;
    },
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    },
    $isLocation: 1
  };
  A.MediaList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.MessageEvent.prototype = {$isMessageEvent: 1};
  A.MessagePort.prototype = {$isMessagePort: 1};
  A.MidiInputMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.MidiInputMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.MidiInputMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.MidiOutputMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.MidiOutputMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.MidiOutputMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.MimeType.prototype = {$isMimeType: 1};
  A.MimeTypeArray.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.MimeType._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._ChildNodeListLazy.prototype = {
    get$first(_) {
      var result = this._this.firstChild;
      if (result == null)
        throw A.wrapException(A.StateError$("No elements"));
      return result;
    },
    get$single(_) {
      var t1 = this._this,
        l = t1.childNodes.length;
      if (l === 0)
        throw A.wrapException(A.StateError$("No elements"));
      if (l > 1)
        throw A.wrapException(A.StateError$("More than one element"));
      t1 = t1.firstChild;
      t1.toString;
      return t1;
    },
    addAll$1(_, iterable) {
      var t1, t2, len, i, t3;
      type$.Iterable_Node._as(iterable);
      if (iterable instanceof A._ChildNodeListLazy) {
        t1 = iterable._this;
        t2 = this._this;
        if (t1 !== t2)
          for (len = t1.childNodes.length, i = 0; i < len; ++i) {
            t3 = t1.firstChild;
            t3.toString;
            t2.appendChild(t3).toString;
          }
        return;
      }
      for (t1 = iterable.get$iterator(iterable), t2 = this._this; t1.moveNext$0();)
        t2.appendChild(t1.get$current(t1)).toString;
    },
    $indexSet(_, index, value) {
      var t1, t2;
      type$.Node._as(value);
      t1 = this._this;
      t2 = t1.childNodes;
      if (!(index >= 0 && index < t2.length))
        return A.ioore(t2, index);
      t1.replaceChild(value, t2[index]).toString;
    },
    get$iterator(_) {
      var t1 = this._this.childNodes;
      return new A.FixedSizeListIterator(t1, t1.length, A.instanceType(t1)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1(_, compare) {
      type$.nullable_int_Function_Node_Node._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort Node list"));
    },
    get$length(_) {
      return this._this.childNodes.length;
    },
    $index(_, index) {
      var t1 = this._this.childNodes;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    }
  };
  A.Node.prototype = {
    remove$0(receiver) {
      var t1 = receiver.parentNode;
      if (t1 != null)
        t1.removeChild(receiver).toString;
    },
    _clearChildren$0(receiver) {
      var t1;
      for (; t1 = receiver.firstChild, t1 != null;)
        receiver.removeChild(t1).toString;
    },
    toString$0(receiver) {
      var value = receiver.nodeValue;
      return value == null ? this.super$Interceptor$toString(receiver) : value;
    },
    set$text(receiver, value) {
      receiver.textContent = value;
    },
    $isNode: 1
  };
  A.NodeList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.Plugin.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isPlugin: 1
  };
  A.PluginArray.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Plugin._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.ProgressEvent.prototype = {$isProgressEvent: 1};
  A.RtcStatsReport.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.RtcStatsReport_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.RtcStatsReport_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.ScriptElement.prototype = {$isScriptElement: 1};
  A.SelectElement.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.SharedArrayBuffer.prototype = {$isSharedArrayBuffer: 1};
  A.SourceBuffer.prototype = {$isSourceBuffer: 1};
  A.SourceBufferList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.SourceBuffer._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SpeechGrammar.prototype = {$isSpeechGrammar: 1};
  A.SpeechGrammarList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.SpeechGrammar._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SpeechRecognitionResult.prototype = {
    get$length(receiver) {
      return receiver.length;
    },
    $isSpeechRecognitionResult: 1
  };
  A.Storage.prototype = {
    containsKey$1(receiver, key) {
      return receiver.getItem(key) != null;
    },
    $index(receiver, key) {
      return receiver.getItem(A._asString(key));
    },
    $indexSet(receiver, key, value) {
      receiver.setItem(A._asString(key), A._asString(value));
    },
    forEach$1(receiver, f) {
      var i, key, t1;
      type$.void_Function_String_String._as(f);
      for (i = 0; true; ++i) {
        key = receiver.key(i);
        if (key == null)
          return;
        t1 = receiver.getItem(key);
        t1.toString;
        f.call$2(key, t1);
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.Storage_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      return receiver.key(0) == null;
    },
    $isMap: 1
  };
  A.Storage_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 15
  };
  A.StyleSheet.prototype = {$isStyleSheet: 1};
  A.TableElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var table,
        t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      table = A.Element_Element$html("<table>" + html + "</table>", treeSanitizer, validator);
      t1 = document.createDocumentFragment();
      t1.toString;
      new A._ChildNodeListLazy(t1).addAll$1(0, new A._ChildNodeListLazy(table));
      return t1;
    }
  };
  A.TableRowElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t2,
        t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      t2 = t1.createDocumentFragment();
      t2.toString;
      t1 = t1.createElement("table");
      t1.toString;
      new A._ChildNodeListLazy(t2).addAll$1(0, new A._ChildNodeListLazy(new A._ChildNodeListLazy(new A._ChildNodeListLazy(B.TableElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator)).get$single(0)).get$single(0)));
      return t2;
    }
  };
  A.TableSectionElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, html, treeSanitizer, validator) {
      var t2,
        t1 = "createContextualFragment" in window.Range.prototype;
      t1.toString;
      if (t1)
        return this.super$Element$createFragment(receiver, html, treeSanitizer, validator);
      t1 = document;
      t2 = t1.createDocumentFragment();
      t2.toString;
      t1 = t1.createElement("table");
      t1.toString;
      new A._ChildNodeListLazy(t2).addAll$1(0, new A._ChildNodeListLazy(new A._ChildNodeListLazy(B.TableElement_methods.createFragment$3$treeSanitizer$validator(t1, html, treeSanitizer, validator)).get$single(0)));
      return t2;
    }
  };
  A.TemplateElement.prototype = {
    setInnerHtml$1(receiver, html) {
      var t1, fragment;
      this.set$text(receiver, null);
      t1 = receiver.content;
      t1.toString;
      J._clearChildren$0$x(t1);
      fragment = this.createFragment$3$treeSanitizer$validator(receiver, html, null, null);
      receiver.content.appendChild(fragment).toString;
    },
    $isTemplateElement: 1
  };
  A.TextTrack.prototype = {$isTextTrack: 1};
  A.TextTrackCue.prototype = {$isTextTrackCue: 1};
  A.TextTrackCueList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.TextTrackCue._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TextTrackList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.TextTrack._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TimeRanges.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    }
  };
  A.Touch.prototype = {$isTouch: 1};
  A.TouchList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Touch._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.TrackDefaultList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.UIEvent.prototype = {};
  A.Url.prototype = {
    toString$0(receiver) {
      var t1 = String(receiver);
      t1.toString;
      return t1;
    }
  };
  A.VideoTrackList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.WebSocket.prototype = {
    set$binaryType(receiver, value) {
      receiver.binaryType = value;
    },
    send$1(receiver, data) {
      return receiver.send(data);
    },
    $isWebSocket: 1
  };
  A.Window.prototype = {
    alert$1(receiver, message) {
      return receiver.alert(message);
    },
    confirm$1(receiver, message) {
      var t1 = receiver.confirm(message);
      t1.toString;
      return t1;
    },
    $isWindow: 1,
    $isWindowBase: 1
  };
  A.WorkerGlobalScope.prototype = {$isWorkerGlobalScope: 1};
  A._Attr.prototype = {$is_Attr: 1};
  A._CssRuleList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.CssRule._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._DomRect.prototype = {
    toString$0(receiver) {
      var t2, t3, t4,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      t3 = receiver.width;
      t3.toString;
      t4 = receiver.height;
      t4.toString;
      return "Rectangle (" + A.S(t1) + ", " + A.S(t2) + ") " + A.S(t3) + " x " + A.S(t4);
    },
    $eq(receiver, other) {
      var t1, t2;
      if (other == null)
        return false;
      if (type$.Rectangle_num._is(other)) {
        t1 = receiver.left;
        t1.toString;
        t2 = other.left;
        t2.toString;
        if (t1 === t2) {
          t1 = receiver.top;
          t1.toString;
          t2 = other.top;
          t2.toString;
          if (t1 === t2) {
            t1 = receiver.width;
            t1.toString;
            t2 = J.getInterceptor$x(other);
            if (t1 === t2.get$width(other)) {
              t1 = receiver.height;
              t1.toString;
              t2 = t1 === t2.get$height(other);
              t1 = t2;
            } else
              t1 = false;
          } else
            t1 = false;
        } else
          t1 = false;
      } else
        t1 = false;
      return t1;
    },
    get$hashCode(receiver) {
      var t2, t3, t4,
        t1 = receiver.left;
      t1.toString;
      t2 = receiver.top;
      t2.toString;
      t3 = receiver.width;
      t3.toString;
      t4 = receiver.height;
      t4.toString;
      return A.Object_hash(t1, t2, t3, t4);
    },
    get$_height(receiver) {
      return receiver.height;
    },
    get$height(receiver) {
      var t1 = receiver.height;
      t1.toString;
      return t1;
    },
    get$_width(receiver) {
      return receiver.width;
    },
    get$width(receiver) {
      var t1 = receiver.width;
      t1.toString;
      return t1;
    }
  };
  A._GamepadList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      return receiver[index];
    },
    $indexSet(receiver, index, value) {
      type$.nullable_Gamepad._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      if (receiver.length > 0)
        return receiver[0];
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._NamedNodeMap.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Node._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._SpeechRecognitionResultList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.SpeechRecognitionResult._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._StyleSheetList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length,
        t2 = index >>> 0 !== index || index >= t1;
      t2.toString;
      if (t2)
        throw A.wrapException(A.IndexError$withLength(index, t1, receiver, null, null));
      t1 = receiver[index];
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.StyleSheet._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1;
      if (receiver.length > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      if (!(index >= 0 && index < receiver.length))
        return A.ioore(receiver, index);
      return receiver[index];
    },
    $isEfficientLengthIterable: 1,
    $isJavaScriptIndexingBehavior: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._AttributeMap.prototype = {
    cast$2$0(_, $K, $V) {
      var t1 = type$.String;
      return A.Map_castFrom(this, t1, t1, $K, $V);
    },
    forEach$1(_, f) {
      var t1, t2, t3, _i, t4, value;
      type$.void_Function_String_String._as(f);
      for (t1 = this.get$keys(0), t2 = t1.length, t3 = this._element, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        t4 = A._asString(t1[_i]);
        value = t3.getAttribute(t4);
        f.call$2(t4, value == null ? A._asString(value) : value);
      }
    },
    get$keys(_) {
      var keys, len, t2, i, attr, t3,
        t1 = this._element.attributes;
      t1.toString;
      keys = A._setArrayType([], type$.JSArray_String);
      for (len = t1.length, t2 = type$._Attr, i = 0; i < len; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        attr = t2._as(t1[i]);
        if (attr.namespaceURI == null) {
          t3 = attr.name;
          t3.toString;
          B.JSArray_methods.add$1(keys, t3);
        }
      }
      return keys;
    },
    get$isEmpty(_) {
      return this.get$keys(0).length === 0;
    }
  };
  A._ElementAttributeMap.prototype = {
    containsKey$1(_, key) {
      var t1 = this._element.hasAttribute(key);
      t1.toString;
      return t1;
    },
    $index(_, key) {
      return this._element.getAttribute(A._asString(key));
    },
    $indexSet(_, key, value) {
      this._element.setAttribute(A._asString(key), A._asString(value));
    },
    get$length(_) {
      return this.get$keys(0).length;
    }
  };
  A.EventStreamProvider.prototype = {};
  A._EventStream.prototype = {
    listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError) {
      var t1 = this.$ti;
      t1._eval$1("~(1)?")._as(onData);
      type$.nullable_void_Function._as(onDone);
      return A._EventStreamSubscription$(this._target, this._eventType, onData, false, t1._precomputed1);
    },
    listen$3$onDone$onError(onData, onDone, onError) {
      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
    }
  };
  A._EventStreamSubscription.prototype = {
    cancel$0(_) {
      var _this = this;
      if (_this._target == null)
        return $.$get$nullFuture();
      _this._unlisten$0();
      _this._target = null;
      _this.set$_onData(null);
      return $.$get$nullFuture();
    },
    onData$1(handleData) {
      var t1, _this = this;
      _this.$ti._eval$1("~(1)?")._as(handleData);
      if (_this._target == null)
        throw A.wrapException(A.StateError$("Subscription has been canceled."));
      _this._unlisten$0();
      t1 = A._wrapZone(new A._EventStreamSubscription_onData_closure(handleData), type$.Event);
      _this.set$_onData(t1);
      _this._tryResume$0();
    },
    pause$0(_) {
      if (this._target == null)
        return;
      ++this._pauseCount;
      this._unlisten$0();
    },
    resume$0(_) {
      var _this = this;
      if (_this._target == null || _this._pauseCount <= 0)
        return;
      --_this._pauseCount;
      _this._tryResume$0();
    },
    _tryResume$0() {
      var t2, _this = this,
        t1 = _this._onData;
      if (t1 != null && _this._pauseCount <= 0) {
        t2 = _this._target;
        t2.toString;
        J.addEventListener$3$x(t2, _this._eventType, t1, false);
      }
    },
    _unlisten$0() {
      var t2,
        t1 = this._onData;
      if (t1 != null) {
        t2 = this._target;
        t2.toString;
        J._removeEventListener$3$x(t2, this._eventType, type$.nullable_dynamic_Function_Event._as(t1), false);
      }
    },
    set$_onData(_onData) {
      this._onData = type$.nullable_dynamic_Function_Event._as(_onData);
    },
    $isStreamSubscription: 1
  };
  A._EventStreamSubscription_closure.prototype = {
    call$1(e) {
      return this.onData.call$1(type$.Event._as(e));
    },
    $signature: 4
  };
  A._EventStreamSubscription_onData_closure.prototype = {
    call$1(e) {
      return this.handleData.call$1(type$.Event._as(e));
    },
    $signature: 4
  };
  A._Html5NodeValidator.prototype = {
    _Html5NodeValidator$1$uriPolicy(uriPolicy) {
      var _i;
      if ($._Html5NodeValidator__attributeValidators._length === 0) {
        for (_i = 0; _i < 262; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, B.List_uzK[_i], A.html__Html5NodeValidator__standardAttributeValidator$closure());
        for (_i = 0; _i < 12; ++_i)
          $._Html5NodeValidator__attributeValidators.$indexSet(0, B.List_Jwp[_i], A.html__Html5NodeValidator__uriAttributeValidator$closure());
      }
    },
    allowsElement$1(element) {
      return $.$get$_Html5NodeValidator__allowedElements().contains$1(0, A.Element__safeTagName(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      var validator = $._Html5NodeValidator__attributeValidators.$index(0, A.Element__safeTagName(element) + "::" + attributeName);
      if (validator == null)
        validator = $._Html5NodeValidator__attributeValidators.$index(0, "*::" + attributeName);
      if (validator == null)
        return false;
      return A._asBool(validator.call$4(element, attributeName, value, this));
    },
    $isNodeValidator: 1
  };
  A.ImmutableListMixin.prototype = {
    get$iterator(receiver) {
      return new A.FixedSizeListIterator(receiver, this.get$length(receiver), A.instanceType(receiver)._eval$1("FixedSizeListIterator<ImmutableListMixin.E>"));
    },
    sort$1(receiver, compare) {
      A.instanceType(receiver)._eval$1("int(ImmutableListMixin.E,ImmutableListMixin.E)?")._as(compare);
      throw A.wrapException(A.UnsupportedError$("Cannot sort immutable List."));
    }
  };
  A.NodeValidatorBuilder.prototype = {
    allowsElement$1(element) {
      return B.JSArray_methods.any$1(this._validators, new A.NodeValidatorBuilder_allowsElement_closure(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      return B.JSArray_methods.any$1(this._validators, new A.NodeValidatorBuilder_allowsAttribute_closure(element, attributeName, value));
    },
    $isNodeValidator: 1
  };
  A.NodeValidatorBuilder_allowsElement_closure.prototype = {
    call$1(v) {
      return type$.NodeValidator._as(v).allowsElement$1(this.element);
    },
    $signature: 26
  };
  A.NodeValidatorBuilder_allowsAttribute_closure.prototype = {
    call$1(v) {
      return type$.NodeValidator._as(v).allowsAttribute$3(this.element, this.attributeName, this.value);
    },
    $signature: 26
  };
  A._SimpleNodeValidator.prototype = {
    _SimpleNodeValidator$4$allowedAttributes$allowedElements$allowedUriAttributes(uriPolicy, allowedAttributes, allowedElements, allowedUriAttributes) {
      var legalAttributes, extraUriAttributes, t1;
      this.allowedElements.addAll$1(0, allowedElements);
      legalAttributes = allowedAttributes.where$1(0, new A._SimpleNodeValidator_closure());
      extraUriAttributes = allowedAttributes.where$1(0, new A._SimpleNodeValidator_closure0());
      this.allowedAttributes.addAll$1(0, legalAttributes);
      t1 = this.allowedUriAttributes;
      t1.addAll$1(0, B.List_empty0);
      t1.addAll$1(0, extraUriAttributes);
    },
    allowsElement$1(element) {
      return this.allowedElements.contains$1(0, A.Element__safeTagName(element));
    },
    allowsAttribute$3(element, attributeName, value) {
      var t3, _this = this,
        tagName = A.Element__safeTagName(element),
        t1 = _this.allowedUriAttributes,
        t2 = tagName + "::" + attributeName;
      if (t1.contains$1(0, t2))
        return _this.uriPolicy.allowsUri$1(value);
      else {
        t3 = "*::" + attributeName;
        if (t1.contains$1(0, t3))
          return _this.uriPolicy.allowsUri$1(value);
        else {
          t1 = _this.allowedAttributes;
          if (t1.contains$1(0, t2))
            return true;
          else if (t1.contains$1(0, t3))
            return true;
          else if (t1.contains$1(0, tagName + "::*"))
            return true;
          else if (t1.contains$1(0, "*::*"))
            return true;
        }
      }
      return false;
    },
    $isNodeValidator: 1
  };
  A._SimpleNodeValidator_closure.prototype = {
    call$1(x) {
      return !B.JSArray_methods.contains$1(B.List_Jwp, A._asString(x));
    },
    $signature: 27
  };
  A._SimpleNodeValidator_closure0.prototype = {
    call$1(x) {
      return B.JSArray_methods.contains$1(B.List_Jwp, A._asString(x));
    },
    $signature: 27
  };
  A._TemplatingNodeValidator.prototype = {
    allowsAttribute$3(element, attributeName, value) {
      if (this.super$_SimpleNodeValidator$allowsAttribute(element, attributeName, value))
        return true;
      if (attributeName === "template" && value === "")
        return true;
      if (element.getAttribute("template") === "")
        return this._templateAttrs.contains$1(0, attributeName);
      return false;
    }
  };
  A._TemplatingNodeValidator_closure.prototype = {
    call$1(attr) {
      return "TEMPLATE::" + A._asString(attr);
    },
    $signature: 23
  };
  A._SvgNodeValidator.prototype = {
    allowsElement$1(element) {
      var t1;
      if (type$.ScriptElement._is(element))
        return false;
      t1 = type$.SvgElement._is(element);
      if (t1 && A.Element__safeTagName(element) === "foreignObject")
        return false;
      if (t1)
        return true;
      return false;
    },
    allowsAttribute$3(element, attributeName, value) {
      if (attributeName === "is" || B.JSString_methods.startsWith$1(attributeName, "on"))
        return false;
      return this.allowsElement$1(element);
    },
    $isNodeValidator: 1
  };
  A.FixedSizeListIterator.prototype = {
    moveNext$0() {
      var _this = this,
        nextPosition = _this._position + 1,
        t1 = _this._html$_length;
      if (nextPosition < t1) {
        _this.set$_current(J.$index$asx(_this._array, nextPosition));
        _this._position = nextPosition;
        return true;
      }
      _this.set$_current(null);
      _this._position = t1;
      return false;
    },
    get$current(_) {
      var t1 = this._current;
      return t1 == null ? this.$ti._precomputed1._as(t1) : t1;
    },
    set$_current(_current) {
      this._current = this.$ti._eval$1("1?")._as(_current);
    },
    $isIterator: 1
  };
  A._DOMWindowCrossFrame.prototype = {$isJSObject: 1, $isEventTarget: 1, $isWindowBase: 1};
  A._SameOriginUriPolicy.prototype = {$isUriPolicy: 1};
  A._ValidatingTreeSanitizer.prototype = {
    sanitizeTree$1(node) {
      var previousTreeModifications,
        walk = new A._ValidatingTreeSanitizer_sanitizeTree_walk(this);
      do {
        previousTreeModifications = this.numTreeModifications;
        walk.call$2(node, null);
      } while (previousTreeModifications !== this.numTreeModifications);
    },
    _removeNode$2(node, $parent) {
      ++this.numTreeModifications;
      if ($parent == null || $parent !== node.parentNode)
        J.remove$0$x(node);
      else
        $parent.removeChild(node).toString;
    },
    _sanitizeUntrustedElement$2(element, $parent) {
      var corruptedTest1, elementText, elementTagName, t1, corrupted0, exception, t2,
        corrupted = true,
        attrs = null, isAttr = null;
      try {
        attrs = J.get$attributes$x(element);
        isAttr = attrs._element.getAttribute("is");
        type$.Element._as(element);
        t1 = function(element) {
          if (!(element.attributes instanceof NamedNodeMap)) {
            return true;
          }
          if (element.id == "lastChild" || element.name == "lastChild" || element.id == "previousSibling" || element.name == "previousSibling" || element.id == "children" || element.name == "children") {
            return true;
          }
          var childNodes = element.childNodes;
          if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1]) {
            return true;
          }
          if (element.children) {
            if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList)) {
              return true;
            }
          }
          var length = 0;
          if (element.children) {
            length = element.children.length;
          }
          for (var i = 0; i < length; i++) {
            var child = element.children[i];
            if (child.id == "attributes" || child.name == "attributes" || child.id == "lastChild" || child.name == "lastChild" || child.id == "previousSibling" || child.name == "previousSibling" || child.id == "children" || child.name == "children") {
              return true;
            }
          }
          return false;
        }(element);
        t1.toString;
        corruptedTest1 = t1;
        if (A.boolConversionCheck(corruptedTest1))
          corrupted0 = true;
        else {
          t1 = !(element.attributes instanceof NamedNodeMap);
          t1.toString;
          corrupted0 = t1;
        }
        corrupted = corrupted0;
      } catch (exception) {
      }
      elementText = "element unprintable";
      try {
        elementText = J.toString$0$(element);
      } catch (exception) {
      }
      try {
        type$.Element._as(element);
        elementTagName = A.Element__safeTagName(element);
        this._sanitizeElement$7(element, $parent, corrupted, elementText, elementTagName, type$.Map_dynamic_dynamic._as(attrs), A._asStringQ(isAttr));
      } catch (exception) {
        if (A.unwrapException(exception) instanceof A.ArgumentError)
          throw exception;
        else {
          this._removeNode$2(element, $parent);
          window.toString;
          t1 = A.S(elementText);
          t2 = typeof console != "undefined";
          t2.toString;
          if (t2)
            window.console.warn("Removing corrupted element " + t1);
        }
      }
    },
    _sanitizeElement$7(element, $parent, corrupted, text, tag, attrs, isAttr) {
      var t1, t2, keys, i, $name, t3, t4, _this = this;
      if (corrupted) {
        _this._removeNode$2(element, $parent);
        window.toString;
        t1 = typeof console != "undefined";
        t1.toString;
        if (t1)
          window.console.warn("Removing element due to corrupted attributes on <" + text + ">");
        return;
      }
      if (!_this.validator.allowsElement$1(element)) {
        _this._removeNode$2(element, $parent);
        window.toString;
        t1 = A.S($parent);
        t2 = typeof console != "undefined";
        t2.toString;
        if (t2)
          window.console.warn("Removing disallowed element <" + tag + "> from " + t1);
        return;
      }
      if (isAttr != null)
        if (!_this.validator.allowsAttribute$3(element, "is", isAttr)) {
          _this._removeNode$2(element, $parent);
          window.toString;
          t1 = typeof console != "undefined";
          t1.toString;
          if (t1)
            window.console.warn("Removing disallowed type extension <" + tag + ' is="' + isAttr + '">');
          return;
        }
      t1 = attrs.get$keys(0);
      keys = A._setArrayType(t1.slice(0), A._arrayInstanceType(t1));
      for (i = attrs.get$keys(0).length - 1, t1 = attrs._element, t2 = "Removing disallowed attribute <" + tag + " "; i >= 0; --i) {
        if (!(i < keys.length))
          return A.ioore(keys, i);
        $name = keys[i];
        t3 = _this.validator;
        t4 = J.toLowerCase$0$s($name);
        A._asString($name);
        if (!t3.allowsAttribute$3(element, t4, A._asString(t1.getAttribute($name)))) {
          window.toString;
          t3 = t1.getAttribute($name);
          t4 = typeof console != "undefined";
          t4.toString;
          if (t4)
            window.console.warn(t2 + $name + '="' + A.S(t3) + '">');
          t1.removeAttribute($name);
        }
      }
      if (type$.TemplateElement._is(element)) {
        t1 = element.content;
        t1.toString;
        _this.sanitizeTree$1(t1);
      }
    },
    sanitizeNode$2(node, $parent) {
      var t1 = node.nodeType;
      t1.toString;
      switch (t1) {
        case 1:
          this._sanitizeUntrustedElement$2(node, $parent);
          break;
        case 8:
        case 11:
        case 3:
        case 4:
          break;
        default:
          this._removeNode$2(node, $parent);
      }
    },
    $isNodeTreeSanitizer: 1
  };
  A._ValidatingTreeSanitizer_sanitizeTree_walk.prototype = {
    call$2(node, $parent) {
      var child, nextChild, t2, t3, t4, exception,
        t1 = this.$this;
      t1.sanitizeNode$2(node, $parent);
      child = node.lastChild;
      for (t2 = type$.Node; child != null;) {
        nextChild = null;
        try {
          nextChild = child.previousSibling;
          if (nextChild != null) {
            t3 = nextChild.nextSibling;
            t4 = child;
            t4 = t3 == null ? t4 != null : t3 !== t4;
            t3 = t4;
          } else
            t3 = false;
          if (t3) {
            t3 = A.StateError$("Corrupt HTML");
            throw A.wrapException(t3);
          }
        } catch (exception) {
          t3 = t2._as(child);
          ++t1.numTreeModifications;
          t4 = t3.parentNode;
          if (node !== t4) {
            if (t4 != null)
              t4.removeChild(t3).toString;
          } else
            node.removeChild(t3).toString;
          child = null;
          nextChild = node.lastChild;
        }
        if (child != null)
          this.call$2(child, node);
        child = nextChild;
      }
    },
    $signature: 37
  };
  A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase.prototype = {};
  A._DomRectList_JavaScriptObject_ListMixin.prototype = {};
  A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._DomStringList_JavaScriptObject_ListMixin.prototype = {};
  A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._FileList_JavaScriptObject_ListMixin.prototype = {};
  A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._HtmlCollection_JavaScriptObject_ListMixin.prototype = {};
  A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._MidiInputMap_JavaScriptObject_MapMixin.prototype = {};
  A._MidiOutputMap_JavaScriptObject_MapMixin.prototype = {};
  A._MimeTypeArray_JavaScriptObject_ListMixin.prototype = {};
  A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._NodeList_JavaScriptObject_ListMixin.prototype = {};
  A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._PluginArray_JavaScriptObject_ListMixin.prototype = {};
  A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._RtcStatsReport_JavaScriptObject_MapMixin.prototype = {};
  A._SourceBufferList_EventTarget_ListMixin.prototype = {};
  A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  A._SpeechGrammarList_JavaScriptObject_ListMixin.prototype = {};
  A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._Storage_JavaScriptObject_MapMixin.prototype = {};
  A._TextTrackCueList_JavaScriptObject_ListMixin.prototype = {};
  A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._TextTrackList_EventTarget_ListMixin.prototype = {};
  A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.prototype = {};
  A._TouchList_JavaScriptObject_ListMixin.prototype = {};
  A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__CssRuleList_JavaScriptObject_ListMixin.prototype = {};
  A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__GamepadList_JavaScriptObject_ListMixin.prototype = {};
  A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__NamedNodeMap_JavaScriptObject_ListMixin.prototype = {};
  A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin.prototype = {};
  A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.__StyleSheetList_JavaScriptObject_ListMixin.prototype = {};
  A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._StructuredClone.prototype = {
    findSlot$1(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      B.JSArray_methods.add$1(t1, value);
      B.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1(e) {
      var slot, t2, copy, t3, _this = this, t1 = {};
      if (e == null)
        return e;
      if (A._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      if (e instanceof A.DateTime)
        return new Date(e._value);
      if (e instanceof A.JSSyntaxRegExp)
        throw A.wrapException(A.UnimplementedError$("structured clone of RegExp"));
      if (type$.File._is(e))
        return e;
      if (type$.Blob._is(e))
        return e;
      if (type$.FileList._is(e))
        return e;
      if (type$.ImageData._is(e))
        return e;
      if (type$.NativeByteBuffer._is(e) || type$.NativeTypedData._is(e) || type$.MessagePort._is(e) || type$.SharedArrayBuffer._is(e))
        return e;
      if (type$.Map_dynamic_dynamic._is(e)) {
        slot = _this.findSlot$1(e);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t1.copy = t2[slot];
        if (copy != null)
          return copy;
        copy = {};
        t1.copy = copy;
        B.JSArray_methods.$indexSet(t2, slot, copy);
        J.forEach$1$ax(e, new A._StructuredClone_walk_closure(t1, _this));
        return t1.copy;
      }
      if (type$.List_dynamic._is(e)) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (!(slot < t1.length))
          return A.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        return _this.copyList$2(e, slot);
      }
      if (type$.JSObject._is(e)) {
        slot = _this.findSlot$1(e);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t1.copy = t2[slot];
        if (copy != null)
          return copy;
        t3 = {};
        t3.toString;
        t1.copy = t3;
        B.JSArray_methods.$indexSet(t2, slot, t3);
        _this.forEachObjectKey$2(e, new A._StructuredClone_walk_closure0(t1, _this));
        return t1.copy;
      }
      throw A.wrapException(A.UnimplementedError$("structured clone of other type"));
    },
    copyList$2(e, slot) {
      var i,
        t1 = J.getInterceptor$asx(e),
        $length = t1.get$length(e),
        t2 = new Array($length);
      t2.toString;
      B.JSArray_methods.$indexSet(this.copies, slot, t2);
      for (i = 0; i < $length; ++i)
        B.JSArray_methods.$indexSet(t2, i, this.walk$1(t1.$index(e, i)));
      return t2;
    }
  };
  A._StructuredClone_walk_closure.prototype = {
    call$2(key, value) {
      this._box_0.copy[key] = this.$this.walk$1(value);
    },
    $signature: 9
  };
  A._StructuredClone_walk_closure0.prototype = {
    call$2(key, value) {
      this._box_0.copy[key] = this.$this.walk$1(value);
    },
    $signature: 38
  };
  A._AcceptStructuredClone.prototype = {
    findSlot$1(value) {
      var i,
        t1 = this.values,
        $length = t1.length;
      for (i = 0; i < $length; ++i)
        if (t1[i] === value)
          return i;
      B.JSArray_methods.add$1(t1, value);
      B.JSArray_methods.add$1(this.copies, null);
      return $length;
    },
    walk$1(e) {
      var t1, slot, copy, t2, map, t3, $length, t4, i, _this = this;
      if (e == null)
        return e;
      if (A._isBool(e))
        return e;
      if (typeof e == "number")
        return e;
      if (typeof e == "string")
        return e;
      t1 = e instanceof Date;
      t1.toString;
      if (t1) {
        t1 = e.getTime();
        t1.toString;
        return A.DateTime$fromMillisecondsSinceEpoch(t1, true);
      }
      t1 = e instanceof RegExp;
      t1.toString;
      if (t1)
        throw A.wrapException(A.UnimplementedError$("structured clone of RegExp"));
      t1 = typeof Promise != "undefined" && e instanceof Promise;
      t1.toString;
      if (t1)
        return A.promiseToFuture(e, type$.dynamic);
      if (A.isJavaScriptSimpleObject(e)) {
        slot = _this.findSlot$1(e);
        t1 = _this.copies;
        if (!(slot < t1.length))
          return A.ioore(t1, slot);
        copy = t1[slot];
        if (copy != null)
          return copy;
        t2 = type$.dynamic;
        map = A.LinkedHashMap_LinkedHashMap$_empty(t2, t2);
        B.JSArray_methods.$indexSet(t1, slot, map);
        _this.forEachJsField$2(e, new A._AcceptStructuredClone_walk_closure(_this, map));
        return map;
      }
      t1 = e instanceof Array;
      t1.toString;
      if (t1) {
        t1 = e;
        t1.toString;
        slot = _this.findSlot$1(t1);
        t2 = _this.copies;
        if (!(slot < t2.length))
          return A.ioore(t2, slot);
        copy = t2[slot];
        if (copy != null)
          return copy;
        t3 = J.getInterceptor$asx(t1);
        $length = t3.get$length(t1);
        if (_this.mustCopy) {
          t4 = new Array($length);
          t4.toString;
          copy = t4;
        } else
          copy = t1;
        B.JSArray_methods.$indexSet(t2, slot, copy);
        for (t2 = J.getInterceptor$ax(copy), i = 0; i < $length; ++i)
          t2.$indexSet(copy, i, _this.walk$1(t3.$index(t1, i)));
        return copy;
      }
      return e;
    },
    convertNativeToDart_AcceptStructuredClone$2$mustCopy(object, mustCopy) {
      this.mustCopy = true;
      return this.walk$1(object);
    }
  };
  A._AcceptStructuredClone_walk_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.walk$1(value);
      this.map.$indexSet(0, key, t1);
      return t1;
    },
    $signature: 39
  };
  A._convertDartToNative_Value_closure.prototype = {
    call$1(element) {
      this.array.push(A._convertDartToNative_Value(element));
    },
    $signature: 3
  };
  A.convertDartToNative_Dictionary_closure.prototype = {
    call$2(key, value) {
      this.object[key] = A._convertDartToNative_Value(value);
    },
    $signature: 9
  };
  A._StructuredCloneDart2Js.prototype = {
    forEachObjectKey$2(object, action) {
      var t1, t2, _i, key;
      type$.dynamic_Function_dynamic_dynamic._as(action);
      for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  A._AcceptStructuredCloneDart2Js.prototype = {
    forEachJsField$2(object, action) {
      var t1, t2, _i, key;
      type$.dynamic_Function_dynamic_dynamic._as(action);
      for (t1 = Object.keys(object), t2 = t1.length, _i = 0; _i < t1.length; t1.length === t2 || (0, A.throwConcurrentModificationError)(t1), ++_i) {
        key = t1[_i];
        action.call$2(key, object[key]);
      }
    }
  };
  A.KeyRange.prototype = {$isKeyRange: 1};
  A.JsObject__convertDataTree__convert.prototype = {
    call$1(o) {
      var convertedMap, t2, key, convertedList,
        t1 = this._convertedObjects;
      if (t1.containsKey$1(0, o))
        return t1.$index(0, o);
      if (type$.Map_dynamic_dynamic._is(o)) {
        convertedMap = {};
        t1.$indexSet(0, o, convertedMap);
        for (t1 = J.getInterceptor$x(o), t2 = J.get$iterator$ax(t1.get$keys(o)); t2.moveNext$0();) {
          key = t2.get$current(t2);
          convertedMap[key] = this.call$1(t1.$index(o, key));
        }
        return convertedMap;
      } else if (type$.Iterable_dynamic._is(o)) {
        convertedList = [];
        t1.$indexSet(0, o, convertedList);
        B.JSArray_methods.addAll$1(convertedList, J.map$1$1$ax(o, this, type$.dynamic));
        return convertedList;
      } else
        return A._convertToJS(o);
    },
    $signature: 40
  };
  A._convertToJS_closure.prototype = {
    call$1(o) {
      var jsFunction;
      type$.Function._as(o);
      jsFunction = function(_call, f, captureThis) {
        return function() {
          return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
        };
      }(A._callDartFunction, o, false);
      A._defineProperty(jsFunction, $.$get$DART_CLOSURE_PROPERTY_NAME(), o);
      return jsFunction;
    },
    $signature: 1
  };
  A._convertToJS_closure0.prototype = {
    call$1(o) {
      return new this.ctor(o);
    },
    $signature: 1
  };
  A._wrapToDart_closure.prototype = {
    call$1(o) {
      return new A.JsFunction(o == null ? type$.Object._as(o) : o);
    },
    $signature: 41
  };
  A._wrapToDart_closure0.prototype = {
    call$1(o) {
      var t1 = o == null ? type$.Object._as(o) : o;
      return new A.JsArray(t1, type$.JsArray_dynamic);
    },
    $signature: 42
  };
  A._wrapToDart_closure1.prototype = {
    call$1(o) {
      return new A.JsObject(o == null ? type$.Object._as(o) : o);
    },
    $signature: 43
  };
  A.JsObject.prototype = {
    $index(_, property) {
      if (typeof property != "string" && typeof property != "number")
        throw A.wrapException(A.ArgumentError$("property is not a String or num", null));
      return A._convertToDart(this._jsObject[property]);
    },
    $indexSet(_, property, value) {
      if (typeof property != "string" && typeof property != "number")
        throw A.wrapException(A.ArgumentError$("property is not a String or num", null));
      this._jsObject[property] = A._convertToJS(value);
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.JsObject && this._jsObject === other._jsObject;
    },
    toString$0(_) {
      var t1, exception;
      try {
        t1 = String(this._jsObject);
        return t1;
      } catch (exception) {
        t1 = this.super$Object$toString(0);
        return t1;
      }
    },
    callMethod$2(method, args) {
      var t2,
        t1 = this._jsObject;
      if (args == null)
        t2 = null;
      else {
        t2 = A._arrayInstanceType(args);
        t2 = A.List_List$from(new A.MappedListIterable(args, t2._eval$1("@(1)")._as(A.js___convertToJS$closure()), t2._eval$1("MappedListIterable<1,@>")), true, type$.dynamic);
      }
      return A._convertToDart(t1[method].apply(t1, t2));
    },
    callMethod$1(method) {
      return this.callMethod$2(method, null);
    },
    get$hashCode(_) {
      return 0;
    }
  };
  A.JsFunction.prototype = {};
  A.JsArray.prototype = {
    _checkIndex$1(index) {
      var t1 = index < 0 || index >= this.get$length(0);
      if (t1)
        throw A.wrapException(A.RangeError$range(index, 0, this.get$length(0), null, null));
    },
    $index(_, index) {
      if (A._isInt(index))
        this._checkIndex$1(index);
      return this.$ti._precomputed1._as(this.super$JsObject$$index(0, index));
    },
    $indexSet(_, index, value) {
      this._checkIndex$1(index);
      this.super$_JsArray_JsObject_ListMixin$$indexSet(0, index, value);
    },
    get$length(_) {
      var len = this._jsObject.length;
      if (typeof len === "number" && len >>> 0 === len)
        return len;
      throw A.wrapException(A.StateError$("Bad JsArray length"));
    },
    sort$1(_, compare) {
      this.$ti._eval$1("int(1,1)?")._as(compare);
      this.callMethod$2("sort", compare == null ? [] : [compare]);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._JsArray_JsObject_ListMixin.prototype = {
    $indexSet(_, property, value) {
      return this.super$JsObject$$indexSet(0, property, value);
    }
  };
  A.promiseToFuture_closure.prototype = {
    call$1(r) {
      return this.completer.complete$1(0, this.T._eval$1("0/?")._as(r));
    },
    $signature: 3
  };
  A.promiseToFuture_closure0.prototype = {
    call$1(e) {
      if (e == null)
        return this.completer.completeError$1(new A.NullRejectionException(e === undefined));
      return this.completer.completeError$1(e);
    },
    $signature: 3
  };
  A.NullRejectionException.prototype = {
    toString$0(_) {
      return "Promise was rejected with a value of `" + (this.isUndefined ? "undefined" : "null") + "`.";
    }
  };
  A._JSRandom.prototype = {
    nextInt$1(max) {
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      return Math.random() * max >>> 0;
    }
  };
  A._Random.prototype = {
    _Random$1(seed) {
      var low, high, tmplow, low0, t1, t2, t3, _this = this, _4294967296 = 4294967296,
        empty_seed = seed < 0 ? -1 : 0;
      do {
        low = seed >>> 0;
        seed = B.JSInt_methods._tdivFast$1(seed - low, _4294967296);
        high = seed >>> 0;
        seed = B.JSInt_methods._tdivFast$1(seed - high, _4294967296);
        tmplow = (~low >>> 0) + (low << 21 >>> 0);
        low0 = tmplow >>> 0;
        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + B.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296) >>> 0;
        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 24) >>> 0) * 265 + B.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
        low = tmplow >>> 0;
        high = ((high ^ high >>> 14) >>> 0) * 21 + B.JSInt_methods._tdivFast$1(tmplow - low, _4294967296) >>> 0;
        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
        high = (high ^ high >>> 28) >>> 0;
        tmplow = (low << 31 >>> 0) + low;
        low0 = tmplow >>> 0;
        t1 = B.JSInt_methods._tdivFast$1(tmplow - low0, _4294967296);
        tmplow = _this._lo * 1037;
        t2 = _this._lo = tmplow >>> 0;
        t3 = _this._hi * 1037 + B.JSInt_methods._tdivFast$1(tmplow - t2, _4294967296) >>> 0;
        _this._hi = t3;
        t2 = (t2 ^ low0) >>> 0;
        _this._lo = t2;
        t1 = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 >>> 0) >>> 0;
        _this._hi = t1;
      } while (seed !== empty_seed);
      if (t1 === 0 && t2 === 0)
        _this._lo = 23063;
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
      _this._nextState$0();
    },
    _nextState$0() {
      var _this = this,
        t1 = _this._lo,
        tmpHi = 4294901760 * t1,
        tmpHiLo = tmpHi >>> 0,
        tmpLo = 55905 * t1,
        tmpLoLo = tmpLo >>> 0,
        newLo = tmpLoLo + tmpHiLo + _this._hi;
      t1 = newLo >>> 0;
      _this._lo = t1;
      _this._hi = B.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) >>> 0;
    },
    nextInt$1(max) {
      var t1, rnd32, result, _this = this;
      if (max <= 0 || max > 4294967296)
        throw A.wrapException(A.RangeError$(string$.max_mu + max));
      t1 = max - 1;
      if ((max & t1) >>> 0 === 0) {
        _this._nextState$0();
        return (_this._lo & t1) >>> 0;
      }
      do {
        _this._nextState$0();
        rnd32 = _this._lo;
        result = rnd32 % max;
      } while (rnd32 - result + max >= 4294967296);
      return result;
    }
  };
  A.Length.prototype = {$isLength: 1};
  A.LengthList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Length._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.Number.prototype = {$isNumber: 1};
  A.NumberList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Number._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.PointList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.ScriptElement0.prototype = {$isScriptElement0: 1};
  A.StringList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      A._asString(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A.SvgElement.prototype = {
    createFragment$3$treeSanitizer$validator(receiver, svg, treeSanitizer, validator) {
      var t2, fragment, root,
        t1 = A._setArrayType([], type$.JSArray_NodeValidator);
      B.JSArray_methods.add$1(t1, A._Html5NodeValidator$(null));
      B.JSArray_methods.add$1(t1, A._TemplatingNodeValidator$());
      B.JSArray_methods.add$1(t1, new A._SvgNodeValidator());
      treeSanitizer = new A._ValidatingTreeSanitizer(new A.NodeValidatorBuilder(t1));
      t1 = document;
      t2 = t1.body;
      t2.toString;
      fragment = B.BodyElement_methods.createFragment$2$treeSanitizer(t2, '<svg version="1.1">' + svg + "</svg>", treeSanitizer);
      t1 = t1.createDocumentFragment();
      t1.toString;
      root = new A._ChildNodeListLazy(fragment).get$single(0);
      for (; t2 = root.firstChild, t2 != null;)
        t1.appendChild(t2).toString;
      return t1;
    },
    $isSvgElement: 1
  };
  A.Transform.prototype = {$isTransform: 1};
  A.TransformList.prototype = {
    get$length(receiver) {
      var t1 = receiver.length;
      t1.toString;
      return t1;
    },
    $index(receiver, index) {
      var t1 = receiver.length;
      t1.toString;
      t1 = index >>> 0 !== index || index >= t1;
      t1.toString;
      if (t1)
        throw A.wrapException(A.IndexError$withLength(index, this.get$length(receiver), receiver, null, null));
      t1 = receiver.getItem(index);
      t1.toString;
      return t1;
    },
    $indexSet(receiver, index, value) {
      type$.Transform._as(value);
      throw A.wrapException(A.UnsupportedError$("Cannot assign element of immutable List."));
    },
    get$first(receiver) {
      var t1 = receiver.length;
      t1.toString;
      if (t1 > 0) {
        t1 = receiver[0];
        t1.toString;
        return t1;
      }
      throw A.wrapException(A.StateError$("No elements"));
    },
    elementAt$1(receiver, index) {
      return this.$index(receiver, index);
    },
    $isEfficientLengthIterable: 1,
    $isIterable: 1,
    $isList: 1
  };
  A._LengthList_JavaScriptObject_ListMixin.prototype = {};
  A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._NumberList_JavaScriptObject_ListMixin.prototype = {};
  A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._StringList_JavaScriptObject_ListMixin.prototype = {};
  A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A._TransformList_JavaScriptObject_ListMixin.prototype = {};
  A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin.prototype = {};
  A.AudioBuffer.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.AudioParamMap.prototype = {
    containsKey$1(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(key)) != null;
    },
    $index(receiver, key) {
      return A.convertNativeToDart_Dictionary(receiver.get(A._asString(key)));
    },
    forEach$1(receiver, f) {
      var entries, entry, t1;
      type$.void_Function_String_dynamic._as(f);
      entries = receiver.entries();
      for (; true;) {
        entry = entries.next();
        t1 = entry.done;
        t1.toString;
        if (t1)
          return;
        t1 = entry.value[0];
        t1.toString;
        f.call$2(t1, A.convertNativeToDart_Dictionary(entry.value[1]));
      }
    },
    get$keys(receiver) {
      var keys = A._setArrayType([], type$.JSArray_String);
      this.forEach$1(receiver, new A.AudioParamMap_keys_closure(keys));
      return keys;
    },
    get$length(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1;
    },
    get$isEmpty(receiver) {
      var t1 = receiver.size;
      t1.toString;
      return t1 === 0;
    },
    $indexSet(receiver, key, value) {
      A._asString(key);
      throw A.wrapException(A.UnsupportedError$("Not supported"));
    },
    $isMap: 1
  };
  A.AudioParamMap_keys_closure.prototype = {
    call$2(k, v) {
      return B.JSArray_methods.add$1(this.keys, k);
    },
    $signature: 6
  };
  A.AudioTrackList.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A.BaseAudioContext.prototype = {};
  A.OfflineAudioContext.prototype = {
    get$length(receiver) {
      return receiver.length;
    }
  };
  A._AudioParamMap_JavaScriptObject_MapMixin.prototype = {};
  A.AsyncMemoizer.prototype = {};
  A.DelegatingStreamSink.prototype = {
    add$1(_, data) {
      this._sink.add$1(0, A._instanceType(this)._eval$1("DelegatingStreamSink.T")._as(data));
    },
    $isStreamSink: 1
  };
  A.ErrorResult.prototype = {
    complete$1(_, completer) {
      completer.completeError$2(this.error, this.stackTrace);
    },
    get$hashCode(_) {
      return (J.get$hashCode$(this.error) ^ A.Primitives_objectHashCode(this.stackTrace) ^ 492929599) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.ErrorResult && J.$eq$(this.error, other.error) && this.stackTrace === other.stackTrace;
    },
    $isResult: 1
  };
  A.ValueResult.prototype = {
    complete$1(_, completer) {
      this.$ti._eval$1("Completer<1>")._as(completer).complete$1(0, this.value);
    },
    get$hashCode(_) {
      return (J.get$hashCode$(this.value) ^ 842997089) >>> 0;
    },
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.ValueResult && J.$eq$(this.value, other.value);
    },
    $isResult: 1
  };
  A.StreamQueue.prototype = {
    get$hasNext() {
      var t1 = new A._Future($.Zone__current, type$._Future_bool);
      this._addRequest$1(new A._HasNextRequest(new A._AsyncCompleter(t1, type$._AsyncCompleter_bool), this.$ti._eval$1("_HasNextRequest<1>")));
      return t1;
    },
    _updateRequests$0() {
      var t1, t2, t3, t4, t5, _this = this;
      for (t1 = _this._requestQueue, t2 = _this._eventQueue, t3 = t1.$ti._precomputed1; !t1.get$isEmpty(0);) {
        t4 = t1._head;
        if (t4 === t1._tail)
          A.throwExpression(A.IterableElementError_noElement());
        t5 = t1._table;
        if (!(t4 < t5.length))
          return A.ioore(t5, t4);
        t4 = t5[t4];
        if (t4 == null)
          t4 = t3._as(t4);
        if (J.update$2$z(t4, t2, _this._isDone))
          t1.removeFirst$0();
        else
          return;
      }
      if (!_this._isDone)
        _this._stream_queue$_subscription.pause$0(0);
    },
    _ensureListening$0() {
      var t1, _this = this;
      if (_this._isDone)
        return;
      t1 = _this._stream_queue$_subscription;
      if (t1 == null)
        _this.set$_stream_queue$_subscription(_this._stream_queue$_source.listen$3$onDone$onError(new A.StreamQueue__ensureListening_closure(_this), new A.StreamQueue__ensureListening_closure0(_this), new A.StreamQueue__ensureListening_closure1(_this)));
      else
        t1.resume$0(0);
    },
    _addResult$1(result) {
      var t1, _this = this;
      _this.$ti._eval$1("Result<1>")._as(result);
      ++_this._eventsReceived;
      t1 = _this._eventQueue;
      t1._queue_list$_add$1(0, t1.$ti._eval$1("QueueList.E")._as(result));
      _this._updateRequests$0();
    },
    _addRequest$1(request) {
      var t1, _this = this;
      _this.$ti._eval$1("_EventRequest<1>")._as(request);
      t1 = _this._requestQueue;
      if (t1._head === t1._tail) {
        if (request.update$2(0, _this._eventQueue, _this._isDone))
          return;
        _this._ensureListening$0();
      }
      t1._collection$_add$1(0, t1.$ti._precomputed1._as(request));
    },
    set$_stream_queue$_subscription(_subscription) {
      this._stream_queue$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A.StreamQueue__ensureListening_closure.prototype = {
    call$1(data) {
      var t1 = this.$this,
        t2 = t1.$ti;
      t1._addResult$1(new A.ValueResult(t2._precomputed1._as(data), t2._eval$1("ValueResult<1>")));
    },
    $signature() {
      return this.$this.$ti._eval$1("~(1)");
    }
  };
  A.StreamQueue__ensureListening_closure1.prototype = {
    call$2(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      this.$this._addResult$1(new A.ErrorResult(error, stackTrace));
    },
    $signature: 8
  };
  A.StreamQueue__ensureListening_closure0.prototype = {
    call$0() {
      var t1 = this.$this;
      t1.set$_stream_queue$_subscription(null);
      t1._isDone = true;
      t1._updateRequests$0();
    },
    $signature: 0
  };
  A._NextRequest.prototype = {
    update$2(_, events, isDone) {
      var t1, result;
      this.$ti._eval$1("QueueList<Result<1>>")._as(events);
      if (!events.get$isEmpty(events)) {
        t1 = events._queue_list$_head;
        if (t1 === events._queue_list$_tail)
          A.throwExpression(A.StateError$("No element"));
        result = J.$index$asx(events._queue_list$_table, t1);
        if (result == null)
          result = events.$ti._eval$1("QueueList.E")._as(result);
        J.$indexSet$ax(events._queue_list$_table, events._queue_list$_head, null);
        events._queue_list$_head = (events._queue_list$_head + 1 & J.get$length$asx(events._queue_list$_table) - 1) >>> 0;
        J.complete$1$z(result, this._stream_queue$_completer);
        return true;
      }
      if (isDone) {
        this._stream_queue$_completer.completeError$2(new A.StateError("No elements"), A.StackTrace_current());
        return true;
      }
      return false;
    },
    $is_EventRequest: 1
  };
  A._HasNextRequest.prototype = {
    update$2(_, events, isDone) {
      this.$ti._eval$1("QueueList<Result<1>>")._as(events);
      if (!events.get$isEmpty(events)) {
        this._stream_queue$_completer.complete$1(0, true);
        return true;
      }
      if (isDone) {
        this._stream_queue$_completer.complete$1(0, false);
        return true;
      }
      return false;
    },
    $is_EventRequest: 1
  };
  A.hashObjects_closure.prototype = {
    call$2(h, i) {
      return A._combine(A._asInt(h), J.get$hashCode$(i));
    },
    $signature: 44
  };
  A.BuiltList.prototype = {
    toBuilder$0() {
      return A.ListBuilder_ListBuilder(this, this.$ti._precomputed1);
    },
    get$hashCode(_) {
      var t1 = this._list$_hashCode;
      return t1 == null ? this._list$_hashCode = A.hashObjects(this._list) : t1;
    },
    $eq(_, other) {
      var t1, t2, i, t3, t4;
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A._BuiltList))
        return false;
      t1 = other._list;
      t2 = this._list;
      if (t1.length !== t2.length)
        return false;
      if (other.get$hashCode(0) !== this.get$hashCode(0))
        return false;
      for (i = 0; t3 = t2.length, i !== t3; ++i) {
        if (!(i < t1.length))
          return A.ioore(t1, i);
        t4 = t1[i];
        if (!(i < t3))
          return A.ioore(t2, i);
        if (!J.$eq$(t4, t2[i]))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this._list, "[", "]");
    },
    get$length(_) {
      return this._list.length;
    },
    get$iterator(_) {
      var t1 = this._list;
      return new J.ArrayIterator(t1, t1.length, A._arrayInstanceType(t1)._eval$1("ArrayIterator<1>"));
    },
    map$1$1(_, f, $T) {
      var t1 = this._list,
        t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("MappedListIterable<1,2>"));
    },
    map$1(_, f) {
      return this.map$1$1(0, f, type$.dynamic);
    },
    contains$1(_, element) {
      return B.JSArray_methods.contains$1(this._list, element);
    },
    get$isEmpty(_) {
      return this._list.length === 0;
    },
    get$isNotEmpty(_) {
      return this._list.length !== 0;
    },
    take$1(_, n) {
      var t1 = this._list;
      return A.SubListIterable$(t1, 0, A.checkNotNullable(n, "count", type$.int), A._arrayInstanceType(t1)._precomputed1);
    },
    skip$1(_, n) {
      var t1 = this._list;
      return A.SubListIterable$(t1, n, null, A._arrayInstanceType(t1)._precomputed1);
    },
    get$first(_) {
      return B.JSArray_methods.get$first(this._list);
    },
    elementAt$1(_, index) {
      var t1 = this._list;
      if (!(index >= 0 && index < t1.length))
        return A.ioore(t1, index);
      return t1[index];
    },
    $isIterable: 1
  };
  A._BuiltList.prototype = {
    _list$_maybeCheckForNull$0() {
      var t1, t2, _i;
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (t1 = this._list, t2 = t1.length, _i = 0; _i < t2; ++_i)
        if (t1[_i] == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
    }
  };
  A.ListBuilder.prototype = {
    build$0() {
      var t1, t2, t3, _this = this;
      if (_this._listOwner == null) {
        t1 = _this.__ListBuilder__list_A;
        t1 === $ && A.throwLateFieldNI("_list");
        t2 = _this.$ti;
        t3 = t2._eval$1("_BuiltList<1>");
        t3 = t3._as(new A._BuiltList(t1, t3));
        _this.set$__ListBuilder__list_A(t2._eval$1("List<1>")._as(t1));
        _this.set$_listOwner(t3);
      }
      t1 = _this._listOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, iterable) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_BuiltList<1>"),
        t3 = t1._eval$1("List<1>");
      if (t2._is(iterable)) {
        t2._as(iterable);
        _this.set$__ListBuilder__list_A(t3._as(iterable._list));
        _this.set$_listOwner(iterable);
      } else {
        _this.set$__ListBuilder__list_A(t3._as(A.List_List$from(iterable, true, t1._precomputed1)));
        _this.set$_listOwner(null);
      }
    },
    get$length(_) {
      var t1 = this.__ListBuilder__list_A;
      t1 === $ && A.throwLateFieldNI("_list");
      return t1.length;
    },
    map$1(_, f) {
      var t2, t3, t4, t5, result, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      t2 = _this.__ListBuilder__list_A;
      t2 === $ && A.throwLateFieldNI("_list");
      t3 = t1._precomputed1;
      t4 = A._arrayInstanceType(t2);
      t5 = t4._eval$1("@<1>")._bind$1(t3)._eval$1("MappedListIterable<1,2>");
      result = A.List_List$of(new A.MappedListIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t5), true, t5._eval$1("ListIterable.E"));
      _this._list$_maybeCheckElements$1(result);
      _this.set$__ListBuilder__list_A(t1._eval$1("List<1>")._as(result));
      _this.set$_listOwner(null);
    },
    _list$_maybeCheckElements$1(elements) {
      var t2, _i,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = elements.length, t1 = t1._precomputed1, _i = 0; _i < t2; ++_i)
        if (t1._as(elements[_i]) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
    },
    set$__ListBuilder__list_A(__ListBuilder__list_A) {
      this.__ListBuilder__list_A = this.$ti._eval$1("List<1>")._as(__ListBuilder__list_A);
    },
    set$_listOwner(_listOwner) {
      this._listOwner = this.$ti._eval$1("_BuiltList<1>?")._as(_listOwner);
    }
  };
  A.BuiltListMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._list_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._list_multimap$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeyIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltListMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._list_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltListMultimap))
        return false;
      t1 = other._list_multimap$_map;
      t2 = _this._list_multimap$_map;
      if (t1._length !== t2._length)
        return false;
      if (other.get$hashCode(0) !== _this.get$hashCode(0))
        return false;
      for (t3 = _this.get$keys(0), t4 = t3._map, t3 = A.LinkedHashMapKeyIterator$(t4, t4._modifications, t3.$ti._precomputed1), t4 = other._emptyList, t5 = _this._emptyList; t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._list_multimap$_map);
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._list_multimap$_keys == null) {
        t1 = _this._list_multimap$_map;
        _this.set$_list_multimap$_keys(new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>")));
      }
      t1 = _this._list_multimap$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      return this._list_multimap$_map._length;
    },
    set$_list_multimap$_keys(_keys) {
      this._list_multimap$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltListMultimap_BuiltListMultimap_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltListMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._list_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltListMultimap.prototype = {
    _BuiltListMultimap$copy$2(keys, lookup, $K, $V) {
      var t1, t2, t3, key;
      for (t1 = J.get$iterator$ax(keys), t2 = this._list_multimap$_map, t3 = type$.Iterable_dynamic; t1.moveNext$0();) {
        key = t1.get$current(t1);
        if ($K._is(key))
          t2.$indexSet(0, key, A.BuiltList_BuiltList$from(t3._as(lookup.call$1(key)), $V));
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.ListMultimapBuilder.prototype = {
    build$0() {
      var t1, key, t2, t3, t4, t5, builtList, _this = this,
        _s9_ = "_builtMap";
      if (_this._list_multimap$_builtMapOwner == null) {
        t1 = _this.__ListMultimapBuilder__builderMap_A;
        t1 === $ && A.throwLateFieldNI("_builderMap");
        t1 = A.LinkedHashMapKeyIterator$(t1, t1._modifications, A._instanceType(t1)._precomputed1);
        for (; t1.moveNext$0();) {
          key = t1.__js_helper$_current;
          t2 = _this.__ListMultimapBuilder__builderMap_A.$index(0, key);
          if (t2._listOwner == null) {
            t3 = t2.__ListBuilder__list_A;
            t3 === $ && A.throwLateFieldNI("_list");
            t4 = A._instanceType(t2);
            t5 = t4._eval$1("_BuiltList<1>");
            t5 = t5._as(new A._BuiltList(t3, t5));
            t2.set$__ListBuilder__list_A(t4._eval$1("List<1>")._as(t3));
            t2.set$_listOwner(t5);
          }
          builtList = t2._listOwner;
          t2 = builtList._list.length;
          t3 = _this.__ListMultimapBuilder__builtMap_A;
          if (t2 === 0) {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.remove$1(0, key);
          } else {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.$indexSet(0, key, builtList);
          }
        }
        t1 = _this.__ListMultimapBuilder__builtMap_A;
        t1 === $ && A.throwLateFieldNI(_s9_);
        t2 = _this.$ti;
        t3 = t2._rest[1];
        _this.set$_list_multimap$_builtMapOwner(new A._BuiltListMultimap(t1, A.BuiltList_BuiltList$from(B.List_empty, t3), t2._eval$1("@<1>")._bind$1(t3)._eval$1("_BuiltListMultimap<1,2>")));
      }
      t1 = _this._list_multimap$_builtMapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, multimap) {
      this._list_multimap$_setWithCopyAndCheck$2(multimap.get$keys(multimap), new A.ListMultimapBuilder_replace_closure(multimap));
    },
    _list_multimap$_getValuesBuilder$1(key) {
      var t2, result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t2 = _this.__ListMultimapBuilder__builderMap_A;
      t2 === $ && A.throwLateFieldNI("_builderMap");
      result = t2.$index(0, key);
      if (result == null) {
        t2 = _this.__ListMultimapBuilder__builtMap_A;
        t2 === $ && A.throwLateFieldNI("_builtMap");
        builtValues = t2.$index(0, key);
        result = builtValues == null ? A.ListBuilder_ListBuilder(B.List_empty, t1._rest[1]) : A.ListBuilder_ListBuilder(builtValues, builtValues.$ti._precomputed1);
        _this.__ListMultimapBuilder__builderMap_A.$indexSet(0, key, result);
      }
      return result;
    },
    _list_multimap$_setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, t10, t11, _this = this, _null = null;
      _this.set$_list_multimap$_builtMapOwner(_null);
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltList<2>");
      t4 = t1._eval$1("Map<1,BuiltList<2>>");
      _this.set$__ListMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3)));
      _this.set$__ListMultimapBuilder__builderMap_A(t1._eval$1("Map<1,ListBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("ListBuilder<2>"))));
      for (t5 = J.get$iterator$ax(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current(t5);
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current(t7);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._list_multimap$_builtMapOwner != null) {
                t8 = _this.__ListMultimapBuilder__builtMap_A;
                t8 === $ && A.throwLateFieldNI("_builtMap");
                _this.set$__ListMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$from(t8, t2, t3)));
                _this.set$_list_multimap$_builtMapOwner(_null);
              }
              _this._list_multimap$_checkKey$1(key);
              _this._list_multimap$_checkValue$1(value);
              t8 = _this._list_multimap$_getValuesBuilder$1(key);
              t9 = t8.$ti;
              t10 = t9._precomputed1;
              t10._as(value);
              if (!$.$get$isSoundMode() && !t10._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", _null));
              if (t8._listOwner != null) {
                t11 = t8.__ListBuilder__list_A;
                t11 === $ && A.throwLateFieldNI("_list");
                t8.set$__ListBuilder__list_A(t9._eval$1("List<1>")._as(A.List_List$from(t11, true, t10)));
                t8.set$_listOwner(_null);
              }
              t8 = t8.__ListBuilder__list_A;
              t8 === $ && A.throwLateFieldNI("_list");
              B.JSArray_methods.add$1(t8, value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), _null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), _null));
      }
    },
    _list_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _list_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    },
    set$__ListMultimapBuilder__builtMap_A(__ListMultimapBuilder__builtMap_A) {
      this.__ListMultimapBuilder__builtMap_A = this.$ti._eval$1("Map<1,BuiltList<2>>")._as(__ListMultimapBuilder__builtMap_A);
    },
    set$_list_multimap$_builtMapOwner(_builtMapOwner) {
      this._list_multimap$_builtMapOwner = this.$ti._eval$1("_BuiltListMultimap<1,2>?")._as(_builtMapOwner);
    },
    set$__ListMultimapBuilder__builderMap_A(__ListMultimapBuilder__builderMap_A) {
      this.__ListMultimapBuilder__builderMap_A = this.$ti._eval$1("Map<1,ListBuilder<2>>")._as(__ListMultimapBuilder__builderMap_A);
    }
  };
  A.ListMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltMap.prototype = {
    toBuilder$0() {
      var t1 = this.$ti;
      t1._eval$1("_BuiltMap<1,2>")._as(this);
      return new A.MapBuilder(this._mapFactory, this._map$_map, this, t1._eval$1("@<1>")._bind$1(t1._rest[1])._eval$1("MapBuilder<1,2>"));
    },
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._map$_hashCode;
      if (t1 == null) {
        t1 = _this._map$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeyIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltMap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._map$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, key, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltMap))
        return false;
      t1 = other._map$_map;
      t2 = _this._map$_map;
      if (t1._length !== t2._length)
        return false;
      if (other.get$hashCode(0) !== _this.get$hashCode(0))
        return false;
      for (t3 = _this.get$keys(0), t4 = t3._map, t3 = A.LinkedHashMapKeyIterator$(t4, t4._modifications, t3.$ti._precomputed1); t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        if (!J.$eq$(t1.$index(0, key), t2.$index(0, key)))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._map$_map);
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._map$_keys == null) {
        t1 = _this._map$_map;
        _this.set$_map$_keys(new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>")));
      }
      t1 = _this._map$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      return this._map$_map._length;
    },
    map$1(_, f) {
      var t1 = type$.dynamic,
        t2 = this._map$_map;
      return new A._BuiltMap(null, t2.map$2$1(t2, this.$ti._eval$1("MapEntry<@,@>(1,2)")._as(f), t1, t1), type$._BuiltMap_dynamic_dynamic);
    },
    set$_map$_keys(_keys) {
      this._map$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltMap_BuiltMap_closure.prototype = {
    call$1(k) {
      return this.map.$index(0, k);
    },
    $signature: 1
  };
  A.BuiltMap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._map$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltMap.prototype = {
    _BuiltMap$copyAndCheckTypes$2(keys, lookup, $K, $V) {
      var t1, t2, key, value;
      for (t1 = J.get$iterator$ax(keys), t2 = this._map$_map; t1.moveNext$0();) {
        key = t1.get$current(t1);
        if ($K._is(key)) {
          value = lookup.call$1(key);
          if ($V._is(value))
            t2.$indexSet(0, key, value);
          else
            throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value), null));
        } else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), null));
      }
    }
  };
  A.MapBuilder.prototype = {
    build$0() {
      var t1, t2, _this = this;
      if (_this._mapOwner == null) {
        t1 = _this.__MapBuilder__map_A;
        t1 === $ && A.throwLateFieldNI("_map");
        t2 = _this.$ti;
        _this.set$_mapOwner(new A._BuiltMap(_this._mapFactory, t1, t2._eval$1("@<1>")._bind$1(t2._rest[1])._eval$1("_BuiltMap<1,2>")));
      }
      t1 = _this._mapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, map) {
      var _this = this,
        replacement = _this._createMap$0();
      map.forEach$1(0, new A.MapBuilder_replace_closure(_this, replacement));
      _this.$ti._eval$1("Map<1,2>")._as(replacement);
      _this.set$_mapOwner(null);
      _this.set$__MapBuilder__map_A(replacement);
    },
    $indexSet(_, key, value) {
      var t2, t3, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t1._rest[1]._as(value);
      _this._checkKey$1(key);
      _this._checkValue$1(value);
      if (_this._mapOwner != null) {
        t2 = _this._createMap$0();
        t3 = _this.__MapBuilder__map_A;
        t3 === $ && A.throwLateFieldNI("_map");
        t2.addAll$1(0, t3);
        _this.set$__MapBuilder__map_A(t1._eval$1("Map<1,2>")._as(t2));
        _this.set$_mapOwner(null);
      }
      t1 = _this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      t1.$indexSet(0, key, value);
    },
    get$length(_) {
      var t1 = this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      return t1._length;
    },
    get$_safeMap() {
      var t1, t2, _this = this;
      if (_this._mapOwner != null) {
        t1 = _this._createMap$0();
        t2 = _this.__MapBuilder__map_A;
        t2 === $ && A.throwLateFieldNI("_map");
        t1.addAll$1(0, t2);
        _this.set$__MapBuilder__map_A(_this.$ti._eval$1("Map<1,2>")._as(t1));
        _this.set$_mapOwner(null);
      }
      t1 = _this.__MapBuilder__map_A;
      t1 === $ && A.throwLateFieldNI("_map");
      return t1;
    },
    _createMap$0() {
      var t1 = this.$ti;
      return A.LinkedHashMap_LinkedHashMap$_empty(t1._precomputed1, t1._rest[1]);
    },
    _checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("null key", null));
    },
    _checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("null value", null));
    },
    set$__MapBuilder__map_A(__MapBuilder__map_A) {
      this.__MapBuilder__map_A = this.$ti._eval$1("Map<1,2>")._as(__MapBuilder__map_A);
    },
    set$_mapOwner(_mapOwner) {
      this._mapOwner = this.$ti._eval$1("_BuiltMap<1,2>?")._as(_mapOwner);
    }
  };
  A.MapBuilder_replace_closure.prototype = {
    call$2(key, value) {
      var t1 = this.$this.$ti;
      this.replacement.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value));
    },
    $signature: 9
  };
  A.BuiltSet.prototype = {
    get$hashCode(_) {
      var t2, t3, _this = this,
        t1 = _this._set$_hashCode;
      if (t1 == null) {
        t1 = _this._set$_set;
        t2 = A._instanceType(t1);
        t3 = t2._eval$1("EfficientLengthMappedIterable<1,int>");
        t3 = A.List_List$of(new A.EfficientLengthMappedIterable(t1, t2._eval$1("int(1)")._as(new A.BuiltSet_hashCode_closure(_this)), t3), false, t3._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t3);
        t3 = _this._set$_hashCode = A.hashObjects(t3);
        t1 = t3;
      }
      return t1;
    },
    $eq(_, other) {
      var t1;
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A._BuiltSet))
        return false;
      t1 = this._set$_set;
      if (other._set$_set._collection$_length !== t1._collection$_length)
        return false;
      if (other.get$hashCode(0) !== this.get$hashCode(0))
        return false;
      return t1.containsAll$1(other);
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this._set$_set, "{", "}");
    },
    get$length(_) {
      return this._set$_set._collection$_length;
    },
    get$iterator(_) {
      var t1 = this._set$_set;
      return A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1);
    },
    map$1$1(_, f, $T) {
      var t1 = this._set$_set,
        t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._bind$1($T)._eval$1("1(2)")._as(this.$ti._bind$1($T)._eval$1("1(2)")._as(f)), t2._eval$1("@<1>")._bind$1($T)._eval$1("EfficientLengthMappedIterable<1,2>"));
    },
    map$1(_, f) {
      return this.map$1$1(0, f, type$.dynamic);
    },
    contains$1(_, element) {
      return this._set$_set.contains$1(0, element);
    },
    get$isEmpty(_) {
      return this._set$_set._collection$_length === 0;
    },
    get$isNotEmpty(_) {
      return this._set$_set._collection$_length !== 0;
    },
    take$1(_, n) {
      var t1 = this._set$_set;
      return A.TakeIterable_TakeIterable(t1, n, A._instanceType(t1)._precomputed1);
    },
    skip$1(_, n) {
      var t1 = this._set$_set;
      return A.SkipIterable_SkipIterable(t1, n, A._instanceType(t1)._precomputed1);
    },
    get$first(_) {
      return this._set$_set.get$first(0);
    },
    elementAt$1(_, index) {
      return this._set$_set.elementAt$1(0, index);
    },
    $isIterable: 1
  };
  A.BuiltSet_hashCode_closure.prototype = {
    call$1(e) {
      return J.get$hashCode$(this.$this.$ti._precomputed1._as(e));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSet.prototype = {
    _maybeCheckForNull$0() {
      var t1, t2, element;
      if (!(!$.$get$isSoundMode() && !this.$ti._precomputed1._is(null)))
        return;
      for (t1 = this._set$_set, t1 = A._LinkedHashSetIterator$(t1, t1._collection$_modifications, A._instanceType(t1)._precomputed1), t2 = t1.$ti._precomputed1; t1.moveNext$0();) {
        element = t1._collection$_current;
        if ((element == null ? t2._as(element) : element) == null)
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: null", null));
      }
    }
  };
  A.SetBuilder.prototype = {
    build$0() {
      var t1, _this = this;
      if (_this._setOwner == null) {
        t1 = _this.__SetBuilder__set_A;
        t1 === $ && A.throwLateFieldNI("_set");
        _this.set$_setOwner(new A._BuiltSet(_this._setFactory, t1, _this.$ti._eval$1("_BuiltSet<1>")));
      }
      t1 = _this._setOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, iterable) {
      var t1, t2, t3, element, _this = this,
        set = _this._createSet$0();
      for (t1 = J.get$iterator$ax(iterable), t2 = _this.$ti, t3 = t2._precomputed1; t1.moveNext$0();) {
        element = t1.get$current(t1);
        if (t3._is(element))
          set.add$1(0, element);
        else
          throw A.wrapException(A.ArgumentError$("iterable contained invalid element: " + A.S(element), null));
      }
      t2._eval$1("Set<1>")._as(set);
      _this.set$_setOwner(null);
      _this.set$__SetBuilder__set_A(set);
    },
    get$length(_) {
      var t1 = this.__SetBuilder__set_A;
      t1 === $ && A.throwLateFieldNI("_set");
      return t1._collection$_length;
    },
    map$1(_, f) {
      var result, t2, t3, t4, _this = this,
        t1 = _this.$ti;
      t1._eval$1("1(1)")._as(f);
      result = _this._createSet$0();
      t2 = _this.__SetBuilder__set_A;
      t2 === $ && A.throwLateFieldNI("_set");
      t3 = t1._precomputed1;
      t4 = A._instanceType(t2);
      result.addAll$1(0, new A.EfficientLengthMappedIterable(t2, t4._bind$1(t3)._eval$1("1(2)")._as(f), t4._eval$1("@<1>")._bind$1(t3)._eval$1("EfficientLengthMappedIterable<1,2>")));
      _this._maybeCheckElements$1(result);
      t1._eval$1("Set<1>")._as(result);
      _this.set$_setOwner(null);
      _this.set$__SetBuilder__set_A(result);
    },
    get$_safeSet() {
      var t1, t2, _this = this;
      if (_this._setOwner != null) {
        t1 = _this._createSet$0();
        t2 = _this.__SetBuilder__set_A;
        t2 === $ && A.throwLateFieldNI("_set");
        t1.addAll$1(0, t2);
        _this.set$__SetBuilder__set_A(_this.$ti._eval$1("Set<1>")._as(t1));
        _this.set$_setOwner(null);
      }
      t1 = _this.__SetBuilder__set_A;
      t1 === $ && A.throwLateFieldNI("_set");
      return t1;
    },
    _createSet$0() {
      return A.LinkedHashSet_LinkedHashSet$_empty(this.$ti._precomputed1);
    },
    _maybeCheckElements$1(elements) {
      var t2, t3, element,
        t1 = this.$ti;
      t1._eval$1("Iterable<1>")._as(elements);
      if (!(!$.$get$isSoundMode() && !t1._precomputed1._is(null)))
        return;
      for (t2 = A._LinkedHashSetIterator$(elements, elements._collection$_modifications, A._instanceType(elements)._precomputed1), t1 = t1._precomputed1, t3 = t2.$ti._precomputed1; t2.moveNext$0();) {
        element = t2._collection$_current;
        if (t1._as(element == null ? t3._as(element) : element) == null)
          A.throwExpression(A.ArgumentError$("null element", null));
      }
    },
    set$__SetBuilder__set_A(__SetBuilder__set_A) {
      this.__SetBuilder__set_A = this.$ti._eval$1("Set<1>")._as(__SetBuilder__set_A);
    },
    set$_setOwner(_setOwner) {
      this._setOwner = this.$ti._eval$1("_BuiltSet<1>?")._as(_setOwner);
    }
  };
  A.BuiltSetMultimap.prototype = {
    get$hashCode(_) {
      var t2, _this = this,
        t1 = _this._set_multimap$_hashCode;
      if (t1 == null) {
        t1 = _this._set_multimap$_map;
        t2 = A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>");
        t2 = A.MappedIterable_MappedIterable(new A.LinkedHashMapKeyIterable(t1, t2), t2._eval$1("int(Iterable.E)")._as(new A.BuiltSetMultimap_hashCode_closure(_this)), t2._eval$1("Iterable.E"), type$.int);
        t2 = A.List_List$of(t2, false, A._instanceType(t2)._eval$1("Iterable.E"));
        B.JSArray_methods.sort$0(t2);
        t2 = _this._set_multimap$_hashCode = A.hashObjects(t2);
        t1 = t2;
      }
      return t1;
    },
    $eq(_, other) {
      var t1, t2, t3, t4, t5, key, result, t6, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A._BuiltSetMultimap))
        return false;
      t1 = other._set_multimap$_map;
      t2 = _this._set_multimap$_map;
      if (t1._length !== t2._length)
        return false;
      if (other.get$hashCode(0) !== _this.get$hashCode(0))
        return false;
      for (t3 = _this.get$keys(0), t4 = t3._map, t3 = A.LinkedHashMapKeyIterator$(t4, t4._modifications, t3.$ti._precomputed1), t4 = other._emptySet, t5 = _this._emptySet; t3.moveNext$0();) {
        key = t3.__js_helper$_current;
        result = t1.$index(0, key);
        t6 = result == null ? t4 : result;
        result = t2.$index(0, key);
        if (!t6.$eq(0, result == null ? t5 : result))
          return false;
      }
      return true;
    },
    toString$0(_) {
      return A.MapBase_mapToString(this._set_multimap$_map);
    },
    get$keys(_) {
      var t1, _this = this;
      if (_this._set_multimap$_keys == null) {
        t1 = _this._set_multimap$_map;
        _this.set$_set_multimap$_keys(new A.LinkedHashMapKeyIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeyIterable<1>")));
      }
      t1 = _this._set_multimap$_keys;
      t1.toString;
      return t1;
    },
    get$length(_) {
      return this._set_multimap$_map._length;
    },
    set$_set_multimap$_keys(_keys) {
      this._set_multimap$_keys = this.$ti._eval$1("Iterable<1>?")._as(_keys);
    }
  };
  A.BuiltSetMultimap_hashCode_closure.prototype = {
    call$1(key) {
      var t2,
        t1 = this.$this;
      t1.$ti._precomputed1._as(key);
      t2 = J.get$hashCode$(key);
      t1 = J.get$hashCode$(t1._set_multimap$_map.$index(0, key));
      return A._finish(A._combine(A._combine(0, B.JSInt_methods.get$hashCode(t2)), B.JSInt_methods.get$hashCode(t1)));
    },
    $signature() {
      return this.$this.$ti._eval$1("int(1)");
    }
  };
  A._BuiltSetMultimap.prototype = {};
  A.SetMultimapBuilder.prototype = {
    build$0() {
      var t1, key, t2, t3, t4, builtSet, _this = this,
        _s9_ = "_builtMap";
      if (_this._builtMapOwner == null) {
        t1 = _this.__SetMultimapBuilder__builderMap_A;
        t1 === $ && A.throwLateFieldNI("_builderMap");
        t1 = A.LinkedHashMapKeyIterator$(t1, t1._modifications, A._instanceType(t1)._precomputed1);
        for (; t1.moveNext$0();) {
          key = t1.__js_helper$_current;
          t2 = _this.__SetMultimapBuilder__builderMap_A.$index(0, key);
          if (t2._setOwner == null) {
            t3 = t2._setFactory;
            t4 = t2.__SetBuilder__set_A;
            t4 === $ && A.throwLateFieldNI("_set");
            t2.set$_setOwner(new A._BuiltSet(t3, t4, A._instanceType(t2)._eval$1("_BuiltSet<1>")));
          }
          builtSet = t2._setOwner;
          t2 = builtSet._set$_set._collection$_length;
          t3 = _this.__SetMultimapBuilder__builtMap_A;
          if (t2 === 0) {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.remove$1(0, key);
          } else {
            t3 === $ && A.throwLateFieldNI(_s9_);
            t3.$indexSet(0, key, builtSet);
          }
        }
        t1 = _this.__SetMultimapBuilder__builtMap_A;
        t1 === $ && A.throwLateFieldNI(_s9_);
        t2 = _this.$ti;
        t3 = t2._rest[1];
        _this.set$_builtMapOwner(new A._BuiltSetMultimap(t1, A.BuiltSet_BuiltSet$from(B.List_empty, t3), t2._eval$1("@<1>")._bind$1(t3)._eval$1("_BuiltSetMultimap<1,2>")));
      }
      t1 = _this._builtMapOwner;
      t1.toString;
      return t1;
    },
    replace$1(_, multimap) {
      this._setWithCopyAndCheck$2(multimap.get$keys(multimap), new A.SetMultimapBuilder_replace_closure(multimap));
    },
    _getValuesBuilder$1(key) {
      var t2, result, builtValues, _this = this,
        t1 = _this.$ti;
      t1._precomputed1._as(key);
      t2 = _this.__SetMultimapBuilder__builderMap_A;
      t2 === $ && A.throwLateFieldNI("_builderMap");
      result = t2.$index(0, key);
      if (result == null) {
        t2 = _this.__SetMultimapBuilder__builtMap_A;
        t2 === $ && A.throwLateFieldNI("_builtMap");
        builtValues = t2.$index(0, key);
        if (builtValues == null)
          result = A.SetBuilder_SetBuilder(t1._rest[1]);
        else {
          t1 = builtValues.$ti;
          t1._eval$1("_BuiltSet<1>")._as(builtValues);
          result = new A.SetBuilder(builtValues._setFactory, builtValues._set$_set, builtValues, t1._eval$1("SetBuilder<1>"));
        }
        _this.__SetMultimapBuilder__builderMap_A.$indexSet(0, key, result);
      }
      return result;
    },
    _setWithCopyAndCheck$2(keys, lookup) {
      var t1, t2, t3, t4, t5, t6, key, t7, value, t8, t9, _this = this, _null = null;
      _this.set$_builtMapOwner(_null);
      t1 = _this.$ti;
      t2 = t1._precomputed1;
      t3 = t1._eval$1("BuiltSet<2>");
      t4 = t1._eval$1("Map<1,BuiltSet<2>>");
      _this.set$__SetMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t3)));
      _this.set$__SetMultimapBuilder__builderMap_A(t1._eval$1("Map<1,SetBuilder<2>>")._as(A.LinkedHashMap_LinkedHashMap$_empty(t2, t1._eval$1("SetBuilder<2>"))));
      for (t5 = J.get$iterator$ax(keys), t6 = type$.Iterable_dynamic, t1 = t1._rest[1]; t5.moveNext$0();) {
        key = t5.get$current(t5);
        if (t2._is(key))
          for (t7 = J.get$iterator$ax(t6._as(lookup.call$1(key))); t7.moveNext$0();) {
            value = t7.get$current(t7);
            if (t1._is(value)) {
              t2._as(key);
              t1._as(value);
              if (_this._builtMapOwner != null) {
                t8 = _this.__SetMultimapBuilder__builtMap_A;
                t8 === $ && A.throwLateFieldNI("_builtMap");
                _this.set$__SetMultimapBuilder__builtMap_A(t4._as(A.LinkedHashMap_LinkedHashMap$from(t8, t2, t3)));
                _this.set$_builtMapOwner(_null);
              }
              _this._set_multimap$_checkKey$1(key);
              _this._set_multimap$_checkValue$1(value);
              t8 = _this._getValuesBuilder$1(key);
              t9 = t8.$ti._precomputed1;
              t9._as(value);
              if (!$.$get$isSoundMode() && !t9._is(null))
                if (value == null)
                  A.throwExpression(A.ArgumentError$("null element", _null));
              t8.get$_safeSet().add$1(0, value);
            } else
              throw A.wrapException(A.ArgumentError$("map contained invalid value: " + A.S(value) + ", for key " + A.S(key), _null));
          }
        else
          throw A.wrapException(A.ArgumentError$("map contained invalid key: " + A.S(key), _null));
      }
    },
    _set_multimap$_checkKey$1(key) {
      var t1 = this.$ti._precomputed1;
      t1._as(key);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (key == null)
        throw A.wrapException(A.ArgumentError$("invalid key: " + A.S(key), null));
    },
    _set_multimap$_checkValue$1(value) {
      var t1 = this.$ti._rest[1];
      t1._as(value);
      if ($.$get$isSoundMode())
        return;
      if (t1._is(null))
        return;
      if (value == null)
        throw A.wrapException(A.ArgumentError$("invalid value: " + A.S(value), null));
    },
    set$__SetMultimapBuilder__builtMap_A(__SetMultimapBuilder__builtMap_A) {
      this.__SetMultimapBuilder__builtMap_A = this.$ti._eval$1("Map<1,BuiltSet<2>>")._as(__SetMultimapBuilder__builtMap_A);
    },
    set$_builtMapOwner(_builtMapOwner) {
      this._builtMapOwner = this.$ti._eval$1("_BuiltSetMultimap<1,2>?")._as(_builtMapOwner);
    },
    set$__SetMultimapBuilder__builderMap_A(__SetMultimapBuilder__builderMap_A) {
      this.__SetMultimapBuilder__builderMap_A = this.$ti._eval$1("Map<1,SetBuilder<2>>")._as(__SetMultimapBuilder__builderMap_A);
    }
  };
  A.SetMultimapBuilder_replace_closure.prototype = {
    call$1(k) {
      return this.multimap.$index(0, k);
    },
    $signature: 1
  };
  A.EnumClass.prototype = {
    toString$0(_) {
      return this.name;
    }
  };
  A.newBuiltValueToStringHelper_closure.prototype = {
    call$1(className) {
      var t1 = new A.StringBuffer(""),
        t2 = "" + className;
      t1._contents = t2;
      t1._contents = t2 + " {\n";
      $._indentingBuiltValueToStringHelperIndent = $._indentingBuiltValueToStringHelperIndent + 2;
      return new A.IndentingBuiltValueToStringHelper(t1);
    },
    $signature: 45
  };
  A.IndentingBuiltValueToStringHelper.prototype = {
    add$2(_, field, value) {
      var t1, t2;
      if (value != null) {
        t1 = this._result;
        t1.toString;
        t2 = t1._contents += B.JSString_methods.$mul(" ", $._indentingBuiltValueToStringHelperIndent);
        t2 += field;
        t1._contents = t2;
        t1._contents = t2 + "=";
        t2 = t1._contents += A.S(value);
        t1._contents = t2 + ",\n";
      }
    },
    toString$0(_) {
      var t2, stringResult,
        t1 = $._indentingBuiltValueToStringHelperIndent - 2;
      $._indentingBuiltValueToStringHelperIndent = t1;
      t2 = this._result;
      t2.toString;
      t1 = t2._contents += B.JSString_methods.$mul(" ", t1);
      t2._contents = t1 + "}";
      stringResult = J.toString$0$(this._result);
      this._result = null;
      return stringResult;
    }
  };
  A.BuiltValueNullFieldError.prototype = {
    toString$0(_) {
      return 'Tried to construct class "' + this.type + '" with null for non-nullable field "' + this.field + '".';
    }
  };
  A.BuiltValueNestedFieldError.prototype = {
    toString$0(_) {
      return 'Tried to build class "' + this.type + '" but nested builder for field "' + this.field + '" threw: ' + this.error;
    }
  };
  A.JsonObject.prototype = {
    toString$0(_) {
      return J.toString$0$(this.get$value(this));
    }
  };
  A.BoolJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.BoolJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSBool_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.ListJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.ListJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.MapJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.MapJsonObject))
        return false;
      return B.C_DeepCollectionEquality.equals$2(this.value, other.value);
    },
    get$hashCode(_) {
      return B.C_DeepCollectionEquality.hash$1(0, this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.NumJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.NumJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSNumber_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.StringJsonObject.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      if (!(other instanceof A.StringJsonObject))
        return false;
      return this.value === other.value;
    },
    get$hashCode(_) {
      return B.JSString_methods.get$hashCode(this.value);
    },
    get$value(receiver) {
      return this.value;
    }
  };
  A.Serializers_Serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty, type$.Object);
    },
    $signature: 46
  };
  A.Serializers_Serializers_closure0.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.ListMultimapBuilder_ListMultimapBuilder(t1, t1);
    },
    $signature: 47
  };
  A.Serializers_Serializers_closure1.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.MapBuilder_MapBuilder(t1, t1);
    },
    $signature: 48
  };
  A.Serializers_Serializers_closure2.prototype = {
    call$0() {
      return A.SetBuilder_SetBuilder(type$.Object);
    },
    $signature: 99
  };
  A.Serializers_Serializers_closure3.prototype = {
    call$0() {
      var t1 = type$.Object;
      return A.SetMultimapBuilder_SetMultimapBuilder(t1, t1);
    },
    $signature: 50
  };
  A.FullType.prototype = {
    $eq(_, other) {
      var t1, t2, t3, t4, i, t5, _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      if (!(other instanceof A.FullType))
        return false;
      if (_this.root != other.root)
        return false;
      if (_this.nullable !== other.nullable)
        return false;
      t1 = _this.parameters;
      t2 = t1.length;
      t3 = other.parameters;
      t4 = t3.length;
      if (t2 !== t4)
        return false;
      for (i = 0; i !== t2; ++i) {
        if (!(i < t2))
          return A.ioore(t1, i);
        t5 = t1[i];
        if (!(i < t4))
          return A.ioore(t3, i);
        if (!t5.$eq(0, t3[i]))
          return false;
      }
      return true;
    },
    get$hashCode(_) {
      var t1 = A.hashObjects(this.parameters);
      t1 = A._finish(A._combine(A._combine(0, J.get$hashCode$(this.root)), B.JSInt_methods.get$hashCode(t1)));
      return t1 ^ (this.nullable ? 1768878041 : 0);
    },
    toString$0(_) {
      var t2,
        t1 = this.root;
      if (t1 == null)
        t1 = "unspecified";
      else {
        t2 = this.parameters;
        t1 = t2.length === 0 ? A.FullType__getRawName(t1) : A.FullType__getRawName(t1) + "<" + B.JSArray_methods.join$1(t2, ", ") + ">";
        t1 += this.nullable ? "?" : "";
      }
      return t1;
    }
  };
  A.DeserializationError.prototype = {
    toString$0(_) {
      return "Deserializing to '" + this.type.toString$0(0) + "' failed due to: " + this.error.toString$0(0);
    }
  };
  A.BigIntSerializer.prototype = {
    serialize$3$specifiedType(serializers, bigInt, specifiedType) {
      return type$.BigInt._as(bigInt).toString$0(0);
    },
    serialize$2(serializers, bigInt) {
      return this.serialize$3$specifiedType(serializers, bigInt, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var result;
      A._asString(serialized);
      result = A._BigIntImpl__tryParse(serialized, null);
      if (result == null)
        A.throwExpression(A.FormatException$("Could not parse BigInt", serialized, null));
      return result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "BigInt";
    }
  };
  A.BoolSerializer.prototype = {
    serialize$3$specifiedType(serializers, boolean, specifiedType) {
      return A._asBool(boolean);
    },
    serialize$2(serializers, boolean) {
      return this.serialize$3$specifiedType(serializers, boolean, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asBool(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "bool";
    }
  };
  A.BuiltJsonSerializers.prototype = {
    serialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, t4, transformedObject, t5, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1), t3 = t2._eval$1("ArrayIterator<1>"), t4 = new J.ArrayIterator(t1, t1.length, t3), t2 = t2._precomputed1, transformedObject = object; t4.moveNext$0();) {
        t5 = t4.__interceptors$_current;
        transformedObject = (t5 == null ? t2._as(t5) : t5).beforeSerialize$2(transformedObject, specifiedType);
      }
      result = this._serialize$2(transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t3); t1.moveNext$0();) {
        t3 = t1.__interceptors$_current;
        result = (t3 == null ? t2._as(t3) : t3).afterSerialize$2(result, specifiedType);
      }
      return result;
    },
    serialize$1(object) {
      return this.serialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _serialize$2(object, specifiedType) {
      var serializer, result, _this = this,
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        t1 = J.getInterceptor$(object);
        serializer = _this.serializerForType$1(t1.get$runtimeType(object));
        if (serializer == null)
          throw A.wrapException(A.StateError$("No serializer for '" + t1.get$runtimeType(object).toString$0(0) + "'."));
        if (type$.StructuredSerializer_dynamic._is(serializer)) {
          result = [serializer.get$wireName()];
          B.JSArray_methods.addAll$1(result, serializer.serialize$2(_this, object));
          return result;
        } else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? [serializer.get$wireName(), null] : A._setArrayType([serializer.get$wireName(), serializer.serialize$2(_this, object)], type$.JSArray_Object);
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer = _this.serializerForType$1(t1);
        if (serializer == null)
          return _this.serialize$1(object);
        if (type$.StructuredSerializer_dynamic._is(serializer))
          return object == null ? null : J.toList$0$ax(serializer.serialize$3$specifiedType(_this, object, specifiedType));
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          return object == null ? null : serializer.serialize$3$specifiedType(_this, object, specifiedType);
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    deserialize$2$specifiedType(object, specifiedType) {
      var t1, t2, t3, t4, transformedObject, t5, result;
      for (t1 = this.serializerPlugins._list, t2 = A._arrayInstanceType(t1), t3 = t2._eval$1("ArrayIterator<1>"), t4 = new J.ArrayIterator(t1, t1.length, t3), t2 = t2._precomputed1, transformedObject = object; t4.moveNext$0();) {
        t5 = t4.__interceptors$_current;
        transformedObject = (t5 == null ? t2._as(t5) : t5).beforeDeserialize$2(transformedObject, specifiedType);
      }
      result = this._deserialize$3(object, transformedObject, specifiedType);
      for (t1 = new J.ArrayIterator(t1, t1.length, t3); t1.moveNext$0();) {
        t3 = t1.__interceptors$_current;
        result = (t3 == null ? t2._as(t3) : t3).afterDeserialize$2(result, specifiedType);
      }
      return result;
    },
    deserialize$1(object) {
      return this.deserialize$2$specifiedType(object, B.FullType_null_List_empty_false);
    },
    _deserialize$3(objectBeforePlugins, object, specifiedType) {
      var serializer, error, primitive, error0, serializer0, error1, error2, wireName, exception, _this = this,
        _s19_ = "No serializer for '",
        _s62_ = string$.serial,
        t1 = specifiedType.root;
      if (t1 == null) {
        type$.List_nullable_Object._as(object);
        t1 = J.getInterceptor$ax(object);
        wireName = A._asString(t1.get$first(object));
        serializer = _this._wireNameToSerializer._map$_map.$index(0, wireName);
        if (serializer == null)
          throw A.wrapException(A.StateError$(_s19_ + wireName + "'."));
        if (type$.StructuredSerializer_dynamic._is(serializer))
          try {
            t1 = serializer.deserialize$2(_this, t1.sublist$1(object, 1));
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer))
          try {
            primitive = t1.$index(object, 1);
            t1 = primitive == null ? null : serializer.deserialize$2(_this, primitive);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error0 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error0));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      } else {
        serializer0 = _this.serializerForType$1(t1);
        if (serializer0 == null)
          if (type$.List_dynamic._is(object) && typeof J.get$first$ax(object) == "string")
            return _this.deserialize$1(objectBeforePlugins);
          else
            throw A.wrapException(A.StateError$(_s19_ + t1.toString$0(0) + "'."));
        if (type$.StructuredSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, type$.Iterable_nullable_Object._as(object), specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error1 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error1));
            } else
              throw exception;
          }
        else if (type$.PrimitiveSerializer_dynamic._is(serializer0))
          try {
            t1 = object == null ? null : serializer0.deserialize$3$specifiedType(_this, object, specifiedType);
            return t1;
          } catch (exception) {
            t1 = A.unwrapException(exception);
            if (type$.Error._is(t1)) {
              error2 = t1;
              throw A.wrapException(A.DeserializationError_DeserializationError(object, specifiedType, error2));
            } else
              throw exception;
          }
        else
          throw A.wrapException(A.StateError$(_s62_));
      }
    },
    serializerForType$1(type) {
      var t1 = this._typeToSerializer._map$_map.$index(0, type);
      return t1 == null ? this._typeNameToSerializer._map$_map.$index(0, A._getRawName(type)) : t1;
    },
    newBuilder$1(fullType) {
      var t1,
        builderFactory = this.builderFactories._map$_map.$index(0, fullType);
      if (builderFactory == null)
        this._throwMissingBuilderFactory$1(fullType);
      t1 = builderFactory.call$0();
      return t1 == null ? type$.Object._as(t1) : t1;
    },
    _throwMissingBuilderFactory$1(fullType) {
      throw A.wrapException(A.StateError$("No builder factory for " + fullType.toString$0(0) + ". Fix by adding one, see SerializersBuilder.addBuilderFactory."));
    },
    $isSerializers: 1
  };
  A.BuiltJsonSerializersBuilder.prototype = {
    add$1(_, serializer) {
      var t1, t2, t3, t4, t5, t6, $name, genericsStart, t7;
      if (!type$.StructuredSerializer_dynamic._is(serializer) && !type$.PrimitiveSerializer_dynamic._is(serializer))
        throw A.wrapException(A.ArgumentError$(string$.serial, null));
      this._wireNameToSerializer.$indexSet(0, serializer.get$wireName(), serializer);
      for (t1 = J.get$iterator$ax(serializer.get$types(serializer)), t2 = this._typeToSerializer, t3 = t2.$ti, t4 = t3._precomputed1, t3 = t3._rest[1], t5 = this._typeNameToSerializer; t1.moveNext$0();) {
        t6 = t1.get$current(t1);
        t4._as(t6);
        t3._as(serializer);
        t2._checkKey$1(t6);
        t2._checkValue$1(serializer);
        t2.get$_safeMap().$indexSet(0, t6, serializer);
        $name = t6.toString$0(0);
        genericsStart = B.JSString_methods.indexOf$1($name, "<");
        t6 = genericsStart === -1 ? $name : B.JSString_methods.substring$2($name, 0, genericsStart);
        t7 = t5.$ti;
        t7._precomputed1._as(t6);
        t7._rest[1]._as(serializer);
        t5._checkKey$1(t6);
        t5._checkValue$1(serializer);
        t5.get$_safeMap().$indexSet(0, t6, serializer);
      }
    },
    addBuilderFactory$2(types, $function) {
      var t2, t3,
        t1 = this._builderFactories;
      t1.$indexSet(0, types, $function);
      t2 = types.root;
      t3 = types.parameters;
      t1.$indexSet(0, !types.nullable ? new A.FullType(t2, t3, true) : new A.FullType(t2, t3, false), $function);
    },
    build$0() {
      var _this = this;
      return new A.BuiltJsonSerializers(_this._typeToSerializer.build$0(), _this._wireNameToSerializer.build$0(), _this._typeNameToSerializer.build$0(), _this._builderFactories.build$0(), _this._plugins.build$0());
    }
  };
  A.BuiltListMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtListMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltListMultimap_dynamic_dynamic._as(builtListMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtListMultimap.get$keys(0), t2 = t1._map, t1 = A.LinkedHashMapKeyIterator$(t2, t2._modifications, t1.$ti._precomputed1), t2 = builtListMultimap._list_multimap$_map, t3 = builtListMultimap._emptyList; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._list;
        t6 = A._arrayInstanceType(t5);
        t7 = t6._eval$1("MappedListIterable<1,Object?>");
        result.push(A.List_List$of(new A.MappedListIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltListMultimapSerializer_serialize_closure(serializers, valueType))), t7), true, t7._eval$1("ListIterable.E")));
      }
      return result;
    },
    serialize$2(serializers, builtListMultimap) {
      return this.serialize$3$specifiedType(serializers, builtListMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, t5, t6, t7, i, key, values, t8, value, t9, t10, t11, t12, _null = null,
        t1 = type$.Iterable_nullable_Object;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.ListMultimapBuilder_ListMultimapBuilder(t2, t2);
      } else
        result = type$.ListMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", _null));
      for (t3 = result.$ti, t4 = t3._precomputed1, t5 = t3._rest[1], t6 = t3._eval$1("BuiltList<2>"), t3 = t3._eval$1("Map<1,BuiltList<2>>"), t7 = type$.nullable_Object, i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        values = J.map$1$1$ax(t1._as(t2.elementAt$1(serialized, i + 1)), new A.BuiltListMultimapSerializer_deserialize_closure(serializers, valueType), t7);
        for (t8 = values.get$iterator(values); t8.moveNext$0();) {
          value = t8.get$current(t8);
          t4._as(key);
          t5._as(value);
          if (result._list_multimap$_builtMapOwner != null) {
            t9 = result.__ListMultimapBuilder__builtMap_A;
            t9 === $ && A.throwLateFieldNI("_builtMap");
            result.set$__ListMultimapBuilder__builtMap_A(t3._as(A.LinkedHashMap_LinkedHashMap$from(t9, t4, t6)));
            result.set$_list_multimap$_builtMapOwner(_null);
          }
          result._list_multimap$_checkKey$1(key);
          result._list_multimap$_checkValue$1(value);
          t9 = result._list_multimap$_getValuesBuilder$1(key);
          t10 = t9.$ti;
          t11 = t10._precomputed1;
          t11._as(value);
          if (!$.$get$isSoundMode() && !t11._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", _null));
          if (t9._listOwner != null) {
            t12 = t9.__ListBuilder__list_A;
            t12 === $ && A.throwLateFieldNI("_list");
            t9.set$__ListBuilder__list_A(t10._eval$1("List<1>")._as(A.List_List$from(t12, true, t11)));
            t9.set$_listOwner(_null);
          }
          t9 = t9.__ListBuilder__list_A;
          t9 === $ && A.throwLateFieldNI("_list");
          B.JSArray_methods.add$1(t9, value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "listMultimap";
    }
  };
  A.BuiltListMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 2
  };
  A.BuiltListMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 34
  };
  A.BuiltListSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtList, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltList_dynamic._as(builtList);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      t1 = builtList._list;
      t2 = A._arrayInstanceType(t1);
      return new A.MappedListIterable(t1, t2._eval$1("Object?(1)")._as(builtList.$ti._eval$1("Object?(1)")._as(new A.BuiltListSerializer_serialize_closure(serializers, elementType))), t2._eval$1("MappedListIterable<1,Object?>"));
    },
    serialize$2(serializers, builtList) {
      return this.serialize$3$specifiedType(serializers, builtList, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.ListBuilder_ListBuilder(B.List_empty, type$.Object) : type$.ListBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new A.BuiltListSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "list";
    }
  };
  A.BuiltListSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.BuiltListSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.BuiltMapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtMap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key;
      type$.BuiltMap_dynamic_dynamic._as(builtMap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtMap.get$keys(0), t2 = t1._map, t1 = A.LinkedHashMapKeyIterator$(t2, t2._modifications, t1.$ti._precomputed1), t2 = builtMap._map$_map; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result.push(serializers.serialize$2$specifiedType(t2.$index(0, key), valueType));
      }
      return result;
    },
    serialize$2(serializers, builtMap) {
      return this.serialize$3$specifiedType(serializers, builtMap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, t3, keyType, valueType, result, i, key, value;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      if (isUnderspecified) {
        t1 = type$.Object;
        result = A.MapBuilder_MapBuilder(t1, t1);
      } else
        result = type$.MapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t1 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t1.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (t2 = result.$ti, t3 = t2._precomputed1, t2 = t2._rest[1], i = 0; i !== t1.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i), keyType);
        value = serializers.deserialize$2$specifiedType(t1.elementAt$1(serialized, i + 1), valueType);
        t3._as(key);
        t2._as(value);
        result._checkKey$1(key);
        result._checkValue$1(value);
        result.get$_safeMap().$indexSet(0, key, value);
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "map";
    }
  };
  A.BuiltSetMultimapSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSetMultimap, specifiedType) {
      var t1, t2, t3, keyType, valueType, result, key, result0, t4, t5, t6, t7;
      type$.BuiltSetMultimap_dynamic_dynamic._as(builtSetMultimap);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      t3 = t2 === 0;
      if (t3)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        keyType = t1[0];
      }
      if (t3)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t2)
          return A.ioore(t1, 1);
        valueType = t1[1];
      }
      result = [];
      for (t1 = builtSetMultimap.get$keys(0), t2 = t1._map, t1 = A.LinkedHashMapKeyIterator$(t2, t2._modifications, t1.$ti._precomputed1), t2 = builtSetMultimap._set_multimap$_map, t3 = builtSetMultimap._emptySet; t1.moveNext$0();) {
        key = t1.__js_helper$_current;
        result.push(serializers.serialize$2$specifiedType(key, keyType));
        result0 = t2.$index(0, key);
        t4 = result0 == null ? t3 : result0;
        t5 = t4._set$_set;
        t6 = A._instanceType(t5);
        t7 = t6._eval$1("EfficientLengthMappedIterable<1,Object?>");
        result.push(A.List_List$of(new A.EfficientLengthMappedIterable(t5, t6._eval$1("Object?(1)")._as(t4.$ti._eval$1("Object?(1)")._as(new A.BuiltSetMultimapSerializer_serialize_closure(serializers, valueType))), t7), true, t7._eval$1("Iterable.E")));
      }
      return result;
    },
    serialize$2(serializers, builtSetMultimap) {
      return this.serialize$3$specifiedType(serializers, builtSetMultimap, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t2, t3, t4, keyType, valueType, result, t5, t6, i, key, t7, value, t8, t9,
        t1 = type$.Iterable_dynamic;
      t1._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t2 = specifiedType.parameters;
      t3 = t2.length;
      t4 = t3 === 0;
      if (t4)
        keyType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t3)
          return A.ioore(t2, 0);
        keyType = t2[0];
      }
      if (t4)
        valueType = B.FullType_null_List_empty_false;
      else {
        if (1 >= t3)
          return A.ioore(t2, 1);
        valueType = t2[1];
      }
      if (isUnderspecified) {
        t2 = type$.Object;
        result = A.SetMultimapBuilder_SetMultimapBuilder(t2, t2);
      } else
        result = type$.SetMultimapBuilder_dynamic_dynamic._as(serializers.newBuilder$1(specifiedType));
      t2 = J.getInterceptor$asx(serialized);
      if (B.JSInt_methods.$mod(t2.get$length(serialized), 2) === 1)
        throw A.wrapException(A.ArgumentError$("odd length", null));
      for (t3 = result.$ti, t4 = t3._precomputed1, t5 = t3._rest[1], t6 = t3._eval$1("BuiltSet<2>"), t3 = t3._eval$1("Map<1,BuiltSet<2>>"), i = 0; i !== t2.get$length(serialized); i += 2) {
        key = serializers.deserialize$2$specifiedType(t2.elementAt$1(serialized, i), keyType);
        for (t7 = J.get$iterator$ax(t1._as(J.map$1$ax(t2.elementAt$1(serialized, i + 1), new A.BuiltSetMultimapSerializer_deserialize_closure(serializers, valueType)))); t7.moveNext$0();) {
          value = t7.get$current(t7);
          t4._as(key);
          t5._as(value);
          if (result._builtMapOwner != null) {
            t8 = result.__SetMultimapBuilder__builtMap_A;
            t8 === $ && A.throwLateFieldNI("_builtMap");
            result.set$__SetMultimapBuilder__builtMap_A(t3._as(A.LinkedHashMap_LinkedHashMap$from(t8, t4, t6)));
            result.set$_builtMapOwner(null);
          }
          result._set_multimap$_checkKey$1(key);
          result._set_multimap$_checkValue$1(value);
          t8 = result._getValuesBuilder$1(key);
          t9 = t8.$ti._precomputed1;
          t9._as(value);
          if (!$.$get$isSoundMode() && !t9._is(null))
            if (value == null)
              A.throwExpression(A.ArgumentError$("null element", null));
          t8.get$_safeSet().add$1(0, value);
        }
      }
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "setMultimap";
    }
  };
  A.BuiltSetMultimapSerializer_serialize_closure.prototype = {
    call$1(value) {
      return this.serializers.serialize$2$specifiedType(value, this.valueType);
    },
    $signature: 2
  };
  A.BuiltSetMultimapSerializer_deserialize_closure.prototype = {
    call$1(value) {
      return this.serializers.deserialize$2$specifiedType(value, this.valueType);
    },
    $signature: 2
  };
  A.BuiltSetSerializer.prototype = {
    serialize$3$specifiedType(serializers, builtSet, specifiedType) {
      var t1, t2, elementType;
      type$.BuiltSet_dynamic._as(builtSet);
      if (!(specifiedType.root == null || specifiedType.parameters.length === 0))
        if (!serializers.builderFactories._map$_map.containsKey$1(0, specifiedType))
          serializers._throwMissingBuilderFactory$1(specifiedType);
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      t1 = builtSet._set$_set;
      t2 = A._instanceType(t1);
      return new A.EfficientLengthMappedIterable(t1, t2._eval$1("Object?(1)")._as(builtSet.$ti._eval$1("Object?(1)")._as(new A.BuiltSetSerializer_serialize_closure(serializers, elementType))), t2._eval$1("EfficientLengthMappedIterable<1,Object?>"));
    },
    serialize$2(serializers, builtSet) {
      return this.serialize$3$specifiedType(serializers, builtSet, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var isUnderspecified, t1, t2, elementType, result;
      type$.Iterable_dynamic._as(serialized);
      isUnderspecified = specifiedType.root == null || specifiedType.parameters.length === 0;
      t1 = specifiedType.parameters;
      t2 = t1.length;
      if (t2 === 0)
        elementType = B.FullType_null_List_empty_false;
      else {
        if (0 >= t2)
          return A.ioore(t1, 0);
        elementType = t1[0];
      }
      result = isUnderspecified ? A.SetBuilder_SetBuilder(type$.Object) : type$.SetBuilder_dynamic._as(serializers.newBuilder$1(specifiedType));
      result.replace$1(0, J.map$1$1$ax(serialized, new A.BuiltSetSerializer_deserialize_closure(serializers, elementType), type$.dynamic));
      return result.build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "set";
    }
  };
  A.BuiltSetSerializer_serialize_closure.prototype = {
    call$1(item) {
      return this.serializers.serialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.BuiltSetSerializer_deserialize_closure.prototype = {
    call$1(item) {
      return this.serializers.deserialize$2$specifiedType(item, this.elementType);
    },
    $signature: 2
  };
  A.DateTimeSerializer.prototype = {
    serialize$3$specifiedType(serializers, dateTime, specifiedType) {
      type$.DateTime._as(dateTime);
      if (!dateTime.isUtc)
        throw A.wrapException(A.ArgumentError$value(dateTime, "dateTime", "Must be in utc for serialization."));
      return 1000 * dateTime._value;
    },
    serialize$2(serializers, dateTime) {
      return this.serialize$3$specifiedType(serializers, dateTime, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t2,
        t1 = B.JSNumber_methods.round$0(A._asInt(serialized) / 1000);
      if (Math.abs(t1) <= 864e13)
        t2 = false;
      else
        t2 = true;
      if (t2)
        A.throwExpression(A.ArgumentError$("DateTime is outside valid range: " + t1, null));
      A.checkNotNullable(true, "isUtc", type$.bool);
      return new A.DateTime(t1, true);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "DateTime";
    }
  };
  A.DoubleSerializer.prototype = {
    serialize$3$specifiedType(serializers, aDouble, specifiedType) {
      A._asDouble(aDouble);
      if (isNaN(aDouble))
        return "NaN";
      else if (aDouble == 1 / 0 || aDouble == -1 / 0)
        return B.JSNumber_methods.get$isNegative(aDouble) ? "-INF" : "INF";
      else
        return aDouble;
    },
    serialize$2(serializers, aDouble) {
      return this.serialize$3$specifiedType(serializers, aDouble, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNum(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "double";
    }
  };
  A.DurationSerializer.prototype = {
    serialize$3$specifiedType(serializers, duration, specifiedType) {
      return type$.Duration._as(duration)._duration;
    },
    serialize$2(serializers, duration) {
      return this.serialize$3$specifiedType(serializers, duration, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Duration$(A._asInt(serialized), 0);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Duration";
    }
  };
  A.Int32Serializer.prototype = {
    serialize$3$specifiedType(serializers, int32, specifiedType) {
      return type$.Int32._as(int32)._i;
    },
    serialize$2(serializers, int32) {
      return this.serialize$3$specifiedType(serializers, int32, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      A._asInt(serialized);
      return new A.Int32((serialized & 2147483647) - ((serialized & 2147483648) >>> 0));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Int32";
    }
  };
  A.Int64Serializer.prototype = {
    serialize$3$specifiedType(serializers, int64, specifiedType) {
      return type$.Int64._as(int64)._toRadixString$1(10);
    },
    serialize$2(serializers, int64) {
      return this.serialize$3$specifiedType(serializers, int64, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = A.Int64__parseRadix(A._asString(serialized), 10, true);
      t1.toString;
      return t1;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Int64";
    }
  };
  A.IntSerializer.prototype = {
    serialize$3$specifiedType(serializers, integer, specifiedType) {
      return A._asInt(integer);
    },
    serialize$2(serializers, integer) {
      return this.serialize$3$specifiedType(serializers, integer, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asInt(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "int";
    }
  };
  A.JsonObjectSerializer.prototype = {
    serialize$3$specifiedType(serializers, jsonObject, specifiedType) {
      type$.JsonObject._as(jsonObject);
      return jsonObject.get$value(jsonObject);
    },
    serialize$2(serializers, jsonObject) {
      return this.serialize$3$specifiedType(serializers, jsonObject, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.JsonObject_JsonObject(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "JsonObject";
    }
  };
  A.NullSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      type$.Null._as(value);
      throw A.wrapException(A.UnimplementedError$(null));
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      throw A.wrapException(A.UnimplementedError$(null));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Null";
    }
  };
  A.NumSerializer.prototype = {
    serialize$3$specifiedType(serializers, number, specifiedType) {
      A._asNum(number);
      if (isNaN(number))
        return "NaN";
      else if (number == 1 / 0 || number == -1 / 0)
        return B.JSNumber_methods.get$isNegative(number) ? "-INF" : "INF";
      else
        return number;
    },
    serialize$2(serializers, number) {
      return this.serialize$3$specifiedType(serializers, number, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1 = J.getInterceptor$(serialized);
      if (t1.$eq(serialized, "NaN"))
        return 0 / 0;
      else if (t1.$eq(serialized, "-INF"))
        return -1 / 0;
      else if (t1.$eq(serialized, "INF"))
        return 1 / 0;
      else
        return A._asNum(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "num";
    }
  };
  A.RegExpSerializer.prototype = {
    serialize$3$specifiedType(serializers, value, specifiedType) {
      return type$.RegExp._as(value).pattern;
    },
    serialize$2(serializers, value) {
      return this.serialize$3$specifiedType(serializers, value, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.RegExp_RegExp(A._asString(serialized), true, false);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "RegExp";
    }
  };
  A.StringSerializer.prototype = {
    serialize$3$specifiedType(serializers, string, specifiedType) {
      return A._asString(string);
    },
    serialize$2(serializers, string) {
      return this.serialize$3$specifiedType(serializers, string, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._asString(serialized);
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "String";
    }
  };
  A.Uint8ListSerializer.prototype = {
    serialize$3$specifiedType(serializers, uint8list, specifiedType) {
      uint8list = type$.Base64Codec._eval$1("Codec.S")._as(type$.Uint8List._as(uint8list));
      return B.C_Base64Codec.get$encoder().convert$1(uint8list);
    },
    serialize$2(serializers, uint8list) {
      return this.serialize$3$specifiedType(serializers, uint8list, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return B.C_Base64Decoder.convert$1(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    get$types(_) {
      return A.BuiltList_BuiltList$from([B.Type_Uint8List_WLA], type$.Type);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$wireName() {
      return "UInt8List";
    }
  };
  A.UriSerializer.prototype = {
    serialize$3$specifiedType(serializers, uri, specifiedType) {
      return type$.Uri._as(uri).toString$0(0);
    },
    serialize$2(serializers, uri) {
      return this.serialize$3$specifiedType(serializers, uri, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A.Uri_parse(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types(receiver) {
      return this.types;
    },
    get$wireName() {
      return "Uri";
    }
  };
  A.DefaultEquality.prototype = {$isEquality: 1};
  A.IterableEquality.prototype = {
    equals$2(elements1, elements2) {
      var it1, it2, hasNext,
        t1 = this.$ti._eval$1("Iterable<1>?");
      t1._as(elements1);
      t1._as(elements2);
      if (elements1 === elements2)
        return true;
      it1 = J.get$iterator$ax(elements1);
      it2 = J.get$iterator$ax(elements2);
      for (t1 = this._elementEquality; true;) {
        hasNext = it1.moveNext$0();
        if (hasNext !== it2.moveNext$0())
          return false;
        if (!hasNext)
          return true;
        if (!t1.equals$2(it1.get$current(it1), it2.get$current(it2)))
          return false;
      }
    },
    hash$1(_, elements) {
      var t1, t2, hash;
      this.$ti._eval$1("Iterable<1>?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();) {
        hash = hash + t2.hash$1(0, t1.get$current(t1)) & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.ListEquality.prototype = {
    equals$2(list1, list2) {
      var $length, t2, t3, i,
        t1 = this.$ti._eval$1("List<1>?");
      t1._as(list1);
      t1._as(list2);
      if (list1 === list2)
        return true;
      t1 = J.getInterceptor$asx(list1);
      $length = t1.get$length(list1);
      t2 = J.getInterceptor$asx(list2);
      if ($length !== t2.get$length(list2))
        return false;
      for (t3 = this._elementEquality, i = 0; i < $length; ++i)
        if (!t3.equals$2(t1.$index(list1, i), t2.$index(list2, i)))
          return false;
      return true;
    },
    hash$1(_, list) {
      var t1, t2, hash, i;
      this.$ti._eval$1("List<1>?")._as(list);
      for (t1 = J.getInterceptor$asx(list), t2 = this._elementEquality, hash = 0, i = 0; i < t1.get$length(list); ++i) {
        hash = hash + t2.hash$1(0, t1.$index(list, i)) & 2147483647;
        hash = hash + (hash << 10 >>> 0) & 2147483647;
        hash ^= hash >>> 6;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A._UnorderedEquality.prototype = {
    equals$2(elements1, elements2) {
      var counts, $length, e, count,
        t1 = A._instanceType(this),
        t2 = t1._eval$1("_UnorderedEquality.T?");
      t2._as(elements1);
      t2._as(elements2);
      if (elements1 === elements2)
        return true;
      t2 = this._elementEquality;
      counts = A.HashMap_HashMap(t1._eval$1("bool(_UnorderedEquality.E,_UnorderedEquality.E)")._as(t2.get$equals()), t1._eval$1("int(_UnorderedEquality.E)")._as(t2.get$hash(t2)), t2.get$isValidKey(), t1._eval$1("_UnorderedEquality.E"), type$.int);
      for (t1 = J.get$iterator$ax(elements1), $length = 0; t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        counts.$indexSet(0, e, (count == null ? 0 : count) + 1);
        ++$length;
      }
      for (t1 = J.get$iterator$ax(elements2); t1.moveNext$0();) {
        e = t1.get$current(t1);
        count = counts.$index(0, e);
        if (count == null || count === 0)
          return false;
        if (typeof count !== "number")
          return count.$sub();
        counts.$indexSet(0, e, count - 1);
        --$length;
      }
      return $length === 0;
    },
    hash$1(_, elements) {
      var t1, t2, hash;
      A._instanceType(this)._eval$1("_UnorderedEquality.T?")._as(elements);
      for (t1 = J.get$iterator$ax(elements), t2 = this._elementEquality, hash = 0; t1.moveNext$0();)
        hash = hash + t2.hash$1(0, t1.get$current(t1)) & 2147483647;
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.SetEquality.prototype = {};
  A._MapEntry.prototype = {
    get$hashCode(_) {
      var t1 = this.equality;
      return 3 * t1._keyEquality.hash$1(0, this.key) + 7 * t1._valueEquality.hash$1(0, this.value) & 2147483647;
    },
    $eq(_, other) {
      var t1;
      if (other == null)
        return false;
      if (other instanceof A._MapEntry) {
        t1 = this.equality;
        t1 = t1._keyEquality.equals$2(this.key, other.key) && t1._valueEquality.equals$2(this.value, other.value);
      } else
        t1 = false;
      return t1;
    }
  };
  A.MapEquality.prototype = {
    equals$2(map1, map2) {
      var t2, equalElementCounts, t3, key, entry, count,
        t1 = this.$ti._eval$1("Map<1,2>?");
      t1._as(map1);
      t1._as(map2);
      if (map1 === map2)
        return true;
      t1 = J.getInterceptor$asx(map1);
      t2 = J.getInterceptor$asx(map2);
      if (t1.get$length(map1) !== t2.get$length(map2))
        return false;
      equalElementCounts = A.HashMap_HashMap(null, null, null, type$._MapEntry, type$.int);
      for (t3 = J.get$iterator$ax(t1.get$keys(map1)); t3.moveNext$0();) {
        key = t3.get$current(t3);
        entry = new A._MapEntry(this, key, t1.$index(map1, key));
        count = equalElementCounts.$index(0, entry);
        equalElementCounts.$indexSet(0, entry, (count == null ? 0 : count) + 1);
      }
      for (t1 = J.get$iterator$ax(t2.get$keys(map2)); t1.moveNext$0();) {
        key = t1.get$current(t1);
        entry = new A._MapEntry(this, key, t2.$index(map2, key));
        count = equalElementCounts.$index(0, entry);
        if (count == null || count === 0)
          return false;
        if (typeof count !== "number")
          return count.$sub();
        equalElementCounts.$indexSet(0, entry, count - 1);
      }
      return true;
    },
    hash$1(_, map) {
      var t2, t3, t4, t5, hash, key, keyHash, t6,
        t1 = this.$ti;
      t1._eval$1("Map<1,2>?")._as(map);
      for (t2 = J.getInterceptor$x(map), t3 = J.get$iterator$ax(t2.get$keys(map)), t4 = this._keyEquality, t5 = this._valueEquality, t1 = t1._rest[1], hash = 0; t3.moveNext$0();) {
        key = t3.get$current(t3);
        keyHash = t4.hash$1(0, key);
        t6 = t2.$index(map, key);
        hash = hash + 3 * keyHash + 7 * t5.hash$1(0, t6 == null ? t1._as(t6) : t6) & 2147483647;
      }
      hash = hash + (hash << 3 >>> 0) & 2147483647;
      hash ^= hash >>> 11;
      return hash + (hash << 15 >>> 0) & 2147483647;
    },
    $isEquality: 1
  };
  A.DeepCollectionEquality.prototype = {
    equals$2(e1, e2) {
      var _this = this,
        t1 = type$.Set_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.SetEquality(_this, type$.SetEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Map_dynamic_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).equals$2(e1, e2);
      t1 = type$.List_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.ListEquality(_this, type$.ListEquality_dynamic).equals$2(e1, e2);
      t1 = type$.Iterable_dynamic;
      if (t1._is(e1))
        return t1._is(e2) && new A.IterableEquality(_this, type$.IterableEquality_dynamic).equals$2(e1, e2);
      return J.$eq$(e1, e2);
    },
    hash$1(_, o) {
      var _this = this;
      if (type$.Set_dynamic._is(o))
        return new A.SetEquality(_this, type$.SetEquality_dynamic).hash$1(0, o);
      if (type$.Map_dynamic_dynamic._is(o))
        return new A.MapEquality(_this, _this, type$.MapEquality_dynamic_dynamic).hash$1(0, o);
      if (type$.List_dynamic._is(o))
        return new A.ListEquality(_this, type$.ListEquality_dynamic).hash$1(0, o);
      if (type$.Iterable_dynamic._is(o))
        return new A.IterableEquality(_this, type$.IterableEquality_dynamic).hash$1(0, o);
      return J.get$hashCode$(o);
    },
    isValidKey$1(o) {
      return true;
    },
    $isEquality: 1
  };
  A.QueueList.prototype = {
    cast$1$0(_, $T) {
      return new A._CastQueueList(this, J.cast$1$0$ax(this._queue_list$_table, $T), -1, -1, A._instanceType(this)._eval$1("@<QueueList.E>")._bind$1($T)._eval$1("_CastQueueList<1,2>"));
    },
    toString$0(_) {
      return A.Iterable_iterableToFullString(this, "{", "}");
    },
    get$length(_) {
      var _this = this;
      return (_this.get$_queue_list$_tail() - _this.get$_queue_list$_head(_this) & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0;
    },
    $index(_, index) {
      var t1, _this = this;
      if (index < 0 || index >= _this.get$length(0))
        throw A.wrapException(A.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(0) + ")."));
      t1 = J.$index$asx(_this._queue_list$_table, (_this.get$_queue_list$_head(_this) + index & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0);
      return t1 == null ? A._instanceType(_this)._eval$1("QueueList.E")._as(t1) : t1;
    },
    $indexSet(_, index, value) {
      var _this = this;
      A._instanceType(_this)._eval$1("QueueList.E")._as(value);
      if (index < 0 || index >= _this.get$length(0))
        throw A.wrapException(A.RangeError$("Index " + index + " must be in the range [0.." + _this.get$length(0) + ")."));
      J.$indexSet$ax(_this._queue_list$_table, (_this.get$_queue_list$_head(_this) + index & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0, value);
    },
    _queue_list$_add$1(_, element) {
      var newTable, split, _this = this,
        t1 = A._instanceType(_this);
      t1._eval$1("QueueList.E")._as(element);
      J.$indexSet$ax(_this._queue_list$_table, _this.get$_queue_list$_tail(), element);
      _this.set$_queue_list$_tail((_this.get$_queue_list$_tail() + 1 & J.get$length$asx(_this._queue_list$_table) - 1) >>> 0);
      if (_this.get$_queue_list$_head(_this) === _this.get$_queue_list$_tail()) {
        newTable = A.List_List$filled(J.get$length$asx(_this._queue_list$_table) * 2, null, false, t1._eval$1("QueueList.E?"));
        split = J.get$length$asx(_this._queue_list$_table) - _this.get$_queue_list$_head(_this);
        B.JSArray_methods.setRange$4(newTable, 0, split, _this._queue_list$_table, _this.get$_queue_list$_head(_this));
        B.JSArray_methods.setRange$4(newTable, split, split + _this.get$_queue_list$_head(_this), _this._queue_list$_table, 0);
        _this.set$_queue_list$_head(0, 0);
        _this.set$_queue_list$_tail(J.get$length$asx(_this._queue_list$_table));
        _this.set$_queue_list$_table(newTable);
      }
    },
    set$_queue_list$_table(_table) {
      this._queue_list$_table = A._instanceType(this)._eval$1("List<QueueList.E?>")._as(_table);
    },
    set$_queue_list$_head(_, _head) {
      this._queue_list$_head = A._asInt(_head);
    },
    set$_queue_list$_tail(_tail) {
      this._queue_list$_tail = A._asInt(_tail);
    },
    $isEfficientLengthIterable: 1,
    $isQueue: 1,
    $isIterable: 1,
    $isList: 1,
    get$_queue_list$_head(receiver) {
      return this._queue_list$_head;
    },
    get$_queue_list$_tail() {
      return this._queue_list$_tail;
    }
  };
  A._CastQueueList.prototype = {
    get$_queue_list$_head(_) {
      var t1 = this._queue_list$_delegate;
      return t1.get$_queue_list$_head(t1);
    },
    set$_queue_list$_head(_, value) {
      this._queue_list$_delegate.set$_queue_list$_head(0, value);
    },
    get$_queue_list$_tail() {
      return this._queue_list$_delegate.get$_queue_list$_tail();
    },
    set$_queue_list$_tail(value) {
      this._queue_list$_delegate.set$_queue_list$_tail(value);
    }
  };
  A._QueueList_Object_ListMixin.prototype = {};
  A.BuildStatus.prototype = {};
  A.BuildResult.prototype = {};
  A._$BuildStatusSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return type$.BuildStatus._as(object).name;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      return A._$valueOf(A._asString(serialized));
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isPrimitiveSerializer: 1,
    get$types() {
      return B.List_Type_BuildStatus_ahk;
    },
    get$wireName() {
      return "BuildStatus";
    }
  };
  A._$BuildResultSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["status", serializers.serialize$2$specifiedType(type$.BuildResult._as(object).status, B.FullType_FuN)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, value, $$v, _$result,
        _s11_ = "BuildResult",
        result = new A.BuildResultBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuildStatus; iterator.moveNext$0();) {
        t2 = iterator.get$current(iterator);
        t2.toString;
        A._asString(t2);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t2) {
          case "status":
            t2 = serializers.deserialize$2$specifiedType(value, B.FullType_FuN);
            t2.toString;
            t1._as(t2);
            $$v = result._build_result$_$v;
            if ($$v != null) {
              result._status = $$v.status;
              result._build_result$_$v = null;
            }
            result._status = t2;
            break;
        }
      }
      _$result = result._build_result$_$v;
      if (_$result == null) {
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_build_result$_$this()._status, _s11_, "status", t1);
        _$result = new A._$BuildResult(t2);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s11_, "status", t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.BuildResult);
      return result._build_result$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_kqK;
    },
    get$wireName() {
      return "BuildResult";
    }
  };
  A._$BuildResult.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BuildResult && this.status === other.status;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, A.Primitives_objectHashCode(this.status)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BuildResult"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "status", this.status);
      return t2.toString$0(t1);
    }
  };
  A.BuildResultBuilder.prototype = {
    get$_build_result$_$this() {
      var _this = this,
        $$v = _this._build_result$_$v;
      if ($$v != null) {
        _this._status = $$v.status;
        _this._build_result$_$v = null;
      }
      return _this;
    }
  };
  A.ConnectRequest.prototype = {};
  A._$ConnectRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ConnectRequest._as(object);
      return ["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_h8g), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_h8g), "entrypointPath", serializers.serialize$2$specifiedType(object.entrypointPath, B.FullType_h8g)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.ConnectRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "appId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._appId = t1;
            break;
          case "instanceId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._instanceId = t1;
            break;
          case "entrypointPath":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_connect_request$_$this()._entrypointPath = t1;
            break;
        }
      }
      return result._build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_muk;
    },
    get$wireName() {
      return "ConnectRequest";
    }
  };
  A._$ConnectRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ConnectRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.entrypointPath === other.entrypointPath;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.appId)), B.JSString_methods.get$hashCode(this.instanceId)), B.JSString_methods.get$hashCode(this.entrypointPath)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ConnectRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", this.appId);
      t2.add$2(t1, "instanceId", this.instanceId);
      t2.add$2(t1, "entrypointPath", this.entrypointPath);
      return t2.toString$0(t1);
    }
  };
  A.ConnectRequestBuilder.prototype = {
    get$_connect_request$_$this() {
      var _this = this,
        $$v = _this._$v;
      if ($$v != null) {
        _this._appId = $$v.appId;
        _this._instanceId = $$v.instanceId;
        _this._entrypointPath = $$v.entrypointPath;
        _this._$v = null;
      }
      return _this;
    },
    _build$0() {
      var t1, t2, t3, t4, _this = this,
        _s14_ = "ConnectRequest",
        _s10_ = "instanceId",
        _s14_0 = "entrypointPath",
        _$result = _this._$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._appId, _s14_, "appId", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._instanceId, _s14_, _s10_, t1);
        t4 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_connect_request$_$this()._entrypointPath, _s14_, _s14_0, t1);
        _$result = new A._$ConnectRequest(t2, t3, t4);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s14_, "appId", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s14_, _s10_, t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s14_, _s14_0, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ConnectRequest);
      return _this._$v = _$result;
    }
  };
  A.DebugEvent.prototype = {};
  A.BatchedDebugEvents.prototype = {};
  A._$DebugEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.DebugEvent._as(object);
      return ["kind", serializers.serialize$2$specifiedType(object.kind, B.FullType_h8g), "eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_h8g), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_kjq)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DebugEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "kind":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_debug_event$_$this()._debug_event$_kind = t1;
            break;
          case "eventData":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_debug_event$_$this()._eventData = t1;
            break;
          case "timestamp":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            result.get$_debug_event$_$this()._timestamp = t1;
            break;
        }
      }
      return result._debug_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_8h5;
    },
    get$wireName() {
      return "DebugEvent";
    }
  };
  A._$BatchedDebugEventsSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["events", serializers.serialize$2$specifiedType(type$.BatchedDebugEvents._as(object).events, B.FullType_EGl)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, t5, value, $$v, t6, t7, t8, t9,
        result = new A.BatchedDebugEventsBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuiltList_nullable_Object, t2 = type$.DebugEvent, t3 = type$.List_DebugEvent, t4 = type$.ListBuilder_DebugEvent; iterator.moveNext$0();) {
        t5 = iterator.get$current(iterator);
        t5.toString;
        A._asString(t5);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t5) {
          case "events":
            $$v = result._debug_event$_$v;
            if ($$v != null) {
              t5 = $$v.events;
              t6 = t5.$ti;
              t7 = new A.ListBuilder(t6._eval$1("ListBuilder<1>"));
              t8 = t6._eval$1("_BuiltList<1>");
              t9 = t6._eval$1("List<1>");
              if (t8._is(t5)) {
                t8._as(t5);
                t7.set$__ListBuilder__list_A(t9._as(t5._list));
                t7.set$_listOwner(t5);
              } else {
                t7.set$__ListBuilder__list_A(t9._as(A.List_List$from(t5, true, t6._precomputed1)));
                t7.set$_listOwner(null);
              }
              result.set$_events(t7);
              result._debug_event$_$v = null;
            }
            t5 = result._events;
            if (t5 == null) {
              t5 = new A.ListBuilder(t4);
              t5.set$__ListBuilder__list_A(t3._as(A.List_List$from(B.List_empty, true, t2)));
              t5.set$_listOwner(null);
              result.set$_events(t5);
            }
            t6 = serializers.deserialize$2$specifiedType(value, B.FullType_EGl);
            t6.toString;
            t1._as(t6);
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1>");
            t9 = t7._eval$1("List<1>");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.set$__ListBuilder__list_A(t9._as(t6._list));
              t5.set$_listOwner(t6);
            } else {
              t5.set$__ListBuilder__list_A(t9._as(A.List_List$from(t6, true, t7._precomputed1)));
              t5.set$_listOwner(null);
            }
            break;
        }
      }
      return result._debug_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_Jeh;
    },
    get$wireName() {
      return "BatchedDebugEvents";
    }
  };
  A._$DebugEvent.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DebugEvent && _this.kind === other.kind && _this.eventData === other.eventData && _this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.kind)), B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DebugEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "kind", this.kind);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.DebugEventBuilder.prototype = {
    get$_debug_event$_$this() {
      var _this = this,
        $$v = _this._debug_event$_$v;
      if ($$v != null) {
        _this._debug_event$_kind = $$v.kind;
        _this._eventData = $$v.eventData;
        _this._timestamp = $$v.timestamp;
        _this._debug_event$_$v = null;
      }
      return _this;
    },
    _debug_event$_build$0() {
      var t1, t2, t3, t4, t5, _this = this,
        _s10_ = "DebugEvent",
        _s9_ = "eventData",
        _s9_0 = "timestamp",
        _$result = _this._debug_event$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._debug_event$_kind, _s10_, "kind", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._eventData, _s10_, _s9_, t1);
        t4 = type$.int;
        t5 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_debug_event$_$this()._timestamp, _s10_, _s9_0, t4);
        _$result = new A._$DebugEvent(t2, t3, t5);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s10_, "kind", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s10_, _s9_, t1);
        A.BuiltValueNullFieldError_checkNotNull(t5, _s10_, _s9_0, t4);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.DebugEvent);
      return _this._debug_event$_$v = _$result;
    }
  };
  A._$BatchedDebugEvents.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BatchedDebugEvents && this.events.$eq(0, other.events);
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, this.events.get$hashCode(0)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedDebugEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  A.BatchedDebugEventsBuilder.prototype = {
    get$events() {
      var t1 = this.get$_debug_event$_$this(),
        t2 = t1._events;
      if (t2 == null) {
        t2 = A.ListBuilder_ListBuilder(B.List_empty, type$.DebugEvent);
        t1.set$_events(t2);
        t1 = t2;
      } else
        t1 = t2;
      return t1;
    },
    get$_debug_event$_$this() {
      var t1, _this = this,
        $$v = _this._debug_event$_$v;
      if ($$v != null) {
        t1 = $$v.events;
        _this.set$_events(A.ListBuilder_ListBuilder(t1, t1.$ti._precomputed1));
        _this._debug_event$_$v = null;
      }
      return _this;
    },
    _debug_event$_build$0() {
      var _$failedField, e, _$result0, t1, exception, t2, _this = this,
        _s18_ = "BatchedDebugEvents",
        _$result = null;
      try {
        _$result0 = _this._debug_event$_$v;
        if (_$result0 == null) {
          t1 = _this.get$events().build$0();
          _$result0 = new A._$BatchedDebugEvents(t1);
          A.BuiltValueNullFieldError_checkNotNull(t1, _s18_, "events", type$.BuiltList_DebugEvent);
        }
        _$result = _$result0;
      } catch (exception) {
        _$failedField = A._Cell$named("_$failedField");
        try {
          _$failedField.__late_helper$_value = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = A.unwrapException(exception);
          t1 = A.BuiltValueNestedFieldError$(_s18_, _$failedField.readLocal$0(), J.toString$0$(e));
          throw A.wrapException(t1);
        }
        throw exception;
      }
      t1 = type$.BatchedDebugEvents;
      t2 = t1._as(_$result);
      A.ArgumentError_checkNotNull(t2, "other", t1);
      _this._debug_event$_$v = t2;
      return _$result;
    },
    set$_events(_events) {
      this._events = type$.nullable_ListBuilder_DebugEvent._as(_events);
    }
  };
  A.DebugInfo.prototype = {};
  A._$DebugInfoSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DebugInfo._as(object);
      result = [];
      value = object.appEntrypointPath;
      if (value != null) {
        result.push("appEntrypointPath");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appId;
      if (value != null) {
        result.push("appId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appInstanceId;
      if (value != null) {
        result.push("appInstanceId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appOrigin;
      if (value != null) {
        result.push("appOrigin");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.appUrl;
      if (value != null) {
        result.push("appUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.authUrl;
      if (value != null) {
        result.push("authUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.dwdsVersion;
      if (value != null) {
        result.push("dwdsVersion");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.extensionUrl;
      if (value != null) {
        result.push("extensionUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.isInternalBuild;
      if (value != null) {
        result.push("isInternalBuild");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_MtR));
      }
      value = object.isFlutterApp;
      if (value != null) {
        result.push("isFlutterApp");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_MtR));
      }
      value = object.workspaceName;
      if (value != null) {
        result.push("workspaceName");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.tabUrl;
      if (value != null) {
        result.push("tabUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.tabId;
      if (value != null) {
        result.push("tabId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_kjq));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DebugInfoBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "appEntrypointPath":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appEntrypointPath = t1;
            break;
          case "appId":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._debug_info$_appId = t1;
            break;
          case "appInstanceId":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appInstanceId = t1;
            break;
          case "appOrigin":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appOrigin = t1;
            break;
          case "appUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._appUrl = t1;
            break;
          case "authUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._authUrl = t1;
            break;
          case "dwdsVersion":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._dwdsVersion = t1;
            break;
          case "extensionUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._extensionUrl = t1;
            break;
          case "isInternalBuild":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_$this()._isInternalBuild = t1;
            break;
          case "isFlutterApp":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_$this()._isFlutterApp = t1;
            break;
          case "workspaceName":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._workspaceName = t1;
            break;
          case "tabUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_$this()._tabUrl = t1;
            break;
          case "tabId":
            t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_$this()._tabId = t1;
            break;
        }
      }
      return result._debug_info$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_IMr;
    },
    get$wireName() {
      return "DebugInfo";
    }
  };
  A._$DebugInfo.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DebugInfo && _this.appEntrypointPath == other.appEntrypointPath && _this.appId == other.appId && _this.appInstanceId == other.appInstanceId && _this.appOrigin == other.appOrigin && _this.appUrl == other.appUrl && _this.authUrl == other.authUrl && _this.dwdsVersion == other.dwdsVersion && _this.extensionUrl == other.extensionUrl && _this.isInternalBuild == other.isInternalBuild && _this.isFlutterApp == other.isFlutterApp && _this.workspaceName == other.workspaceName && _this.tabUrl == other.tabUrl && _this.tabId == other.tabId;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, J.get$hashCode$(_this.appEntrypointPath)), J.get$hashCode$(_this.appId)), J.get$hashCode$(_this.appInstanceId)), J.get$hashCode$(_this.appOrigin)), J.get$hashCode$(_this.appUrl)), J.get$hashCode$(_this.authUrl)), J.get$hashCode$(_this.dwdsVersion)), J.get$hashCode$(_this.extensionUrl)), J.get$hashCode$(_this.isInternalBuild)), J.get$hashCode$(_this.isFlutterApp)), J.get$hashCode$(_this.workspaceName)), J.get$hashCode$(_this.tabUrl)), J.get$hashCode$(_this.tabId)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("DebugInfo"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appEntrypointPath", _this.appEntrypointPath);
      t2.add$2(t1, "appId", _this.appId);
      t2.add$2(t1, "appInstanceId", _this.appInstanceId);
      t2.add$2(t1, "appOrigin", _this.appOrigin);
      t2.add$2(t1, "appUrl", _this.appUrl);
      t2.add$2(t1, "authUrl", _this.authUrl);
      t2.add$2(t1, "dwdsVersion", _this.dwdsVersion);
      t2.add$2(t1, "extensionUrl", _this.extensionUrl);
      t2.add$2(t1, "isInternalBuild", _this.isInternalBuild);
      t2.add$2(t1, "isFlutterApp", _this.isFlutterApp);
      t2.add$2(t1, "workspaceName", _this.workspaceName);
      t2.add$2(t1, "tabUrl", _this.tabUrl);
      t2.add$2(t1, "tabId", _this.tabId);
      return t2.toString$0(t1);
    }
  };
  A.DebugInfoBuilder.prototype = {
    get$_$this() {
      var _this = this,
        $$v = _this._debug_info$_$v;
      if ($$v != null) {
        _this._appEntrypointPath = $$v.appEntrypointPath;
        _this._debug_info$_appId = $$v.appId;
        _this._appInstanceId = $$v.appInstanceId;
        _this._appOrigin = $$v.appOrigin;
        _this._appUrl = $$v.appUrl;
        _this._authUrl = $$v.authUrl;
        _this._dwdsVersion = $$v.dwdsVersion;
        _this._extensionUrl = $$v.extensionUrl;
        _this._isInternalBuild = $$v.isInternalBuild;
        _this._isFlutterApp = $$v.isFlutterApp;
        _this._workspaceName = $$v.workspaceName;
        _this._tabUrl = $$v.tabUrl;
        _this._tabId = $$v.tabId;
        _this._debug_info$_$v = null;
      }
      return _this;
    },
    _debug_info$_build$0() {
      var _this = this,
        _$result = _this._debug_info$_$v;
      if (_$result == null)
        _$result = new A._$DebugInfo(_this.get$_$this()._appEntrypointPath, _this.get$_$this()._debug_info$_appId, _this.get$_$this()._appInstanceId, _this.get$_$this()._appOrigin, _this.get$_$this()._appUrl, _this.get$_$this()._authUrl, _this.get$_$this()._dwdsVersion, _this.get$_$this()._extensionUrl, _this.get$_$this()._isInternalBuild, _this.get$_$this()._isFlutterApp, _this.get$_$this()._workspaceName, _this.get$_$this()._tabUrl, _this.get$_$this()._tabId);
      A.ArgumentError_checkNotNull(_$result, "other", type$.DebugInfo);
      return _this._debug_info$_$v = _$result;
    }
  };
  A.DevToolsRequest.prototype = {};
  A.DevToolsResponse.prototype = {};
  A._$DevToolsRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DevToolsRequest._as(object);
      result = ["appId", serializers.serialize$2$specifiedType(object.appId, B.FullType_h8g), "instanceId", serializers.serialize$2$specifiedType(object.instanceId, B.FullType_h8g)];
      value = object.contextId;
      if (value != null) {
        result.push("contextId");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_kjq));
      }
      value = object.tabUrl;
      if (value != null) {
        result.push("tabUrl");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      value = object.uriOnly;
      if (value != null) {
        result.push("uriOnly");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_MtR));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value,
        result = new A.DevToolsRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "appId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_devtools_request$_$this()._devtools_request$_appId = t1;
            break;
          case "instanceId":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
            break;
          case "contextId":
            t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_kjq));
            result.get$_devtools_request$_$this()._contextId = t1;
            break;
          case "tabUrl":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._devtools_request$_tabUrl = t1;
            break;
          case "uriOnly":
            t1 = A._asBoolQ(serializers.deserialize$2$specifiedType(value, B.FullType_MtR));
            result.get$_devtools_request$_$this()._uriOnly = t1;
            break;
        }
      }
      return result._devtools_request$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_yT3;
    },
    get$wireName() {
      return "DevToolsRequest";
    }
  };
  A._$DevToolsResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.DevToolsResponse._as(object);
      result = ["success", serializers.serialize$2$specifiedType(object.success, B.FullType_MtR), "promptExtension", serializers.serialize$2$specifiedType(object.promptExtension, B.FullType_MtR)];
      value = object.error;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result, t2, t3,
        _s15_ = "promptExtension",
        _s16_ = "DevToolsResponse",
        result = new A.DevToolsResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_MtR);
            t1.toString;
            A._asBool(t1);
            result.get$_devtools_request$_$this()._success = t1;
            break;
          case "promptExtension":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_MtR);
            t1.toString;
            A._asBool(t1);
            result.get$_devtools_request$_$this()._promptExtension = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_devtools_request$_$this()._error = t1;
            break;
        }
      }
      _$result = result._devtools_request$_$v;
      if (_$result == null) {
        t1 = type$.bool;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_devtools_request$_$this()._success, _s16_, "success", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(result.get$_devtools_request$_$this()._promptExtension, _s16_, _s15_, t1);
        _$result = new A._$DevToolsResponse(t2, t3, result.get$_devtools_request$_$this()._error);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s16_, "success", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s16_, _s15_, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.DevToolsResponse);
      return result._devtools_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_aRS;
    },
    get$wireName() {
      return "DevToolsResponse";
    }
  };
  A._$DevToolsRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DevToolsRequest && _this.appId === other.appId && _this.instanceId === other.instanceId && _this.contextId == other.contextId && _this.tabUrl == other.tabUrl && _this.uriOnly == other.uriOnly;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(_this.appId)), B.JSString_methods.get$hashCode(_this.instanceId)), J.get$hashCode$(_this.contextId)), J.get$hashCode$(_this.tabUrl)), J.get$hashCode$(_this.uriOnly)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "appId", _this.appId);
      t2.add$2(t1, "instanceId", _this.instanceId);
      t2.add$2(t1, "contextId", _this.contextId);
      t2.add$2(t1, "tabUrl", _this.tabUrl);
      t2.add$2(t1, "uriOnly", _this.uriOnly);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsRequestBuilder.prototype = {
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._devtools_request$_appId = $$v.appId;
        _this._devtools_request$_instanceId = $$v.instanceId;
        _this._contextId = $$v.contextId;
        _this._devtools_request$_tabUrl = $$v.tabUrl;
        _this._uriOnly = $$v.uriOnly;
        _this._devtools_request$_$v = null;
      }
      return _this;
    },
    _devtools_request$_build$0() {
      var t1, t2, t3, _this = this,
        _s15_ = "DevToolsRequest",
        _s10_ = "instanceId",
        _$result = _this._devtools_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_devtools_request$_$this()._devtools_request$_appId, _s15_, "appId", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_devtools_request$_$this()._devtools_request$_instanceId, _s15_, _s10_, t1);
        _$result = new A._$DevToolsRequest(t2, t3, _this.get$_devtools_request$_$this()._contextId, _this.get$_devtools_request$_$this()._devtools_request$_tabUrl, _this.get$_devtools_request$_$this()._uriOnly);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s15_, "appId", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s15_, _s10_, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.DevToolsRequest);
      return _this._devtools_request$_$v = _$result;
    }
  };
  A._$DevToolsResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$DevToolsResponse && _this.success === other.success && _this.promptExtension === other.promptExtension && _this.error == other.error;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSBool_methods.get$hashCode(this.success)), B.JSBool_methods.get$hashCode(this.promptExtension)), J.get$hashCode$(this.error)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("DevToolsResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "success", this.success);
      t2.add$2(t1, "promptExtension", this.promptExtension);
      t2.add$2(t1, "error", this.error);
      return t2.toString$0(t1);
    }
  };
  A.DevToolsResponseBuilder.prototype = {
    get$_devtools_request$_$this() {
      var _this = this,
        $$v = _this._devtools_request$_$v;
      if ($$v != null) {
        _this._success = $$v.success;
        _this._promptExtension = $$v.promptExtension;
        _this._error = $$v.error;
        _this._devtools_request$_$v = null;
      }
      return _this;
    }
  };
  A.ErrorResponse.prototype = {};
  A._$ErrorResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ErrorResponse._as(object);
      return ["error", serializers.serialize$2$specifiedType(object.error, B.FullType_h8g), "stackTrace", serializers.serialize$2$specifiedType(object.stackTrace, B.FullType_h8g)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result, t2, t3,
        _s10_ = "stackTrace",
        _s13_ = "ErrorResponse",
        result = new A.ErrorResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "error":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_error = t1;
            break;
          case "stackTrace":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._error_response$_$v;
            if ($$v != null) {
              result._error_response$_error = $$v.error;
              result._error_response$_stackTrace = $$v.stackTrace;
              result._error_response$_$v = null;
            }
            result._error_response$_stackTrace = t1;
            break;
        }
      }
      _$result = result._error_response$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_error_response$_$this()._error_response$_error, _s13_, "error", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(result.get$_error_response$_$this()._error_response$_stackTrace, _s13_, _s10_, t1);
        _$result = new A._$ErrorResponse(t2, t3);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s13_, "error", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s13_, _s10_, t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ErrorResponse);
      return result._error_response$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_6Bz;
    },
    get$wireName() {
      return "ErrorResponse";
    }
  };
  A._$ErrorResponse.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$ErrorResponse && this.error === other.error && this.stackTrace === other.stackTrace;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.error)), B.JSString_methods.get$hashCode(this.stackTrace)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ErrorResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "error", this.error);
      t2.add$2(t1, "stackTrace", this.stackTrace);
      return t2.toString$0(t1);
    }
  };
  A.ErrorResponseBuilder.prototype = {
    get$_error_response$_$this() {
      var _this = this,
        $$v = _this._error_response$_$v;
      if ($$v != null) {
        _this._error_response$_error = $$v.error;
        _this._error_response$_stackTrace = $$v.stackTrace;
        _this._error_response$_$v = null;
      }
      return _this;
    }
  };
  A.ExtensionRequest.prototype = {};
  A.ExtensionResponse.prototype = {};
  A.ExtensionEvent.prototype = {};
  A.BatchedEvents.prototype = {};
  A._$ExtensionRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.ExtensionRequest._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_kjq), "command", serializers.serialize$2$specifiedType(object.command, B.FullType_h8g)];
      value = object.commandParams;
      if (value != null) {
        result.push("commandParams");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result, t2, t3, t4,
        _s16_ = "ExtensionRequest",
        result = new A.ExtensionRequestBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "command":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_extension_request$_$this()._command = t1;
            break;
          case "commandParams":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._commandParams = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = type$.int;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._id, _s16_, "id", t1);
        t3 = type$.String;
        t4 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._command, _s16_, "command", t3);
        _$result = new A._$ExtensionRequest(t2, t4, result.get$_extension_request$_$this()._commandParams);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s16_, "id", t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s16_, "command", t3);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ExtensionRequest);
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_0YD;
    },
    get$wireName() {
      return "ExtensionRequest";
    }
  };
  A._$ExtensionResponseSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      var result, value;
      type$.ExtensionResponse._as(object);
      result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_kjq), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_MtR), "result", serializers.serialize$2$specifiedType(object.result, B.FullType_h8g)];
      value = object.error;
      if (value != null) {
        result.push("error");
        result.push(serializers.serialize$2$specifiedType(value, B.FullType_h8g));
      }
      return result;
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, _$result, t2, t3, t4, t5, t6,
        _s17_ = "ExtensionResponse",
        result = new A.ExtensionResponseBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "id":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            result.get$_extension_request$_$this()._id = t1;
            break;
          case "success":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_MtR);
            t1.toString;
            A._asBool(t1);
            result.get$_extension_request$_$this()._extension_request$_success = t1;
            break;
          case "result":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            result.get$_extension_request$_$this()._extension_request$_result = t1;
            break;
          case "error":
            t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_h8g));
            result.get$_extension_request$_$this()._extension_request$_error = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = type$.int;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._id, _s17_, "id", t1);
        t3 = type$.bool;
        t4 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_success, _s17_, "success", t3);
        t5 = type$.String;
        t6 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_result, _s17_, "result", t5);
        _$result = new A._$ExtensionResponse(t2, t4, t6, result.get$_extension_request$_$this()._extension_request$_error);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s17_, "id", t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s17_, "success", t3);
        A.BuiltValueNullFieldError_checkNotNull(t6, _s17_, "result", t5);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ExtensionResponse);
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_bhs;
    },
    get$wireName() {
      return "ExtensionResponse";
    }
  };
  A._$ExtensionEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.ExtensionEvent._as(object);
      return ["params", serializers.serialize$2$specifiedType(object.params, B.FullType_h8g), "method", serializers.serialize$2$specifiedType(object.method, B.FullType_h8g)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v, _$result, t2, t3,
        _s14_ = "ExtensionEvent",
        result = new A.ExtensionEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "params":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._params = t1;
            break;
          case "method":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              result._params = $$v.params;
              result._extension_request$_method = $$v.method;
              result._extension_request$_$v = null;
            }
            result._extension_request$_method = t1;
            break;
        }
      }
      _$result = result._extension_request$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._params, _s14_, "params", t1);
        t3 = A.BuiltValueNullFieldError_checkNotNull(result.get$_extension_request$_$this()._extension_request$_method, _s14_, "method", t1);
        _$result = new A._$ExtensionEvent(t2, t3);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s14_, "params", t1);
        A.BuiltValueNullFieldError_checkNotNull(t3, _s14_, "method", t1);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.ExtensionEvent);
      return result._extension_request$_$v = _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_e7M;
    },
    get$wireName() {
      return "ExtensionEvent";
    }
  };
  A._$BatchedEventsSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      return ["events", serializers.serialize$2$specifiedType(type$.BatchedEvents._as(object).events, B.FullType_NIe)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, t2, t3, t4, t5, value, $$v, t6, t7, t8, t9,
        result = new A.BatchedEventsBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (t1 = type$.BuiltList_nullable_Object, t2 = type$.ExtensionEvent, t3 = type$.List_ExtensionEvent, t4 = type$.ListBuilder_ExtensionEvent; iterator.moveNext$0();) {
        t5 = iterator.get$current(iterator);
        t5.toString;
        A._asString(t5);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t5) {
          case "events":
            $$v = result._extension_request$_$v;
            if ($$v != null) {
              t5 = $$v.events;
              t6 = t5.$ti;
              t7 = new A.ListBuilder(t6._eval$1("ListBuilder<1>"));
              t8 = t6._eval$1("_BuiltList<1>");
              t9 = t6._eval$1("List<1>");
              if (t8._is(t5)) {
                t8._as(t5);
                t7.set$__ListBuilder__list_A(t9._as(t5._list));
                t7.set$_listOwner(t5);
              } else {
                t7.set$__ListBuilder__list_A(t9._as(A.List_List$from(t5, true, t6._precomputed1)));
                t7.set$_listOwner(null);
              }
              result.set$_extension_request$_events(t7);
              result._extension_request$_$v = null;
            }
            t5 = result._extension_request$_events;
            if (t5 == null) {
              t5 = new A.ListBuilder(t4);
              t5.set$__ListBuilder__list_A(t3._as(A.List_List$from(B.List_empty, true, t2)));
              t5.set$_listOwner(null);
              result.set$_extension_request$_events(t5);
            }
            t6 = serializers.deserialize$2$specifiedType(value, B.FullType_NIe);
            t6.toString;
            t1._as(t6);
            t7 = t5.$ti;
            t8 = t7._eval$1("_BuiltList<1>");
            t9 = t7._eval$1("List<1>");
            if (t8._is(t6)) {
              t8._as(t6);
              t5.set$__ListBuilder__list_A(t9._as(t6._list));
              t5.set$_listOwner(t6);
            } else {
              t5.set$__ListBuilder__list_A(t9._as(A.List_List$from(t6, true, t7._precomputed1)));
              t5.set$_listOwner(null);
            }
            break;
        }
      }
      return result._extension_request$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_oyn;
    },
    get$wireName() {
      return "BatchedEvents";
    }
  };
  A._$ExtensionRequest.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ExtensionRequest && _this.id === other.id && _this.command === other.command && _this.commandParams == other.commandParams;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(this.id)), B.JSString_methods.get$hashCode(this.command)), J.get$hashCode$(this.commandParams)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionRequest"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", this.id);
      t2.add$2(t1, "command", this.command);
      t2.add$2(t1, "commandParams", this.commandParams);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionRequestBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._command = $$v.command;
        _this._commandParams = $$v.commandParams;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionResponse.prototype = {
    $eq(_, other) {
      var _this = this;
      if (other == null)
        return false;
      if (other === _this)
        return true;
      return other instanceof A._$ExtensionResponse && _this.id === other.id && _this.success === other.success && _this.result === other.result && _this.error == other.error;
    },
    get$hashCode(_) {
      var _this = this;
      return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSInt_methods.get$hashCode(_this.id)), B.JSBool_methods.get$hashCode(_this.success)), B.JSString_methods.get$hashCode(_this.result)), J.get$hashCode$(_this.error)));
    },
    toString$0(_) {
      var _this = this,
        t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionResponse"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "id", _this.id);
      t2.add$2(t1, "success", _this.success);
      t2.add$2(t1, "result", _this.result);
      t2.add$2(t1, "error", _this.error);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionResponseBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._id = $$v.id;
        _this._extension_request$_success = $$v.success;
        _this._extension_request$_result = $$v.result;
        _this._extension_request$_error = $$v.error;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$ExtensionEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$ExtensionEvent && this.params === other.params && this.method === other.method;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.params)), B.JSString_methods.get$hashCode(this.method)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("ExtensionEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "params", this.params);
      t2.add$2(t1, "method", this.method);
      return t2.toString$0(t1);
    }
  };
  A.ExtensionEventBuilder.prototype = {
    get$_extension_request$_$this() {
      var _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        _this._params = $$v.params;
        _this._extension_request$_method = $$v.method;
        _this._extension_request$_$v = null;
      }
      return _this;
    }
  };
  A._$BatchedEvents.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$BatchedEvents && this.events.$eq(0, other.events);
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(0, this.events.get$hashCode(0)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("BatchedEvents"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "events", this.events);
      return t2.toString$0(t1);
    }
  };
  A.BatchedEventsBuilder.prototype = {
    get$events() {
      var t1, _this = this,
        $$v = _this._extension_request$_$v;
      if ($$v != null) {
        t1 = $$v.events;
        _this.set$_extension_request$_events(A.ListBuilder_ListBuilder(t1, t1.$ti._precomputed1));
        _this._extension_request$_$v = null;
      }
      t1 = _this._extension_request$_events;
      if (t1 == null) {
        t1 = A.ListBuilder_ListBuilder(B.List_empty, type$.ExtensionEvent);
        _this.set$_extension_request$_events(t1);
      }
      return t1;
    },
    _extension_request$_build$0() {
      var _$failedField, e, _$result0, t1, exception, t2, _this = this,
        _s13_ = "BatchedEvents",
        _$result = null;
      try {
        _$result0 = _this._extension_request$_$v;
        if (_$result0 == null) {
          t1 = _this.get$events().build$0();
          _$result0 = new A._$BatchedEvents(t1);
          A.BuiltValueNullFieldError_checkNotNull(t1, _s13_, "events", type$.BuiltList_ExtensionEvent);
        }
        _$result = _$result0;
      } catch (exception) {
        _$failedField = A._Cell$named("_$failedField");
        try {
          _$failedField.__late_helper$_value = "events";
          _this.get$events().build$0();
        } catch (exception) {
          e = A.unwrapException(exception);
          t1 = A.BuiltValueNestedFieldError$(_s13_, _$failedField.readLocal$0(), J.toString$0$(e));
          throw A.wrapException(t1);
        }
        throw exception;
      }
      t1 = type$.BatchedEvents;
      t2 = t1._as(_$result);
      A.ArgumentError_checkNotNull(t2, "other", t1);
      _this._extension_request$_$v = t2;
      return _$result;
    },
    set$_extension_request$_events(_events) {
      this._extension_request$_events = type$.nullable_ListBuilder_ExtensionEvent._as(_events);
    }
  };
  A.IsolateExit.prototype = {};
  A.IsolateStart.prototype = {};
  A._$IsolateExitSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.IsolateExit._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.Iterable_nullable_Object._as(serialized);
      return new A.IsolateExitBuilder()._isolate_events$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_J12;
    },
    get$wireName() {
      return "IsolateExit";
    }
  };
  A._$IsolateStartSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.IsolateStart._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      type$.Iterable_nullable_Object._as(serialized);
      return new A.IsolateStartBuilder()._isolate_events$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_00;
    },
    get$wireName() {
      return "IsolateStart";
    }
  };
  A._$IsolateExit.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$IsolateExit;
    },
    get$hashCode(_) {
      return 814065794;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateExit"));
    }
  };
  A.IsolateExitBuilder.prototype = {
    _isolate_events$_build$0() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new A._$IsolateExit();
      A.ArgumentError_checkNotNull(_$result, "other", type$.IsolateExit);
      return this._isolate_events$_$v = _$result;
    }
  };
  A._$IsolateStart.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$IsolateStart;
    },
    get$hashCode(_) {
      return 97463111;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateStart"));
    }
  };
  A.IsolateStartBuilder.prototype = {
    _isolate_events$_build$0() {
      var _$result = this._isolate_events$_$v;
      if (_$result == null)
        _$result = new A._$IsolateStart();
      A.ArgumentError_checkNotNull(_$result, "other", type$.IsolateStart);
      return this._isolate_events$_$v = _$result;
    }
  };
  A.RegisterEvent.prototype = {};
  A._$RegisterEventSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.RegisterEvent._as(object);
      return ["eventData", serializers.serialize$2$specifiedType(object.eventData, B.FullType_h8g), "timestamp", serializers.serialize$2$specifiedType(object.timestamp, B.FullType_kjq)];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var t1, value, $$v,
        result = new A.RegisterEventBuilder(),
        iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized));
      for (; iterator.moveNext$0();) {
        t1 = iterator.get$current(iterator);
        t1.toString;
        A._asString(t1);
        iterator.moveNext$0();
        value = iterator.get$current(iterator);
        switch (t1) {
          case "eventData":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_h8g);
            t1.toString;
            A._asString(t1);
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_eventData = t1;
            break;
          case "timestamp":
            t1 = serializers.deserialize$2$specifiedType(value, B.FullType_kjq);
            t1.toString;
            A._asInt(t1);
            $$v = result._register_event$_$v;
            if ($$v != null) {
              result._register_event$_eventData = $$v.eventData;
              result._register_event$_timestamp = $$v.timestamp;
              result._register_event$_$v = null;
            }
            result._register_event$_timestamp = t1;
            break;
        }
      }
      return result._register_event$_build$0();
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_ASY;
    },
    get$wireName() {
      return "RegisterEvent";
    }
  };
  A._$RegisterEvent.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$RegisterEvent && this.eventData === other.eventData && this.timestamp === other.timestamp;
    },
    get$hashCode(_) {
      return A.$jf(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.eventData)), B.JSInt_methods.get$hashCode(this.timestamp)));
    },
    toString$0(_) {
      var t1 = $.$get$newBuiltValueToStringHelper().call$1("RegisterEvent"),
        t2 = J.getInterceptor$ax(t1);
      t2.add$2(t1, "eventData", this.eventData);
      t2.add$2(t1, "timestamp", this.timestamp);
      return t2.toString$0(t1);
    }
  };
  A.RegisterEventBuilder.prototype = {
    get$_register_event$_$this() {
      var _this = this,
        $$v = _this._register_event$_$v;
      if ($$v != null) {
        _this._register_event$_eventData = $$v.eventData;
        _this._register_event$_timestamp = $$v.timestamp;
        _this._register_event$_$v = null;
      }
      return _this;
    },
    _register_event$_build$0() {
      var t1, t2, t3, t4, _this = this,
        _s13_ = "RegisterEvent",
        _s9_ = "eventData",
        _s9_0 = "timestamp",
        _$result = _this._register_event$_$v;
      if (_$result == null) {
        t1 = type$.String;
        t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_register_event$_$this()._register_event$_eventData, _s13_, _s9_, t1);
        t3 = type$.int;
        t4 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_register_event$_$this()._register_event$_timestamp, _s13_, _s9_0, t3);
        _$result = new A._$RegisterEvent(t2, t4);
        A.BuiltValueNullFieldError_checkNotNull(t2, _s13_, _s9_, t1);
        A.BuiltValueNullFieldError_checkNotNull(t4, _s13_, _s9_0, t3);
      }
      A.ArgumentError_checkNotNull(_$result, "other", type$.RegisterEvent);
      return _this._register_event$_$v = _$result;
    }
  };
  A.RunRequest.prototype = {};
  A._$RunRequestSerializer.prototype = {
    serialize$3$specifiedType(serializers, object, specifiedType) {
      type$.RunRequest._as(object);
      return [];
    },
    serialize$2(serializers, object) {
      return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false);
    },
    deserialize$3$specifiedType(serializers, serialized, specifiedType) {
      var _$result;
      type$.Iterable_nullable_Object._as(serialized);
      _$result = new A._$RunRequest();
      A.ArgumentError_checkNotNull(_$result, "other", type$.RunRequest);
      return _$result;
    },
    deserialize$2(serializers, serialized) {
      return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false);
    },
    $isSerializer: 1,
    $isStructuredSerializer: 1,
    get$types() {
      return B.List_7pl;
    },
    get$wireName() {
      return "RunRequest";
    }
  };
  A._$RunRequest.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      if (other === this)
        return true;
      return other instanceof A._$RunRequest;
    },
    get$hashCode(_) {
      return 248087772;
    },
    toString$0(_) {
      return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("RunRequest"));
    }
  };
  A._$serializers_closure.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty, type$.DebugEvent);
    },
    $signature: 56
  };
  A._$serializers_closure0.prototype = {
    call$0() {
      return A.ListBuilder_ListBuilder(B.List_empty, type$.ExtensionEvent);
    },
    $signature: 57
  };
  A.BatchedStreamController.prototype = {
    _batchAndSendEvents$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, t2, t3, t4, t5, t6, t7, t8, lastSendTime0, lastEvent, duration, t1, buffer, lastSendTime, $async$temp1, $async$temp2;
      var $async$_batchAndSendEvents$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              duration = A.Duration$(0, $async$self._checkDelayMilliseconds);
              t1 = $async$self.$ti;
              buffer = A._setArrayType([], t1._eval$1("JSArray<1>"));
              lastSendTime = Date.now();
              t2 = $async$self._batchDelayMilliseconds, t3 = $async$self._outputController, t4 = A._instanceType(t3), t1 = t1._precomputed1, t5 = t4._precomputed1, t4 = t4._eval$1("_DelayedData<1>");
            case 2:
              // for condition
              $async$temp1 = A;
              $async$goto = 4;
              return A._asyncAwait($async$self._hasEventOrTimeOut$1(duration), $async$_batchAndSendEvents$0);
            case 4:
              // returning from await.
              if (!$async$temp1.boolConversionCheck($async$result)) {
                // goto after for
                $async$goto = 3;
                break;
              }
              $async$temp1 = A;
              $async$goto = 7;
              return A._asyncAwait($async$self._hasEventDuring$1(duration), $async$_batchAndSendEvents$0);
            case 7:
              // returning from await.
              $async$goto = $async$temp1.boolConversionCheck($async$result) ? 5 : 6;
              break;
            case 5:
              // then
              t6 = $async$self.__BatchedStreamController__inputQueue_A;
              t6 === $ && A.throwLateFieldNI("_inputQueue");
              t7 = t6.$ti;
              t8 = new A._Future($.Zone__current, t7._eval$1("_Future<1>"));
              t6._addRequest$1(new A._NextRequest(new A._AsyncCompleter(t8, t7._eval$1("_AsyncCompleter<1>")), t7._eval$1("_NextRequest<1>")));
              $async$temp1 = B.JSArray_methods;
              $async$temp2 = buffer;
              $async$goto = 8;
              return A._asyncAwait(t8, $async$_batchAndSendEvents$0);
            case 8:
              // returning from await.
              $async$temp1.add$1($async$temp2, $async$result);
            case 6:
              // join
              lastSendTime0 = Date.now();
              if (lastSendTime0 > lastSendTime + t2) {
                if (buffer.length !== 0) {
                  t6 = t5._as(A.List_List$of(buffer, true, t1));
                  t7 = t3._state;
                  if (t7 >= 4)
                    A.throwExpression(t3._badEventState$0());
                  if ((t7 & 1) !== 0)
                    t3._sendData$1(t6);
                  else if ((t7 & 3) === 0) {
                    t7 = t3._ensurePendingEvents$0();
                    t6 = new A._DelayedData(t6, t4);
                    lastEvent = t7.lastPendingEvent;
                    if (lastEvent == null)
                      t7.firstPendingEvent = t7.lastPendingEvent = t6;
                    else {
                      lastEvent.set$next(0, t6);
                      t7.lastPendingEvent = t6;
                    }
                  }
                  B.JSArray_methods.clear$0(buffer);
                }
                lastSendTime = lastSendTime0;
              }
              // goto for condition
              $async$goto = 2;
              break;
            case 3:
              // after for
              if (buffer.length !== 0)
                t3.add$1(0, t5._as(A.List_List$of(buffer, true, t1)));
              $async$self._completer.complete$1(0, true);
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_batchAndSendEvents$0, $async$completer);
    },
    _hasEventOrTimeOut$1(duration) {
      var t1 = this.__BatchedStreamController__inputQueue_A;
      t1 === $ && A.throwLateFieldNI("_inputQueue");
      return t1.get$hasNext().timeout$2$onTimeout(0, duration, new A.BatchedStreamController__hasEventOrTimeOut_closure());
    },
    _hasEventDuring$1(duration) {
      var t1 = this.__BatchedStreamController__inputQueue_A;
      t1 === $ && A.throwLateFieldNI("_inputQueue");
      return t1.get$hasNext().timeout$2$onTimeout(0, duration, new A.BatchedStreamController__hasEventDuring_closure());
    },
    set$__BatchedStreamController__inputQueue_A(__BatchedStreamController__inputQueue_A) {
      this.__BatchedStreamController__inputQueue_A = this.$ti._eval$1("StreamQueue<1>")._as(__BatchedStreamController__inputQueue_A);
    }
  };
  A.BatchedStreamController__hasEventOrTimeOut_closure.prototype = {
    call$0() {
      return true;
    },
    $signature: 31
  };
  A.BatchedStreamController__hasEventDuring_closure.prototype = {
    call$0() {
      return false;
    },
    $signature: 31
  };
  A.SocketClient.prototype = {};
  A.SseSocketClient.prototype = {
    get$sink() {
      var t1 = this._sockets$_client._outgoingController;
      return new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>"));
    },
    get$stream(_) {
      var t1 = this._sockets$_client._incomingController;
      return new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>"));
    }
  };
  A.WebSocketClient.prototype = {
    get$sink() {
      var t2,
        t1 = this._channel,
        value = t1.__HtmlWebSocketChannel_sink_FI;
      if (value === $) {
        t2 = t1._html0$_controller.__StreamChannelController__foreign_F;
        t2 === $ && A.throwLateFieldNI("_foreign");
        t2 = t2.__GuaranteeChannel__sink_F;
        t2 === $ && A.throwLateFieldNI("_sink");
        value !== $ && A.throwLateFieldADI("sink");
        value = t1.__HtmlWebSocketChannel_sink_FI = new A._HtmlWebSocketSink(t1, t2);
      }
      return value;
    },
    get$stream(_) {
      var t2,
        t1 = this._channel._html0$_controller.__StreamChannelController__foreign_F;
      t1 === $ && A.throwLateFieldNI("_foreign");
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t2 = A._instanceType(t1)._eval$1("_ControllerStream<1>");
      return new A._MapStream(t2._eval$1("String(Stream.T)")._as(new A.WebSocketClient_stream_closure()), new A._ControllerStream(t1, t2), t2._eval$1("_MapStream<Stream.T,String>"));
    }
  };
  A.WebSocketClient_stream_closure.prototype = {
    call$1(o) {
      return J.toString$0$(o);
    },
    $signature: 59
  };
  A.safeUnawaited_closure.prototype = {
    call$2(error, stackTrace) {
      type$.StackTrace._as(stackTrace);
      return $.$get$_logger().log$4(B.Level_WARNING_900, "Error in unawaited Future:", error, stackTrace);
    },
    $signature: 17
  };
  A.Int32.prototype = {
    _toInt$1(val) {
      if (val instanceof A.Int32)
        return val._i;
      else if (A._isInt(val))
        return val;
      throw A.wrapException(A.ArgumentError$value(val, "other", "Not an int, Int32 or Int64"));
    },
    $eq(_, other) {
      if (other == null)
        return false;
      if (other instanceof A.Int32)
        return this._i === other._i;
      else if (other instanceof A.Int64)
        return A.Int64_Int64(this._i).$eq(0, other);
      else if (A._isInt(other))
        return this._i === other;
      return false;
    },
    compareTo$1(_, other) {
      if (other instanceof A.Int64)
        return A.Int64_Int64(this._i)._compareTo$1(other);
      return B.JSInt_methods.compareTo$1(this._i, this._toInt$1(other));
    },
    get$hashCode(_) {
      return this._i;
    },
    toString$0(_) {
      return B.JSInt_methods.toString$0(this._i);
    },
    $isComparable: 1
  };
  A.Int64.prototype = {
    $eq(_, other) {
      var o, _this = this;
      if (other == null)
        return false;
      if (other instanceof A.Int64)
        o = other;
      else if (A._isInt(other)) {
        if (_this._h === 0 && _this._m === 0)
          return _this._l === other;
        if ((other & 4194303) === other)
          return false;
        o = A.Int64_Int64(other);
      } else
        o = other instanceof A.Int32 ? A.Int64_Int64(other._i) : null;
      if (o != null)
        return _this._l === o._l && _this._m === o._m && _this._h === o._h;
      return false;
    },
    compareTo$1(_, other) {
      return this._compareTo$1(other);
    },
    _compareTo$1(other) {
      var o = A.Int64__promote(other),
        t1 = this._h,
        signa = t1 >>> 19,
        t2 = o._h;
      if (signa !== t2 >>> 19)
        return signa === 0 ? 1 : -1;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._m;
      t2 = o._m;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      t1 = this._l;
      t2 = o._l;
      if (t1 > t2)
        return 1;
      else if (t1 < t2)
        return -1;
      return 0;
    },
    get$hashCode(_) {
      var t1 = this._m;
      return (((t1 & 1023) << 22 | this._l) ^ (this._h << 12 | t1 >>> 10 & 4095)) >>> 0;
    },
    toString$0(_) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(10, d0, d1, d2, sign);
    },
    _toRadixString$1(radix) {
      var d00, d10, sign,
        d0 = this._l,
        d1 = this._m,
        d2 = this._h;
      if ((d2 & 524288) !== 0) {
        d0 = 0 - d0;
        d00 = d0 & 4194303;
        d1 = 0 - d1 - (B.JSInt_methods._shrOtherPositive$1(d0, 22) & 1);
        d10 = d1 & 4194303;
        d2 = 0 - d2 - (B.JSInt_methods._shrOtherPositive$1(d1, 22) & 1) & 1048575;
        d1 = d10;
        d0 = d00;
        sign = "-";
      } else
        sign = "";
      return A.Int64__toRadixStringUnsigned(radix, d0, d1, d2, sign);
    },
    $isComparable: 1
  };
  A._StackState.prototype = {};
  A.Level.prototype = {
    $eq(_, other) {
      if (other == null)
        return false;
      return other instanceof A.Level && this.value === other.value;
    },
    compareTo$1(_, other) {
      return this.value - type$.Level._as(other).value;
    },
    get$hashCode(_) {
      return this.value;
    },
    toString$0(_) {
      return this.name;
    },
    $isComparable: 1
  };
  A.LogRecord.prototype = {
    toString$0(_) {
      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
    }
  };
  A.Logger.prototype = {
    get$fullName() {
      var t1 = this.parent,
        t2 = t1 == null ? null : t1.name.length !== 0,
        t3 = this.name;
      return t2 === true ? t1.get$fullName() + "." + t3 : t3;
    },
    get$level(_) {
      var t1, effectiveLevel;
      if (this.parent == null) {
        t1 = this._level;
        t1.toString;
        effectiveLevel = t1;
      } else {
        t1 = $.$get$Logger_root()._level;
        t1.toString;
        effectiveLevel = t1;
      }
      return effectiveLevel;
    },
    log$4(logLevel, message, error, stackTrace) {
      var record, _this = this,
        t1 = logLevel.value;
      if (t1 >= _this.get$level(0).value) {
        if (stackTrace == null && t1 >= 2000) {
          A.StackTrace_current();
          if (error == null)
            logLevel.toString$0(0);
        }
        t1 = _this.get$fullName();
        Date.now();
        $.LogRecord__nextNumber = $.LogRecord__nextNumber + 1;
        record = new A.LogRecord(logLevel, message, t1);
        if (_this.parent == null)
          _this._publish$1(record);
        else
          $.$get$Logger_root()._publish$1(record);
      }
    },
    _publish$1(record) {
      return null;
    }
  };
  A.Logger_Logger_closure.prototype = {
    call$0() {
      var dot, $parent, t1,
        thisName = this.name;
      if (B.JSString_methods.startsWith$1(thisName, "."))
        A.throwExpression(A.ArgumentError$("name shouldn't start with a '.'", null));
      if (B.JSString_methods.endsWith$1(thisName, "."))
        A.throwExpression(A.ArgumentError$("name shouldn't end with a '.'", null));
      dot = B.JSString_methods.lastIndexOf$1(thisName, ".");
      if (dot === -1)
        $parent = thisName !== "" ? A.Logger_Logger("") : null;
      else {
        $parent = A.Logger_Logger(B.JSString_methods.substring$2(thisName, 0, dot));
        thisName = B.JSString_methods.substring$1(thisName, dot + 1);
      }
      t1 = new A.Logger(thisName, $parent, A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger));
      if ($parent == null)
        t1._level = B.Level_INFO_800;
      else
        $parent._children.$indexSet(0, thisName, t1);
      return t1;
    },
    $signature: 60
  };
  A.Pool.prototype = {
    request$0(_) {
      var t1, t2, _this = this;
      if ((_this._closeMemo._async_memoizer$_completer.future._state & 30) !== 0)
        throw A.wrapException(A.StateError$("request() may not be called on a closed Pool."));
      t1 = _this._allocatedResources;
      if (t1 < _this._maxAllocatedResources) {
        _this._allocatedResources = t1 + 1;
        return A.Future_Future$value(new A.PoolResource(_this), type$.PoolResource);
      } else {
        t1 = _this._onReleaseCallbacks;
        if (!t1.get$isEmpty(0))
          return _this._runOnRelease$1(t1.removeFirst$0());
        else {
          t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
          t2 = _this._requestedResources;
          t2._collection$_add$1(0, t2.$ti._precomputed1._as(new A._AsyncCompleter(t1, type$._AsyncCompleter_PoolResource)));
          _this._resetTimer$0();
          return t1;
        }
      }
    },
    withResource$1$1(callback, $T) {
      return this.withResource$body$Pool($T._eval$1("0/()")._as(callback), $T, $T);
    },
    withResource$body$Pool(callback, $T, $async$type) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter($async$type),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$next = [], $async$self = this, resource, t1, t2;
      var $async$withResource$1$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              if (($async$self._closeMemo._async_memoizer$_completer.future._state & 30) !== 0)
                throw A.wrapException(A.StateError$("withResource() may not be called on a closed Pool."));
              $async$goto = 3;
              return A._asyncAwait($async$self.request$0(0), $async$withResource$1$1);
            case 3:
              // returning from await.
              resource = $async$result;
              $async$handler = 4;
              t1 = callback.call$0();
              $async$goto = 7;
              return A._asyncAwait($T._eval$1("Future<0>")._is(t1) ? t1 : A._Future$value($T._as(t1), $T), $async$withResource$1$1);
            case 7:
              // returning from await.
              t1 = $async$result;
              $async$returnValue = t1;
              $async$next = [1];
              // goto finally
              $async$goto = 5;
              break;
              $async$next.push(6);
              // goto finally
              $async$goto = 5;
              break;
            case 4:
              // uncaught
              $async$next = [2];
            case 5:
              // finally
              $async$handler = 2;
              t1 = resource;
              if (t1._released)
                A.throwExpression(A.StateError$("A PoolResource may only be released once."));
              t1._released = true;
              t1 = t1._pool;
              t1._resetTimer$0();
              t2 = t1._requestedResources;
              if (!t2.get$isEmpty(0))
                t2.removeFirst$0().complete$1(0, new A.PoolResource(t1));
              else {
                t2 = --t1._allocatedResources;
                if ((t1._closeMemo._async_memoizer$_completer.future._state & 30) !== 0 && t2 === 0)
                  null.close$0(0);
              }
              // goto the next finally handler
              $async$goto = $async$next.pop();
              break;
            case 6:
              // after finally
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$withResource$1$1, $async$completer);
    },
    _runOnRelease$1(onRelease) {
      var t1, t2;
      A.Future_Future$sync(type$.dynamic_Function._as(onRelease), type$.dynamic).then$1$1(0, new A.Pool__runOnRelease_closure(this), type$.Null).catchError$1(new A.Pool__runOnRelease_closure0(this));
      t1 = new A._Future($.Zone__current, type$._Future_PoolResource);
      t2 = this._onReleaseCompleters;
      t2._collection$_add$1(0, t2.$ti._precomputed1._as(new A._SyncCompleter(t1, type$._SyncCompleter_PoolResource)));
      return t1;
    },
    _resetTimer$0() {
      var t2,
        t1 = this._timer;
      if (t1 == null)
        return;
      t2 = this._requestedResources;
      if (t2._head === t2._tail)
        t1._restartable_timer$_timer.cancel$0(0);
      else {
        t1._restartable_timer$_timer.cancel$0(0);
        t1._restartable_timer$_timer = A.Timer_Timer(t1._restartable_timer$_duration, t1._callback);
      }
    }
  };
  A.Pool__runOnRelease_closure.prototype = {
    call$1(value) {
      var t1 = this.$this;
      J.complete$1$z(t1._onReleaseCompleters.removeFirst$0(), new A.PoolResource(t1));
    },
    $signature: 7
  };
  A.Pool__runOnRelease_closure0.prototype = {
    call$2(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      this.$this._onReleaseCompleters.removeFirst$0().completeError$2(error, stackTrace);
    },
    $signature: 8
  };
  A.PoolResource.prototype = {};
  A.SseClient.prototype = {
    SseClient$2$debugKey(serverUrl, debugKey) {
      var t2, _this = this,
        t1 = serverUrl + "?sseClientId=" + _this._clientId;
      _this.__SseClient__serverUrl_A = t1;
      t1 = A.EventSource__factoryEventSource(t1, A.LinkedHashMap_LinkedHashMap$_literal(["withCredentials", true], type$.String, type$.dynamic));
      _this.__SseClient__eventSource_A = t1;
      new A._EventStream(t1, "open", false, type$._EventStream_Event).get$first(0).whenComplete$1(new A.SseClient_closure(_this));
      B.EventSource_methods.addEventListener$2(_this.__SseClient__eventSource_A, "message", _this.get$_onIncomingMessage());
      B.EventSource_methods.addEventListener$2(_this.__SseClient__eventSource_A, "control", _this.get$_onIncomingControlMessage());
      t1 = type$.nullable_void_Function_Event;
      t2 = type$.Event;
      A._EventStreamSubscription$(_this.__SseClient__eventSource_A, "open", t1._as(new A.SseClient_closure0(_this)), false, t2);
      A._EventStreamSubscription$(_this.__SseClient__eventSource_A, "error", t1._as(new A.SseClient_closure1(_this)), false, t2);
    },
    close$0(_) {
      var _this = this,
        t1 = _this.__SseClient__eventSource_A;
      t1 === $ && A.throwLateFieldNI("_eventSource");
      t1.close();
      if ((_this._onConnected.future._state & 30) === 0) {
        t1 = _this._outgoingController;
        new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$cancelOnError(null, true).asFuture$1$1(null, type$.dynamic);
      }
      _this._incomingController.close$0(0);
      _this._outgoingController.close$0(0);
    },
    _closeWithError$1(error) {
      var t1;
      this._incomingController.addError$1(error);
      this.close$0(0);
      t1 = this._onConnected;
      if ((t1.future._state & 30) === 0)
        t1.completeError$1(error);
    },
    _onIncomingControlMessage$1(message) {
      var data = new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as(type$.Event._as(message)).data, true);
      if (J.$eq$(data, "close"))
        this.close$0(0);
      else
        throw A.wrapException(A.UnsupportedError$("[" + this._clientId + '] Illegal Control Message "' + A.S(data) + '"'));
    },
    _onIncomingMessage$1(message) {
      this._incomingController.add$1(0, A._asString(B.C_JsonCodec.decode$2$reviver(0, A._asString(new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as(type$.Event._as(message)).data, true)), null)));
    },
    _onOutgoingDone$0() {
      this.close$0(0);
    },
    _onOutgoingMessage$1(message) {
      return this._onOutgoingMessage$body$SseClient(A._asStringQ(message));
    },
    _onOutgoingMessage$body$SseClient(message) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, t1;
      var $async$_onOutgoingMessage$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = {};
              t1.encodedMessage = null;
              $async$goto = 2;
              return A._asyncAwait($.$get$_requestPool().withResource$1$1(new A.SseClient__onOutgoingMessage_closure(t1, $async$self, message), type$.Null), $async$_onOutgoingMessage$1);
            case 2:
              // returning from await.
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_onOutgoingMessage$1, $async$completer);
    }
  };
  A.SseClient_closure.prototype = {
    call$0() {
      var t2,
        t1 = this.$this;
      t1._onConnected.complete$0(0);
      t2 = t1._outgoingController;
      new A._ControllerStream(t2, A._instanceType(t2)._eval$1("_ControllerStream<1>")).listen$2$onDone(t1.get$_onOutgoingMessage(), t1.get$_onOutgoingDone());
    },
    $signature: 5
  };
  A.SseClient_closure0.prototype = {
    call$1(_) {
      var t1 = this.$this._errorTimer;
      if (t1 != null)
        t1.cancel$0(0);
    },
    $signature: 4
  };
  A.SseClient_closure1.prototype = {
    call$1(error) {
      var t1 = this.$this,
        t2 = t1._errorTimer;
      t2 = t2 == null ? null : t2.get$isActive();
      if (t2 !== true)
        t1._errorTimer = A.Timer_Timer(B.Duration_5000000, new A.SseClient__closure(t1, error));
    },
    $signature: 4
  };
  A.SseClient__closure.prototype = {
    call$0() {
      this.$this._closeWithError$1(this.error);
    },
    $signature: 0
  };
  A.SseClient__onOutgoingMessage_closure.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        $async$handler = 1, $async$currentError, $async$self = this, e, e0, url, error, augmentedError, exception, t1, t2, $async$exception;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              try {
                $async$self._box_0.encodedMessage = B.C_JsonCodec.encode$2$toEncodable($async$self.message, null);
              } catch (exception) {
                t1 = A.unwrapException(exception);
                if (t1 instanceof A.JsonUnsupportedObjectError) {
                  e = t1;
                  t1 = $async$self.$this;
                  t1._logger.log$4(B.Level_WARNING_900, "[" + t1._clientId + "] Unable to encode outgoing message: " + A.S(e), null, null);
                } else if (t1 instanceof A.ArgumentError) {
                  e0 = t1;
                  t1 = $async$self.$this;
                  t1._logger.log$4(B.Level_WARNING_900, "[" + t1._clientId + "] Invalid argument: " + A.S(e0), null, null);
                } else
                  throw exception;
              }
              $async$handler = 3;
              t1 = $async$self.$this;
              t2 = t1.__SseClient__serverUrl_A;
              t2 === $ && A.throwLateFieldNI("_serverUrl");
              url = t2 + "&messageId=" + ++t1._lastMessageId;
              $async$goto = 6;
              return A._asyncAwait(A.promiseToFuture(self.fetch(url, {method: "POST", credentials: "include", body: $async$self._box_0.encodedMessage}), type$.dynamic), $async$call$0);
            case 6:
              // returning from await.
              $async$handler = 1;
              // goto after finally
              $async$goto = 5;
              break;
            case 3:
              // catch
              $async$handler = 2;
              $async$exception = $async$currentError;
              error = A.unwrapException($async$exception);
              t1 = $async$self.$this;
              augmentedError = "[" + t1._clientId + "] SSE client failed to send " + A.S($async$self.message) + ":\n " + A.S(error);
              t1._logger.log$4(B.Level_SEVERE_1000, augmentedError, null, null);
              t1._closeWithError$1(augmentedError);
              // goto after finally
              $async$goto = 5;
              break;
            case 2:
              // uncaught
              // goto rethrow
              $async$goto = 1;
              break;
            case 5:
              // after finally
              // implicit return
              return A._asyncReturn(null, $async$completer);
            case 1:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 25
  };
  A._FetchOptions.prototype = {};
  A.generateUuidV4__generateBits.prototype = {
    call$1(bitCount) {
      return this.random.nextInt$1(B.JSInt_methods._shlPositive$1(1, bitCount));
    },
    $signature: 21
  };
  A.generateUuidV4__printDigits.prototype = {
    call$2(value, count) {
      return B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(value, 16), count, "0");
    },
    $signature: 29
  };
  A.generateUuidV4__bitsDigits.prototype = {
    call$2(bitCount, digitCount) {
      return this._printDigits.call$2(this._generateBits.call$1(bitCount), digitCount);
    },
    $signature: 29
  };
  A.GuaranteeChannel.prototype = {
    GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, _box_0, $T) {
      var _this = this,
        t1 = _this.$ti,
        t2 = t1._eval$1("_GuaranteeSink<1>")._as(new A._GuaranteeSink(innerSink, _this, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic), allowSinkErrors, $T._eval$1("_GuaranteeSink<0>")));
      _this.__GuaranteeChannel__sink_F !== $ && A.throwLateFieldAI("_sink");
      _this.set$__GuaranteeChannel__sink_F(t2);
      t1 = t1._eval$1("StreamController<1>")._as(A.StreamController_StreamController(null, new A.GuaranteeChannel_closure(_box_0, _this, $T), true, $T));
      _this.__GuaranteeChannel__streamController_F !== $ && A.throwLateFieldAI("_streamController");
      _this.set$__GuaranteeChannel__streamController_F(t1);
    },
    _onSinkDisconnected$0() {
      var subscription, t1;
      this._disconnected = true;
      subscription = this._guarantee_channel$_subscription;
      if (subscription != null)
        subscription.cancel$0(0);
      t1 = this.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t1.close$0(0);
    },
    set$__GuaranteeChannel__sink_F(__GuaranteeChannel__sink_F) {
      this.__GuaranteeChannel__sink_F = this.$ti._eval$1("_GuaranteeSink<1>")._as(__GuaranteeChannel__sink_F);
    },
    set$__GuaranteeChannel__streamController_F(__GuaranteeChannel__streamController_F) {
      this.__GuaranteeChannel__streamController_F = this.$ti._eval$1("StreamController<1>")._as(__GuaranteeChannel__streamController_F);
    },
    set$_guarantee_channel$_subscription(_subscription) {
      this._guarantee_channel$_subscription = this.$ti._eval$1("StreamSubscription<1>?")._as(_subscription);
    }
  };
  A.GuaranteeChannel_closure.prototype = {
    call$0() {
      var t2, t3,
        t1 = this.$this;
      if (t1._disconnected)
        return;
      t2 = this._box_0.innerStream;
      t3 = t1.__GuaranteeChannel__streamController_F;
      t3 === $ && A.throwLateFieldNI("_streamController");
      t1.set$_guarantee_channel$_subscription(t2.listen$3$onDone$onError(this.T._eval$1("~(0)")._as(t3.get$add(t3)), new A.GuaranteeChannel__closure(t1), t3.get$addError()));
    },
    $signature: 0
  };
  A.GuaranteeChannel__closure.prototype = {
    call$0() {
      var t1 = this.$this,
        t2 = t1.__GuaranteeChannel__sink_F;
      t2 === $ && A.throwLateFieldNI("_sink");
      t2._onStreamDisconnected$0();
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      t1.close$0(0);
    },
    $signature: 0
  };
  A._GuaranteeSink.prototype = {
    add$1(_, data) {
      var t1, _this = this;
      _this.$ti._precomputed1._as(data);
      if (_this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (_this._disconnected)
        return;
      t1 = _this._inner;
      t1._async$_target.add$1(0, t1.$ti._precomputed1._as(data));
    },
    addError$2(error, stackTrace) {
      if (this._closed)
        throw A.wrapException(A.StateError$("Cannot add event after closing."));
      if (this._disconnected)
        return;
      this._guarantee_channel$_addError$2(error, stackTrace);
    },
    addError$1(error) {
      return this.addError$2(error, null);
    },
    _guarantee_channel$_addError$2(error, stackTrace) {
      var _this = this;
      if (_this._allowErrors) {
        _this._inner._async$_target.addError$2(error, stackTrace);
        return;
      }
      _this._doneCompleter.completeError$2(error, stackTrace);
      _this._onStreamDisconnected$0();
      _this._guarantee_channel$_channel._onSinkDisconnected$0();
      _this._inner._async$_target.close$0(0).catchError$1(new A._GuaranteeSink__addError_closure());
    },
    close$0(_) {
      var _this = this;
      if (_this._closed)
        return _this._doneCompleter.future;
      _this._closed = true;
      if (!_this._disconnected) {
        _this._guarantee_channel$_channel._onSinkDisconnected$0();
        _this._doneCompleter.complete$1(0, _this._inner._async$_target.close$0(0));
      }
      return _this._doneCompleter.future;
    },
    _onStreamDisconnected$0() {
      this._disconnected = true;
      var t1 = this._doneCompleter;
      if ((t1.future._state & 30) === 0)
        t1.complete$0(0);
      return;
    },
    $isStreamSink: 1
  };
  A._GuaranteeSink__addError_closure.prototype = {
    call$1(_) {
    },
    $signature: 7
  };
  A.StreamChannelController.prototype = {
    set$__StreamChannelController__local_F(__StreamChannelController__local_F) {
      this.__StreamChannelController__local_F = this.$ti._eval$1("StreamChannel<1>")._as(__StreamChannelController__local_F);
    },
    set$__StreamChannelController__foreign_F(__StreamChannelController__foreign_F) {
      this.__StreamChannelController__foreign_F = this.$ti._eval$1("StreamChannel<1>")._as(__StreamChannelController__foreign_F);
    }
  };
  A.StreamChannelMixin.prototype = {$isStreamChannel: 1};
  A.Uuid.prototype = {
    get$_uuid$_state() {
      var t2, t3,
        t1 = $.$get$Uuid__stateExpando();
      A.Expando__checkType(this);
      t2 = t1._jsWeakMap;
      t3 = t2.get(this);
      if (t3 == null) {
        t3 = A.LinkedHashMap_LinkedHashMap$_literal(["seedBytes", null, "node", null, "clockSeq", null, "mSecs", 0, "nSecs", 0, "hasInitV1", false, "hasInitV4", false], type$.String, type$.dynamic);
        t1.$ti._eval$1("1?")._as(t3);
        t2.set(this, t3);
        t1 = t3;
      } else
        t1 = t3;
      return t1;
    },
    v1$0() {
      var seedBytes, nodeId, t2, t3, t4, clockSeq, mSecs, nSecs, tl, tmh, node, n, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, _this = this,
        _s9_ = "hasInitV1",
        _s9_0 = "seedBytes",
        _s4_ = "node",
        _s8_ = "clockSeq",
        _s5_ = "mSecs", _s5_0 = "nSecs",
        buf = new Uint8Array(16),
        options = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic),
        t1 = J.$index$asx(_this.get$_uuid$_state(), _s9_);
      t1.toString;
      if (!A._asBool(t1)) {
        seedBytes = A.UuidUtil_mathRNG();
        if (J.$index$asx(_this.get$_uuid$_state(), _s9_0) != null)
          J.$index$asx(_this.get$_uuid$_state(), _s9_0);
        else
          J.$indexSet$ax(_this.get$_uuid$_state(), _s9_0, seedBytes);
        nodeId = A._setArrayType([seedBytes[0] | 1, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]], type$.JSArray_int);
        if (J.$index$asx(_this.get$_uuid$_state(), _s4_) != null)
          J.$index$asx(_this.get$_uuid$_state(), _s4_);
        else
          J.$indexSet$ax(_this.get$_uuid$_state(), _s4_, nodeId);
        t1 = seedBytes[6];
        t2 = seedBytes[7];
        t3 = _this.get$_uuid$_state();
        t4 = J.getInterceptor$asx(t3);
        if (t4.$index(t3, _s8_) == null)
          t4.$indexSet(t3, _s8_, (t1 << 8 | t2) & 262143);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s5_, 0);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s5_0, 0);
        J.$indexSet$ax(_this.get$_uuid$_state(), _s9_, true);
      }
      options.$index(0, _s8_);
      clockSeq = A._asInt(J.$index$asx(_this.get$_uuid$_state(), _s8_));
      options.$index(0, _s5_);
      mSecs = Date.now();
      options.$index(0, _s5_0);
      t1 = J.$index$asx(_this.get$_uuid$_state(), _s5_0);
      t1.toString;
      nSecs = A._asInt(t1) + 1;
      t1 = mSecs - A._asNum(J.$index$asx(_this.get$_uuid$_state(), _s5_)) + (nSecs - A._asNum(J.$index$asx(_this.get$_uuid$_state(), _s5_0))) / 10000 < 0;
      if (t1) {
        options.$index(0, _s8_);
        t2 = true;
      } else
        t2 = false;
      if (t2)
        clockSeq = clockSeq + 1 & 16383;
      if (t1 || mSecs > A._asNum(J.$index$asx(_this.get$_uuid$_state(), _s5_))) {
        options.$index(0, _s5_0);
        t1 = true;
      } else
        t1 = false;
      if (t1)
        nSecs = 0;
      if (nSecs >= 10000)
        throw A.wrapException(A.Exception_Exception("uuid.v1(): Can't create more than 10M uuids/sec"));
      J.$indexSet$ax(_this.get$_uuid$_state(), _s5_, mSecs);
      J.$indexSet$ax(_this.get$_uuid$_state(), _s5_0, nSecs);
      J.$indexSet$ax(_this.get$_uuid$_state(), _s8_, clockSeq);
      mSecs += 122192928e5;
      tl = B.JSInt_methods.$mod((mSecs & 268435455) * 10000 + nSecs, 4294967296);
      buf[0] = B.JSInt_methods._shrOtherPositive$1(tl, 24) & 255;
      buf[1] = B.JSInt_methods._shrOtherPositive$1(tl, 16) & 255;
      buf[2] = B.JSInt_methods._shrOtherPositive$1(tl, 8) & 255;
      buf[3] = tl & 255;
      tmh = B.JSNumber_methods.floor$0(mSecs / 4294967296 * 10000) & 268435455;
      buf[4] = tmh >>> 8 & 255;
      buf[5] = tmh & 255;
      buf[6] = tmh >>> 24 & 15 | 16;
      buf[7] = tmh >>> 16 & 255;
      buf[8] = clockSeq >>> 8 & 63 | 128;
      buf[9] = clockSeq & 255;
      options.$index(0, _s4_);
      node = type$.List_dynamic._as(J.$index$asx(_this.get$_uuid$_state(), _s4_));
      for (t1 = J.getInterceptor$asx(node), n = 0; n < 6; ++n)
        buf[10 + n] = A._asInt(t1.$index(node, n));
      t1 = $.$get$Uuid__byteToHex();
      t2 = buf[0];
      if (!(t2 < 256))
        return A.ioore(t1, t2);
      t2 = t1[t2];
      t3 = buf[1];
      if (!(t3 < 256))
        return A.ioore(t1, t3);
      t3 = t1[t3];
      t4 = buf[2];
      if (!(t4 < 256))
        return A.ioore(t1, t4);
      t4 = t1[t4];
      t5 = buf[3];
      if (!(t5 < 256))
        return A.ioore(t1, t5);
      t5 = t1[t5];
      t6 = buf[4];
      if (!(t6 < 256))
        return A.ioore(t1, t6);
      t6 = t1[t6];
      t7 = buf[5];
      if (!(t7 < 256))
        return A.ioore(t1, t7);
      t7 = t1[t7];
      t8 = buf[6];
      if (!(t8 < 256))
        return A.ioore(t1, t8);
      t8 = t1[t8];
      t9 = buf[7];
      if (!(t9 < 256))
        return A.ioore(t1, t9);
      t9 = t1[t9];
      t10 = buf[8];
      if (!(t10 < 256))
        return A.ioore(t1, t10);
      t10 = t1[t10];
      t11 = buf[9];
      if (!(t11 < 256))
        return A.ioore(t1, t11);
      t11 = t1[t11];
      t12 = buf[10];
      if (!(t12 < 256))
        return A.ioore(t1, t12);
      t12 = t1[t12];
      t13 = buf[11];
      if (!(t13 < 256))
        return A.ioore(t1, t13);
      t13 = t1[t13];
      t14 = buf[12];
      if (!(t14 < 256))
        return A.ioore(t1, t14);
      t14 = t1[t14];
      t15 = buf[13];
      if (!(t15 < 256))
        return A.ioore(t1, t15);
      t15 = t1[t15];
      t16 = buf[14];
      if (!(t16 < 256))
        return A.ioore(t1, t16);
      t16 = t1[t16];
      t17 = buf[15];
      if (!(t17 < 256))
        return A.ioore(t1, t17);
      return t2 + t3 + t4 + t5 + "-" + t6 + t7 + "-" + t8 + t9 + "-" + t10 + t11 + "-" + t12 + t13 + t14 + t15 + t16 + t1[t17];
    }
  };
  A.HtmlWebSocketChannel.prototype = {
    HtmlWebSocketChannel$1(innerWebSocket) {
      var _this = this,
        t1 = _this.__HtmlWebSocketChannel__readyCompleter_A = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_void), type$._AsyncCompleter_void),
        t2 = _this.innerWebSocket,
        t3 = t2.readyState;
      t3.toString;
      if (t3 === 1) {
        t1.complete$0(0);
        _this._listen$0();
      } else {
        if (t3 === 2 || t3 === 3)
          t1.completeError$1(new A.WebSocketChannelException("WebSocket state error: " + t3));
        new A._EventStream(t2, "open", false, type$._EventStream_Event).get$first(0).then$1$1(0, new A.HtmlWebSocketChannel_closure(_this), type$.Null);
      }
      t1 = type$.Null;
      new A._EventStream(t2, "error", false, type$._EventStream_Event).get$first(0).then$1$1(0, new A.HtmlWebSocketChannel_closure0(_this), t1);
      A._EventStreamSubscription$(t2, "message", type$.nullable_void_Function_MessageEvent._as(new A.HtmlWebSocketChannel_closure1(_this)), false, type$.MessageEvent);
      new A._EventStream(t2, "close", false, type$._EventStream_CloseEvent).get$first(0).then$1$1(0, new A.HtmlWebSocketChannel_closure2(_this), t1);
    },
    _listen$0() {
      var t1 = this._html0$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t1 = t1.__GuaranteeChannel__streamController_F;
      t1 === $ && A.throwLateFieldNI("_streamController");
      new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")).listen$2$onDone(B.WebSocket_methods.get$send(this.innerWebSocket), new A.HtmlWebSocketChannel__listen_closure(this));
    },
    $isWebSocketChannel: 1
  };
  A.HtmlWebSocketChannel_closure.prototype = {
    call$1(_) {
      var t1, t2;
      type$.Event._as(_);
      t1 = this.$this;
      t2 = t1.__HtmlWebSocketChannel__readyCompleter_A;
      t2 === $ && A.throwLateFieldNI("_readyCompleter");
      t2.complete$0(0);
      t1._listen$0();
    },
    $signature: 36
  };
  A.HtmlWebSocketChannel_closure0.prototype = {
    call$1(_) {
      var error, t1, t2;
      type$.Event._as(_);
      error = new A.WebSocketChannelException("WebSocket connection failed.");
      t1 = this.$this;
      t2 = t1.__HtmlWebSocketChannel__readyCompleter_A;
      t2 === $ && A.throwLateFieldNI("_readyCompleter");
      t2.completeError$1(error);
      t1 = t1._html0$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t2 = t1.__GuaranteeChannel__sink_F;
      t2 === $ && A.throwLateFieldNI("_sink");
      t2.addError$1(error);
      t1 = t1.__GuaranteeChannel__sink_F;
      t1 === $ && A.throwLateFieldNI("_sink");
      t1.close$0(0);
    },
    $signature: 36
  };
  A.HtmlWebSocketChannel_closure1.prototype = {
    call$1($event) {
      var t1,
        data = new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as($event).data, true);
      if (type$.ByteBuffer._is(data))
        data = A.NativeUint8List_NativeUint8List$view(data, 0, null);
      t1 = this.$this._html0$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t1 = t1.__GuaranteeChannel__sink_F;
      t1 === $ && A.throwLateFieldNI("_sink");
      t1.add$1(0, data);
    },
    $signature: 35
  };
  A.HtmlWebSocketChannel_closure2.prototype = {
    call$1($event) {
      var t1;
      type$.CloseEvent._as($event);
      $event.code;
      $event.reason;
      t1 = this.$this._html0$_controller.__StreamChannelController__local_F;
      t1 === $ && A.throwLateFieldNI("_local");
      t1 = t1.__GuaranteeChannel__sink_F;
      t1 === $ && A.throwLateFieldNI("_sink");
      t1.close$0(0);
    },
    $signature: 83
  };
  A.HtmlWebSocketChannel__listen_closure.prototype = {
    call$0() {
      this.$this.innerWebSocket.close();
    },
    $signature: 0
  };
  A._HtmlWebSocketSink.prototype = {$isWebSocketSink: 1};
  A.WebSocketChannel.prototype = {};
  A.WebSocketChannelException.prototype = {
    toString$0(_) {
      return "WebSocketChannelException: " + this.message;
    }
  };
  A.main_closure.prototype = {
    call$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        uri, t1, t2, fixedPath, fixedUri, client, restarter, manager, t3, t4, debugEventController, t5;
      var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              if (self.$dartAppInstanceId == null)
                self.$dartAppInstanceId = B.C_Uuid.v1$0();
              uri = A.Uri_parse(self.$dwdsDevHandlerPath);
              t1 = type$.Location;
              t2 = t1._as(window.location).protocol;
              t2.toString;
              if (t2 === "https:" && uri.get$scheme() === "http" && uri.get$host(uri) !== "localhost")
                uri = uri.replace$1$scheme(0, "https");
              else {
                t1 = t1._as(window.location).protocol;
                t1.toString;
                if (t1 === "wss:" && uri.get$scheme() === "ws" && uri.get$host(uri) !== "localhost")
                  uri = uri.replace$1$scheme(0, "wss");
              }
              fixedPath = uri.toString$0(0);
              fixedUri = A.Uri_parse(fixedPath);
              client = fixedUri.isScheme$1("ws") || fixedUri.isScheme$1("wss") ? new A.WebSocketClient(A.HtmlWebSocketChannel$connect(fixedUri, null)) : new A.SseSocketClient(A.SseClient$(fixedPath, "InjectedClient"));
              $async$goto = J.$eq$(self.$dartModuleStrategy, "require-js") ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = 5;
              return A._asyncAwait(A.RequireRestarter_create(), $async$call$0);
            case 5:
              // returning from await.
              restarter = $async$result;
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if (J.$eq$(self.$dartModuleStrategy, "ddc") || J.$eq$(self.$dartModuleStrategy, "legacy"))
                restarter = new A.DdcRestarter();
              else
                throw A.wrapException(A.StateError$("Unknown module strategy: " + A.S(self.$dartModuleStrategy)));
            case 3:
              // join
              manager = new A.ReloadingManager(client, restarter);
              self.$dartHotRestartDwds = A.allowInterop(new A.main__closure(manager), type$.Promise_bool_Function_String);
              t1 = $.Zone__current;
              t2 = Math.max(100, 1);
              t3 = A.StreamController_StreamController(null, null, false, type$.DebugEvent);
              t4 = A.StreamController_StreamController(null, null, false, type$.List_DebugEvent);
              debugEventController = new A.BatchedStreamController(t2, 1000, t3, t4, new A._AsyncCompleter(new A._Future(t1, type$._Future_bool), type$._AsyncCompleter_bool), type$.BatchedStreamController_DebugEvent);
              t1 = A.List_List$filled(A.QueueList__computeInitialCapacity(null), null, false, type$.nullable_Result_DebugEvent);
              t2 = A.ListQueue$(type$._EventRequest_dynamic);
              t5 = type$.StreamQueue_DebugEvent;
              debugEventController.set$__BatchedStreamController__inputQueue_A(t5._as(new A.StreamQueue(new A._ControllerStream(t3, A._instanceType(t3)._eval$1("_ControllerStream<1>")), new A.QueueList(t1, 0, 0, type$.QueueList_Result_DebugEvent), t2, t5)));
              A.safeUnawaited(debugEventController._batchAndSendEvents$0());
              new A._ControllerStream(t4, A._instanceType(t4)._eval$1("_ControllerStream<1>")).listen$1(new A.main__closure0(client));
              self.$emitDebugEvent = A.allowInterop(new A.main__closure1(debugEventController), type$.void_Function_String_String);
              self.$emitRegisterEvent = A.allowInterop(new A.main__closure2(client), type$.void_Function_String);
              self.$launchDevTools = A.allowInterop(new A.main__closure3(client), type$.void_Function);
              client.get$stream(client).listen$2$onError(new A.main__closure4(manager), new A.main__closure5());
              if (A.boolConversionCheck(self.$dwdsEnableDevToolsLaunch)) {
                t1 = window;
                t1.toString;
                A._EventStreamSubscription$(t1, "keydown", type$.nullable_void_Function_KeyboardEvent._as(new A.main__closure6()), false, type$.KeyboardEvent);
              }
              t1 = window.navigator.vendor;
              t1.toString;
              if (B.JSString_methods.contains$1(t1, "Google")) {
                t1 = client.get$sink();
                t2 = $.$get$serializers();
                t3 = new A.ConnectRequestBuilder();
                type$.nullable_void_Function_ConnectRequestBuilder._as(new A.main__closure7()).call$1(t3);
                A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._build$0()), null), type$.dynamic);
              } else
                A.runMain();
              A._launchCommunicationWithDebugExtension();
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$0, $async$completer);
    },
    $signature: 66
  };
  A.main__closure.prototype = {
    call$1(runId) {
      return A.toPromise(this.manager.hotRestart$1$runId(A._asString(runId)), type$.bool);
    },
    $signature: 67
  };
  A.main__closure0.prototype = {
    call$1(events) {
      var t1, t2, t3;
      type$.List_DebugEvent._as(events);
      if (A.boolConversionCheck(self.$dartEmitDebugEvents)) {
        t1 = this.client.get$sink();
        t2 = $.$get$serializers();
        t3 = new A.BatchedDebugEventsBuilder();
        type$.nullable_void_Function_BatchedDebugEventsBuilder._as(new A.main___closure2(events)).call$1(t3);
        A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._debug_event$_build$0()), null), type$.dynamic);
      }
    },
    $signature: 68
  };
  A.main___closure2.prototype = {
    call$1(b) {
      var t1 = A.ListBuilder_ListBuilder(this.events, type$.DebugEvent);
      type$.nullable_ListBuilder_DebugEvent._as(t1);
      b.get$_debug_event$_$this().set$_events(t1);
      return t1;
    },
    $signature: 69
  };
  A.main__closure1.prototype = {
    call$2(kind, eventData) {
      var t1, t2;
      A._asString(kind);
      A._asString(eventData);
      if (A.boolConversionCheck(self.$dartEmitDebugEvents)) {
        t1 = this.debugEventController._inputController;
        t2 = new A.DebugEventBuilder();
        type$.nullable_void_Function_DebugEventBuilder._as(new A.main___closure1(kind, eventData)).call$1(t2);
        A._trySendEvent(new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>")), t2._debug_event$_build$0(), type$.DebugEvent);
      }
    },
    $signature: 15
  };
  A.main___closure1.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_debug_event$_$this()._timestamp = t1;
      b.get$_debug_event$_$this()._debug_event$_kind = this.kind;
      b.get$_debug_event$_$this()._eventData = this.eventData;
      return b;
    },
    $signature: 70
  };
  A.main__closure2.prototype = {
    call$1(eventData) {
      var t1, t2, t3;
      A._asString(eventData);
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.RegisterEventBuilder();
      type$.nullable_void_Function_RegisterEventBuilder._as(new A.main___closure0(eventData)).call$1(t3);
      A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._register_event$_build$0()), null), type$.dynamic);
    },
    $signature: 33
  };
  A.main___closure0.prototype = {
    call$1(b) {
      var t1 = Date.now();
      b.get$_register_event$_$this()._register_event$_timestamp = t1;
      b.get$_register_event$_$this()._register_event$_eventData = this.eventData;
      return b;
    },
    $signature: 72
  };
  A.main__closure3.prototype = {
    call$0() {
      var t2, t3,
        t1 = window.navigator.vendor;
      t1.toString;
      if (!B.JSString_methods.contains$1(t1, "Google")) {
        t1 = window;
        t1.toString;
        B.Window_methods.alert$1(t1, "Dart DevTools is only supported on Chromium based browsers.");
        return;
      }
      t1 = this.client.get$sink();
      t2 = $.$get$serializers();
      t3 = new A.DevToolsRequestBuilder();
      type$.nullable_void_Function_DevToolsRequestBuilder._as(new A.main___closure()).call$1(t3);
      A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._devtools_request$_build$0()), null), type$.dynamic);
    },
    $signature: 0
  };
  A.main___closure.prototype = {
    call$1(b) {
      var t1 = A._asStringQ(self.$dartAppId);
      b.get$_devtools_request$_$this()._devtools_request$_appId = t1;
      t1 = A._asStringQ(self.$dartAppInstanceId);
      b.get$_devtools_request$_$this()._devtools_request$_instanceId = t1;
      return b;
    },
    $signature: 73
  };
  A.main__closure4.prototype = {
    call$1(serialized) {
      return this.$call$body$main__closure(A._asString(serialized));
    },
    $call$body$main__closure(serialized) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, $alert, t1, win, t2, t3, $event;
      var $async$call$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $event = $.$get$serializers().deserialize$1(B.C_JsonCodec.decode$2$reviver(0, serialized, null));
              $async$goto = $event instanceof A._$BuildResult ? 2 : 4;
              break;
            case 2:
              // then
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.liveReload") ? 5 : 7;
              break;
            case 5:
              // then
              type$.Location._as(window.location).reload();
              // goto join
              $async$goto = 6;
              break;
            case 7:
              // else
              $async$goto = J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotRestart") ? 8 : 10;
              break;
            case 8:
              // then
              $async$goto = 11;
              return A._asyncAwait($async$self.manager.hotRestart$0(), $async$call$1);
            case 11:
              // returning from await.
              // goto join
              $async$goto = 9;
              break;
            case 10:
              // else
              if (J.$eq$(self.$dartReloadConfiguration, "ReloadConfiguration.hotReload"))
                A.print("Hot reload is currently unsupported. Ignoring change.");
            case 9:
              // join
            case 6:
              // join
              // goto join
              $async$goto = 3;
              break;
            case 4:
              // else
              if ($event instanceof A._$DevToolsResponse) {
                if (!$event.success) {
                  $alert = "DevTools failed to open with:\n" + A.S($event.error);
                  if ($event.promptExtension) {
                    t1 = window;
                    t1.toString;
                    t1 = B.Window_methods.confirm$1(t1, $alert);
                  } else
                    t1 = false;
                  if (t1) {
                    win = window.open("https://goo.gle/dart-debug-extension", "_blank");
                    A._DOMWindowCrossFrame__createSafe(win);
                  } else {
                    t1 = window;
                    t1.toString;
                    B.Window_methods.alert$1(t1, $alert);
                  }
                }
              } else if ($event instanceof A._$RunRequest)
                A.runMain();
              else if ($event instanceof A._$ErrorResponse) {
                window.toString;
                t1 = $event.error;
                t2 = $event.stackTrace;
                t3 = typeof console != "undefined";
                t3.toString;
                if (t3)
                  window.console.error("Error from backend:\n\nError: " + t1 + "\n\nStack Trace:\n" + t2);
              }
            case 3:
              // join
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$1, $async$completer);
    },
    $signature: 74
  };
  A.main__closure5.prototype = {
    call$1(error) {
    },
    $signature: 7
  };
  A.main__closure6.prototype = {
    call$1(e) {
      var t1;
      if (type$.KeyboardEvent._is(e))
        if (B.JSArray_methods.contains$1(B.List_er0, e.key)) {
          t1 = e.altKey;
          t1.toString;
          if (t1) {
            t1 = e.ctrlKey;
            t1.toString;
            if (!t1) {
              t1 = e.metaKey;
              t1.toString;
              t1 = !t1;
            } else
              t1 = false;
          } else
            t1 = false;
        } else
          t1 = false;
      else
        t1 = false;
      if (t1) {
        e.preventDefault();
        self.$launchDevTools.call$0();
      }
    },
    $signature: 4
  };
  A.main__closure7.prototype = {
    call$1(b) {
      var t1 = A._asStringQ(self.$dartAppId);
      b.get$_connect_request$_$this()._appId = t1;
      t1 = A._asStringQ(self.$dartAppInstanceId);
      b.get$_connect_request$_$this()._instanceId = t1;
      t1 = A._asStringQ(self.$dartEntrypointPath);
      b.get$_connect_request$_$this()._entrypointPath = t1;
      return b;
    },
    $signature: 75
  };
  A.main_closure0.prototype = {
    call$2(error, stackTrace) {
      type$.Object._as(error);
      type$.StackTrace._as(stackTrace);
      A.print("Unhandled error detected in the injected client.js script.\n\nYou can disable this script in webdev by passing --no-injected-client if it\nis preventing your app from loading, but note that this will also prevent\nall debugging and hot reload/restart functionality from working.\n\nThe original error is below, please file an issue at\nhttps://github.com/dart-lang/webdev/issues/new and attach this output:\n\n" + A.S(error) + "\n" + stackTrace.toString$0(0) + "\n");
    },
    $signature: 11
  };
  A._launchCommunicationWithDebugExtension_closure.prototype = {
    call$1(b) {
      var t2,
        t1 = A._asStringQ(self.$dartEntrypointPath);
      b.get$_$this()._appEntrypointPath = t1;
      t1 = window;
      t1.toString;
      t1 = A._asStringQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$dartAppId"));
      b.get$_$this()._debug_info$_appId = t1;
      t1 = A._asStringQ(self.$dartAppInstanceId);
      b.get$_$this()._appInstanceId = t1;
      t1 = type$.Location;
      t2 = B.Location_methods.get$origin(t1._as(window.location));
      b.get$_$this()._appOrigin = t2;
      t1 = t1._as(window.location).href;
      t1.toString;
      b.get$_$this()._appUrl = t1;
      t1 = A._authUrl();
      b.get$_$this()._authUrl = t1;
      t1 = window;
      t1.toString;
      t1 = A._asStringQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$dartExtensionUri"));
      b.get$_$this()._extensionUrl = t1;
      t1 = window;
      t1.toString;
      t1 = A._asBoolQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$isInternalBuild"));
      b.get$_$this()._isInternalBuild = t1;
      t1 = window;
      t1.toString;
      t1 = A._asBoolQ(A.JsObject_JsObject$fromBrowserObject(t1).$index(0, "$isFlutterApp"));
      b.get$_$this()._isFlutterApp = t1;
      t1 = A._asStringQ(self.$dartWorkspaceName);
      b.get$_$this()._workspaceName = t1;
      return b;
    },
    $signature: 76
  };
  A._listenForDebugExtensionAuthRequest_closure.prototype = {
    call$1($event) {
      return this.$call$body$_listenForDebugExtensionAuthRequest_closure(type$.Event._as($event));
    },
    $call$body$_listenForDebugExtensionAuthRequest_closure($event) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Null),
        $async$returnValue, t1, $async$temp1, $async$temp2, $async$temp3, $async$temp4;
      var $async$call$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              type$.MessageEvent._as($event);
              if (typeof new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy($event.data, true) != "string") {
                // goto return
                $async$goto = 1;
                break;
              }
              if (A._asString(new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy($event.data, true)) !== "dart-auth-request") {
                // goto return
                $async$goto = 1;
                break;
              }
              $async$goto = A._authUrl() != null ? 3 : 4;
              break;
            case 3:
              // then
              t1 = A._authUrl();
              t1.toString;
              $async$temp1 = self.window.top.document;
              $async$temp2 = A;
              $async$temp3 = "dart-auth-response";
              $async$temp4 = A;
              $async$goto = 5;
              return A._asyncAwait(A._authenticateUser(t1), $async$call$1);
            case 5:
              // returning from await.
              $async$temp1.dispatchEvent($async$temp2.CustomEvent_CustomEvent($async$temp3, $async$temp4.S($async$result)));
            case 4:
              // join
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$call$1, $async$completer);
    },
    $signature: 77
  };
  A.DdcRestarter.prototype = {
    restart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, t1, t2, dartLibrary;
      var $async$restart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              dartLibrary = type$.JsObject._as($.$get$_context().$index(0, "dart_library"));
              if (runId == null)
                dartLibrary.callMethod$1("reload");
              else {
                t1 = type$.String;
                t1 = A.LinkedHashMap_LinkedHashMap$_literal(["runId", runId], t1, t1);
                dartLibrary.callMethod$2("reload", [A._wrapToDart(A.JsObject__convertDataTree(t1))]);
              }
              t1 = new A._Future($.Zone__current, type$._Future_bool);
              t2 = window;
              t2.toString;
              $async$returnValue = t1.then$1$1(0, new A.DdcRestarter_restart_closure(A._EventStreamSubscription$(t2, "message", type$.nullable_void_Function_MessageEvent._as(new A.DdcRestarter_restart_closure0(new A._AsyncCompleter(t1, type$._AsyncCompleter_bool))), false, type$.MessageEvent)), type$.bool);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$1$runId, $async$completer);
    },
    $isRestarter: 1
  };
  A.DdcRestarter_restart_closure0.prototype = {
    call$1($event) {
      var t1,
        message = new A._AcceptStructuredCloneDart2Js([], []).convertNativeToDart_AcceptStructuredClone$2$mustCopy(type$.MessageEvent._as($event).data, true);
      if (type$.Map_dynamic_dynamic._is(message)) {
        t1 = J.getInterceptor$asx(message);
        t1 = J.$eq$(t1.$index(message, "type"), "DDC_STATE_CHANGE") && J.$eq$(t1.$index(message, "state"), "restart_end");
      } else
        t1 = false;
      if (t1)
        this.reloadCompleter.complete$1(0, true);
    },
    $signature: 35
  };
  A.DdcRestarter_restart_closure.prototype = {
    call$1(value) {
      A._asBool(value);
      this.sub.cancel$0(0);
      return value;
    },
    $signature: 78
  };
  A.ReloadingManager.prototype = {
    hotRestart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, $async$self = this, result, t1, t2;
      var $async$hotRestart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._client.get$sink();
              t2 = $.$get$serializers();
              t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateExitBuilder()._isolate_events$_build$0()), null));
              $async$goto = 3;
              return A._asyncAwait($async$self._restarter.restart$1$runId(runId), $async$hotRestart$1$runId);
            case 3:
              // returning from await.
              result = $async$result;
              $async$self._afterRestart$1(result);
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$hotRestart$1$runId, $async$completer);
    },
    hotRestart$0() {
      return this.hotRestart$1$runId(null);
    },
    _afterRestart$1(succeeded) {
      var t1, t2;
      if (!succeeded)
        return;
      t1 = this._client.get$sink();
      t2 = $.$get$serializers();
      t1.add$1(0, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(new A.IsolateStartBuilder()._isolate_events$_build$0()), null));
    }
  };
  A.Promise.prototype = {};
  A.toPromise_closure.prototype = {
    call$2(resolve, reject) {
      this.T._eval$1("~(0)")._as(resolve);
      type$.void_Function_dynamic._as(reject);
      this.future.then$1$1(0, resolve, type$.void).catchError$1(reject);
    },
    $signature() {
      return this.T._eval$1("~(~(0),~(@))");
    }
  };
  A.toFuture_closure.prototype = {
    call$1(e) {
      var t1 = e == null ? type$.Object._as(e) : e;
      return this.completer.completeError$2(t1, A.StackTrace_current());
    },
    $signature: 3
  };
  A.RequireLoader.prototype = {};
  A.HotReloadFailedException.prototype = {
    toString$0(_) {
      return "HotReloadFailedException: '" + this._s + "'";
    }
  };
  A.JsError.prototype = {};
  A.JsMap.prototype = {};
  A.RequireRestarter.prototype = {
    restart$1$runId(runId) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, $async$self = this, newDigests, modulesToLoad, t4, t5, t6, t7, line, toZone, t8, result, developer, t1, t2, t3;
      var $async$restart$1$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              developer = self.$loadModuleConfig.call$1("dart_sdk").developer;
              t1 = developer == null;
              t2 = t1 ? type$.Object._as(developer) : developer;
              t3 = type$.Object;
              $async$goto = A._asBool(t3._as(t2._extensions).containsKey("ext.flutter.disassemble")) ? 3 : 4;
              break;
            case 3:
              // then
              t1 = t1 ? t3._as(developer) : developer;
              $async$goto = 5;
              return A._asyncAwait(A.toFuture(type$.Promise_void._as(t1.invokeExtension("ext.flutter.disassemble", "{}")), type$.void), $async$restart$1$runId);
            case 5:
              // returning from await.
            case 4:
              // join
              $async$goto = 6;
              return A._asyncAwait($async$self._getDigests$0(), $async$restart$1$runId);
            case 6:
              // returning from await.
              newDigests = $async$result;
              modulesToLoad = A._setArrayType([], type$.JSArray_String);
              for (t1 = J.getInterceptor$x(newDigests), t2 = J.get$iterator$ax(t1.get$keys(newDigests)), t4 = $.___lastKnownDigests.__late_helper$_name, t5 = type$.Location; t2.moveNext$0();) {
                t6 = t2.get$current(t2);
                t7 = $.___lastKnownDigests.__late_helper$_value;
                if (t7 === $.___lastKnownDigests)
                  A.throwExpression(A.LateError$fieldNI(t4));
                if (!J.containsKey$1$x(t7, t6)) {
                  line = "Error during script reloading, refreshing the page. \nUnable to find an existing digest for module: " + t6 + ".";
                  toZone = $.printToZone;
                  if (toZone == null)
                    A.printString(line);
                  else
                    toZone.call$1(line);
                  t5._as(window.location).reload();
                } else {
                  t7 = $.___lastKnownDigests.__late_helper$_value;
                  if (t7 === $.___lastKnownDigests)
                    A.throwExpression(A.LateError$fieldNI(t4));
                  if (!J.$eq$(J.$index$asx(t7, t6), t1.$index(newDigests, t6))) {
                    t7 = $.___lastKnownDigests.__late_helper$_value;
                    if (t7 === $.___lastKnownDigests)
                      A.throwExpression(A.LateError$fieldNI(t4));
                    t8 = t1.$index(newDigests, t6);
                    t8.toString;
                    J.$indexSet$ax(t7, t6, t8);
                    B.JSArray_methods.add$1(modulesToLoad, t6);
                  }
                }
              }
              $async$goto = modulesToLoad.length !== 0 ? 7 : 9;
              break;
            case 7:
              // then
              $async$self._updateGraph$0();
              $async$goto = 10;
              return A._asyncAwait($async$self._reload$1(modulesToLoad), $async$restart$1$runId);
            case 10:
              // returning from await.
              result = $async$result;
              // goto join
              $async$goto = 8;
              break;
            case 9:
              // else
              result = true;
            case 8:
              // join
              t3._as(self.$loadModuleConfig.call$1("dart_sdk").dart).hotRestart();
              A.runMain();
              $async$returnValue = result;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$restart$1$runId, $async$completer);
    },
    _getDigests$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.Map_String_String),
        $async$returnValue, t1, $async$temp1, $async$temp2, $async$temp3;
      var $async$_getDigests$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = type$.String;
              $async$temp1 = J;
              $async$temp2 = type$.Map_dynamic_dynamic;
              $async$temp3 = A;
              $async$goto = 3;
              return A._asyncAwait(A.HttpRequest_request(J.get$digestsPath$x(self.$requireLoader), "GET", "json", null), $async$_getDigests$0);
            case 3:
              // returning from await.
              $async$returnValue = $async$temp1.cast$2$0$ax($async$temp2._as($async$temp3._convertNativeToDart_XHR_Response($async$result.response)), t1, t1);
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
          }
      });
      return A._asyncStartSync($async$_getDigests$0, $async$completer);
    },
    _initialize$0() {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.void),
        $async$self = this, $async$temp1;
      var $async$_initialize$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1)
          return A._asyncRethrow($async$result, $async$completer);
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              $async$temp1 = $.___lastKnownDigests;
              $async$goto = 2;
              return A._asyncAwait($async$self._getDigests$0(), $async$_initialize$0);
            case 2:
              // returning from await.
              $async$temp1.__late_helper$_value = $async$result;
              // implicit return
              return A._asyncReturn(null, $async$completer);
          }
      });
      return A._asyncStartSync($async$_initialize$0, $async$completer);
    },
    _moduleParents$1(module) {
      var t1;
      A._asString(module);
      t1 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), module);
      t1 = t1 == null ? null : J.cast$1$0$ax(t1, type$.String);
      return t1 == null ? A._setArrayType([], type$.JSArray_String) : t1;
    },
    _moduleTopologicalCompare$2(module1, module2) {
      var t1, order1, order2, t2, topological;
      A._asString(module1);
      A._asString(module2);
      t1 = this._moduleOrdering;
      order1 = t1.$index(0, module1);
      order2 = t1.$index(0, module2);
      t2 = order1 == null;
      if (t2 || order2 == null)
        throw A.wrapException(A.HotReloadFailedException$("Unable to fetch ordering info for module: " + (t2 ? module1 : module2)));
      t2 = t1.$index(0, module2);
      t2.toString;
      t1 = t1.$index(0, module1);
      t1.toString;
      topological = J.compareTo$1$ns(t2, t1);
      return topological === 0 ? B.JSString_methods.compareTo$1(module1, module2) : topological;
    },
    _reload$1(modules) {
      return this._reload$body$RequireRestarter(type$.List_String._as(modules));
    },
    _reload$body$RequireRestarter(modules) {
      var $async$goto = 0,
        $async$completer = A._makeAsyncAwaitCompleter(type$.bool),
        $async$returnValue, $async$handler = 2, $async$currentError, $async$self = this, reloadedModules, previousModuleId, moduleId, parentIds, childModule, e, t2, t3, t4, t5, t6, exception, t1, $async$exception;
      var $async$_reload$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) {
        if ($async$errorCode === 1) {
          $async$currentError = $async$result;
          $async$goto = $async$handler;
        }
        while (true)
          switch ($async$goto) {
            case 0:
              // Function start
              t1 = $async$self._running.future;
              $async$goto = (t1._state & 30) === 0 ? 3 : 4;
              break;
            case 3:
              // then
              $async$goto = 5;
              return A._asyncAwait(t1, $async$_reload$1);
            case 5:
              // returning from await.
              $async$returnValue = $async$result;
              // goto return
              $async$goto = 1;
              break;
            case 4:
              // join
              $async$self.set$_running(new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_bool), type$._AsyncCompleter_bool));
              reloadedModules = 0;
              $async$handler = 7;
              t1 = $async$self.__RequireRestarter__dirtyModules_A;
              t1 === $ && A.throwLateFieldNI("_dirtyModules");
              t1.addAll$1(0, modules);
              previousModuleId = null;
              t1 = $async$self.get$_moduleTopologicalCompare(), t2 = type$.String, t3 = type$.JSArray_String, t4 = type$.Object, t5 = type$.dynamic_Function;
            case 10:
              // for condition
              if (!(t6 = $async$self.__RequireRestarter__dirtyModules_A, t6._root != null)) {
                // goto after for
                $async$goto = 11;
                break;
              }
              if (t6._count === 0)
                A.throwExpression(A.IterableElementError_noElement());
              moduleId = t6.get$_collection$_first().key;
              $async$self.__RequireRestarter__dirtyModules_A.remove$1(0, moduleId);
              t6 = A._asString(moduleId);
              t6 = J.$get$1$x(J.get$moduleParentsGraph$x(self.$requireLoader), t6);
              t6 = t6 == null ? null : J.cast$1$0$ax(t6, t2);
              parentIds = t6 == null ? A._setArrayType([], t3) : t6;
              $async$goto = J.get$isEmpty$asx(parentIds) ? 12 : 14;
              break;
            case 12:
              // then
              childModule = t4._as(self.$loadModuleConfig.call$1("dart_sdk").dart).getModuleLibraries(previousModuleId);
              self.$dartRunMain = A.allowInterop(new A.RequireRestarter__reload_closure(childModule), t5);
              // goto join
              $async$goto = 13;
              break;
            case 14:
              // else
              t6 = reloadedModules;
              if (typeof t6 !== "number") {
                $async$returnValue = t6.$add();
                // goto return
                $async$goto = 1;
                break;
              }
              reloadedModules = t6 + 1;
              $async$goto = 15;
              return A._asyncAwait($async$self._reloadModule$1(moduleId), $async$_reload$1);
            case 15:
              // returning from await.
              J.sort$1$ax(parentIds, t1);
              $async$self.__RequireRestarter__dirtyModules_A.addAll$1(0, parentIds);
              previousModuleId = moduleId;
            case 13:
              // join
              // goto for condition
              $async$goto = 10;
              break;
            case 11:
              // after for
              A.print(A.S(reloadedModules) + " module(s) were hot-reloaded.");
              $async$self._running.complete$1(0, true);
              $async$handler = 2;
              // goto after finally
              $async$goto = 9;
              break;
            case 7:
              // catch
              $async$handler = 6;
              $async$exception = $async$currentError;
              t1 = A.unwrapException($async$exception);
              if (t1 instanceof A.HotReloadFailedException) {
                e = t1;
                A.print("Error during script reloading. Firing full page reload. " + A.S(e));
                type$.Location._as(window.location).reload();
                $async$self._running.complete$1(0, false);
              } else
                throw $async$exception;
              // goto after finally
              $async$goto = 9;
              break;
            case 6:
              // uncaught
              // goto rethrow
              $async$goto = 2;
              break;
            case 9:
              // after finally
              $async$returnValue = $async$self._running.future;
              // goto return
              $async$goto = 1;
              break;
            case 1:
              // return
              return A._asyncReturn($async$returnValue, $async$completer);
            case 2:
              // rethrow
              return A._asyncRethrow($async$currentError, $async$completer);
          }
      });
      return A._asyncStartSync($async$_reload$1, $async$completer);
    },
    _reloadModule$1(moduleId) {
      var t1 = new A._Future($.Zone__current, type$._Future_dynamic),
        completer = new A._AsyncCompleter(t1, type$._AsyncCompleter_dynamic),
        stackTrace = A.StackTrace_current();
      J.forceLoadModule$3$x(self.$requireLoader, moduleId, A.allowInterop(type$.void_Function_$opt_dynamic._as(completer.get$complete(completer)), type$.void_Function), A.allowInterop(new A.RequireRestarter__reloadModule_closure(completer, stackTrace), type$.void_Function_JsError));
      return t1;
    },
    _updateGraph$0() {
      var i, t2, t3, _i,
        t1 = type$.String,
        stronglyConnectedComponents = A.stronglyConnectedComponents(A.List_List$from(self.Array.from(J.keys$0$x(J.get$moduleParentsGraph$x(self.$requireLoader))), true, t1), this.get$_moduleParents(), t1);
      t1 = this._moduleOrdering;
      if (t1._collection$_length > 0) {
        t1._collection$_strings = t1._collection$_nums = t1._collection$_rest = t1._keys = null;
        t1._collection$_length = 0;
      }
      for (i = 0; i < stronglyConnectedComponents.length; ++i)
        for (t2 = stronglyConnectedComponents[i], t3 = t2.length, _i = 0; _i < t2.length; t2.length === t3 || (0, A.throwConcurrentModificationError)(t2), ++_i)
          t1.$indexSet(0, t2[_i], i);
    },
    set$__RequireRestarter__dirtyModules_A(__RequireRestarter__dirtyModules_A) {
      this.__RequireRestarter__dirtyModules_A = type$.SplayTreeSet_String._as(__RequireRestarter__dirtyModules_A);
    },
    set$_running(_running) {
      this._running = type$.Completer_bool._as(_running);
    },
    $isRestarter: 1
  };
  A.RequireRestarter__reload_closure.prototype = {
    call$0() {
      var t1 = this.childModule;
      t1 = J.get$first$ax(self.Object.values(t1 == null ? type$.Object._as(t1) : t1));
      if (t1 == null)
        t1 = type$.Object._as(t1);
      t1.main();
    },
    $signature: 5
  };
  A.RequireRestarter__reloadModule_closure.prototype = {
    call$1(e) {
      this.completer.completeError$2(new A.HotReloadFailedException(J.get$message$x(type$.JsError._as(e))), this.stackTrace);
    },
    $signature: 81
  };
  A._createScript_closure.prototype = {
    call$0() {
      var nonce = A._findNonce();
      if (nonce == null)
        return A.html_ScriptElement___new_tearOff$closure();
      return new A._createScript__closure(nonce);
    },
    $signature: 82
  };
  A._createScript__closure.prototype = {
    call$0() {
      var t1 = document.createElement("script");
      t1.setAttribute("nonce", this.nonce);
      return t1;
    },
    $signature: 14
  };
  (function aliases() {
    var _ = J.Interceptor.prototype;
    _.super$Interceptor$toString = _.toString$0;
    _ = J.LegacyJavaScriptObject.prototype;
    _.super$LegacyJavaScriptObject$toString = _.toString$0;
    _ = A._BufferingStreamSubscription.prototype;
    _.super$_BufferingStreamSubscription$_add = _._add$1;
    _.super$_BufferingStreamSubscription$_addError = _._addError$2;
    _ = A._HashMap.prototype;
    _.super$_HashMap$_containsKey = _._containsKey$1;
    _.super$_HashMap$_get = _._get$1;
    _.super$_HashMap$_set = _._set$2;
    _ = A.Iterable.prototype;
    _.super$Iterable$where = _.where$1;
    _ = A.Object.prototype;
    _.super$Object$toString = _.toString$0;
    _ = A.Element.prototype;
    _.super$Element$createFragment = _.createFragment$3$treeSanitizer$validator;
    _ = A._SimpleNodeValidator.prototype;
    _.super$_SimpleNodeValidator$allowsAttribute = _.allowsAttribute$3;
    _ = A.JsObject.prototype;
    _.super$JsObject$$index = _.$index;
    _.super$JsObject$$indexSet = _.$indexSet;
    _ = A._JsArray_JsObject_ListMixin.prototype;
    _.super$_JsArray_JsObject_ListMixin$$indexSet = _.$indexSet;
  })();
  (function installTearOffs() {
    var _static_2 = hunkHelpers._static_2,
      _static_1 = hunkHelpers._static_1,
      _static_0 = hunkHelpers._static_0,
      _static = hunkHelpers.installStaticTearOff,
      _instance = hunkHelpers.installInstanceTearOff,
      _instance_2_u = hunkHelpers._instance_2u,
      _instance_1_i = hunkHelpers._instance_1i,
      _instance_0_u = hunkHelpers._instance_0u,
      _instance_1_u = hunkHelpers._instance_1u,
      _instance_0_i = hunkHelpers._instance_0i;
    _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 28);
    _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 10);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 10);
    _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 10);
    _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0);
    _static_1(A, "async___nullDataHandler$closure", "_nullDataHandler", 3);
    _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 11);
    _static_0(A, "async___nullDoneHandler$closure", "_nullDoneHandler", 0);
    _static(A, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 86, 0);
    _static(A, "async___rootRun$closure", 4, null, ["call$1$4", "call$4"], ["_rootRun", function($self, $parent, zone, f) {
      return A._rootRun($self, $parent, zone, f, type$.dynamic);
    }], 87, 1);
    _static(A, "async___rootRunUnary$closure", 5, null, ["call$2$5", "call$5"], ["_rootRunUnary", function($self, $parent, zone, f, arg) {
      var t1 = type$.dynamic;
      return A._rootRunUnary($self, $parent, zone, f, arg, t1, t1);
    }], 88, 1);
    _static(A, "async___rootRunBinary$closure", 6, null, ["call$3$6", "call$6"], ["_rootRunBinary", function($self, $parent, zone, f, arg1, arg2) {
      var t1 = type$.dynamic;
      return A._rootRunBinary($self, $parent, zone, f, arg1, arg2, t1, t1, t1);
    }], 89, 1);
    _static(A, "async___rootRegisterCallback$closure", 4, null, ["call$1$4", "call$4"], ["_rootRegisterCallback", function($self, $parent, zone, f) {
      return A._rootRegisterCallback($self, $parent, zone, f, type$.dynamic);
    }], 90, 0);
    _static(A, "async___rootRegisterUnaryCallback$closure", 4, null, ["call$2$4", "call$4"], ["_rootRegisterUnaryCallback", function($self, $parent, zone, f) {
      var t1 = type$.dynamic;
      return A._rootRegisterUnaryCallback($self, $parent, zone, f, t1, t1);
    }], 91, 0);
    _static(A, "async___rootRegisterBinaryCallback$closure", 4, null, ["call$3$4", "call$4"], ["_rootRegisterBinaryCallback", function($self, $parent, zone, f) {
      var t1 = type$.dynamic;
      return A._rootRegisterBinaryCallback($self, $parent, zone, f, t1, t1, t1);
    }], 92, 0);
    _static(A, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 93, 0);
    _static(A, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 94, 0);
    _static(A, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 95, 0);
    _static(A, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 96, 0);
    _static(A, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 97, 0);
    _static_1(A, "async___printToZone$closure", "_printToZone", 33);
    _static(A, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 98, 0);
    _instance(A._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 32, 0, 0);
    _instance(A._AsyncCompleter.prototype, "get$complete", 1, 0, function() {
      return [null];
    }, ["call$1", "call$0"], ["complete$1", "complete$0"], 54, 0, 0);
    _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 11);
    var _;
    _instance_1_i(_ = A._StreamController.prototype, "get$add", "add$1", 16);
    _instance(_, "get$addError", 0, 1, function() {
      return [null];
    }, ["call$2", "call$1"], ["addError$2", "addError$1"], 32, 0, 0);
    _instance_0_u(_ = A._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = A._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_0_u(_ = A._ForwardingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0);
    _instance_0_u(_, "get$_onResume", "_onResume$0", 0);
    _instance_1_u(_, "get$_handleData", "_handleData$1", 16);
    _instance_2_u(_, "get$_handleError", "_handleError$2", 17);
    _instance_0_u(_, "get$_handleDone", "_handleDone$0", 0);
    _static_2(A, "collection___defaultEquals$closure", "_defaultEquals0", 12);
    _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 13);
    _static_2(A, "collection_ListBase__compareAny$closure", "ListBase__compareAny", 28);
    _static_1(A, "convert___defaultToEncodable$closure", "_defaultToEncodable", 1);
    _static_1(A, "core__identityHashCode$closure", "identityHashCode", 13);
    _static_2(A, "core__identical$closure", "identical", 12);
    _static_0(A, "html_ScriptElement___new_tearOff$closure", "ScriptElement___new_tearOff", 14);
    _static(A, "html__Html5NodeValidator__standardAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__standardAttributeValidator"], 30, 0);
    _static(A, "html__Html5NodeValidator__uriAttributeValidator$closure", 4, null, ["call$4"], ["_Html5NodeValidator__uriAttributeValidator"], 30, 0);
    _instance_0_i(A.Node.prototype, "get$remove", "remove$0", 0);
    _instance_1_i(A.WebSocket.prototype, "get$send", "send$1", 3);
    _static_1(A, "js___convertToJS$closure", "_convertToJS", 34);
    _static_1(A, "js___convertToDart$closure", "_convertToDart", 2);
    _instance_2_u(_ = A.DeepCollectionEquality.prototype, "get$equals", "equals$2", 12);
    _instance_1_i(_, "get$hash", "hash$1", 13);
    _instance_1_u(_, "get$isValidKey", "isValidKey$1", 55);
    _instance_1_u(_ = A.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 4);
    _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 4);
    _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0);
    _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 61);
    _instance_1_u(_ = A.RequireRestarter.prototype, "get$_moduleParents", "_moduleParents$1", 79);
    _instance_2_u(_, "get$_moduleTopologicalCompare", "_moduleTopologicalCompare$2", 80);
  })();
  (function inheritance() {
    var _mixin = hunkHelpers.mixin,
      _mixinHard = hunkHelpers.mixinHard,
      _inherit = hunkHelpers.inherit,
      _inheritMany = hunkHelpers.inheritMany;
    _inherit(A.Object, null);
    _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, J.ArrayIterator, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A.ListBase, A.Symbol, A.MapView, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.JSInvocationMirror, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A._Required, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A.AsyncError, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A.Stream, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._StreamIterator, A._ZoneFunction, A._ZoneSpecification, A._ZoneDelegate, A._Zone, A._HashMapKeyIterator, A.SetBase, A._HashSetIterator, A._LinkedHashSetCell, A._LinkedHashSetIterator, A._UnmodifiableMapMixin, A._ListQueueIterator, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A.Converter, A._Base64Encoder, A._Base64Decoder, A._JsonStringifier, A._Utf8Encoder, A._BigIntImpl, A.DateTime, A.Duration, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.Expando, A.CssStyleDeclarationBase, A.EventStreamProvider, A._EventStreamSubscription, A._Html5NodeValidator, A.ImmutableListMixin, A.NodeValidatorBuilder, A._SimpleNodeValidator, A._SvgNodeValidator, A.FixedSizeListIterator, A._DOMWindowCrossFrame, A._SameOriginUriPolicy, A._ValidatingTreeSanitizer, A._StructuredClone, A._AcceptStructuredClone, A.JsObject, A.NullRejectionException, A._JSRandom, A._Random, A.AsyncMemoizer, A.DelegatingStreamSink, A.ErrorResult, A.ValueResult, A.StreamQueue, A._NextRequest, A._HasNextRequest, A.BuiltList, A.ListBuilder, A.BuiltListMultimap, A.ListMultimapBuilder, A.BuiltMap, A.MapBuilder, A.BuiltSet, A.SetBuilder, A.BuiltSetMultimap, A.SetMultimapBuilder, A.EnumClass, A.IndentingBuiltValueToStringHelper, A.JsonObject, A.FullType, A.BigIntSerializer, A.BoolSerializer, A.BuiltJsonSerializers, A.BuiltJsonSerializersBuilder, A.BuiltListMultimapSerializer, A.BuiltListSerializer, A.BuiltMapSerializer, A.BuiltSetMultimapSerializer, A.BuiltSetSerializer, A.DateTimeSerializer, A.DoubleSerializer, A.DurationSerializer, A.Int32Serializer, A.Int64Serializer, A.IntSerializer, A.JsonObjectSerializer, A.NullSerializer, A.NumSerializer, A.RegExpSerializer, A.StringSerializer, A.Uint8ListSerializer, A.UriSerializer, A.DefaultEquality, A.IterableEquality, A.ListEquality, A._UnorderedEquality, A._MapEntry, A.MapEquality, A.DeepCollectionEquality, A._QueueList_Object_ListMixin, A.BuildResult, A._$BuildStatusSerializer, A._$BuildResultSerializer, A.BuildResultBuilder, A.ConnectRequest, A._$ConnectRequestSerializer, A.ConnectRequestBuilder, A.DebugEvent, A.BatchedDebugEvents, A._$DebugEventSerializer, A._$BatchedDebugEventsSerializer, A.DebugEventBuilder, A.BatchedDebugEventsBuilder, A.DebugInfo, A._$DebugInfoSerializer, A.DebugInfoBuilder, A.DevToolsRequest, A.DevToolsResponse, A._$DevToolsRequestSerializer, A._$DevToolsResponseSerializer, A.DevToolsRequestBuilder, A.DevToolsResponseBuilder, A.ErrorResponse, A._$ErrorResponseSerializer, A.ErrorResponseBuilder, A.ExtensionRequest, A.ExtensionResponse, A.ExtensionEvent, A.BatchedEvents, A._$ExtensionRequestSerializer, A._$ExtensionResponseSerializer, A._$ExtensionEventSerializer, A._$BatchedEventsSerializer, A.ExtensionRequestBuilder, A.ExtensionResponseBuilder, A.ExtensionEventBuilder, A.BatchedEventsBuilder, A.IsolateExit, A.IsolateStart, A._$IsolateExitSerializer, A._$IsolateStartSerializer, A.IsolateExitBuilder, A.IsolateStartBuilder, A.RegisterEvent, A._$RegisterEventSerializer, A.RegisterEventBuilder, A.RunRequest, A._$RunRequestSerializer, A.BatchedStreamController, A.SocketClient, A.Int32, A.Int64, A._StackState, A.Level, A.LogRecord, A.Logger, A.Pool, A.PoolResource, A.StreamChannelMixin, A._GuaranteeSink, A.StreamChannelController, A.Uuid, A.WebSocketChannelException, A.DdcRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]);
    _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JavaScriptBigInt, J.JavaScriptSymbol, J.JSNumber, J.JSString]);
    _inheritMany(J.JavaScriptObject, [J.LegacyJavaScriptObject, J.JSArray, A.NativeByteBuffer, A.NativeTypedData, A.EventTarget, A.AccessibleNodeList, A.Blob, A.Event, A.CssTransformComponent, A.CssRule, A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase, A.CssStyleValue, A.DataTransferItemList, A.DomException, A.DomImplementation, A._DomRectList_JavaScriptObject_ListMixin, A.DomRectReadOnly, A._DomStringList_JavaScriptObject_ListMixin, A.DomTokenList, A._FileList_JavaScriptObject_ListMixin, A.Gamepad, A.History, A._HtmlCollection_JavaScriptObject_ListMixin, A.ImageData, A.Location, A.MediaList, A._MidiInputMap_JavaScriptObject_MapMixin, A._MidiOutputMap_JavaScriptObject_MapMixin, A.MimeType, A._MimeTypeArray_JavaScriptObject_ListMixin, A._NodeList_JavaScriptObject_ListMixin, A.Plugin, A._PluginArray_JavaScriptObject_ListMixin, A._RtcStatsReport_JavaScriptObject_MapMixin, A.SharedArrayBuffer, A.SpeechGrammar, A._SpeechGrammarList_JavaScriptObject_ListMixin, A.SpeechRecognitionResult, A._Storage_JavaScriptObject_MapMixin, A.StyleSheet, A._TextTrackCueList_JavaScriptObject_ListMixin, A.TimeRanges, A.Touch, A._TouchList_JavaScriptObject_ListMixin, A.TrackDefaultList, A.Url, A.__CssRuleList_JavaScriptObject_ListMixin, A.__GamepadList_JavaScriptObject_ListMixin, A.__NamedNodeMap_JavaScriptObject_ListMixin, A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin, A.__StyleSheetList_JavaScriptObject_ListMixin, A.KeyRange, A.Length, A._LengthList_JavaScriptObject_ListMixin, A.Number, A._NumberList_JavaScriptObject_ListMixin, A.PointList, A._StringList_JavaScriptObject_ListMixin, A.Transform, A._TransformList_JavaScriptObject_ListMixin, A.AudioBuffer, A._AudioParamMap_JavaScriptObject_MapMixin]);
    _inheritMany(J.LegacyJavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction, A._FetchOptions, A.Promise, A.RequireLoader, A.JsError, A.JsMap]);
    _inherit(J.JSUnmodifiableArray, J.JSArray);
    _inheritMany(J.JSNumber, [J.JSInt, J.JSNumNotInt]);
    _inheritMany(A.Iterable, [A._CastIterableBase, A.EfficientLengthIterable, A.MappedIterable, A.WhereIterable, A.TakeIterable, A.SkipIterable, A._KeysOrValues, A._AllMatchesIterable, A._StringAllMatchesIterable]);
    _inheritMany(A._CastIterableBase, [A.CastIterable, A.__CastListBase__CastIterableBase_ListMixin]);
    _inherit(A._EfficientLengthCastIterable, A.CastIterable);
    _inherit(A._CastListBase, A.__CastListBase__CastIterableBase_ListMixin);
    _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._Future__chainForeignFuture_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._CustomHashMap_closure, A.SplayTreeSet_closure, A._BigIntImpl_hashCode_finish, A._Uri__makePath_closure, A._createTables_setChars, A._createTables_setRange, A.Element_Element$html_closure, A.HttpRequest_request_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.NodeValidatorBuilder_allowsElement_closure, A.NodeValidatorBuilder_allowsAttribute_closure, A._SimpleNodeValidator_closure, A._SimpleNodeValidator_closure0, A._TemplatingNodeValidator_closure, A._convertDartToNative_Value_closure, A.JsObject__convertDataTree__convert, A._convertToJS_closure, A._convertToJS_closure0, A._wrapToDart_closure, A._wrapToDart_closure0, A._wrapToDart_closure1, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.StreamQueue__ensureListening_closure, A.BuiltListMultimap_BuiltListMultimap_closure, A.BuiltListMultimap_hashCode_closure, A.ListMultimapBuilder_replace_closure, A.BuiltMap_BuiltMap_closure, A.BuiltMap_hashCode_closure, A.BuiltSet_hashCode_closure, A.BuiltSetMultimap_hashCode_closure, A.SetMultimapBuilder_replace_closure, A.newBuiltValueToStringHelper_closure, A.BuiltListMultimapSerializer_serialize_closure, A.BuiltListMultimapSerializer_deserialize_closure, A.BuiltListSerializer_serialize_closure, A.BuiltListSerializer_deserialize_closure, A.BuiltSetMultimapSerializer_serialize_closure, A.BuiltSetMultimapSerializer_deserialize_closure, A.BuiltSetSerializer_serialize_closure, A.BuiltSetSerializer_deserialize_closure, A.WebSocketClient_stream_closure, A.Pool__runOnRelease_closure, A.SseClient_closure0, A.SseClient_closure1, A.generateUuidV4__generateBits, A._GuaranteeSink__addError_closure, A.HtmlWebSocketChannel_closure, A.HtmlWebSocketChannel_closure0, A.HtmlWebSocketChannel_closure1, A.HtmlWebSocketChannel_closure2, A.main__closure, A.main__closure0, A.main___closure2, A.main___closure1, A.main__closure2, A.main___closure0, A.main___closure, A.main__closure4, A.main__closure5, A.main__closure6, A.main__closure7, A._launchCommunicationWithDebugExtension_closure, A._listenForDebugExtensionAuthRequest_closure, A.DdcRestarter_restart_closure0, A.DdcRestarter_restart_closure, A.toFuture_closure, A.RequireRestarter__reloadModule_closure]);
    _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.Primitives_functionNoSuchMethod_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__chainForeignFuture_closure0, A._Future_timeout_closure1, A._BufferingStreamSubscription_asFuture_closure0, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._BigIntImpl_hashCode_combine, A._symbolMapToStringMap_closure, A.NoSuchMethodError_toString_closure, A.Uri__parseIPv4Address_error, A.Uri_parseIPv6Address_error, A.Uri_parseIPv6Address_parseHex, A._createTables_build, A.MidiInputMap_keys_closure, A.MidiOutputMap_keys_closure, A.RtcStatsReport_keys_closure, A.Storage_keys_closure, A._ValidatingTreeSanitizer_sanitizeTree_walk, A._StructuredClone_walk_closure, A._StructuredClone_walk_closure0, A._AcceptStructuredClone_walk_closure, A.convertDartToNative_Dictionary_closure, A.AudioParamMap_keys_closure, A.StreamQueue__ensureListening_closure1, A.hashObjects_closure, A.MapBuilder_replace_closure, A.safeUnawaited_closure, A.Pool__runOnRelease_closure0, A.generateUuidV4__printDigits, A.generateUuidV4__bitsDigits, A.main__closure1, A.main_closure0, A.toPromise_closure]);
    _inherit(A.CastList, A._CastListBase);
    _inheritMany(A.MapBase, [A.CastMap, A.JsLinkedHashMap, A._HashMap, A._JsonMap, A._AttributeMap]);
    _inheritMany(A.Error, [A.LateError, A.TypeError, A.JsNoSuchMethodError, A.UnknownJsTypeError, A._CyclicInitializationError, A.RuntimeError, A.AssertionError, A._Error, A.JsonUnsupportedObjectError, A.ArgumentError, A.NoSuchMethodError, A.UnsupportedError, A.UnimplementedError, A.StateError, A.ConcurrentModificationError, A.BuiltValueNullFieldError, A.BuiltValueNestedFieldError, A.DeserializationError]);
    _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl$periodic_closure, A.Future_Future$microtask_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainForeignFuture_closure1, A._Future__chainCoreFutureAsync_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteError_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A.StreamQueue__ensureListening_closure0, A.Serializers_Serializers_closure, A.Serializers_Serializers_closure0, A.Serializers_Serializers_closure1, A.Serializers_Serializers_closure2, A.Serializers_Serializers_closure3, A._$serializers_closure, A._$serializers_closure0, A.BatchedStreamController__hasEventOrTimeOut_closure, A.BatchedStreamController__hasEventDuring_closure, A.Logger_Logger_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.GuaranteeChannel_closure, A.GuaranteeChannel__closure, A.HtmlWebSocketChannel__listen_closure, A.main_closure, A.main__closure3, A.RequireRestarter__reload_closure, A._createScript_closure, A._createScript__closure]);
    _inheritMany(A.EfficientLengthIterable, [A.ListIterable, A.EmptyIterable, A.LinkedHashMapKeyIterable, A._HashMapKeyIterable]);
    _inheritMany(A.ListIterable, [A.SubListIterable, A.MappedListIterable, A.ReversedListIterable, A.ListQueue, A._JsonMapKeyIterable]);
    _inherit(A.EfficientLengthMappedIterable, A.MappedIterable);
    _inherit(A.EfficientLengthTakeIterable, A.TakeIterable);
    _inherit(A.EfficientLengthSkipIterable, A.SkipIterable);
    _inheritMany(A.ListBase, [A.UnmodifiableListBase, A._FrozenElementList, A._ChildNodeListLazy]);
    _inherit(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A.MapView);
    _inherit(A.UnmodifiableMapView, A._UnmodifiableMapView_MapView__UnmodifiableMapMixin);
    _inherit(A.ConstantMapView, A.UnmodifiableMapView);
    _inherit(A.ConstantStringMap, A.ConstantMap);
    _inherit(A.NullError, A.TypeError);
    _inheritMany(A.TearOffClosure, [A.StaticClosure, A.BoundClosure]);
    _inherit(A._AssertionError, A.AssertionError);
    _inheritMany(A.NativeTypedData, [A.NativeByteData, A.NativeTypedArray]);
    _inheritMany(A.NativeTypedArray, [A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]);
    _inherit(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfDouble, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inherit(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin);
    _inherit(A.NativeTypedArrayOfInt, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin);
    _inheritMany(A.NativeTypedArrayOfDouble, [A.NativeFloat32List, A.NativeFloat64List]);
    _inheritMany(A.NativeTypedArrayOfInt, [A.NativeInt16List, A.NativeInt32List, A.NativeInt8List, A.NativeUint16List, A.NativeUint32List, A.NativeUint8ClampedList, A.NativeUint8List]);
    _inherit(A._TypeError, A._Error);
    _inheritMany(A._Completer, [A._AsyncCompleter, A._SyncCompleter]);
    _inheritMany(A._StreamController, [A._AsyncStreamController, A._SyncStreamController]);
    _inheritMany(A.Stream, [A._StreamImpl, A._ForwardingStream, A._EventStream]);
    _inherit(A._ControllerStream, A._StreamImpl);
    _inheritMany(A._BufferingStreamSubscription, [A._ControllerSubscription, A._ForwardingStreamSubscription]);
    _inheritMany(A._DelayedEvent, [A._DelayedData, A._DelayedError]);
    _inherit(A._MapStream, A._ForwardingStream);
    _inheritMany(A._Zone, [A._CustomZone, A._RootZone]);
    _inheritMany(A._HashMap, [A._IdentityHashMap, A._CustomHashMap]);
    _inherit(A._SetBase, A.SetBase);
    _inheritMany(A._SetBase, [A._HashSet, A._LinkedHashSet]);
    _inherit(A.UnmodifiableListView, A.UnmodifiableListBase);
    _inherit(A._SplayTreeSetNode, A._SplayTreeNode);
    _inherit(A._SplayTreeKeyIterator, A._SplayTreeIterator);
    _inherit(A._SplayTreeSet__SplayTree_Iterable, A._SplayTree);
    _inherit(A._SplayTreeSet__SplayTree_Iterable_SetMixin, A._SplayTreeSet__SplayTree_Iterable);
    _inherit(A.SplayTreeSet, A._SplayTreeSet__SplayTree_Iterable_SetMixin);
    _inheritMany(A.Codec, [A.Base64Codec, A.Encoding, A.JsonCodec]);
    _inheritMany(A.Converter, [A.Base64Encoder, A.Base64Decoder, A.JsonEncoder, A.JsonDecoder, A.Utf8Encoder]);
    _inherit(A.JsonCyclicError, A.JsonUnsupportedObjectError);
    _inherit(A._JsonStringStringifier, A._JsonStringifier);
    _inherit(A.Utf8Codec, A.Encoding);
    _inheritMany(A.ArgumentError, [A.RangeError, A.IndexError]);
    _inherit(A._DataUri, A._Uri);
    _inheritMany(A.EventTarget, [A.Node, A.EventSource, A.FileWriter, A.HttpRequestEventTarget, A.MessagePort, A.SourceBuffer, A._SourceBufferList_EventTarget_ListMixin, A.TextTrack, A.TextTrackCue, A._TextTrackList_EventTarget_ListMixin, A.VideoTrackList, A.WebSocket, A.Window, A.WorkerGlobalScope, A.AudioTrackList, A.BaseAudioContext]);
    _inheritMany(A.Node, [A.Element, A.CharacterData, A.Document, A._Attr]);
    _inheritMany(A.Element, [A.HtmlElement, A.SvgElement]);
    _inheritMany(A.HtmlElement, [A.AnchorElement, A.AreaElement, A.BaseElement, A.BodyElement, A.FormElement, A.ScriptElement, A.SelectElement, A.TableElement, A.TableRowElement, A.TableSectionElement, A.TemplateElement]);
    _inheritMany(A.Event, [A.CloseEvent, A.CustomEvent, A.UIEvent, A.MessageEvent, A.ProgressEvent]);
    _inherit(A.CssPerspective, A.CssTransformComponent);
    _inherit(A.CssStyleDeclaration, A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase);
    _inheritMany(A.CssStyleValue, [A.CssTransformValue, A.CssUnparsedValue]);
    _inherit(A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin, A._DomRectList_JavaScriptObject_ListMixin);
    _inherit(A.DomRectList, A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin, A._DomStringList_JavaScriptObject_ListMixin);
    _inherit(A.DomStringList, A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.File, A.Blob);
    _inherit(A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin, A._FileList_JavaScriptObject_ListMixin);
    _inherit(A.FileList, A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin, A._HtmlCollection_JavaScriptObject_ListMixin);
    _inherit(A.HtmlCollection, A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.HtmlDocument, A.Document);
    _inherit(A.HttpRequest, A.HttpRequestEventTarget);
    _inherit(A.KeyboardEvent, A.UIEvent);
    _inherit(A.MidiInputMap, A._MidiInputMap_JavaScriptObject_MapMixin);
    _inherit(A.MidiOutputMap, A._MidiOutputMap_JavaScriptObject_MapMixin);
    _inherit(A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin, A._MimeTypeArray_JavaScriptObject_ListMixin);
    _inherit(A.MimeTypeArray, A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin, A._NodeList_JavaScriptObject_ListMixin);
    _inherit(A.NodeList, A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin, A._PluginArray_JavaScriptObject_ListMixin);
    _inherit(A.PluginArray, A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.RtcStatsReport, A._RtcStatsReport_JavaScriptObject_MapMixin);
    _inherit(A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, A._SourceBufferList_EventTarget_ListMixin);
    _inherit(A.SourceBufferList, A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin, A._SpeechGrammarList_JavaScriptObject_ListMixin);
    _inherit(A.SpeechGrammarList, A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.Storage, A._Storage_JavaScriptObject_MapMixin);
    _inherit(A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin, A._TextTrackCueList_JavaScriptObject_ListMixin);
    _inherit(A.TextTrackCueList, A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, A._TextTrackList_EventTarget_ListMixin);
    _inherit(A.TextTrackList, A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin);
    _inherit(A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin, A._TouchList_JavaScriptObject_ListMixin);
    _inherit(A.TouchList, A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__CssRuleList_JavaScriptObject_ListMixin);
    _inherit(A._CssRuleList, A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._DomRect, A.DomRectReadOnly);
    _inherit(A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__GamepadList_JavaScriptObject_ListMixin);
    _inherit(A._GamepadList, A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin, A.__NamedNodeMap_JavaScriptObject_ListMixin);
    _inherit(A._NamedNodeMap, A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin);
    _inherit(A._SpeechRecognitionResultList, A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin, A.__StyleSheetList_JavaScriptObject_ListMixin);
    _inherit(A._StyleSheetList, A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._ElementAttributeMap, A._AttributeMap);
    _inherit(A._TemplatingNodeValidator, A._SimpleNodeValidator);
    _inherit(A._StructuredCloneDart2Js, A._StructuredClone);
    _inherit(A._AcceptStructuredCloneDart2Js, A._AcceptStructuredClone);
    _inheritMany(A.JsObject, [A.JsFunction, A._JsArray_JsObject_ListMixin]);
    _inherit(A.JsArray, A._JsArray_JsObject_ListMixin);
    _inherit(A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin, A._LengthList_JavaScriptObject_ListMixin);
    _inherit(A.LengthList, A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin, A._NumberList_JavaScriptObject_ListMixin);
    _inherit(A.NumberList, A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.ScriptElement0, A.SvgElement);
    _inherit(A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin, A._StringList_JavaScriptObject_ListMixin);
    _inherit(A.StringList, A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin, A._TransformList_JavaScriptObject_ListMixin);
    _inherit(A.TransformList, A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin);
    _inherit(A.AudioParamMap, A._AudioParamMap_JavaScriptObject_MapMixin);
    _inherit(A.OfflineAudioContext, A.BaseAudioContext);
    _inherit(A._BuiltList, A.BuiltList);
    _inherit(A._BuiltListMultimap, A.BuiltListMultimap);
    _inherit(A._BuiltMap, A.BuiltMap);
    _inherit(A._BuiltSet, A.BuiltSet);
    _inherit(A._BuiltSetMultimap, A.BuiltSetMultimap);
    _inheritMany(A.JsonObject, [A.BoolJsonObject, A.ListJsonObject, A.MapJsonObject, A.NumJsonObject, A.StringJsonObject]);
    _inherit(A.SetEquality, A._UnorderedEquality);
    _inherit(A.QueueList, A._QueueList_Object_ListMixin);
    _inherit(A._CastQueueList, A.QueueList);
    _inherit(A.BuildStatus, A.EnumClass);
    _inherit(A._$BuildResult, A.BuildResult);
    _inherit(A._$ConnectRequest, A.ConnectRequest);
    _inherit(A._$DebugEvent, A.DebugEvent);
    _inherit(A._$BatchedDebugEvents, A.BatchedDebugEvents);
    _inherit(A._$DebugInfo, A.DebugInfo);
    _inherit(A._$DevToolsRequest, A.DevToolsRequest);
    _inherit(A._$DevToolsResponse, A.DevToolsResponse);
    _inherit(A._$ErrorResponse, A.ErrorResponse);
    _inherit(A._$ExtensionRequest, A.ExtensionRequest);
    _inherit(A._$ExtensionResponse, A.ExtensionResponse);
    _inherit(A._$ExtensionEvent, A.ExtensionEvent);
    _inherit(A._$BatchedEvents, A.BatchedEvents);
    _inherit(A._$IsolateExit, A.IsolateExit);
    _inherit(A._$IsolateStart, A.IsolateStart);
    _inherit(A._$RegisterEvent, A.RegisterEvent);
    _inherit(A._$RunRequest, A.RunRequest);
    _inheritMany(A.SocketClient, [A.SseSocketClient, A.WebSocketClient]);
    _inheritMany(A.StreamChannelMixin, [A.SseClient, A.GuaranteeChannel, A.HtmlWebSocketChannel, A.WebSocketChannel]);
    _inherit(A._HtmlWebSocketSink, A.DelegatingStreamSink);
    _mixin(A.UnmodifiableListBase, A.UnmodifiableListMixin);
    _mixin(A.__CastListBase__CastIterableBase_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin, A.ListBase);
    _mixin(A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin, A.FixedLengthListMixin);
    _mixin(A._AsyncStreamController, A._AsyncStreamControllerDispatch);
    _mixin(A._SyncStreamController, A._SyncStreamControllerDispatch);
    _mixin(A._SplayTreeSet__SplayTree_Iterable, A.Iterable);
    _mixin(A._SplayTreeSet__SplayTree_Iterable_SetMixin, A.SetBase);
    _mixin(A._UnmodifiableMapView_MapView__UnmodifiableMapMixin, A._UnmodifiableMapMixin);
    _mixin(A._CssStyleDeclaration_JavaScriptObject_CssStyleDeclarationBase, A.CssStyleDeclarationBase);
    _mixin(A._DomRectList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._DomRectList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._DomStringList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._DomStringList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._FileList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._FileList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._HtmlCollection_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._HtmlCollection_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._MidiInputMap_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._MidiOutputMap_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._MimeTypeArray_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._MimeTypeArray_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._NodeList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._NodeList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._PluginArray_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._PluginArray_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._RtcStatsReport_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._SourceBufferList_EventTarget_ListMixin, A.ListBase);
    _mixin(A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._SpeechGrammarList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._SpeechGrammarList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._Storage_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._TextTrackCueList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._TextTrackCueList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TextTrackList_EventTarget_ListMixin, A.ListBase);
    _mixin(A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TouchList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._TouchList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__CssRuleList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__CssRuleList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__GamepadList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__GamepadList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__NamedNodeMap_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__NamedNodeMap_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__SpeechRecognitionResultList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A.__StyleSheetList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A.__StyleSheetList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixinHard(A._JsArray_JsObject_ListMixin, A.ListBase);
    _mixin(A._LengthList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._LengthList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._NumberList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._NumberList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._StringList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._StringList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._TransformList_JavaScriptObject_ListMixin, A.ListBase);
    _mixin(A._TransformList_JavaScriptObject_ListMixin_ImmutableListMixin, A.ImmutableListMixin);
    _mixin(A._AudioParamMap_JavaScriptObject_MapMixin, A.MapBase);
    _mixin(A._QueueList_Object_ListMixin, A.ListBase);
  })();
  var init = {
    typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []},
    mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List", Object: "Object", Map: "Map"},
    mangledNames: {},
    types: ["~()", "@(@)", "Object?(@)", "~(@)", "~(Event)", "Null()", "~(String,@)", "Null(@)", "Null(Object,StackTrace)", "~(@,@)", "~(~())", "~(Object,StackTrace)", "bool(Object?,Object?)", "int(Object?)", "ScriptElement()", "~(String,String)", "~(Object?)", "~(@,StackTrace)", "bool(@)", "~(Object?,Object?)", "int(int,int)", "int(int)", "~(Symbol0,@)", "String(String)", "~(Uint8List,String,int)", "Future<Null>()", "bool(NodeValidator)", "bool(String)", "int(@,@)", "String(int,int)", "bool(Element,String,String,_Html5NodeValidator)", "bool()", "~(Object[StackTrace?])", "~(String)", "Object?(Object?)", "~(MessageEvent)", "Null(Event)", "~(Node,Node?)", "Null(@,@)", "@(@,@)", "@(Object?)", "JsFunction(@)", "JsArray<@>(@)", "JsObject(@)", "int(int,@)", "IndentingBuiltValueToStringHelper(String)", "ListBuilder<Object>()", "ListMultimapBuilder<Object,Object>()", "MapBuilder<Object,Object>()", "_Future<@>(@)", "SetMultimapBuilder<Object,Object>()", "~(int,@)", "Null(@,StackTrace)", "~(ProgressEvent)", "~([Object?])", "bool(Object?)", "ListBuilder<DebugEvent>()", "ListBuilder<ExtensionEvent>()", "bool(Node)", "String(@)", "Logger()", "~(String?)", "Uint8List(@,@)", "~(String,int?)", "~(String,int)", "Null(~())", "Future<~>()", "Promise<1&>(String)", "~(List<DebugEvent>)", "ListBuilder<DebugEvent>(BatchedDebugEventsBuilder)", "DebugEventBuilder(DebugEventBuilder)", "~(Zone,ZoneDelegate,Zone,Object,StackTrace)", "RegisterEventBuilder(RegisterEventBuilder)", "DevToolsRequestBuilder(DevToolsRequestBuilder)", "Future<~>(String)", "ConnectRequestBuilder(ConnectRequestBuilder)", "DebugInfoBuilder(DebugInfoBuilder)", "Future<Null>(Event)", "bool(bool)", "List<String>(String)", "int(String,String)", "~(JsError)", "ScriptElement()()", "Null(CloseEvent)", "@(@,String)", "@(String)", "~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)", "0^(Zone?,ZoneDelegate?,Zone,0^())<Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)<Object?,Object?>", "0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>", "0^()(Zone,ZoneDelegate,Zone,0^())<Object?>", "0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>", "0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>", "AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)", "~(Zone?,ZoneDelegate?,Zone,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))", "~(Zone,ZoneDelegate,Zone,String)", "Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map<Object?,Object?>?)", "SetBuilder<Object>()"],
    interceptorsByTag: null,
    leafTags: null,
    arrayRti: Symbol("$ti")
  };
  A._Universe_addRules(init.typeUniverse, JSON.parse('{"PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","JavaScriptFunction":"LegacyJavaScriptObject","_FetchOptions":"LegacyJavaScriptObject","Promise":"LegacyJavaScriptObject","JsError":"LegacyJavaScriptObject","RequireLoader":"LegacyJavaScriptObject","JsMap":"LegacyJavaScriptObject","KeyframeEffect":"JavaScriptObject","KeyframeEffectReadOnly":"JavaScriptObject","AnimationEffectReadOnly":"JavaScriptObject","AbortPaymentEvent":"Event","ExtendableEvent":"Event","AudioContext":"BaseAudioContext","AbsoluteOrientationSensor":"EventTarget","OrientationSensor":"EventTarget","Sensor":"EventTarget","AElement":"SvgElement","GraphicsElement":"SvgElement","_ResourceProgressEvent":"ProgressEvent","AudioElement":"HtmlElement","MediaElement":"HtmlElement","ShadowRoot":"Node","DocumentFragment":"Node","XmlDocument":"Document","VttCue":"TextTrackCue","CompositionEvent":"UIEvent","DedicatedWorkerGlobalScope":"WorkerGlobalScope","CDataSection":"CharacterData","Text":"CharacterData","MathMLElement":"Element","HttpRequestUpload":"HttpRequestEventTarget","HtmlFormControlsCollection":"HtmlCollection","CssCharsetRule":"CssRule","CssMatrixComponent":"CssTransformComponent","CssStyleSheet":"StyleSheet","CssurlImageValue":"CssStyleValue","CssImageValue":"CssStyleValue","CssResourceValue":"CssStyleValue","JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"JavaScriptObject":{"JSObject":[]},"LegacyJavaScriptObject":{"JSObject":[],"Promise":["1&"],"JsError":[]},"JSArray":{"List":["1"],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"Iterable.E":"1"},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"Iterable.E":"1"},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[],"TrustedGetRuntimeType":[]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","Iterable.E":"2"},"CastMap":{"MapBase":["3","4"],"Map":["3","4"],"MapBase.K":"3","MapBase.V":"4"},"LateError":{"Error":[]},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListIterable.E":"2","Iterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"TakeIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthTakeIterable":{"TakeIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"TakeIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"Symbol":{"Symbol0":[]},"ConstantMapView":{"UnmodifiableMapView":["1","2"],"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_KeysOrValues":{"Iterable":["1"],"Iterable.E":"1"},"_KeysOrValuesOrElementsIterator":{"Iterator":["1"]},"JSInvocationMirror":{"Invocation":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Function":[]},"Closure2Args":{"Function":[]},"TearOffClosure":{"Function":[]},"StaticClosure":{"Function":[]},"BoundClosure":{"Function":[]},"_CyclicInitializationError":{"Error":[]},"RuntimeError":{"Error":[]},"_AssertionError":{"Error":[]},"JsLinkedHashMap":{"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"LinkedHashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeTypedData":{"JSObject":[],"TypedData":[]},"NativeByteData":{"NativeTypedData":[],"JSObject":[],"TypedData":[],"TrustedGetRuntimeType":[]},"NativeTypedArray":{"NativeTypedData":[],"JavaScriptIndexingBehavior":["1"],"JSObject":[],"TypedData":[]},"NativeTypedArrayOfDouble":{"ListBase":["double"],"List":["double"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListBase":["int"],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"ListBase":["double"],"List":["double"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double"},"NativeFloat64List":{"ListBase":["double"],"List":["double"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["double"],"EfficientLengthIterable":["double"],"JSObject":[],"TypedData":[],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double"},"NativeInt16List":{"ListBase":["int"],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeInt32List":{"ListBase":["int"],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeInt8List":{"ListBase":["int"],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint16List":{"ListBase":["int"],"Uint16List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint32List":{"ListBase":["int"],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint8ClampedList":{"ListBase":["int"],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"NativeUint8List":{"ListBase":["int"],"Uint8List":[],"List":["int"],"NativeTypedData":[],"JavaScriptIndexingBehavior":["int"],"EfficientLengthIterable":["int"],"JSObject":[],"TypedData":[],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int"},"_Type":{"Type":[]},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"AsyncError":{"Error":[]},"_Future":{"Future":["1"]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_StreamController":{"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamSinkWrapper":{"StreamSink":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_EventSink":["2"],"_EventDispatch":["2"],"_BufferingStreamSubscription.T":"2"},"_MapStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"_ZoneSpecification":{"ZoneSpecification":[]},"_ZoneDelegate":{"ZoneDelegate":[]},"_Zone":{"Zone":[]},"_CustomZone":{"_Zone":[],"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_SplayTreeSetNode":{"_SplayTreeNode":["1","_SplayTreeSetNode<1>"],"_SplayTreeNode.1":"_SplayTreeSetNode<1>","_SplayTreeNode.K":"1"},"_HashMap":{"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_IdentityHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_CustomHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_HashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashSetIterator":{"Iterator":["1"]},"_LinkedHashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_LinkedHashSetIterator":{"Iterator":["1"]},"UnmodifiableListView":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1","UnmodifiableListMixin.E":"1"},"ListBase":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ListQueue":{"Queue":["1"],"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SetBase":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SplayTreeIterator":{"Iterator":["3"]},"_SplayTreeKeyIterator":{"_SplayTreeIterator":["1","2","1"],"Iterator":["1"],"_SplayTreeIterator.K":"1","_SplayTreeIterator.T":"1","_SplayTreeIterator.1":"2"},"SplayTreeSet":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"_SplayTree":["1","_SplayTreeSetNode<1>"],"Iterable":["1"],"Iterable.E":"1","_SplayTree.1":"_SplayTreeSetNode<1>","_SplayTree.K":"1"},"_JsonMap":{"MapBase":["String","@"],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"Base64Codec":{"Codec":["List<int>","String"],"Codec.S":"List<int>"},"Base64Encoder":{"Converter":["List<int>","String"],"StreamTransformer":["List<int>","String"]},"Base64Decoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"Converter":{"StreamTransformer":["1","2"]},"Encoding":{"Codec":["String","List<int>"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"],"StreamTransformer":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"],"StreamTransformer":["String","Object?"]},"Utf8Codec":{"Codec":["String","List<int>"],"Codec.S":"String"},"Utf8Encoder":{"Converter":["String","List<int>"],"StreamTransformer":["String","List<int>"]},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExp":{"Pattern":[]},"RegExpMatch":{"Match":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"NoSuchMethodError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"IntegerDivisionByZeroException":{"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"CloseEvent":{"Event":[],"JSObject":[]},"CssRule":{"JSObject":[]},"Element":{"Node":[],"EventTarget":[],"JSObject":[]},"Event":{"JSObject":[]},"File":{"Blob":[],"JSObject":[]},"Gamepad":{"JSObject":[]},"HttpRequest":{"EventTarget":[],"JSObject":[]},"KeyboardEvent":{"Event":[],"JSObject":[]},"MessageEvent":{"Event":[],"JSObject":[]},"MimeType":{"JSObject":[]},"Node":{"EventTarget":[],"JSObject":[]},"Plugin":{"JSObject":[]},"ProgressEvent":{"Event":[],"JSObject":[]},"ScriptElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"SourceBuffer":{"EventTarget":[],"JSObject":[]},"SpeechGrammar":{"JSObject":[]},"SpeechRecognitionResult":{"JSObject":[]},"StyleSheet":{"JSObject":[]},"TextTrack":{"EventTarget":[],"JSObject":[]},"TextTrackCue":{"EventTarget":[],"JSObject":[]},"Touch":{"JSObject":[]},"_Html5NodeValidator":{"NodeValidator":[]},"HtmlElement":{"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"AccessibleNodeList":{"JSObject":[]},"AnchorElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"AreaElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"BaseElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"Blob":{"JSObject":[]},"BodyElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"CharacterData":{"Node":[],"EventTarget":[],"JSObject":[]},"CssPerspective":{"JSObject":[]},"CssStyleDeclaration":{"JSObject":[]},"CssStyleValue":{"JSObject":[]},"CssTransformComponent":{"JSObject":[]},"CssTransformValue":{"JSObject":[]},"CssUnparsedValue":{"JSObject":[]},"CustomEvent":{"Event":[],"JSObject":[]},"DataTransferItemList":{"JSObject":[]},"Document":{"Node":[],"EventTarget":[],"JSObject":[]},"DomException":{"JSObject":[]},"DomImplementation":{"JSObject":[]},"DomRectList":{"ListBase":["Rectangle<num>"],"ImmutableListMixin":["Rectangle<num>"],"List":["Rectangle<num>"],"JavaScriptIndexingBehavior":["Rectangle<num>"],"EfficientLengthIterable":["Rectangle<num>"],"JSObject":[],"Iterable":["Rectangle<num>"],"ImmutableListMixin.E":"Rectangle<num>","ListBase.E":"Rectangle<num>","Iterable.E":"Rectangle<num>"},"DomRectReadOnly":{"Rectangle":["num"],"JSObject":[]},"DomStringList":{"ListBase":["String"],"ImmutableListMixin":["String"],"List":["String"],"JavaScriptIndexingBehavior":["String"],"EfficientLengthIterable":["String"],"JSObject":[],"Iterable":["String"],"ImmutableListMixin.E":"String","ListBase.E":"String","Iterable.E":"String"},"DomTokenList":{"JSObject":[]},"_FrozenElementList":{"ListBase":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1"},"EventSource":{"EventTarget":[],"JSObject":[]},"EventTarget":{"JSObject":[]},"FileList":{"ListBase":["File"],"ImmutableListMixin":["File"],"List":["File"],"JavaScriptIndexingBehavior":["File"],"EfficientLengthIterable":["File"],"JSObject":[],"Iterable":["File"],"ImmutableListMixin.E":"File","ListBase.E":"File","Iterable.E":"File"},"FileWriter":{"EventTarget":[],"JSObject":[]},"FormElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"History":{"JSObject":[]},"HtmlCollection":{"ListBase":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"JSObject":[],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListBase.E":"Node","Iterable.E":"Node"},"HtmlDocument":{"Document":[],"Node":[],"EventTarget":[],"JSObject":[]},"HttpRequestEventTarget":{"EventTarget":[],"JSObject":[]},"ImageData":{"JSObject":[]},"Location":{"JSObject":[]},"MediaList":{"JSObject":[]},"MessagePort":{"EventTarget":[],"JSObject":[]},"MidiInputMap":{"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"MidiOutputMap":{"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"MimeTypeArray":{"ListBase":["MimeType"],"ImmutableListMixin":["MimeType"],"List":["MimeType"],"JavaScriptIndexingBehavior":["MimeType"],"EfficientLengthIterable":["MimeType"],"JSObject":[],"Iterable":["MimeType"],"ImmutableListMixin.E":"MimeType","ListBase.E":"MimeType","Iterable.E":"MimeType"},"_ChildNodeListLazy":{"ListBase":["Node"],"List":["Node"],"EfficientLengthIterable":["Node"],"Iterable":["Node"],"ListBase.E":"Node","Iterable.E":"Node"},"NodeList":{"ListBase":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"JSObject":[],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListBase.E":"Node","Iterable.E":"Node"},"PluginArray":{"ListBase":["Plugin"],"ImmutableListMixin":["Plugin"],"List":["Plugin"],"JavaScriptIndexingBehavior":["Plugin"],"EfficientLengthIterable":["Plugin"],"JSObject":[],"Iterable":["Plugin"],"ImmutableListMixin.E":"Plugin","ListBase.E":"Plugin","Iterable.E":"Plugin"},"RtcStatsReport":{"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"SelectElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"SharedArrayBuffer":{"JSObject":[]},"SourceBufferList":{"ListBase":["SourceBuffer"],"ImmutableListMixin":["SourceBuffer"],"List":["SourceBuffer"],"EventTarget":[],"JavaScriptIndexingBehavior":["SourceBuffer"],"EfficientLengthIterable":["SourceBuffer"],"JSObject":[],"Iterable":["SourceBuffer"],"ImmutableListMixin.E":"SourceBuffer","ListBase.E":"SourceBuffer","Iterable.E":"SourceBuffer"},"SpeechGrammarList":{"ListBase":["SpeechGrammar"],"ImmutableListMixin":["SpeechGrammar"],"List":["SpeechGrammar"],"JavaScriptIndexingBehavior":["SpeechGrammar"],"EfficientLengthIterable":["SpeechGrammar"],"JSObject":[],"Iterable":["SpeechGrammar"],"ImmutableListMixin.E":"SpeechGrammar","ListBase.E":"SpeechGrammar","Iterable.E":"SpeechGrammar"},"Storage":{"MapBase":["String","String"],"JSObject":[],"Map":["String","String"],"MapBase.K":"String","MapBase.V":"String"},"TableElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"TableRowElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"TableSectionElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"TemplateElement":{"HtmlElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"TextTrackCueList":{"ListBase":["TextTrackCue"],"ImmutableListMixin":["TextTrackCue"],"List":["TextTrackCue"],"JavaScriptIndexingBehavior":["TextTrackCue"],"EfficientLengthIterable":["TextTrackCue"],"JSObject":[],"Iterable":["TextTrackCue"],"ImmutableListMixin.E":"TextTrackCue","ListBase.E":"TextTrackCue","Iterable.E":"TextTrackCue"},"TextTrackList":{"ListBase":["TextTrack"],"ImmutableListMixin":["TextTrack"],"List":["TextTrack"],"EventTarget":[],"JavaScriptIndexingBehavior":["TextTrack"],"EfficientLengthIterable":["TextTrack"],"JSObject":[],"Iterable":["TextTrack"],"ImmutableListMixin.E":"TextTrack","ListBase.E":"TextTrack","Iterable.E":"TextTrack"},"TimeRanges":{"JSObject":[]},"TouchList":{"ListBase":["Touch"],"ImmutableListMixin":["Touch"],"List":["Touch"],"JavaScriptIndexingBehavior":["Touch"],"EfficientLengthIterable":["Touch"],"JSObject":[],"Iterable":["Touch"],"ImmutableListMixin.E":"Touch","ListBase.E":"Touch","Iterable.E":"Touch"},"TrackDefaultList":{"JSObject":[]},"UIEvent":{"Event":[],"JSObject":[]},"Url":{"JSObject":[]},"VideoTrackList":{"EventTarget":[],"JSObject":[]},"WebSocket":{"EventTarget":[],"JSObject":[]},"Window":{"WindowBase":[],"EventTarget":[],"JSObject":[]},"WorkerGlobalScope":{"EventTarget":[],"JSObject":[]},"_Attr":{"Node":[],"EventTarget":[],"JSObject":[]},"_CssRuleList":{"ListBase":["CssRule"],"ImmutableListMixin":["CssRule"],"List":["CssRule"],"JavaScriptIndexingBehavior":["CssRule"],"EfficientLengthIterable":["CssRule"],"JSObject":[],"Iterable":["CssRule"],"ImmutableListMixin.E":"CssRule","ListBase.E":"CssRule","Iterable.E":"CssRule"},"_DomRect":{"Rectangle":["num"],"JSObject":[]},"_GamepadList":{"ListBase":["Gamepad?"],"ImmutableListMixin":["Gamepad?"],"List":["Gamepad?"],"JavaScriptIndexingBehavior":["Gamepad?"],"EfficientLengthIterable":["Gamepad?"],"JSObject":[],"Iterable":["Gamepad?"],"ImmutableListMixin.E":"Gamepad?","ListBase.E":"Gamepad?","Iterable.E":"Gamepad?"},"_NamedNodeMap":{"ListBase":["Node"],"ImmutableListMixin":["Node"],"List":["Node"],"JavaScriptIndexingBehavior":["Node"],"EfficientLengthIterable":["Node"],"JSObject":[],"Iterable":["Node"],"ImmutableListMixin.E":"Node","ListBase.E":"Node","Iterable.E":"Node"},"_SpeechRecognitionResultList":{"ListBase":["SpeechRecognitionResult"],"ImmutableListMixin":["SpeechRecognitionResult"],"List":["SpeechRecognitionResult"],"JavaScriptIndexingBehavior":["SpeechRecognitionResult"],"EfficientLengthIterable":["SpeechRecognitionResult"],"JSObject":[],"Iterable":["SpeechRecognitionResult"],"ImmutableListMixin.E":"SpeechRecognitionResult","ListBase.E":"SpeechRecognitionResult","Iterable.E":"SpeechRecognitionResult"},"_StyleSheetList":{"ListBase":["StyleSheet"],"ImmutableListMixin":["StyleSheet"],"List":["StyleSheet"],"JavaScriptIndexingBehavior":["StyleSheet"],"EfficientLengthIterable":["StyleSheet"],"JSObject":[],"Iterable":["StyleSheet"],"ImmutableListMixin.E":"StyleSheet","ListBase.E":"StyleSheet","Iterable.E":"StyleSheet"},"_AttributeMap":{"MapBase":["String","String"],"Map":["String","String"]},"_ElementAttributeMap":{"MapBase":["String","String"],"Map":["String","String"],"MapBase.K":"String","MapBase.V":"String"},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"NodeValidatorBuilder":{"NodeValidator":[]},"_SimpleNodeValidator":{"NodeValidator":[]},"_TemplatingNodeValidator":{"NodeValidator":[]},"_SvgNodeValidator":{"NodeValidator":[]},"FixedSizeListIterator":{"Iterator":["1"]},"_DOMWindowCrossFrame":{"WindowBase":[],"EventTarget":[],"JSObject":[]},"_SameOriginUriPolicy":{"UriPolicy":[]},"_ValidatingTreeSanitizer":{"NodeTreeSanitizer":[]},"KeyRange":{"JSObject":[]},"JsFunction":{"JsObject":[]},"JsArray":{"ListBase":["1"],"List":["1"],"EfficientLengthIterable":["1"],"JsObject":[],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1"},"Length":{"JSObject":[]},"Number":{"JSObject":[]},"Transform":{"JSObject":[]},"LengthList":{"ListBase":["Length"],"ImmutableListMixin":["Length"],"List":["Length"],"EfficientLengthIterable":["Length"],"JSObject":[],"Iterable":["Length"],"ImmutableListMixin.E":"Length","ListBase.E":"Length","Iterable.E":"Length"},"NumberList":{"ListBase":["Number"],"ImmutableListMixin":["Number"],"List":["Number"],"EfficientLengthIterable":["Number"],"JSObject":[],"Iterable":["Number"],"ImmutableListMixin.E":"Number","ListBase.E":"Number","Iterable.E":"Number"},"PointList":{"JSObject":[]},"ScriptElement0":{"SvgElement":[],"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"StringList":{"ListBase":["String"],"ImmutableListMixin":["String"],"List":["String"],"EfficientLengthIterable":["String"],"JSObject":[],"Iterable":["String"],"ImmutableListMixin.E":"String","ListBase.E":"String","Iterable.E":"String"},"SvgElement":{"Element":[],"Node":[],"EventTarget":[],"JSObject":[]},"TransformList":{"ListBase":["Transform"],"ImmutableListMixin":["Transform"],"List":["Transform"],"EfficientLengthIterable":["Transform"],"JSObject":[],"Iterable":["Transform"],"ImmutableListMixin.E":"Transform","ListBase.E":"Transform","Iterable.E":"Transform"},"AudioBuffer":{"JSObject":[]},"AudioParamMap":{"MapBase":["String","@"],"JSObject":[],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"AudioTrackList":{"EventTarget":[],"JSObject":[]},"BaseAudioContext":{"EventTarget":[],"JSObject":[]},"OfflineAudioContext":{"EventTarget":[],"JSObject":[]},"DelegatingStreamSink":{"StreamSink":["1"]},"ErrorResult":{"Result":["0&"]},"ValueResult":{"Result":["1"]},"_NextRequest":{"_EventRequest":["1"]},"_HasNextRequest":{"_EventRequest":["1"]},"BuiltList":{"Iterable":["1"]},"_BuiltList":{"BuiltList":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltListMultimap":{"BuiltListMultimap":["1","2"]},"_BuiltMap":{"BuiltMap":["1","2"]},"BuiltSet":{"Iterable":["1"]},"_BuiltSet":{"BuiltSet":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltSetMultimap":{"BuiltSetMultimap":["1","2"]},"BuiltValueNullFieldError":{"Error":[]},"BuiltValueNestedFieldError":{"Error":[]},"BoolJsonObject":{"JsonObject":[]},"ListJsonObject":{"JsonObject":[]},"MapJsonObject":{"JsonObject":[]},"NumJsonObject":{"JsonObject":[]},"StringJsonObject":{"JsonObject":[]},"DeserializationError":{"Error":[]},"BigIntSerializer":{"PrimitiveSerializer":["BigInt"],"Serializer":["BigInt"]},"BoolSerializer":{"PrimitiveSerializer":["bool"],"Serializer":["bool"]},"BuiltJsonSerializers":{"Serializers":[]},"BuiltListMultimapSerializer":{"StructuredSerializer":["BuiltListMultimap<@,@>"],"Serializer":["BuiltListMultimap<@,@>"]},"BuiltListSerializer":{"StructuredSerializer":["BuiltList<@>"],"Serializer":["BuiltList<@>"]},"BuiltMapSerializer":{"StructuredSerializer":["BuiltMap<@,@>"],"Serializer":["BuiltMap<@,@>"]},"BuiltSetMultimapSerializer":{"StructuredSerializer":["BuiltSetMultimap<@,@>"],"Serializer":["BuiltSetMultimap<@,@>"]},"BuiltSetSerializer":{"StructuredSerializer":["BuiltSet<@>"],"Serializer":["BuiltSet<@>"]},"DateTimeSerializer":{"PrimitiveSerializer":["DateTime"],"Serializer":["DateTime"]},"DoubleSerializer":{"PrimitiveSerializer":["double"],"Serializer":["double"]},"DurationSerializer":{"PrimitiveSerializer":["Duration"],"Serializer":["Duration"]},"Int32Serializer":{"PrimitiveSerializer":["Int32"],"Serializer":["Int32"]},"Int64Serializer":{"PrimitiveSerializer":["Int64"],"Serializer":["Int64"]},"IntSerializer":{"PrimitiveSerializer":["int"],"Serializer":["int"]},"JsonObjectSerializer":{"PrimitiveSerializer":["JsonObject"],"Serializer":["JsonObject"]},"NullSerializer":{"PrimitiveSerializer":["Null"],"Serializer":["Null"]},"NumSerializer":{"PrimitiveSerializer":["num"],"Serializer":["num"]},"RegExpSerializer":{"PrimitiveSerializer":["RegExp"],"Serializer":["RegExp"]},"StringSerializer":{"PrimitiveSerializer":["String"],"Serializer":["String"]},"Uint8ListSerializer":{"PrimitiveSerializer":["Uint8List"],"Serializer":["Uint8List"]},"UriSerializer":{"PrimitiveSerializer":["Uri"],"Serializer":["Uri"]},"DefaultEquality":{"Equality":["1"]},"IterableEquality":{"Equality":["Iterable<1>"]},"ListEquality":{"Equality":["List<1>"]},"_UnorderedEquality":{"Equality":["2"]},"SetEquality":{"_UnorderedEquality":["1","Set<1>"],"Equality":["Set<1>"],"_UnorderedEquality.E":"1","_UnorderedEquality.T":"Set<1>"},"MapEquality":{"Equality":["Map<1,2>"]},"DeepCollectionEquality":{"Equality":["@"]},"QueueList":{"ListBase":["1"],"List":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","QueueList.E":"1","Iterable.E":"1"},"_CastQueueList":{"QueueList":["2"],"ListBase":["2"],"List":["2"],"Queue":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","QueueList.E":"2","Iterable.E":"2"},"_$BuildStatusSerializer":{"PrimitiveSerializer":["BuildStatus"],"Serializer":["BuildStatus"]},"_$BuildResultSerializer":{"StructuredSerializer":["BuildResult"],"Serializer":["BuildResult"]},"_$BuildResult":{"BuildResult":[]},"_$ConnectRequestSerializer":{"StructuredSerializer":["ConnectRequest"],"Serializer":["ConnectRequest"]},"_$ConnectRequest":{"ConnectRequest":[]},"_$DebugEventSerializer":{"StructuredSerializer":["DebugEvent"],"Serializer":["DebugEvent"]},"_$BatchedDebugEventsSerializer":{"StructuredSerializer":["BatchedDebugEvents"],"Serializer":["BatchedDebugEvents"]},"_$DebugEvent":{"DebugEvent":[]},"_$BatchedDebugEvents":{"BatchedDebugEvents":[]},"_$DebugInfoSerializer":{"StructuredSerializer":["DebugInfo"],"Serializer":["DebugInfo"]},"_$DebugInfo":{"DebugInfo":[]},"_$DevToolsRequestSerializer":{"StructuredSerializer":["DevToolsRequest"],"Serializer":["DevToolsRequest"]},"_$DevToolsResponseSerializer":{"StructuredSerializer":["DevToolsResponse"],"Serializer":["DevToolsResponse"]},"_$DevToolsRequest":{"DevToolsRequest":[]},"_$DevToolsResponse":{"DevToolsResponse":[]},"_$ErrorResponseSerializer":{"StructuredSerializer":["ErrorResponse"],"Serializer":["ErrorResponse"]},"_$ErrorResponse":{"ErrorResponse":[]},"_$ExtensionRequestSerializer":{"StructuredSerializer":["ExtensionRequest"],"Serializer":["ExtensionRequest"]},"_$ExtensionResponseSerializer":{"StructuredSerializer":["ExtensionResponse"],"Serializer":["ExtensionResponse"]},"_$ExtensionEventSerializer":{"StructuredSerializer":["ExtensionEvent"],"Serializer":["ExtensionEvent"]},"_$BatchedEventsSerializer":{"StructuredSerializer":["BatchedEvents"],"Serializer":["BatchedEvents"]},"_$ExtensionRequest":{"ExtensionRequest":[]},"_$ExtensionResponse":{"ExtensionResponse":[]},"_$ExtensionEvent":{"ExtensionEvent":[]},"_$BatchedEvents":{"BatchedEvents":[]},"_$IsolateExitSerializer":{"StructuredSerializer":["IsolateExit"],"Serializer":["IsolateExit"]},"_$IsolateStartSerializer":{"StructuredSerializer":["IsolateStart"],"Serializer":["IsolateStart"]},"_$IsolateExit":{"IsolateExit":[]},"_$IsolateStart":{"IsolateStart":[]},"_$RegisterEventSerializer":{"StructuredSerializer":["RegisterEvent"],"Serializer":["RegisterEvent"]},"_$RegisterEvent":{"RegisterEvent":[]},"_$RunRequestSerializer":{"StructuredSerializer":["RunRequest"],"Serializer":["RunRequest"]},"_$RunRequest":{"RunRequest":[]},"SseSocketClient":{"SocketClient":[]},"WebSocketClient":{"SocketClient":[]},"Int32":{"Comparable":["Object"]},"Int64":{"Comparable":["Object"]},"Level":{"Comparable":["Level"]},"SseClient":{"StreamChannel":["String?"]},"GuaranteeChannel":{"StreamChannel":["1"]},"_GuaranteeSink":{"StreamSink":["1"]},"StreamChannelMixin":{"StreamChannel":["1"]},"HtmlWebSocketChannel":{"WebSocketChannel":[],"StreamChannel":["@"]},"_HtmlWebSocketSink":{"WebSocketSink":[],"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"WebSocketChannel":{"StreamChannel":["@"]},"DdcRestarter":{"Restarter":[]},"RequireRestarter":{"Restarter":[]},"ByteData":{"TypedData":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"TypedData":[]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"],"TypedData":[]}}'));
  A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"_DelayedEvent":1,"_SplayTreeSet__SplayTree_Iterable":1,"_SplayTreeSet__SplayTree_Iterable_SetMixin":1,"MapEntry":2,"_JsArray_JsObject_ListMixin":1,"_QueueList_Object_ListMixin":1,"StreamChannelMixin":1}'));
  var string$ = {
    ABCDEF: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    Error_: "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type",
    max_mu: "max must be in range 0 < max \u2264 2^32, was ",
    serial: "serializer must be StructuredSerializer or PrimitiveSerializer"
  };
  var type$ = (function rtii() {
    var findType = A.findType;
    return {
      AsyncError: findType("AsyncError"),
      Base64Codec: findType("Base64Codec"),
      BaseElement: findType("BaseElement"),
      BatchedDebugEvents: findType("BatchedDebugEvents"),
      BatchedEvents: findType("BatchedEvents"),
      BatchedStreamController_DebugEvent: findType("BatchedStreamController<DebugEvent>"),
      BigInt: findType("BigInt"),
      Blob: findType("Blob"),
      BodyElement: findType("BodyElement"),
      BuildResult: findType("BuildResult"),
      BuildStatus: findType("BuildStatus"),
      BuiltListMultimap_dynamic_dynamic: findType("BuiltListMultimap<@,@>"),
      BuiltList_DebugEvent: findType("BuiltList<DebugEvent>"),
      BuiltList_ExtensionEvent: findType("BuiltList<ExtensionEvent>"),
      BuiltList_dynamic: findType("BuiltList<@>"),
      BuiltList_nullable_Object: findType("BuiltList<Object?>"),
      BuiltMap_dynamic_dynamic: findType("BuiltMap<@,@>"),
      BuiltSetMultimap_dynamic_dynamic: findType("BuiltSetMultimap<@,@>"),
      BuiltSet_dynamic: findType("BuiltSet<@>"),
      ByteBuffer: findType("ByteBuffer"),
      CloseEvent: findType("CloseEvent"),
      Comparable_dynamic: findType("Comparable<@>"),
      Completer_bool: findType("Completer<bool>"),
      ConnectRequest: findType("ConnectRequest"),
      ConstantMapView_Symbol_dynamic: findType("ConstantMapView<Symbol0,@>"),
      CssRule: findType("CssRule"),
      CustomEvent: findType("CustomEvent"),
      DateTime: findType("DateTime"),
      DebugEvent: findType("DebugEvent"),
      DebugInfo: findType("DebugInfo"),
      DevToolsRequest: findType("DevToolsRequest"),
      DevToolsResponse: findType("DevToolsResponse"),
      Document: findType("Document"),
      Duration: findType("Duration"),
      EfficientLengthIterable_dynamic: findType("EfficientLengthIterable<@>"),
      Element: findType("Element"),
      Error: findType("Error"),
      ErrorResponse: findType("ErrorResponse"),
      Event: findType("Event"),
      ExtensionEvent: findType("ExtensionEvent"),
      ExtensionRequest: findType("ExtensionRequest"),
      ExtensionResponse: findType("ExtensionResponse"),
      File: findType("File"),
      FileList: findType("FileList"),
      FullType: findType("FullType"),
      Function: findType("Function"),
      Future_dynamic: findType("Future<@>"),
      Future_void: findType("Future<~>"),
      HtmlElement: findType("HtmlElement"),
      ImageData: findType("ImageData"),
      Int32: findType("Int32"),
      Int64: findType("Int64"),
      Invocation: findType("Invocation"),
      IsolateExit: findType("IsolateExit"),
      IsolateStart: findType("IsolateStart"),
      IterableEquality_dynamic: findType("IterableEquality<@>"),
      Iterable_Node: findType("Iterable<Node>"),
      Iterable_dynamic: findType("Iterable<@>"),
      Iterable_nullable_Object: findType("Iterable<Object?>"),
      JSArray_FullType: findType("JSArray<FullType>"),
      JSArray_NodeValidator: findType("JSArray<NodeValidator>"),
      JSArray_Object: findType("JSArray<Object>"),
      JSArray_String: findType("JSArray<String>"),
      JSArray_Type: findType("JSArray<Type>"),
      JSArray_dynamic: findType("JSArray<@>"),
      JSArray_int: findType("JSArray<int>"),
      JSNull: findType("JSNull"),
      JSObject: findType("JSObject"),
      JavaScriptFunction: findType("JavaScriptFunction"),
      JavaScriptIndexingBehavior_dynamic: findType("JavaScriptIndexingBehavior<@>"),
      JsArray_dynamic: findType("JsArray<@>"),
      JsError: findType("JsError"),
      JsLinkedHashMap_String_dynamic: findType("JsLinkedHashMap<String,@>"),
      JsLinkedHashMap_Symbol_dynamic: findType("JsLinkedHashMap<Symbol0,@>"),
      JsObject: findType("JsObject"),
      JsonObject: findType("JsonObject"),
      KeyRange: findType("KeyRange"),
      KeyboardEvent: findType("KeyboardEvent"),
      Length: findType("Length"),
      Level: findType("Level"),
      ListBuilder_DebugEvent: findType("ListBuilder<DebugEvent>"),
      ListBuilder_ExtensionEvent: findType("ListBuilder<ExtensionEvent>"),
      ListBuilder_dynamic: findType("ListBuilder<@>"),
      ListEquality_dynamic: findType("ListEquality<@>"),
      ListMultimapBuilder_dynamic_dynamic: findType("ListMultimapBuilder<@,@>"),
      List_DebugEvent: findType("List<DebugEvent>"),
      List_ExtensionEvent: findType("List<ExtensionEvent>"),
      List_String: findType("List<String>"),
      List_dynamic: findType("List<@>"),
      List_int: findType("List<int>"),
      List_nullable_Object: findType("List<Object?>"),
      Location: findType("Location"),
      Logger: findType("Logger"),
      MapBuilder_dynamic_dynamic: findType("MapBuilder<@,@>"),
      MapEquality_dynamic_dynamic: findType("MapEquality<@,@>"),
      Map_String_String: findType("Map<String,String>"),
      Map_dynamic_dynamic: findType("Map<@,@>"),
      Map_of_String_and_nullable_Object: findType("Map<String,Object?>"),
      MappedListIterable_String_String: findType("MappedListIterable<String,String>"),
      MessageEvent: findType("MessageEvent"),
      MessagePort: findType("MessagePort"),
      MimeType: findType("MimeType"),
      NativeByteBuffer: findType("NativeByteBuffer"),
      NativeTypedData: findType("NativeTypedData"),
      NativeUint8List: findType("NativeUint8List"),
      Node: findType("Node"),
      NodeValidator: findType("NodeValidator"),
      Null: findType("Null"),
      Number: findType("Number"),
      Object: findType("Object"),
      Plugin: findType("Plugin"),
      PoolResource: findType("PoolResource"),
      PrimitiveSerializer_dynamic: findType("PrimitiveSerializer<@>"),
      ProgressEvent: findType("ProgressEvent"),
      Promise_bool_Function_String: findType("Promise<1&>(String)"),
      Promise_void: findType("Promise<1&>"),
      QueueList_Result_DebugEvent: findType("QueueList<Result<DebugEvent>>"),
      Record: findType("Record"),
      Rectangle_num: findType("Rectangle<num>"),
      RegExp: findType("RegExp"),
      RegExpMatch: findType("RegExpMatch"),
      RegisterEvent: findType("RegisterEvent"),
      RequireRestarter: findType("RequireRestarter"),
      ReversedListIterable_String: findType("ReversedListIterable<String>"),
      RunRequest: findType("RunRequest"),
      ScriptElement: findType("ScriptElement0"),
      SerializerPlugin: findType("SerializerPlugin"),
      Serializer_dynamic: findType("Serializer<@>"),
      SetBuilder_dynamic: findType("SetBuilder<@>"),
      SetEquality_dynamic: findType("SetEquality<@>"),
      SetMultimapBuilder_dynamic_dynamic: findType("SetMultimapBuilder<@,@>"),
      Set_dynamic: findType("Set<@>"),
      SharedArrayBuffer: findType("SharedArrayBuffer"),
      SourceBuffer: findType("SourceBuffer"),
      SpeechGrammar: findType("SpeechGrammar"),
      SpeechRecognitionResult: findType("SpeechRecognitionResult"),
      SplayTreeSet_String: findType("SplayTreeSet<String>"),
      StackTrace: findType("StackTrace"),
      StreamChannelController_dynamic: findType("StreamChannelController<@>"),
      StreamQueue_DebugEvent: findType("StreamQueue<DebugEvent>"),
      String: findType("String"),
      String_Function_String: findType("String(String)"),
      StructuredSerializer_dynamic: findType("StructuredSerializer<@>"),
      StyleSheet: findType("StyleSheet"),
      SvgElement: findType("SvgElement"),
      Symbol: findType("Symbol0"),
      TemplateElement: findType("TemplateElement"),
      TextTrack: findType("TextTrack"),
      TextTrackCue: findType("TextTrackCue"),
      Timer: findType("Timer"),
      Touch: findType("Touch"),
      Transform: findType("Transform"),
      TrustedGetRuntimeType: findType("TrustedGetRuntimeType"),
      Type: findType("Type"),
      TypeError: findType("TypeError"),
      TypedData: findType("TypedData"),
      Uint8List: findType("Uint8List"),
      UnknownJavaScriptObject: findType("UnknownJavaScriptObject"),
      UnmodifiableListView_nullable_Object: findType("UnmodifiableListView<Object?>"),
      UnmodifiableMapView_of_String_and_nullable_Object: findType("UnmodifiableMapView<String,Object?>"),
      Uri: findType("Uri"),
      Window: findType("Window"),
      WindowBase: findType("WindowBase"),
      WorkerGlobalScope: findType("WorkerGlobalScope"),
      Zone: findType("Zone"),
      _AsyncCompleter_HttpRequest: findType("_AsyncCompleter<HttpRequest>"),
      _AsyncCompleter_PoolResource: findType("_AsyncCompleter<PoolResource>"),
      _AsyncCompleter_bool: findType("_AsyncCompleter<bool>"),
      _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"),
      _AsyncCompleter_void: findType("_AsyncCompleter<~>"),
      _Attr: findType("_Attr"),
      _BigIntImpl: findType("_BigIntImpl"),
      _BuiltMap_dynamic_dynamic: findType("_BuiltMap<@,@>"),
      _ChildNodeListLazy: findType("_ChildNodeListLazy"),
      _EventRequest_dynamic: findType("_EventRequest<@>"),
      _EventStream_CloseEvent: findType("_EventStream<CloseEvent>"),
      _EventStream_Event: findType("_EventStream<Event>"),
      _FrozenElementList_Element: findType("_FrozenElementList<Element>"),
      _Future_HttpRequest: findType("_Future<HttpRequest>"),
      _Future_PoolResource: findType("_Future<PoolResource>"),
      _Future_bool: findType("_Future<bool>"),
      _Future_dynamic: findType("_Future<@>"),
      _Future_int: findType("_Future<int>"),
      _Future_void: findType("_Future<~>"),
      _Html5NodeValidator: findType("_Html5NodeValidator"),
      _IdentityHashMap_dynamic_dynamic: findType("_IdentityHashMap<@,@>"),
      _MapEntry: findType("_MapEntry"),
      _StreamControllerAddStreamState_nullable_Object: findType("_StreamControllerAddStreamState<Object?>"),
      _SyncCompleter_PoolResource: findType("_SyncCompleter<PoolResource>"),
      _ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace: findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,Object,StackTrace)>"),
      bool: findType("bool"),
      bool_Function_Object: findType("bool(Object)"),
      double: findType("double"),
      dynamic: findType("@"),
      dynamic_Function: findType("@()"),
      dynamic_Function_Event: findType("@(Event)"),
      dynamic_Function_Object: findType("@(Object)"),
      dynamic_Function_Object_StackTrace: findType("@(Object,StackTrace)"),
      dynamic_Function_dynamic: findType("@(@)"),
      dynamic_Function_dynamic_dynamic: findType("@(@,@)"),
      int: findType("int"),
      legacy_Never: findType("0&*"),
      legacy_Object: findType("Object*"),
      nullable_Future_Null: findType("Future<Null>?"),
      nullable_Gamepad: findType("Gamepad?"),
      nullable_ListBuilder_DebugEvent: findType("ListBuilder<DebugEvent>?"),
      nullable_ListBuilder_ExtensionEvent: findType("ListBuilder<ExtensionEvent>?"),
      nullable_List_dynamic: findType("List<@>?"),
      nullable_Map_of_nullable_Object_and_nullable_Object: findType("Map<Object?,Object?>?"),
      nullable_Object: findType("Object?"),
      nullable_Result_DebugEvent: findType("Result<DebugEvent>?"),
      nullable_StackTrace: findType("StackTrace?"),
      nullable_Zone: findType("Zone?"),
      nullable_ZoneDelegate: findType("ZoneDelegate?"),
      nullable_ZoneSpecification: findType("ZoneSpecification?"),
      nullable__DelayedEvent_dynamic: findType("_DelayedEvent<@>?"),
      nullable__FutureListener_dynamic_dynamic: findType("_FutureListener<@,@>?"),
      nullable__LinkedHashSetCell: findType("_LinkedHashSetCell?"),
      nullable_dynamic_Function_Event: findType("@(Event)?"),
      nullable_int_Function_Node_Node: findType("int(Node,Node)?"),
      nullable_void_Function: findType("~()?"),
      nullable_void_Function_BatchedDebugEventsBuilder: findType("~(BatchedDebugEventsBuilder)?"),
      nullable_void_Function_ConnectRequestBuilder: findType("~(ConnectRequestBuilder)?"),
      nullable_void_Function_DebugEventBuilder: findType("~(DebugEventBuilder)?"),
      nullable_void_Function_DebugInfoBuilder: findType("~(DebugInfoBuilder)?"),
      nullable_void_Function_DevToolsRequestBuilder: findType("~(DevToolsRequestBuilder)?"),
      nullable_void_Function_Event: findType("~(Event)?"),
      nullable_void_Function_KeyboardEvent: findType("~(KeyboardEvent)?"),
      nullable_void_Function_MessageEvent: findType("~(MessageEvent)?"),
      nullable_void_Function_ProgressEvent: findType("~(ProgressEvent)?"),
      nullable_void_Function_RegisterEventBuilder: findType("~(RegisterEventBuilder)?"),
      num: findType("num"),
      void: findType("~"),
      void_Function: findType("~()"),
      void_Function_$opt_dynamic: findType("~([@])"),
      void_Function_JsError: findType("~(JsError)"),
      void_Function_Object: findType("~(Object)"),
      void_Function_Object_StackTrace: findType("~(Object,StackTrace)"),
      void_Function_String: findType("~(String)"),
      void_Function_String_String: findType("~(String,String)"),
      void_Function_String_dynamic: findType("~(String,@)"),
      void_Function_Timer: findType("~(Timer)"),
      void_Function_dynamic: findType("~(@)")
    };
  })();
  (function constants() {
    var makeConstList = hunkHelpers.makeConstList;
    B.AnchorElement_methods = A.AnchorElement.prototype;
    B.BodyElement_methods = A.BodyElement.prototype;
    B.DomImplementation_methods = A.DomImplementation.prototype;
    B.EventSource_methods = A.EventSource.prototype;
    B.HtmlDocument_methods = A.HtmlDocument.prototype;
    B.HttpRequest_methods = A.HttpRequest.prototype;
    B.Interceptor_methods = J.Interceptor.prototype;
    B.JSArray_methods = J.JSArray.prototype;
    B.JSBool_methods = J.JSBool.prototype;
    B.JSInt_methods = J.JSInt.prototype;
    B.JSNumber_methods = J.JSNumber.prototype;
    B.JSString_methods = J.JSString.prototype;
    B.JavaScriptFunction_methods = J.JavaScriptFunction.prototype;
    B.JavaScriptObject_methods = J.JavaScriptObject.prototype;
    B.Location_methods = A.Location.prototype;
    B.NativeUint8List_methods = A.NativeUint8List.prototype;
    B.NodeList_methods = A.NodeList.prototype;
    B.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
    B.TableElement_methods = A.TableElement.prototype;
    B.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
    B.WebSocket_methods = A.WebSocket.prototype;
    B.Window_methods = A.Window.prototype;
    B.BuildStatus_failed = new A.BuildStatus("failed");
    B.BuildStatus_started = new A.BuildStatus("started");
    B.BuildStatus_succeeded = new A.BuildStatus("succeeded");
    B.C_Base64Encoder = new A.Base64Encoder();
    B.C_Base64Codec = new A.Base64Codec();
    B.C_Base64Decoder = new A.Base64Decoder();
    B.C_DefaultEquality = new A.DefaultEquality(A.findType("DefaultEquality<0&>"));
    B.C_DeepCollectionEquality = new A.DeepCollectionEquality();
    B.C_EmptyIterator = new A.EmptyIterator(A.findType("EmptyIterator<0&>"));
    B.C_IntegerDivisionByZeroException = new A.IntegerDivisionByZeroException();
    B.C_JS_CONST = function getTagFallback(o) {
  var s = Object.prototype.toString.call(o);
  return s.substring(8, s.length - 1);
};
    B.C_JS_CONST0 = function() {
  var toStringFunction = Object.prototype.toString;
  function getTag(o) {
    var s = toStringFunction.call(o);
    return s.substring(8, s.length - 1);
  }
  function getUnknownTag(object, tag) {
    if (/^HTML[A-Z].*Element$/.test(tag)) {
      var name = toStringFunction.call(object);
      if (name == "[object Object]") return null;
      return "HTMLElement";
    }
  }
  function getUnknownTagGenericBrowser(object, tag) {
    if (object instanceof HTMLElement) return "HTMLElement";
    return getUnknownTag(object, tag);
  }
  function prototypeForTag(tag) {
    if (typeof window == "undefined") return null;
    if (typeof window[tag] == "undefined") return null;
    var constructor = window[tag];
    if (typeof constructor != "function") return null;
    return constructor.prototype;
  }
  function discriminator(tag) { return null; }
  var isBrowser = typeof HTMLElement == "function";
  return {
    getTag: getTag,
    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
    prototypeForTag: prototypeForTag,
    discriminator: discriminator };
};
    B.C_JS_CONST6 = function(getTagFallback) {
  return function(hooks) {
    if (typeof navigator != "object") return hooks;
    var userAgent = navigator.userAgent;
    if (typeof userAgent != "string") return hooks;
    if (userAgent.indexOf("DumpRenderTree") >= 0) return hooks;
    if (userAgent.indexOf("Chrome") >= 0) {
      function confirm(p) {
        return typeof window == "object" && window[p] && window[p].name == p;
      }
      if (confirm("Window") && confirm("HTMLElement")) return hooks;
    }
    hooks.getTag = getTagFallback;
  };
};
    B.C_JS_CONST1 = function(hooks) {
  if (typeof dartExperimentalFixupGetTag != "function") return hooks;
  hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
};
    B.C_JS_CONST5 = function(hooks) {
  if (typeof navigator != "object") return hooks;
  var userAgent = navigator.userAgent;
  if (typeof userAgent != "string") return hooks;
  if (userAgent.indexOf("Firefox") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "GeoGeolocation": "Geolocation",
    "Location": "!Location",
    "WorkerMessageEvent": "MessageEvent",
    "XMLDocument": "!Document"};
  function getTagFirefox(o) {
    var tag = getTag(o);
    return quickMap[tag] || tag;
  }
  hooks.getTag = getTagFirefox;
};
    B.C_JS_CONST4 = function(hooks) {
  if (typeof navigator != "object") return hooks;
  var userAgent = navigator.userAgent;
  if (typeof userAgent != "string") return hooks;
  if (userAgent.indexOf("Trident/") == -1) return hooks;
  var getTag = hooks.getTag;
  var quickMap = {
    "BeforeUnloadEvent": "Event",
    "DataTransfer": "Clipboard",
    "HTMLDDElement": "HTMLElement",
    "HTMLDTElement": "HTMLElement",
    "HTMLPhraseElement": "HTMLElement",
    "Position": "Geoposition"
  };
  function getTagIE(o) {
    var tag = getTag(o);
    var newTag = quickMap[tag];
    if (newTag) return newTag;
    if (tag == "Object") {
      if (window.DataView && (o instanceof window.DataView)) return "DataView";
    }
    return tag;
  }
  function prototypeForTagIE(tag) {
    var constructor = window[tag];
    if (constructor == null) return null;
    return constructor.prototype;
  }
  hooks.getTag = getTagIE;
  hooks.prototypeForTag = prototypeForTagIE;
};
    B.C_JS_CONST2 = function(hooks) {
  var getTag = hooks.getTag;
  var prototypeForTag = hooks.prototypeForTag;
  function getTagFixed(o) {
    var tag = getTag(o);
    if (tag == "Document") {
      if (!!o.xmlVersion) return "!Document";
      return "!HTMLDocument";
    }
    return tag;
  }
  function prototypeForTagFixed(tag) {
    if (tag == "Document") return null;
    return prototypeForTag(tag);
  }
  hooks.getTag = getTagFixed;
  hooks.prototypeForTag = prototypeForTagFixed;
};
    B.C_JS_CONST3 = function(hooks) { return hooks; }
;
    B.C_JsonCodec = new A.JsonCodec();
    B.C_OutOfMemoryError = new A.OutOfMemoryError();
    B.C_SentinelValue = new A.SentinelValue();
    B.C_Utf8Codec = new A.Utf8Codec();
    B.C_Utf8Encoder = new A.Utf8Encoder();
    B.C_Uuid = new A.Uuid();
    B.C__DelayedDone = new A._DelayedDone();
    B.C__JSRandom = new A._JSRandom();
    B.C__Required = new A._Required();
    B.C__RootZone = new A._RootZone();
    B.Duration_0 = new A.Duration(0);
    B.Duration_5000000 = new A.Duration(5000000);
    B.Type_BuiltMap_qd4 = A.typeLiteral("BuiltMap<@,@>");
    B.Type_Object_xQ6 = A.typeLiteral("Object");
    B.List_empty1 = A._setArrayType(makeConstList([]), type$.JSArray_FullType);
    B.FullType_1MH = new A.FullType(B.Type_Object_xQ6, B.List_empty1, false);
    B.List_4AN = A._setArrayType(makeConstList([B.FullType_1MH, B.FullType_1MH]), type$.JSArray_FullType);
    B.FullType_6Ps = new A.FullType(B.Type_BuiltMap_qd4, B.List_4AN, false);
    B.Type_BuiltList_iTR = A.typeLiteral("BuiltList<@>");
    B.Type_DebugEvent_sSr = A.typeLiteral("DebugEvent");
    B.FullType_Dx1 = new A.FullType(B.Type_DebugEvent_sSr, B.List_empty1, false);
    B.List_luS = A._setArrayType(makeConstList([B.FullType_Dx1]), type$.JSArray_FullType);
    B.FullType_EGl = new A.FullType(B.Type_BuiltList_iTR, B.List_luS, false);
    B.Type_BuildStatus_ahk = A.typeLiteral("BuildStatus");
    B.FullType_FuN = new A.FullType(B.Type_BuildStatus_ahk, B.List_empty1, false);
    B.Type_BuiltSet_fcN = A.typeLiteral("BuiltSet<@>");
    B.List_3wP = A._setArrayType(makeConstList([B.FullType_1MH]), type$.JSArray_FullType);
    B.FullType_KVM = new A.FullType(B.Type_BuiltSet_fcN, B.List_3wP, false);
    B.Type_bool_lhE = A.typeLiteral("bool");
    B.FullType_MtR = new A.FullType(B.Type_bool_lhE, B.List_empty1, false);
    B.Type_ExtensionEvent_gsm = A.typeLiteral("ExtensionEvent");
    B.FullType_Ktb = new A.FullType(B.Type_ExtensionEvent_gsm, B.List_empty1, false);
    B.List_0 = A._setArrayType(makeConstList([B.FullType_Ktb]), type$.JSArray_FullType);
    B.FullType_NIe = new A.FullType(B.Type_BuiltList_iTR, B.List_0, false);
    B.FullType_WUY = new A.FullType(B.Type_BuiltList_iTR, B.List_3wP, false);
    B.Type_BuiltListMultimap_2Mt = A.typeLiteral("BuiltListMultimap<@,@>");
    B.FullType_fA4 = new A.FullType(B.Type_BuiltListMultimap_2Mt, B.List_4AN, false);
    B.Type_BuiltSetMultimap_9Fi = A.typeLiteral("BuiltSetMultimap<@,@>");
    B.FullType_gsm = new A.FullType(B.Type_BuiltSetMultimap_9Fi, B.List_4AN, false);
    B.Type_String_k8F = A.typeLiteral("String");
    B.FullType_h8g = new A.FullType(B.Type_String_k8F, B.List_empty1, false);
    B.Type_int_tHn = A.typeLiteral("int");
    B.FullType_kjq = new A.FullType(B.Type_int_tHn, B.List_empty1, false);
    B.FullType_null_List_empty_false = new A.FullType(null, B.List_empty1, false);
    B.JsonDecoder_null = new A.JsonDecoder(null);
    B.JsonEncoder_null = new A.JsonEncoder(null);
    B.Level_INFO_800 = new A.Level("INFO", 800);
    B.Level_SEVERE_1000 = new A.Level("SEVERE", 1000);
    B.Level_WARNING_900 = new A.Level("WARNING", 900);
    B.Type_IsolateStart_0 = A.typeLiteral("IsolateStart");
    B.Type__$IsolateStart_o3b = A.typeLiteral("_$IsolateStart");
    B.List_00 = A._setArrayType(makeConstList([B.Type_IsolateStart_0, B.Type__$IsolateStart_o3b]), type$.JSArray_Type);
    B.Type_ExtensionRequest_BMe = A.typeLiteral("ExtensionRequest");
    B.Type__$ExtensionRequest_1Ej = A.typeLiteral("_$ExtensionRequest");
    B.List_0YD = A._setArrayType(makeConstList([B.Type_ExtensionRequest_BMe, B.Type__$ExtensionRequest_1Ej]), type$.JSArray_Type);
    B.Type_ErrorResponse_Q43 = A.typeLiteral("ErrorResponse");
    B.Type__$ErrorResponse_xV7 = A.typeLiteral("_$ErrorResponse");
    B.List_6Bz = A._setArrayType(makeConstList([B.Type_ErrorResponse_Q43, B.Type__$ErrorResponse_xV7]), type$.JSArray_Type);
    B.Type_RunRequest_Pkw = A.typeLiteral("RunRequest");
    B.Type__$RunRequest_Im4 = A.typeLiteral("_$RunRequest");
    B.List_7pl = A._setArrayType(makeConstList([B.Type_RunRequest_Pkw, B.Type__$RunRequest_Im4]), type$.JSArray_Type);
    B.Type__$DebugEvent_EmR = A.typeLiteral("_$DebugEvent");
    B.List_8h5 = A._setArrayType(makeConstList([B.Type_DebugEvent_sSr, B.Type__$DebugEvent_EmR]), type$.JSArray_Type);
    B.Type_RegisterEvent_0zQ = A.typeLiteral("RegisterEvent");
    B.Type__$RegisterEvent_SY6 = A.typeLiteral("_$RegisterEvent");
    B.List_ASY = A._setArrayType(makeConstList([B.Type_RegisterEvent_0zQ, B.Type__$RegisterEvent_SY6]), type$.JSArray_Type);
    B.List_AuK = A._setArrayType(makeConstList(["bind", "if", "ref", "repeat", "syntax"]), type$.JSArray_String);
    B.Type_DebugInfo_gg4 = A.typeLiteral("DebugInfo");
    B.Type__$DebugInfo_Eoc = A.typeLiteral("_$DebugInfo");
    B.List_IMr = A._setArrayType(makeConstList([B.Type_DebugInfo_gg4, B.Type__$DebugInfo_Eoc]), type$.JSArray_Type);
    B.List_Icz = A._setArrayType(makeConstList([0, 0, 1048576, 531441, 1048576, 390625, 279936, 823543, 262144, 531441, 1000000, 161051, 248832, 371293, 537824, 759375, 1048576, 83521, 104976, 130321, 160000, 194481, 234256, 279841, 331776, 390625, 456976, 531441, 614656, 707281, 810000, 923521, 1048576, 35937, 39304, 42875, 46656]), type$.JSArray_int);
    B.Type_IsolateExit_D1o = A.typeLiteral("IsolateExit");
    B.Type__$IsolateExit_eWg = A.typeLiteral("_$IsolateExit");
    B.List_J12 = A._setArrayType(makeConstList([B.Type_IsolateExit_D1o, B.Type__$IsolateExit_eWg]), type$.JSArray_Type);
    B.Type_BatchedDebugEvents_I6f = A.typeLiteral("BatchedDebugEvents");
    B.Type__$BatchedDebugEvents_aD9 = A.typeLiteral("_$BatchedDebugEvents");
    B.List_Jeh = A._setArrayType(makeConstList([B.Type_BatchedDebugEvents_I6f, B.Type__$BatchedDebugEvents_aD9]), type$.JSArray_Type);
    B.List_Jwp = A._setArrayType(makeConstList(["A::href", "AREA::href", "BLOCKQUOTE::cite", "BODY::background", "COMMAND::icon", "DEL::cite", "FORM::action", "IMG::src", "INPUT::src", "INS::cite", "Q::cite", "VIDEO::poster"]), type$.JSArray_String);
    B.List_M1A = A._setArrayType(makeConstList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_ME0 = A._setArrayType(makeConstList(["HEAD", "AREA", "BASE", "BASEFONT", "BR", "COL", "COLGROUP", "EMBED", "FRAME", "FRAMESET", "HR", "IMAGE", "IMG", "INPUT", "ISINDEX", "LINK", "META", "PARAM", "SOURCE", "STYLE", "TITLE", "WBR"]), type$.JSArray_String);
    B.List_MMm = A._setArrayType(makeConstList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]), type$.JSArray_int);
    B.List_OL3 = A._setArrayType(makeConstList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_Type_BuildStatus_ahk = A._setArrayType(makeConstList([B.Type_BuildStatus_ahk]), type$.JSArray_Type);
    B.List_XRg0 = A._setArrayType(makeConstList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_XRg = A._setArrayType(makeConstList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_YmH = A._setArrayType(makeConstList([0, 0, 32776, 33792, 1, 10240, 0, 0]), type$.JSArray_int);
    B.Type_DevToolsResponse_Hhy = A.typeLiteral("DevToolsResponse");
    B.Type__$DevToolsResponse_23h = A.typeLiteral("_$DevToolsResponse");
    B.List_aRS = A._setArrayType(makeConstList([B.Type_DevToolsResponse_Hhy, B.Type__$DevToolsResponse_23h]), type$.JSArray_Type);
    B.Type_ExtensionResponse_CC0 = A.typeLiteral("ExtensionResponse");
    B.Type__$ExtensionResponse_Ddl = A.typeLiteral("_$ExtensionResponse");
    B.List_bhs = A._setArrayType(makeConstList([B.Type_ExtensionResponse_CC0, B.Type__$ExtensionResponse_Ddl]), type$.JSArray_Type);
    B.Type__$ExtensionEvent_XOq = A.typeLiteral("_$ExtensionEvent");
    B.List_e7M = A._setArrayType(makeConstList([B.Type_ExtensionEvent_gsm, B.Type__$ExtensionEvent_XOq]), type$.JSArray_Type);
    B.List_ejq = A._setArrayType(makeConstList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]), type$.JSArray_int);
    B.List_empty0 = A._setArrayType(makeConstList([]), type$.JSArray_String);
    B.List_empty = A._setArrayType(makeConstList([]), type$.JSArray_dynamic);
    B.List_er0 = A._setArrayType(makeConstList(["d", "D", "\u2202", "\xce"]), type$.JSArray_String);
    B.Type_BuildResult_dEV = A.typeLiteral("BuildResult");
    B.Type__$BuildResult_knt = A.typeLiteral("_$BuildResult");
    B.List_kqK = A._setArrayType(makeConstList([B.Type_BuildResult_dEV, B.Type__$BuildResult_knt]), type$.JSArray_Type);
    B.Type_ConnectRequest_UGQ = A.typeLiteral("ConnectRequest");
    B.Type__$ConnectRequest_cJC = A.typeLiteral("_$ConnectRequest");
    B.List_muk = A._setArrayType(makeConstList([B.Type_ConnectRequest_UGQ, B.Type__$ConnectRequest_cJC]), type$.JSArray_Type);
    B.List_oFp = A._setArrayType(makeConstList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431]), type$.JSArray_int);
    B.Type_BatchedEvents_gDG = A.typeLiteral("BatchedEvents");
    B.Type__$BatchedEvents_qxo = A.typeLiteral("_$BatchedEvents");
    B.List_oyn = A._setArrayType(makeConstList([B.Type_BatchedEvents_gDG, B.Type__$BatchedEvents_qxo]), type$.JSArray_Type);
    B.List_uzK = A._setArrayType(makeConstList(["*::class", "*::dir", "*::draggable", "*::hidden", "*::id", "*::inert", "*::itemprop", "*::itemref", "*::itemscope", "*::lang", "*::spellcheck", "*::title", "*::translate", "A::accesskey", "A::coords", "A::hreflang", "A::name", "A::shape", "A::tabindex", "A::target", "A::type", "AREA::accesskey", "AREA::alt", "AREA::coords", "AREA::nohref", "AREA::shape", "AREA::tabindex", "AREA::target", "AUDIO::controls", "AUDIO::loop", "AUDIO::mediagroup", "AUDIO::muted", "AUDIO::preload", "BDO::dir", "BODY::alink", "BODY::bgcolor", "BODY::link", "BODY::text", "BODY::vlink", "BR::clear", "BUTTON::accesskey", "BUTTON::disabled", "BUTTON::name", "BUTTON::tabindex", "BUTTON::type", "BUTTON::value", "CANVAS::height", "CANVAS::width", "CAPTION::align", "COL::align", "COL::char", "COL::charoff", "COL::span", "COL::valign", "COL::width", "COLGROUP::align", "COLGROUP::char", "COLGROUP::charoff", "COLGROUP::span", "COLGROUP::valign", "COLGROUP::width", "COMMAND::checked", "COMMAND::command", "COMMAND::disabled", "COMMAND::label", "COMMAND::radiogroup", "COMMAND::type", "DATA::value", "DEL::datetime", "DETAILS::open", "DIR::compact", "DIV::align", "DL::compact", "FIELDSET::disabled", "FONT::color", "FONT::face", "FONT::size", "FORM::accept", "FORM::autocomplete", "FORM::enctype", "FORM::method", "FORM::name", "FORM::novalidate", "FORM::target", "FRAME::name", "H1::align", "H2::align", "H3::align", "H4::align", "H5::align", "H6::align", "HR::align", "HR::noshade", "HR::size", "HR::width", "HTML::version", "IFRAME::align", "IFRAME::frameborder", "IFRAME::height", "IFRAME::marginheight", "IFRAME::marginwidth", "IFRAME::width", "IMG::align", "IMG::alt", "IMG::border", "IMG::height", "IMG::hspace", "IMG::ismap", "IMG::name", "IMG::usemap", "IMG::vspace", "IMG::width", "INPUT::accept", "INPUT::accesskey", "INPUT::align", "INPUT::alt", "INPUT::autocomplete", "INPUT::autofocus", "INPUT::checked", "INPUT::disabled", "INPUT::inputmode", "INPUT::ismap", "INPUT::list", "INPUT::max", "INPUT::maxlength", "INPUT::min", "INPUT::multiple", "INPUT::name", "INPUT::placeholder", "INPUT::readonly", "INPUT::required", "INPUT::size", "INPUT::step", "INPUT::tabindex", "INPUT::type", "INPUT::usemap", "INPUT::value", "INS::datetime", "KEYGEN::disabled", "KEYGEN::keytype", "KEYGEN::name", "LABEL::accesskey", "LABEL::for", "LEGEND::accesskey", "LEGEND::align", "LI::type", "LI::value", "LINK::sizes", "MAP::name", "MENU::compact", "MENU::label", "MENU::type", "METER::high", "METER::low", "METER::max", "METER::min", "METER::value", "OBJECT::typemustmatch", "OL::compact", "OL::reversed", "OL::start", "OL::type", "OPTGROUP::disabled", "OPTGROUP::label", "OPTION::disabled", "OPTION::label", "OPTION::selected", "OPTION::value", "OUTPUT::for", "OUTPUT::name", "P::align", "PRE::width", "PROGRESS::max", "PROGRESS::min", "PROGRESS::value", "SELECT::autocomplete", "SELECT::disabled", "SELECT::multiple", "SELECT::name", "SELECT::required", "SELECT::size", "SELECT::tabindex", "SOURCE::type", "TABLE::align", "TABLE::bgcolor", "TABLE::border", "TABLE::cellpadding", "TABLE::cellspacing", "TABLE::frame", "TABLE::rules", "TABLE::summary", "TABLE::width", "TBODY::align", "TBODY::char", "TBODY::charoff", "TBODY::valign", "TD::abbr", "TD::align", "TD::axis", "TD::bgcolor", "TD::char", "TD::charoff", "TD::colspan", "TD::headers", "TD::height", "TD::nowrap", "TD::rowspan", "TD::scope", "TD::valign", "TD::width", "TEXTAREA::accesskey", "TEXTAREA::autocomplete", "TEXTAREA::cols", "TEXTAREA::disabled", "TEXTAREA::inputmode", "TEXTAREA::name", "TEXTAREA::placeholder", "TEXTAREA::readonly", "TEXTAREA::required", "TEXTAREA::rows", "TEXTAREA::tabindex", "TEXTAREA::wrap", "TFOOT::align", "TFOOT::char", "TFOOT::charoff", "TFOOT::valign", "TH::abbr", "TH::align", "TH::axis", "TH::bgcolor", "TH::char", "TH::charoff", "TH::colspan", "TH::headers", "TH::height", "TH::nowrap", "TH::rowspan", "TH::scope", "TH::valign", "TH::width", "THEAD::align", "THEAD::char", "THEAD::charoff", "THEAD::valign", "TR::align", "TR::bgcolor", "TR::char", "TR::charoff", "TR::valign", "TRACK::default", "TRACK::kind", "TRACK::label", "TRACK::srclang", "UL::compact", "UL::type", "VIDEO::controls", "VIDEO::height", "VIDEO::loop", "VIDEO::mediagroup", "VIDEO::muted", "VIDEO::preload", "VIDEO::width"]), type$.JSArray_String);
    B.Type_DevToolsRequest_A0n = A.typeLiteral("DevToolsRequest");
    B.Type__$DevToolsRequest_cDy = A.typeLiteral("_$DevToolsRequest");
    B.List_yT3 = A._setArrayType(makeConstList([B.Type_DevToolsRequest_A0n, B.Type__$DevToolsRequest_cDy]), type$.JSArray_Type);
    B.Object_empty = {};
    B.Map_empty = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap<Symbol0,@>"));
    B.Map_empty0 = new A.ConstantStringMap(B.Object_empty, [], A.findType("ConstantStringMap<@,@>"));
    B.Symbol_call = new A.Symbol("call");
    B.Type_BigInt_8OV = A.typeLiteral("BigInt");
    B.Type_BoolJsonObject_8HQ = A.typeLiteral("BoolJsonObject");
    B.Type_ByteBuffer_RkP = A.typeLiteral("ByteBuffer");
    B.Type_ByteData_zNC = A.typeLiteral("ByteData");
    B.Type_DateTime_8AS = A.typeLiteral("DateTime");
    B.Type_Duration_SnA = A.typeLiteral("Duration");
    B.Type_Float32List_LB7 = A.typeLiteral("Float32List");
    B.Type_Float64List_LB7 = A.typeLiteral("Float64List");
    B.Type_Int16List_uXf = A.typeLiteral("Int16List");
    B.Type_Int32List_O50 = A.typeLiteral("Int32List");
    B.Type_Int32_Mhf = A.typeLiteral("Int32");
    B.Type_Int64_ww8 = A.typeLiteral("Int64");
    B.Type_Int8List_ekJ = A.typeLiteral("Int8List");
    B.Type_JSObject_8k0 = A.typeLiteral("JSObject");
    B.Type_JsonObject_gyf = A.typeLiteral("JsonObject");
    B.Type_ListJsonObject_yPV = A.typeLiteral("ListJsonObject");
    B.Type_MapJsonObject_bBG = A.typeLiteral("MapJsonObject");
    B.Type_Null_Yyn = A.typeLiteral("Null");
    B.Type_NumJsonObject_H9C = A.typeLiteral("NumJsonObject");
    B.Type_RegExp_Eeh = A.typeLiteral("RegExp");
    B.Type_StringJsonObject_GAC = A.typeLiteral("StringJsonObject");
    B.Type_Uint16List_2bx = A.typeLiteral("Uint16List");
    B.Type_Uint32List_2bx = A.typeLiteral("Uint32List");
    B.Type_Uint8ClampedList_Jik = A.typeLiteral("Uint8ClampedList");
    B.Type_Uint8List_WLA = A.typeLiteral("Uint8List");
    B.Type_Uri_EFX = A.typeLiteral("Uri");
    B.Type_double_K1J = A.typeLiteral("double");
    B.Type_num_cv7 = A.typeLiteral("num");
    B._StringStackTrace_3uE = new A._StringStackTrace("");
    B._ZoneFunction_3bB = new A._ZoneFunction(B.C__RootZone, A.async___rootCreatePeriodicTimer$closure(), A.findType("_ZoneFunction<Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))>"));
    B._ZoneFunction_7G2 = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterBinaryCallback$closure(), A.findType("_ZoneFunction<0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))<Object?,Object?,Object?>>"));
    B._ZoneFunction_Eeh = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterUnaryCallback$closure(), A.findType("_ZoneFunction<0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))<Object?,Object?>>"));
    B._ZoneFunction_NMc = new A._ZoneFunction(B.C__RootZone, A.async___rootHandleUncaughtError$closure(), type$._ZoneFunction_of_void_Function_Zone_ZoneDelegate_Zone_Object_StackTrace);
    B._ZoneFunction__RootZone__rootCreateTimer = new A._ZoneFunction(B.C__RootZone, A.async___rootCreateTimer$closure(), A.findType("_ZoneFunction<Timer(Zone,ZoneDelegate,Zone,Duration,~())>"));
    B._ZoneFunction__RootZone__rootErrorCallback = new A._ZoneFunction(B.C__RootZone, A.async___rootErrorCallback$closure(), A.findType("_ZoneFunction<AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)>"));
    B._ZoneFunction__RootZone__rootFork = new A._ZoneFunction(B.C__RootZone, A.async___rootFork$closure(), A.findType("_ZoneFunction<Zone(Zone,ZoneDelegate,Zone,ZoneSpecification?,Map<Object?,Object?>?)>"));
    B._ZoneFunction__RootZone__rootPrint = new A._ZoneFunction(B.C__RootZone, A.async___rootPrint$closure(), A.findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,String)>"));
    B._ZoneFunction__RootZone__rootRegisterCallback = new A._ZoneFunction(B.C__RootZone, A.async___rootRegisterCallback$closure(), A.findType("_ZoneFunction<0^()(Zone,ZoneDelegate,Zone,0^())<Object?>>"));
    B._ZoneFunction__RootZone__rootRun = new A._ZoneFunction(B.C__RootZone, A.async___rootRun$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^())<Object?>>"));
    B._ZoneFunction__RootZone__rootRunBinary = new A._ZoneFunction(B.C__RootZone, A.async___rootRunBinary$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^(1^,2^),1^,2^)<Object?,Object?,Object?>>"));
    B._ZoneFunction__RootZone__rootRunUnary = new A._ZoneFunction(B.C__RootZone, A.async___rootRunUnary$closure(), A.findType("_ZoneFunction<0^(Zone,ZoneDelegate,Zone,0^(1^),1^)<Object?,Object?>>"));
    B._ZoneFunction__RootZone__rootScheduleMicrotask = new A._ZoneFunction(B.C__RootZone, A.async___rootScheduleMicrotask$closure(), A.findType("_ZoneFunction<~(Zone,ZoneDelegate,Zone,~())>"));
  })();
  (function staticFields() {
    $._JS_INTEROP_INTERCEPTOR_TAG = null;
    $.toStringVisiting = A._setArrayType([], type$.JSArray_Object);
    $.printToZone = null;
    $.Primitives__identityHashCodeProperty = null;
    $.BoundClosure__receiverFieldNameCache = null;
    $.BoundClosure__interceptorFieldNameCache = null;
    $.getTagFunction = null;
    $.alternateTagFunction = null;
    $.prototypeForTagFunction = null;
    $.dispatchRecordsForInstanceTags = null;
    $.interceptorsForUncacheableTags = null;
    $.initNativeDispatchFlag = null;
    $._nextCallback = null;
    $._lastCallback = null;
    $._lastPriorityCallback = null;
    $._isInCallbackLoop = false;
    $.Zone__current = B.C__RootZone;
    $._RootZone__rootDelegate = null;
    $._BigIntImpl__lastDividendDigits = null;
    $._BigIntImpl__lastDividendUsed = null;
    $._BigIntImpl__lastDivisorDigits = null;
    $._BigIntImpl__lastDivisorUsed = null;
    $._BigIntImpl____lastQuoRemDigits = A._Cell$named("_lastQuoRemDigits");
    $._BigIntImpl____lastQuoRemUsed = A._Cell$named("_lastQuoRemUsed");
    $._BigIntImpl____lastRemUsed = A._Cell$named("_lastRemUsed");
    $._BigIntImpl____lastRem_nsh = A._Cell$named("_lastRem_nsh");
    $.Element__parseDocument = null;
    $.Element__parseRange = null;
    $.Element__defaultValidator = null;
    $.Element__defaultSanitizer = null;
    $._Html5NodeValidator__attributeValidators = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Function);
    $._indentingBuiltValueToStringHelperIndent = 0;
    $.LogRecord__nextNumber = 0;
    $.Logger__loggers = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.Logger);
    $.___lastKnownDigests = A._Cell$named("_lastKnownDigests");
  })();
  (function lazyInitializers() {
    var _lazyFinal = hunkHelpers.lazyFinal,
      _lazy = hunkHelpers.lazy;
    _lazyFinal($, "DART_CLOSURE_PROPERTY_NAME", "$get$DART_CLOSURE_PROPERTY_NAME", () => A.getIsolateAffinityTag("_$dart_dartClosure"));
    _lazyFinal($, "nullFuture", "$get$nullFuture", () => B.C__RootZone.run$1$1(new A.nullFuture_closure(), A.findType("Future<Null>")));
    _lazyFinal($, "TypeErrorDecoder_noSuchMethodPattern", "$get$TypeErrorDecoder_noSuchMethodPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_notClosurePattern", "$get$TypeErrorDecoder_notClosurePattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn({$method$: null,
      toString: function() {
        return "$receiver$";
      }
    })));
    _lazyFinal($, "TypeErrorDecoder_nullCallPattern", "$get$TypeErrorDecoder_nullCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralCallPattern", "$get$TypeErrorDecoder_nullLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        null.$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedCallPattern", "$get$TypeErrorDecoder_undefinedCallPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokeCallErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralCallPattern", "$get$TypeErrorDecoder_undefinedLiteralCallPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      var $argumentsExpr$ = "$arguments$";
      try {
        (void 0).$method$($argumentsExpr$);
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_nullPropertyPattern", "$get$TypeErrorDecoder_nullPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(null)));
    _lazyFinal($, "TypeErrorDecoder_nullLiteralPropertyPattern", "$get$TypeErrorDecoder_nullLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        null.$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "TypeErrorDecoder_undefinedPropertyPattern", "$get$TypeErrorDecoder_undefinedPropertyPattern", () => A.TypeErrorDecoder_extractPattern(A.TypeErrorDecoder_provokePropertyErrorOn(void 0)));
    _lazyFinal($, "TypeErrorDecoder_undefinedLiteralPropertyPattern", "$get$TypeErrorDecoder_undefinedLiteralPropertyPattern", () => A.TypeErrorDecoder_extractPattern(function() {
      try {
        (void 0).$method$;
      } catch (e) {
        return e.message;
      }
    }()));
    _lazyFinal($, "_AsyncRun__scheduleImmediateClosure", "$get$_AsyncRun__scheduleImmediateClosure", () => A._AsyncRun__initializeScheduleImmediate());
    _lazyFinal($, "Future__nullFuture", "$get$Future__nullFuture", () => A.findType("_Future<Null>")._as($.$get$nullFuture()));
    _lazyFinal($, "_RootZone__rootMap", "$get$_RootZone__rootMap", () => {
      var t1 = type$.dynamic;
      return A.HashMap_HashMap(null, null, null, t1, t1);
    });
    _lazyFinal($, "_Base64Decoder__inverseAlphabet", "$get$_Base64Decoder__inverseAlphabet", () => A.NativeInt8List__create1(A._ensureNativeList(A._setArrayType([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -1, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2], type$.JSArray_int))));
    _lazy($, "_Base64Decoder__emptyBuffer", "$get$_Base64Decoder__emptyBuffer", () => A.NativeUint8List_NativeUint8List(0));
    _lazyFinal($, "_BigIntImpl_zero", "$get$_BigIntImpl_zero", () => A._BigIntImpl__BigIntImpl$_fromInt(0));
    _lazyFinal($, "_BigIntImpl_one", "$get$_BigIntImpl_one", () => A._BigIntImpl__BigIntImpl$_fromInt(1));
    _lazyFinal($, "_BigIntImpl__minusOne", "$get$_BigIntImpl__minusOne", () => $.$get$_BigIntImpl_one().$negate(0));
    _lazyFinal($, "_BigIntImpl__bigInt10000", "$get$_BigIntImpl__bigInt10000", () => A._BigIntImpl__BigIntImpl$_fromInt(10000));
    _lazy($, "_BigIntImpl__parseRE", "$get$_BigIntImpl__parseRE", () => A.RegExp_RegExp("^\\s*([+-]?)((0x[a-f0-9]+)|(\\d+)|([a-z0-9]+))\\s*$", false, false));
    _lazyFinal($, "_Uri__needsNoEncoding", "$get$_Uri__needsNoEncoding", () => A.RegExp_RegExp("^[\\-\\.0-9A-Z_a-z~]*$", true, false));
    _lazyFinal($, "_hashSeed", "$get$_hashSeed", () => A.objectHashCode(B.Type_Object_xQ6));
    _lazyFinal($, "_scannerTables", "$get$_scannerTables", () => A._createTables());
    _lazyFinal($, "_Html5NodeValidator__allowedElements", "$get$_Html5NodeValidator__allowedElements", () => A.LinkedHashSet_LinkedHashSet$from(["A", "ABBR", "ACRONYM", "ADDRESS", "AREA", "ARTICLE", "ASIDE", "AUDIO", "B", "BDI", "BDO", "BIG", "BLOCKQUOTE", "BR", "BUTTON", "CANVAS", "CAPTION", "CENTER", "CITE", "CODE", "COL", "COLGROUP", "COMMAND", "DATA", "DATALIST", "DD", "DEL", "DETAILS", "DFN", "DIR", "DIV", "DL", "DT", "EM", "FIELDSET", "FIGCAPTION", "FIGURE", "FONT", "FOOTER", "FORM", "H1", "H2", "H3", "H4", "H5", "H6", "HEADER", "HGROUP", "HR", "I", "IFRAME", "IMG", "INPUT", "INS", "KBD", "LABEL", "LEGEND", "LI", "MAP", "MARK", "MENU", "METER", "NAV", "NOBR", "OL", "OPTGROUP", "OPTION", "OUTPUT", "P", "PRE", "PROGRESS", "Q", "S", "SAMP", "SECTION", "SELECT", "SMALL", "SOURCE", "SPAN", "STRIKE", "STRONG", "SUB", "SUMMARY", "SUP", "TABLE", "TBODY", "TD", "TEXTAREA", "TFOOT", "TH", "THEAD", "TIME", "TR", "TRACK", "TT", "U", "UL", "VAR", "VIDEO", "WBR"], type$.String));
    _lazyFinal($, "_context", "$get$_context", () => A._castToJsObject(A._wrapToDart(self)));
    _lazyFinal($, "_DART_OBJECT_PROPERTY_NAME", "$get$_DART_OBJECT_PROPERTY_NAME", () => A.getIsolateAffinityTag("_$dart_dartObject"));
    _lazyFinal($, "_dartProxyCtor", "$get$_dartProxyCtor", () => function DartObject(o) {
      this.o = o;
    });
    _lazyFinal($, "isSoundMode", "$get$isSoundMode", () => !type$.List_int._is(A._setArrayType([], A.findType("JSArray<int?>"))));
    _lazy($, "newBuiltValueToStringHelper", "$get$newBuiltValueToStringHelper", () => new A.newBuiltValueToStringHelper_closure());
    _lazyFinal($, "_runtimeType", "$get$_runtimeType", () => A.getRuntimeTypeOfDartObject(A.RegExp_RegExp("", true, false)));
    _lazy($, "_$buildStatusSerializer", "$get$_$buildStatusSerializer", () => new A._$BuildStatusSerializer());
    _lazy($, "_$buildResultSerializer", "$get$_$buildResultSerializer", () => new A._$BuildResultSerializer());
    _lazy($, "_$connectRequestSerializer", "$get$_$connectRequestSerializer", () => new A._$ConnectRequestSerializer());
    _lazy($, "_$debugEventSerializer", "$get$_$debugEventSerializer", () => new A._$DebugEventSerializer());
    _lazy($, "_$batchedDebugEventsSerializer", "$get$_$batchedDebugEventsSerializer", () => new A._$BatchedDebugEventsSerializer());
    _lazy($, "_$debugInfoSerializer", "$get$_$debugInfoSerializer", () => new A._$DebugInfoSerializer());
    _lazy($, "_$devToolsRequestSerializer", "$get$_$devToolsRequestSerializer", () => new A._$DevToolsRequestSerializer());
    _lazy($, "_$devToolsResponseSerializer", "$get$_$devToolsResponseSerializer", () => new A._$DevToolsResponseSerializer());
    _lazy($, "_$errorResponseSerializer", "$get$_$errorResponseSerializer", () => new A._$ErrorResponseSerializer());
    _lazy($, "_$extensionRequestSerializer", "$get$_$extensionRequestSerializer", () => new A._$ExtensionRequestSerializer());
    _lazy($, "_$extensionResponseSerializer", "$get$_$extensionResponseSerializer", () => new A._$ExtensionResponseSerializer());
    _lazy($, "_$extensionEventSerializer", "$get$_$extensionEventSerializer", () => new A._$ExtensionEventSerializer());
    _lazy($, "_$batchedEventsSerializer", "$get$_$batchedEventsSerializer", () => new A._$BatchedEventsSerializer());
    _lazy($, "_$isolateExitSerializer", "$get$_$isolateExitSerializer", () => new A._$IsolateExitSerializer());
    _lazy($, "_$isolateStartSerializer", "$get$_$isolateStartSerializer", () => new A._$IsolateStartSerializer());
    _lazy($, "_$registerEventSerializer", "$get$_$registerEventSerializer", () => new A._$RegisterEventSerializer());
    _lazy($, "_$runRequestSerializer", "$get$_$runRequestSerializer", () => new A._$RunRequestSerializer());
    _lazyFinal($, "serializers", "$get$serializers", () => $.$get$_$serializers());
    _lazy($, "_$serializers", "$get$_$serializers", () => {
      var t1 = A.Serializers_Serializers();
      t1 = A.BuiltJsonSerializersBuilder$_(t1._typeToSerializer.toBuilder$0(), t1._wireNameToSerializer.toBuilder$0(), t1._typeNameToSerializer.toBuilder$0(), t1.builderFactories.toBuilder$0(), t1.serializerPlugins.toBuilder$0());
      t1.add$1(0, $.$get$_$batchedDebugEventsSerializer());
      t1.add$1(0, $.$get$_$batchedEventsSerializer());
      t1.add$1(0, $.$get$_$buildResultSerializer());
      t1.add$1(0, $.$get$_$buildStatusSerializer());
      t1.add$1(0, $.$get$_$connectRequestSerializer());
      t1.add$1(0, $.$get$_$debugEventSerializer());
      t1.add$1(0, $.$get$_$debugInfoSerializer());
      t1.add$1(0, $.$get$_$devToolsRequestSerializer());
      t1.add$1(0, $.$get$_$devToolsResponseSerializer());
      t1.add$1(0, $.$get$_$errorResponseSerializer());
      t1.add$1(0, $.$get$_$extensionEventSerializer());
      t1.add$1(0, $.$get$_$extensionRequestSerializer());
      t1.add$1(0, $.$get$_$extensionResponseSerializer());
      t1.add$1(0, $.$get$_$isolateExitSerializer());
      t1.add$1(0, $.$get$_$isolateStartSerializer());
      t1.add$1(0, $.$get$_$registerEventSerializer());
      t1.add$1(0, $.$get$_$runRequestSerializer());
      t1.addBuilderFactory$2(B.FullType_EGl, new A._$serializers_closure());
      t1.addBuilderFactory$2(B.FullType_NIe, new A._$serializers_closure0());
      return t1.build$0();
    });
    _lazyFinal($, "_logger", "$get$_logger", () => A.Logger_Logger("Utilities"));
    _lazyFinal($, "Logger_root", "$get$Logger_root", () => A.Logger_Logger(""));
    _lazyFinal($, "_requestPool", "$get$_requestPool", () => {
      var t4,
        t1 = A.findType("Completer<PoolResource>"),
        t2 = A.ListQueue$(t1),
        t3 = A.ListQueue$(type$.void_Function);
      t1 = A.ListQueue$(t1);
      t4 = A.Completer_Completer(type$.dynamic);
      return new A.Pool(t2, t3, t1, 1000, new A.AsyncMemoizer(t4, A.findType("AsyncMemoizer<@>")));
    });
    _lazyFinal($, "Uuid__byteToHex", "$get$Uuid__byteToHex", () => {
      var i,
        _list = J.JSArray_JSArray$allocateGrowable(256, type$.String);
      for (i = 0; i < 256; ++i)
        _list[i] = B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(i, 16), 2, "0");
      return _list;
    });
    _lazyFinal($, "Uuid__stateExpando", "$get$Uuid__stateExpando", () => new A.Expando(new WeakMap(), A.findType("Expando<Map<String,@>>")));
    _lazyFinal($, "UuidUtil__random", "$get$UuidUtil__random", () => A.Random_Random(null));
    _lazyFinal($, "_createScript", "$get$_createScript", () => new A._createScript_closure().call$0());
    _lazyFinal($, "_noncePattern", "$get$_noncePattern", () => A.RegExp_RegExp("^[\\w+/_-]+[=]{0,2}$", true, false));
  })();
  (function nativeSupport() {
    !function() {
      var intern = function(s) {
        var o = {};
        o[s] = 1;
        return Object.keys(hunkHelpers.convertToFastObject(o))[0];
      };
      init.getIsolateTag = function(name) {
        return intern("___dart_" + name + init.isolateTag);
      };
      var tableProperty = "___dart_isolate_tags_";
      var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
      var rootProperty = "_ZxYxX";
      for (var i = 0;; i++) {
        var property = intern(rootProperty + "_" + i + "_");
        if (!(property in usedProperties)) {
          usedProperties[property] = 1;
          init.isolateTag = property;
          break;
        }
      }
      init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
    }();
    hunkHelpers.setOrUpdateInterceptorsByTag({WebGL: J.Interceptor, AnimationEffectReadOnly: J.JavaScriptObject, AnimationEffectTiming: J.JavaScriptObject, AnimationEffectTimingReadOnly: J.JavaScriptObject, AnimationTimeline: J.JavaScriptObject, AnimationWorkletGlobalScope: J.JavaScriptObject, AuthenticatorAssertionResponse: J.JavaScriptObject, AuthenticatorAttestationResponse: J.JavaScriptObject, AuthenticatorResponse: J.JavaScriptObject, BackgroundFetchFetch: J.JavaScriptObject, BackgroundFetchManager: J.JavaScriptObject, BackgroundFetchSettledFetch: J.JavaScriptObject, BarProp: J.JavaScriptObject, BarcodeDetector: J.JavaScriptObject, BluetoothRemoteGATTDescriptor: J.JavaScriptObject, Body: J.JavaScriptObject, BudgetState: J.JavaScriptObject, CacheStorage: J.JavaScriptObject, CanvasGradient: J.JavaScriptObject, CanvasPattern: J.JavaScriptObject, CanvasRenderingContext2D: J.JavaScriptObject, Client: J.JavaScriptObject, Clients: J.JavaScriptObject, CookieStore: J.JavaScriptObject, Coordinates: J.JavaScriptObject, Credential: J.JavaScriptObject, CredentialUserData: J.JavaScriptObject, CredentialsContainer: J.JavaScriptObject, Crypto: J.JavaScriptObject, CryptoKey: J.JavaScriptObject, CSS: J.JavaScriptObject, CSSVariableReferenceValue: J.JavaScriptObject, CustomElementRegistry: J.JavaScriptObject, DataTransfer: J.JavaScriptObject, DataTransferItem: J.JavaScriptObject, DeprecatedStorageInfo: J.JavaScriptObject, DeprecatedStorageQuota: J.JavaScriptObject, DeprecationReport: J.JavaScriptObject, DetectedBarcode: J.JavaScriptObject, DetectedFace: J.JavaScriptObject, DetectedText: J.JavaScriptObject, DeviceAcceleration: J.JavaScriptObject, DeviceRotationRate: J.JavaScriptObject, DirectoryEntry: J.JavaScriptObject, webkitFileSystemDirectoryEntry: J.JavaScriptObject, FileSystemDirectoryEntry: J.JavaScriptObject, DirectoryReader: J.JavaScriptObject, WebKitDirectoryReader: J.JavaScriptObject, webkitFileSystemDirectoryReader: J.JavaScriptObject, FileSystemDirectoryReader: J.JavaScriptObject, DocumentOrShadowRoot: J.JavaScriptObject, DocumentTimeline: J.JavaScriptObject, DOMError: J.JavaScriptObject, Iterator: J.JavaScriptObject, DOMMatrix: J.JavaScriptObject, DOMMatrixReadOnly: J.JavaScriptObject, DOMParser: J.JavaScriptObject, DOMPoint: J.JavaScriptObject, DOMPointReadOnly: J.JavaScriptObject, DOMQuad: J.JavaScriptObject, DOMStringMap: J.JavaScriptObject, Entry: J.JavaScriptObject, webkitFileSystemEntry: J.JavaScriptObject, FileSystemEntry: J.JavaScriptObject, External: J.JavaScriptObject, FaceDetector: J.JavaScriptObject, FederatedCredential: J.JavaScriptObject, FileEntry: J.JavaScriptObject, webkitFileSystemFileEntry: J.JavaScriptObject, FileSystemFileEntry: J.JavaScriptObject, DOMFileSystem: J.JavaScriptObject, WebKitFileSystem: J.JavaScriptObject, webkitFileSystem: J.JavaScriptObject, FileSystem: J.JavaScriptObject, FontFace: J.JavaScriptObject, FontFaceSource: J.JavaScriptObject, FormData: J.JavaScriptObject, GamepadButton: J.JavaScriptObject, GamepadPose: J.JavaScriptObject, Geolocation: J.JavaScriptObject, Position: J.JavaScriptObject, GeolocationPosition: J.JavaScriptObject, Headers: J.JavaScriptObject, HTMLHyperlinkElementUtils: J.JavaScriptObject, IdleDeadline: J.JavaScriptObject, ImageBitmap: J.JavaScriptObject, ImageBitmapRenderingContext: J.JavaScriptObject, ImageCapture: J.JavaScriptObject, InputDeviceCapabilities: J.JavaScriptObject, IntersectionObserver: J.JavaScriptObject, IntersectionObserverEntry: J.JavaScriptObject, InterventionReport: J.JavaScriptObject, KeyframeEffect: J.JavaScriptObject, KeyframeEffectReadOnly: J.JavaScriptObject, MediaCapabilities: J.JavaScriptObject, MediaCapabilitiesInfo: J.JavaScriptObject, MediaDeviceInfo: J.JavaScriptObject, MediaError: J.JavaScriptObject, MediaKeyStatusMap: J.JavaScriptObject, MediaKeySystemAccess: J.JavaScriptObject, MediaKeys: J.JavaScriptObject, MediaKeysPolicy: J.JavaScriptObject, MediaMetadata: J.JavaScriptObject, MediaSession: J.JavaScriptObject, MediaSettingsRange: J.JavaScriptObject, MemoryInfo: J.JavaScriptObject, MessageChannel: J.JavaScriptObject, Metadata: J.JavaScriptObject, MutationObserver: J.JavaScriptObject, WebKitMutationObserver: J.JavaScriptObject, MutationRecord: J.JavaScriptObject, NavigationPreloadManager: J.JavaScriptObject, Navigator: J.JavaScriptObject, NavigatorAutomationInformation: J.JavaScriptObject, NavigatorConcurrentHardware: J.JavaScriptObject, NavigatorCookies: J.JavaScriptObject, NavigatorUserMediaError: J.JavaScriptObject, NodeFilter: J.JavaScriptObject, NodeIterator: J.JavaScriptObject, NonDocumentTypeChildNode: J.JavaScriptObject, NonElementParentNode: J.JavaScriptObject, NoncedElement: J.JavaScriptObject, OffscreenCanvasRenderingContext2D: J.JavaScriptObject, OverconstrainedError: J.JavaScriptObject, PaintRenderingContext2D: J.JavaScriptObject, PaintSize: J.JavaScriptObject, PaintWorkletGlobalScope: J.JavaScriptObject, PasswordCredential: J.JavaScriptObject, Path2D: J.JavaScriptObject, PaymentAddress: J.JavaScriptObject, PaymentInstruments: J.JavaScriptObject, PaymentManager: J.JavaScriptObject, PaymentResponse: J.JavaScriptObject, PerformanceEntry: J.JavaScriptObject, PerformanceLongTaskTiming: J.JavaScriptObject, PerformanceMark: J.JavaScriptObject, PerformanceMeasure: J.JavaScriptObject, PerformanceNavigation: J.JavaScriptObject, PerformanceNavigationTiming: J.JavaScriptObject, PerformanceObserver: J.JavaScriptObject, PerformanceObserverEntryList: J.JavaScriptObject, PerformancePaintTiming: J.JavaScriptObject, PerformanceResourceTiming: J.JavaScriptObject, PerformanceServerTiming: J.JavaScriptObject, PerformanceTiming: J.JavaScriptObject, Permissions: J.JavaScriptObject, PhotoCapabilities: J.JavaScriptObject, PositionError: J.JavaScriptObject, GeolocationPositionError: J.JavaScriptObject, Presentation: J.JavaScriptObject, PresentationReceiver: J.JavaScriptObject, PublicKeyCredential: J.JavaScriptObject, PushManager: J.JavaScriptObject, PushMessageData: J.JavaScriptObject, PushSubscription: J.JavaScriptObject, PushSubscriptionOptions: J.JavaScriptObject, Range: J.JavaScriptObject, RelatedApplication: J.JavaScriptObject, ReportBody: J.JavaScriptObject, ReportingObserver: J.JavaScriptObject, ResizeObserver: J.JavaScriptObject, ResizeObserverEntry: J.JavaScriptObject, RTCCertificate: J.JavaScriptObject, RTCIceCandidate: J.JavaScriptObject, mozRTCIceCandidate: J.JavaScriptObject, RTCLegacyStatsReport: J.JavaScriptObject, RTCRtpContributingSource: J.JavaScriptObject, RTCRtpReceiver: J.JavaScriptObject, RTCRtpSender: J.JavaScriptObject, RTCSessionDescription: J.JavaScriptObject, mozRTCSessionDescription: J.JavaScriptObject, RTCStatsResponse: J.JavaScriptObject, Screen: J.JavaScriptObject, ScrollState: J.JavaScriptObject, ScrollTimeline: J.JavaScriptObject, Selection: J.JavaScriptObject, SpeechRecognitionAlternative: J.JavaScriptObject, SpeechSynthesisVoice: J.JavaScriptObject, StaticRange: J.JavaScriptObject, StorageManager: J.JavaScriptObject, StyleMedia: J.JavaScriptObject, StylePropertyMap: J.JavaScriptObject, StylePropertyMapReadonly: J.JavaScriptObject, SyncManager: J.JavaScriptObject, TaskAttributionTiming: J.JavaScriptObject, TextDetector: J.JavaScriptObject, TextMetrics: J.JavaScriptObject, TrackDefault: J.JavaScriptObject, TreeWalker: J.JavaScriptObject, TrustedHTML: J.JavaScriptObject, TrustedScriptURL: J.JavaScriptObject, TrustedURL: J.JavaScriptObject, UnderlyingSourceBase: J.JavaScriptObject, URLSearchParams: J.JavaScriptObject, VRCoordinateSystem: J.JavaScriptObject, VRDisplayCapabilities: J.JavaScriptObject, VREyeParameters: J.JavaScriptObject, VRFrameData: J.JavaScriptObject, VRFrameOfReference: J.JavaScriptObject, VRPose: J.JavaScriptObject, VRStageBounds: J.JavaScriptObject, VRStageBoundsPoint: J.JavaScriptObject, VRStageParameters: J.JavaScriptObject, ValidityState: J.JavaScriptObject, VideoPlaybackQuality: J.JavaScriptObject, VideoTrack: J.JavaScriptObject, VTTRegion: J.JavaScriptObject, WindowClient: J.JavaScriptObject, WorkletAnimation: J.JavaScriptObject, WorkletGlobalScope: J.JavaScriptObject, XPathEvaluator: J.JavaScriptObject, XPathExpression: J.JavaScriptObject, XPathNSResolver: J.JavaScriptObject, XPathResult: J.JavaScriptObject, XMLSerializer: J.JavaScriptObject, XSLTProcessor: J.JavaScriptObject, Bluetooth: J.JavaScriptObject, BluetoothCharacteristicProperties: J.JavaScriptObject, BluetoothRemoteGATTServer: J.JavaScriptObject, BluetoothRemoteGATTService: J.JavaScriptObject, BluetoothUUID: J.JavaScriptObject, BudgetService: J.JavaScriptObject, Cache: J.JavaScriptObject, DOMFileSystemSync: J.JavaScriptObject, DirectoryEntrySync: J.JavaScriptObject, DirectoryReaderSync: J.JavaScriptObject, EntrySync: J.JavaScriptObject, FileEntrySync: J.JavaScriptObject, FileReaderSync: J.JavaScriptObject, FileWriterSync: J.JavaScriptObject, HTMLAllCollection: J.JavaScriptObject, Mojo: J.JavaScriptObject, MojoHandle: J.JavaScriptObject, MojoWatcher: J.JavaScriptObject, NFC: J.JavaScriptObject, PagePopupController: J.JavaScriptObject, Report: J.JavaScriptObject, Request: J.JavaScriptObject, Response: J.JavaScriptObject, SubtleCrypto: J.JavaScriptObject, USBAlternateInterface: J.JavaScriptObject, USBConfiguration: J.JavaScriptObject, USBDevice: J.JavaScriptObject, USBEndpoint: J.JavaScriptObject, USBInTransferResult: J.JavaScriptObject, USBInterface: J.JavaScriptObject, USBIsochronousInTransferPacket: J.JavaScriptObject, USBIsochronousInTransferResult: J.JavaScriptObject, USBIsochronousOutTransferPacket: J.JavaScriptObject, USBIsochronousOutTransferResult: J.JavaScriptObject, USBOutTransferResult: J.JavaScriptObject, WorkerLocation: J.JavaScriptObject, WorkerNavigator: J.JavaScriptObject, Worklet: J.JavaScriptObject, IDBCursor: J.JavaScriptObject, IDBCursorWithValue: J.JavaScriptObject, IDBFactory: J.JavaScriptObject, IDBIndex: J.JavaScriptObject, IDBObjectStore: J.JavaScriptObject, IDBObservation: J.JavaScriptObject, IDBObserver: J.JavaScriptObject, IDBObserverChanges: J.JavaScriptObject, SVGAngle: J.JavaScriptObject, SVGAnimatedAngle: J.JavaScriptObject, SVGAnimatedBoolean: J.JavaScriptObject, SVGAnimatedEnumeration: J.JavaScriptObject, SVGAnimatedInteger: J.JavaScriptObject, SVGAnimatedLength: J.JavaScriptObject, SVGAnimatedLengthList: J.JavaScriptObject, SVGAnimatedNumber: J.JavaScriptObject, SVGAnimatedNumberList: J.JavaScriptObject, SVGAnimatedPreserveAspectRatio: J.JavaScriptObject, SVGAnimatedRect: J.JavaScriptObject, SVGAnimatedString: J.JavaScriptObject, SVGAnimatedTransformList: J.JavaScriptObject, SVGMatrix: J.JavaScriptObject, SVGPoint: J.JavaScriptObject, SVGPreserveAspectRatio: J.JavaScriptObject, SVGRect: J.JavaScriptObject, SVGUnitTypes: J.JavaScriptObject, AudioListener: J.JavaScriptObject, AudioParam: J.JavaScriptObject, AudioTrack: J.JavaScriptObject, AudioWorkletGlobalScope: J.JavaScriptObject, AudioWorkletProcessor: J.JavaScriptObject, PeriodicWave: J.JavaScriptObject, WebGLActiveInfo: J.JavaScriptObject, ANGLEInstancedArrays: J.JavaScriptObject, ANGLE_instanced_arrays: J.JavaScriptObject, WebGLBuffer: J.JavaScriptObject, WebGLCanvas: J.JavaScriptObject, WebGLColorBufferFloat: J.JavaScriptObject, WebGLCompressedTextureASTC: J.JavaScriptObject, WebGLCompressedTextureATC: J.JavaScriptObject, WEBGL_compressed_texture_atc: J.JavaScriptObject, WebGLCompressedTextureETC1: J.JavaScriptObject, WEBGL_compressed_texture_etc1: J.JavaScriptObject, WebGLCompressedTextureETC: J.JavaScriptObject, WebGLCompressedTexturePVRTC: J.JavaScriptObject, WEBGL_compressed_texture_pvrtc: J.JavaScriptObject, WebGLCompressedTextureS3TC: J.JavaScriptObject, WEBGL_compressed_texture_s3tc: J.JavaScriptObject, WebGLCompressedTextureS3TCsRGB: J.JavaScriptObject, WebGLDebugRendererInfo: J.JavaScriptObject, WEBGL_debug_renderer_info: J.JavaScriptObject, WebGLDebugShaders: J.JavaScriptObject, WEBGL_debug_shaders: J.JavaScriptObject, WebGLDepthTexture: J.JavaScriptObject, WEBGL_depth_texture: J.JavaScriptObject, WebGLDrawBuffers: J.JavaScriptObject, WEBGL_draw_buffers: J.JavaScriptObject, EXTsRGB: J.JavaScriptObject, EXT_sRGB: J.JavaScriptObject, EXTBlendMinMax: J.JavaScriptObject, EXT_blend_minmax: J.JavaScriptObject, EXTColorBufferFloat: J.JavaScriptObject, EXTColorBufferHalfFloat: J.JavaScriptObject, EXTDisjointTimerQuery: J.JavaScriptObject, EXTDisjointTimerQueryWebGL2: J.JavaScriptObject, EXTFragDepth: J.JavaScriptObject, EXT_frag_depth: J.JavaScriptObject, EXTShaderTextureLOD: J.JavaScriptObject, EXT_shader_texture_lod: J.JavaScriptObject, EXTTextureFilterAnisotropic: J.JavaScriptObject, EXT_texture_filter_anisotropic: J.JavaScriptObject, WebGLFramebuffer: J.JavaScriptObject, WebGLGetBufferSubDataAsync: J.JavaScriptObject, WebGLLoseContext: J.JavaScriptObject, WebGLExtensionLoseContext: J.JavaScriptObject, WEBGL_lose_context: J.JavaScriptObject, OESElementIndexUint: J.JavaScriptObject, OES_element_index_uint: J.JavaScriptObject, OESStandardDerivatives: J.JavaScriptObject, OES_standard_derivatives: J.JavaScriptObject, OESTextureFloat: J.JavaScriptObject, OES_texture_float: J.JavaScriptObject, OESTextureFloatLinear: J.JavaScriptObject, OES_texture_float_linear: J.JavaScriptObject, OESTextureHalfFloat: J.JavaScriptObject, OES_texture_half_float: J.JavaScriptObject, OESTextureHalfFloatLinear: J.JavaScriptObject, OES_texture_half_float_linear: J.JavaScriptObject, OESVertexArrayObject: J.JavaScriptObject, OES_vertex_array_object: J.JavaScriptObject, WebGLProgram: J.JavaScriptObject, WebGLQuery: J.JavaScriptObject, WebGLRenderbuffer: J.JavaScriptObject, WebGLRenderingContext: J.JavaScriptObject, WebGL2RenderingContext: J.JavaScriptObject, WebGLSampler: J.JavaScriptObject, WebGLShader: J.JavaScriptObject, WebGLShaderPrecisionFormat: J.JavaScriptObject, WebGLSync: J.JavaScriptObject, WebGLTexture: J.JavaScriptObject, WebGLTimerQueryEXT: J.JavaScriptObject, WebGLTransformFeedback: J.JavaScriptObject, WebGLUniformLocation: J.JavaScriptObject, WebGLVertexArrayObject: J.JavaScriptObject, WebGLVertexArrayObjectOES: J.JavaScriptObject, WebGL2RenderingContextBase: J.JavaScriptObject, ArrayBuffer: A.NativeByteBuffer, ArrayBufferView: A.NativeTypedData, DataView: A.NativeByteData, Float32Array: A.NativeFloat32List, Float64Array: A.NativeFloat64List, Int16Array: A.NativeInt16List, Int32Array: A.NativeInt32List, Int8Array: A.NativeInt8List, Uint16Array: A.NativeUint16List, Uint32Array: A.NativeUint32List, Uint8ClampedArray: A.NativeUint8ClampedList, CanvasPixelArray: A.NativeUint8ClampedList, Uint8Array: A.NativeUint8List, HTMLAudioElement: A.HtmlElement, HTMLBRElement: A.HtmlElement, HTMLButtonElement: A.HtmlElement, HTMLCanvasElement: A.HtmlElement, HTMLContentElement: A.HtmlElement, HTMLDListElement: A.HtmlElement, HTMLDataElement: A.HtmlElement, HTMLDataListElement: A.HtmlElement, HTMLDetailsElement: A.HtmlElement, HTMLDialogElement: A.HtmlElement, HTMLDivElement: A.HtmlElement, HTMLEmbedElement: A.HtmlElement, HTMLFieldSetElement: A.HtmlElement, HTMLHRElement: A.HtmlElement, HTMLHeadElement: A.HtmlElement, HTMLHeadingElement: A.HtmlElement, HTMLHtmlElement: A.HtmlElement, HTMLIFrameElement: A.HtmlElement, HTMLImageElement: A.HtmlElement, HTMLInputElement: A.HtmlElement, HTMLLIElement: A.HtmlElement, HTMLLabelElement: A.HtmlElement, HTMLLegendElement: A.HtmlElement, HTMLLinkElement: A.HtmlElement, HTMLMapElement: A.HtmlElement, HTMLMediaElement: A.HtmlElement, HTMLMenuElement: A.HtmlElement, HTMLMetaElement: A.HtmlElement, HTMLMeterElement: A.HtmlElement, HTMLModElement: A.HtmlElement, HTMLOListElement: A.HtmlElement, HTMLObjectElement: A.HtmlElement, HTMLOptGroupElement: A.HtmlElement, HTMLOptionElement: A.HtmlElement, HTMLOutputElement: A.HtmlElement, HTMLParagraphElement: A.HtmlElement, HTMLParamElement: A.HtmlElement, HTMLPictureElement: A.HtmlElement, HTMLPreElement: A.HtmlElement, HTMLProgressElement: A.HtmlElement, HTMLQuoteElement: A.HtmlElement, HTMLShadowElement: A.HtmlElement, HTMLSlotElement: A.HtmlElement, HTMLSourceElement: A.HtmlElement, HTMLSpanElement: A.HtmlElement, HTMLStyleElement: A.HtmlElement, HTMLTableCaptionElement: A.HtmlElement, HTMLTableCellElement: A.HtmlElement, HTMLTableDataCellElement: A.HtmlElement, HTMLTableHeaderCellElement: A.HtmlElement, HTMLTableColElement: A.HtmlElement, HTMLTextAreaElement: A.HtmlElement, HTMLTimeElement: A.HtmlElement, HTMLTitleElement: A.HtmlElement, HTMLTrackElement: A.HtmlElement, HTMLUListElement: A.HtmlElement, HTMLUnknownElement: A.HtmlElement, HTMLVideoElement: A.HtmlElement, HTMLDirectoryElement: A.HtmlElement, HTMLFontElement: A.HtmlElement, HTMLFrameElement: A.HtmlElement, HTMLFrameSetElement: A.HtmlElement, HTMLMarqueeElement: A.HtmlElement, HTMLElement: A.HtmlElement, AccessibleNodeList: A.AccessibleNodeList, HTMLAnchorElement: A.AnchorElement, HTMLAreaElement: A.AreaElement, HTMLBaseElement: A.BaseElement, Blob: A.Blob, HTMLBodyElement: A.BodyElement, CDATASection: A.CharacterData, CharacterData: A.CharacterData, Comment: A.CharacterData, ProcessingInstruction: A.CharacterData, Text: A.CharacterData, CloseEvent: A.CloseEvent, CSSPerspective: A.CssPerspective, CSSCharsetRule: A.CssRule, CSSConditionRule: A.CssRule, CSSFontFaceRule: A.CssRule, CSSGroupingRule: A.CssRule, CSSImportRule: A.CssRule, CSSKeyframeRule: A.CssRule, MozCSSKeyframeRule: A.CssRule, WebKitCSSKeyframeRule: A.CssRule, CSSKeyframesRule: A.CssRule, MozCSSKeyframesRule: A.CssRule, WebKitCSSKeyframesRule: A.CssRule, CSSMediaRule: A.CssRule, CSSNamespaceRule: A.CssRule, CSSPageRule: A.CssRule, CSSRule: A.CssRule, CSSStyleRule: A.CssRule, CSSSupportsRule: A.CssRule, CSSViewportRule: A.CssRule, CSSStyleDeclaration: A.CssStyleDeclaration, MSStyleCSSProperties: A.CssStyleDeclaration, CSS2Properties: A.CssStyleDeclaration, CSSImageValue: A.CssStyleValue, CSSKeywordValue: A.CssStyleValue, CSSNumericValue: A.CssStyleValue, CSSPositionValue: A.CssStyleValue, CSSResourceValue: A.CssStyleValue, CSSUnitValue: A.CssStyleValue, CSSURLImageValue: A.CssStyleValue, CSSStyleValue: A.CssStyleValue, CSSMatrixComponent: A.CssTransformComponent, CSSRotation: A.CssTransformComponent, CSSScale: A.CssTransformComponent, CSSSkew: A.CssTransformComponent, CSSTranslation: A.CssTransformComponent, CSSTransformComponent: A.CssTransformComponent, CSSTransformValue: A.CssTransformValue, CSSUnparsedValue: A.CssUnparsedValue, CustomEvent: A.CustomEvent, DataTransferItemList: A.DataTransferItemList, XMLDocument: A.Document, Document: A.Document, DOMException: A.DomException, DOMImplementation: A.DomImplementation, ClientRectList: A.DomRectList, DOMRectList: A.DomRectList, DOMRectReadOnly: A.DomRectReadOnly, DOMStringList: A.DomStringList, DOMTokenList: A.DomTokenList, MathMLElement: A.Element, Element: A.Element, AbortPaymentEvent: A.Event, AnimationEvent: A.Event, AnimationPlaybackEvent: A.Event, ApplicationCacheErrorEvent: A.Event, BackgroundFetchClickEvent: A.Event, BackgroundFetchEvent: A.Event, BackgroundFetchFailEvent: A.Event, BackgroundFetchedEvent: A.Event, BeforeInstallPromptEvent: A.Event, BeforeUnloadEvent: A.Event, BlobEvent: A.Event, CanMakePaymentEvent: A.Event, ClipboardEvent: A.Event, DeviceMotionEvent: A.Event, DeviceOrientationEvent: A.Event, ErrorEvent: A.Event, ExtendableEvent: A.Event, ExtendableMessageEvent: A.Event, FetchEvent: A.Event, FontFaceSetLoadEvent: A.Event, ForeignFetchEvent: A.Event, GamepadEvent: A.Event, HashChangeEvent: A.Event, InstallEvent: A.Event, MediaEncryptedEvent: A.Event, MediaKeyMessageEvent: A.Event, MediaQueryListEvent: A.Event, MediaStreamEvent: A.Event, MediaStreamTrackEvent: A.Event, MIDIConnectionEvent: A.Event, MIDIMessageEvent: A.Event, MutationEvent: A.Event, NotificationEvent: A.Event, PageTransitionEvent: A.Event, PaymentRequestEvent: A.Event, PaymentRequestUpdateEvent: A.Event, PopStateEvent: A.Event, PresentationConnectionAvailableEvent: A.Event, PresentationConnectionCloseEvent: A.Event, PromiseRejectionEvent: A.Event, PushEvent: A.Event, RTCDataChannelEvent: A.Event, RTCDTMFToneChangeEvent: A.Event, RTCPeerConnectionIceEvent: A.Event, RTCTrackEvent: A.Event, SecurityPolicyViolationEvent: A.Event, SensorErrorEvent: A.Event, SpeechRecognitionError: A.Event, SpeechRecognitionEvent: A.Event, SpeechSynthesisEvent: A.Event, StorageEvent: A.Event, SyncEvent: A.Event, TrackEvent: A.Event, TransitionEvent: A.Event, WebKitTransitionEvent: A.Event, VRDeviceEvent: A.Event, VRDisplayEvent: A.Event, VRSessionEvent: A.Event, MojoInterfaceRequestEvent: A.Event, USBConnectionEvent: A.Event, IDBVersionChangeEvent: A.Event, AudioProcessingEvent: A.Event, OfflineAudioCompletionEvent: A.Event, WebGLContextEvent: A.Event, Event: A.Event, InputEvent: A.Event, SubmitEvent: A.Event, EventSource: A.EventSource, AbsoluteOrientationSensor: A.EventTarget, Accelerometer: A.EventTarget, AccessibleNode: A.EventTarget, AmbientLightSensor: A.EventTarget, Animation: A.EventTarget, ApplicationCache: A.EventTarget, DOMApplicationCache: A.EventTarget, OfflineResourceList: A.EventTarget, BackgroundFetchRegistration: A.EventTarget, BatteryManager: A.EventTarget, BroadcastChannel: A.EventTarget, CanvasCaptureMediaStreamTrack: A.EventTarget, FileReader: A.EventTarget, FontFaceSet: A.EventTarget, Gyroscope: A.EventTarget, LinearAccelerationSensor: A.EventTarget, Magnetometer: A.EventTarget, MediaDevices: A.EventTarget, MediaKeySession: A.EventTarget, MediaQueryList: A.EventTarget, MediaRecorder: A.EventTarget, MediaSource: A.EventTarget, MediaStream: A.EventTarget, MediaStreamTrack: A.EventTarget, MIDIAccess: A.EventTarget, MIDIInput: A.EventTarget, MIDIOutput: A.EventTarget, MIDIPort: A.EventTarget, NetworkInformation: A.EventTarget, Notification: A.EventTarget, OffscreenCanvas: A.EventTarget, OrientationSensor: A.EventTarget, PaymentRequest: A.EventTarget, Performance: A.EventTarget, PermissionStatus: A.EventTarget, PresentationAvailability: A.EventTarget, PresentationConnection: A.EventTarget, PresentationConnectionList: A.EventTarget, PresentationRequest: A.EventTarget, RelativeOrientationSensor: A.EventTarget, RemotePlayback: A.EventTarget, RTCDataChannel: A.EventTarget, DataChannel: A.EventTarget, RTCDTMFSender: A.EventTarget, RTCPeerConnection: A.EventTarget, webkitRTCPeerConnection: A.EventTarget, mozRTCPeerConnection: A.EventTarget, ScreenOrientation: A.EventTarget, Sensor: A.EventTarget, ServiceWorker: A.EventTarget, ServiceWorkerContainer: A.EventTarget, ServiceWorkerRegistration: A.EventTarget, SharedWorker: A.EventTarget, SpeechRecognition: A.EventTarget, webkitSpeechRecognition: A.EventTarget, SpeechSynthesis: A.EventTarget, SpeechSynthesisUtterance: A.EventTarget, VR: A.EventTarget, VRDevice: A.EventTarget, VRDisplay: A.EventTarget, VRSession: A.EventTarget, VisualViewport: A.EventTarget, Worker: A.EventTarget, WorkerPerformance: A.EventTarget, BluetoothDevice: A.EventTarget, BluetoothRemoteGATTCharacteristic: A.EventTarget, Clipboard: A.EventTarget, MojoInterfaceInterceptor: A.EventTarget, USB: A.EventTarget, IDBDatabase: A.EventTarget, IDBOpenDBRequest: A.EventTarget, IDBVersionChangeRequest: A.EventTarget, IDBRequest: A.EventTarget, IDBTransaction: A.EventTarget, AnalyserNode: A.EventTarget, RealtimeAnalyserNode: A.EventTarget, AudioBufferSourceNode: A.EventTarget, AudioDestinationNode: A.EventTarget, AudioNode: A.EventTarget, AudioScheduledSourceNode: A.EventTarget, AudioWorkletNode: A.EventTarget, BiquadFilterNode: A.EventTarget, ChannelMergerNode: A.EventTarget, AudioChannelMerger: A.EventTarget, ChannelSplitterNode: A.EventTarget, AudioChannelSplitter: A.EventTarget, ConstantSourceNode: A.EventTarget, ConvolverNode: A.EventTarget, DelayNode: A.EventTarget, DynamicsCompressorNode: A.EventTarget, GainNode: A.EventTarget, AudioGainNode: A.EventTarget, IIRFilterNode: A.EventTarget, MediaElementAudioSourceNode: A.EventTarget, MediaStreamAudioDestinationNode: A.EventTarget, MediaStreamAudioSourceNode: A.EventTarget, OscillatorNode: A.EventTarget, Oscillator: A.EventTarget, PannerNode: A.EventTarget, AudioPannerNode: A.EventTarget, webkitAudioPannerNode: A.EventTarget, ScriptProcessorNode: A.EventTarget, JavaScriptAudioNode: A.EventTarget, StereoPannerNode: A.EventTarget, WaveShaperNode: A.EventTarget, EventTarget: A.EventTarget, File: A.File, FileList: A.FileList, FileWriter: A.FileWriter, HTMLFormElement: A.FormElement, Gamepad: A.Gamepad, History: A.History, HTMLCollection: A.HtmlCollection, HTMLFormControlsCollection: A.HtmlCollection, HTMLOptionsCollection: A.HtmlCollection, HTMLDocument: A.HtmlDocument, XMLHttpRequest: A.HttpRequest, XMLHttpRequestUpload: A.HttpRequestEventTarget, XMLHttpRequestEventTarget: A.HttpRequestEventTarget, ImageData: A.ImageData, KeyboardEvent: A.KeyboardEvent, Location: A.Location, MediaList: A.MediaList, MessageEvent: A.MessageEvent, MessagePort: A.MessagePort, MIDIInputMap: A.MidiInputMap, MIDIOutputMap: A.MidiOutputMap, MimeType: A.MimeType, MimeTypeArray: A.MimeTypeArray, DocumentFragment: A.Node, ShadowRoot: A.Node, DocumentType: A.Node, Node: A.Node, NodeList: A.NodeList, RadioNodeList: A.NodeList, Plugin: A.Plugin, PluginArray: A.PluginArray, ProgressEvent: A.ProgressEvent, ResourceProgressEvent: A.ProgressEvent, RTCStatsReport: A.RtcStatsReport, HTMLScriptElement: A.ScriptElement, HTMLSelectElement: A.SelectElement, SharedArrayBuffer: A.SharedArrayBuffer, SourceBuffer: A.SourceBuffer, SourceBufferList: A.SourceBufferList, SpeechGrammar: A.SpeechGrammar, SpeechGrammarList: A.SpeechGrammarList, SpeechRecognitionResult: A.SpeechRecognitionResult, Storage: A.Storage, CSSStyleSheet: A.StyleSheet, StyleSheet: A.StyleSheet, HTMLTableElement: A.TableElement, HTMLTableRowElement: A.TableRowElement, HTMLTableSectionElement: A.TableSectionElement, HTMLTemplateElement: A.TemplateElement, TextTrack: A.TextTrack, TextTrackCue: A.TextTrackCue, VTTCue: A.TextTrackCue, TextTrackCueList: A.TextTrackCueList, TextTrackList: A.TextTrackList, TimeRanges: A.TimeRanges, Touch: A.Touch, TouchList: A.TouchList, TrackDefaultList: A.TrackDefaultList, CompositionEvent: A.UIEvent, FocusEvent: A.UIEvent, MouseEvent: A.UIEvent, DragEvent: A.UIEvent, PointerEvent: A.UIEvent, TextEvent: A.UIEvent, TouchEvent: A.UIEvent, WheelEvent: A.UIEvent, UIEvent: A.UIEvent, URL: A.Url, VideoTrackList: A.VideoTrackList, WebSocket: A.WebSocket, Window: A.Window, DOMWindow: A.Window, DedicatedWorkerGlobalScope: A.WorkerGlobalScope, ServiceWorkerGlobalScope: A.WorkerGlobalScope, SharedWorkerGlobalScope: A.WorkerGlobalScope, WorkerGlobalScope: A.WorkerGlobalScope, Attr: A._Attr, CSSRuleList: A._CssRuleList, ClientRect: A._DomRect, DOMRect: A._DomRect, GamepadList: A._GamepadList, NamedNodeMap: A._NamedNodeMap, MozNamedAttrMap: A._NamedNodeMap, SpeechRecognitionResultList: A._SpeechRecognitionResultList, StyleSheetList: A._StyleSheetList, IDBKeyRange: A.KeyRange, SVGLength: A.Length, SVGLengthList: A.LengthList, SVGNumber: A.Number, SVGNumberList: A.NumberList, SVGPointList: A.PointList, SVGScriptElement: A.ScriptElement0, SVGStringList: A.StringList, SVGAElement: A.SvgElement, SVGAnimateElement: A.SvgElement, SVGAnimateMotionElement: A.SvgElement, SVGAnimateTransformElement: A.SvgElement, SVGAnimationElement: A.SvgElement, SVGCircleElement: A.SvgElement, SVGClipPathElement: A.SvgElement, SVGDefsElement: A.SvgElement, SVGDescElement: A.SvgElement, SVGDiscardElement: A.SvgElement, SVGEllipseElement: A.SvgElement, SVGFEBlendElement: A.SvgElement, SVGFEColorMatrixElement: A.SvgElement, SVGFEComponentTransferElement: A.SvgElement, SVGFECompositeElement: A.SvgElement, SVGFEConvolveMatrixElement: A.SvgElement, SVGFEDiffuseLightingElement: A.SvgElement, SVGFEDisplacementMapElement: A.SvgElement, SVGFEDistantLightElement: A.SvgElement, SVGFEFloodElement: A.SvgElement, SVGFEFuncAElement: A.SvgElement, SVGFEFuncBElement: A.SvgElement, SVGFEFuncGElement: A.SvgElement, SVGFEFuncRElement: A.SvgElement, SVGFEGaussianBlurElement: A.SvgElement, SVGFEImageElement: A.SvgElement, SVGFEMergeElement: A.SvgElement, SVGFEMergeNodeElement: A.SvgElement, SVGFEMorphologyElement: A.SvgElement, SVGFEOffsetElement: A.SvgElement, SVGFEPointLightElement: A.SvgElement, SVGFESpecularLightingElement: A.SvgElement, SVGFESpotLightElement: A.SvgElement, SVGFETileElement: A.SvgElement, SVGFETurbulenceElement: A.SvgElement, SVGFilterElement: A.SvgElement, SVGForeignObjectElement: A.SvgElement, SVGGElement: A.SvgElement, SVGGeometryElement: A.SvgElement, SVGGraphicsElement: A.SvgElement, SVGImageElement: A.SvgElement, SVGLineElement: A.SvgElement, SVGLinearGradientElement: A.SvgElement, SVGMarkerElement: A.SvgElement, SVGMaskElement: A.SvgElement, SVGMetadataElement: A.SvgElement, SVGPathElement: A.SvgElement, SVGPatternElement: A.SvgElement, SVGPolygonElement: A.SvgElement, SVGPolylineElement: A.SvgElement, SVGRadialGradientElement: A.SvgElement, SVGRectElement: A.SvgElement, SVGSetElement: A.SvgElement, SVGStopElement: A.SvgElement, SVGStyleElement: A.SvgElement, SVGSVGElement: A.SvgElement, SVGSwitchElement: A.SvgElement, SVGSymbolElement: A.SvgElement, SVGTSpanElement: A.SvgElement, SVGTextContentElement: A.SvgElement, SVGTextElement: A.SvgElement, SVGTextPathElement: A.SvgElement, SVGTextPositioningElement: A.SvgElement, SVGTitleElement: A.SvgElement, SVGUseElement: A.SvgElement, SVGViewElement: A.SvgElement, SVGGradientElement: A.SvgElement, SVGComponentTransferFunctionElement: A.SvgElement, SVGFEDropShadowElement: A.SvgElement, SVGMPathElement: A.SvgElement, SVGElement: A.SvgElement, SVGTransform: A.Transform, SVGTransformList: A.TransformList, AudioBuffer: A.AudioBuffer, AudioParamMap: A.AudioParamMap, AudioTrackList: A.AudioTrackList, AudioContext: A.BaseAudioContext, webkitAudioContext: A.BaseAudioContext, BaseAudioContext: A.BaseAudioContext, OfflineAudioContext: A.OfflineAudioContext});
    hunkHelpers.setOrUpdateLeafTags({WebGL: true, AnimationEffectReadOnly: true, AnimationEffectTiming: true, AnimationEffectTimingReadOnly: true, AnimationTimeline: true, AnimationWorkletGlobalScope: true, AuthenticatorAssertionResponse: true, AuthenticatorAttestationResponse: true, AuthenticatorResponse: true, BackgroundFetchFetch: true, BackgroundFetchManager: true, BackgroundFetchSettledFetch: true, BarProp: true, BarcodeDetector: true, BluetoothRemoteGATTDescriptor: true, Body: true, BudgetState: true, CacheStorage: true, CanvasGradient: true, CanvasPattern: true, CanvasRenderingContext2D: true, Client: true, Clients: true, CookieStore: true, Coordinates: true, Credential: true, CredentialUserData: true, CredentialsContainer: true, Crypto: true, CryptoKey: true, CSS: true, CSSVariableReferenceValue: true, CustomElementRegistry: true, DataTransfer: true, DataTransferItem: true, DeprecatedStorageInfo: true, DeprecatedStorageQuota: true, DeprecationReport: true, DetectedBarcode: true, DetectedFace: true, DetectedText: true, DeviceAcceleration: true, DeviceRotationRate: true, DirectoryEntry: true, webkitFileSystemDirectoryEntry: true, FileSystemDirectoryEntry: true, DirectoryReader: true, WebKitDirectoryReader: true, webkitFileSystemDirectoryReader: true, FileSystemDirectoryReader: true, DocumentOrShadowRoot: true, DocumentTimeline: true, DOMError: true, Iterator: true, DOMMatrix: true, DOMMatrixReadOnly: true, DOMParser: true, DOMPoint: true, DOMPointReadOnly: true, DOMQuad: true, DOMStringMap: true, Entry: true, webkitFileSystemEntry: true, FileSystemEntry: true, External: true, FaceDetector: true, FederatedCredential: true, FileEntry: true, webkitFileSystemFileEntry: true, FileSystemFileEntry: true, DOMFileSystem: true, WebKitFileSystem: true, webkitFileSystem: true, FileSystem: true, FontFace: true, FontFaceSource: true, FormData: true, GamepadButton: true, GamepadPose: true, Geolocation: true, Position: true, GeolocationPosition: true, Headers: true, HTMLHyperlinkElementUtils: true, IdleDeadline: true, ImageBitmap: true, ImageBitmapRenderingContext: true, ImageCapture: true, InputDeviceCapabilities: true, IntersectionObserver: true, IntersectionObserverEntry: true, InterventionReport: true, KeyframeEffect: true, KeyframeEffectReadOnly: true, MediaCapabilities: true, MediaCapabilitiesInfo: true, MediaDeviceInfo: true, MediaError: true, MediaKeyStatusMap: true, MediaKeySystemAccess: true, MediaKeys: true, MediaKeysPolicy: true, MediaMetadata: true, MediaSession: true, MediaSettingsRange: true, MemoryInfo: true, MessageChannel: true, Metadata: true, MutationObserver: true, WebKitMutationObserver: true, MutationRecord: true, NavigationPreloadManager: true, Navigator: true, NavigatorAutomationInformation: true, NavigatorConcurrentHardware: true, NavigatorCookies: true, NavigatorUserMediaError: true, NodeFilter: true, NodeIterator: true, NonDocumentTypeChildNode: true, NonElementParentNode: true, NoncedElement: true, OffscreenCanvasRenderingContext2D: true, OverconstrainedError: true, PaintRenderingContext2D: true, PaintSize: true, PaintWorkletGlobalScope: true, PasswordCredential: true, Path2D: true, PaymentAddress: true, PaymentInstruments: true, PaymentManager: true, PaymentResponse: true, PerformanceEntry: true, PerformanceLongTaskTiming: true, PerformanceMark: true, PerformanceMeasure: true, PerformanceNavigation: true, PerformanceNavigationTiming: true, PerformanceObserver: true, PerformanceObserverEntryList: true, PerformancePaintTiming: true, PerformanceResourceTiming: true, PerformanceServerTiming: true, PerformanceTiming: true, Permissions: true, PhotoCapabilities: true, PositionError: true, GeolocationPositionError: true, Presentation: true, PresentationReceiver: true, PublicKeyCredential: true, PushManager: true, PushMessageData: true, PushSubscription: true, PushSubscriptionOptions: true, Range: true, RelatedApplication: true, ReportBody: true, ReportingObserver: true, ResizeObserver: true, ResizeObserverEntry: true, RTCCertificate: true, RTCIceCandidate: true, mozRTCIceCandidate: true, RTCLegacyStatsReport: true, RTCRtpContributingSource: true, RTCRtpReceiver: true, RTCRtpSender: true, RTCSessionDescription: true, mozRTCSessionDescription: true, RTCStatsResponse: true, Screen: true, ScrollState: true, ScrollTimeline: true, Selection: true, SpeechRecognitionAlternative: true, SpeechSynthesisVoice: true, StaticRange: true, StorageManager: true, StyleMedia: true, StylePropertyMap: true, StylePropertyMapReadonly: true, SyncManager: true, TaskAttributionTiming: true, TextDetector: true, TextMetrics: true, TrackDefault: true, TreeWalker: true, TrustedHTML: true, TrustedScriptURL: true, TrustedURL: true, UnderlyingSourceBase: true, URLSearchParams: true, VRCoordinateSystem: true, VRDisplayCapabilities: true, VREyeParameters: true, VRFrameData: true, VRFrameOfReference: true, VRPose: true, VRStageBounds: true, VRStageBoundsPoint: true, VRStageParameters: true, ValidityState: true, VideoPlaybackQuality: true, VideoTrack: true, VTTRegion: true, WindowClient: true, WorkletAnimation: true, WorkletGlobalScope: true, XPathEvaluator: true, XPathExpression: true, XPathNSResolver: true, XPathResult: true, XMLSerializer: true, XSLTProcessor: true, Bluetooth: true, BluetoothCharacteristicProperties: true, BluetoothRemoteGATTServer: true, BluetoothRemoteGATTService: true, BluetoothUUID: true, BudgetService: true, Cache: true, DOMFileSystemSync: true, DirectoryEntrySync: true, DirectoryReaderSync: true, EntrySync: true, FileEntrySync: true, FileReaderSync: true, FileWriterSync: true, HTMLAllCollection: true, Mojo: true, MojoHandle: true, MojoWatcher: true, NFC: true, PagePopupController: true, Report: true, Request: true, Response: true, SubtleCrypto: true, USBAlternateInterface: true, USBConfiguration: true, USBDevice: true, USBEndpoint: true, USBInTransferResult: true, USBInterface: true, USBIsochronousInTransferPacket: true, USBIsochronousInTransferResult: true, USBIsochronousOutTransferPacket: true, USBIsochronousOutTransferResult: true, USBOutTransferResult: true, WorkerLocation: true, WorkerNavigator: true, Worklet: true, IDBCursor: true, IDBCursorWithValue: true, IDBFactory: true, IDBIndex: true, IDBObjectStore: true, IDBObservation: true, IDBObserver: true, IDBObserverChanges: true, SVGAngle: true, SVGAnimatedAngle: true, SVGAnimatedBoolean: true, SVGAnimatedEnumeration: true, SVGAnimatedInteger: true, SVGAnimatedLength: true, SVGAnimatedLengthList: true, SVGAnimatedNumber: true, SVGAnimatedNumberList: true, SVGAnimatedPreserveAspectRatio: true, SVGAnimatedRect: true, SVGAnimatedString: true, SVGAnimatedTransformList: true, SVGMatrix: true, SVGPoint: true, SVGPreserveAspectRatio: true, SVGRect: true, SVGUnitTypes: true, AudioListener: true, AudioParam: true, AudioTrack: true, AudioWorkletGlobalScope: true, AudioWorkletProcessor: true, PeriodicWave: true, WebGLActiveInfo: true, ANGLEInstancedArrays: true, ANGLE_instanced_arrays: true, WebGLBuffer: true, WebGLCanvas: true, WebGLColorBufferFloat: true, WebGLCompressedTextureASTC: true, WebGLCompressedTextureATC: true, WEBGL_compressed_texture_atc: true, WebGLCompressedTextureETC1: true, WEBGL_compressed_texture_etc1: true, WebGLCompressedTextureETC: true, WebGLCompressedTexturePVRTC: true, WEBGL_compressed_texture_pvrtc: true, WebGLCompressedTextureS3TC: true, WEBGL_compressed_texture_s3tc: true, WebGLCompressedTextureS3TCsRGB: true, WebGLDebugRendererInfo: true, WEBGL_debug_renderer_info: true, WebGLDebugShaders: true, WEBGL_debug_shaders: true, WebGLDepthTexture: true, WEBGL_depth_texture: true, WebGLDrawBuffers: true, WEBGL_draw_buffers: true, EXTsRGB: true, EXT_sRGB: true, EXTBlendMinMax: true, EXT_blend_minmax: true, EXTColorBufferFloat: true, EXTColorBufferHalfFloat: true, EXTDisjointTimerQuery: true, EXTDisjointTimerQueryWebGL2: true, EXTFragDepth: true, EXT_frag_depth: true, EXTShaderTextureLOD: true, EXT_shader_texture_lod: true, EXTTextureFilterAnisotropic: true, EXT_texture_filter_anisotropic: true, WebGLFramebuffer: true, WebGLGetBufferSubDataAsync: true, WebGLLoseContext: true, WebGLExtensionLoseContext: true, WEBGL_lose_context: true, OESElementIndexUint: true, OES_element_index_uint: true, OESStandardDerivatives: true, OES_standard_derivatives: true, OESTextureFloat: true, OES_texture_float: true, OESTextureFloatLinear: true, OES_texture_float_linear: true, OESTextureHalfFloat: true, OES_texture_half_float: true, OESTextureHalfFloatLinear: true, OES_texture_half_float_linear: true, OESVertexArrayObject: true, OES_vertex_array_object: true, WebGLProgram: true, WebGLQuery: true, WebGLRenderbuffer: true, WebGLRenderingContext: true, WebGL2RenderingContext: true, WebGLSampler: true, WebGLShader: true, WebGLShaderPrecisionFormat: true, WebGLSync: true, WebGLTexture: true, WebGLTimerQueryEXT: true, WebGLTransformFeedback: true, WebGLUniformLocation: true, WebGLVertexArrayObject: true, WebGLVertexArrayObjectOES: true, WebGL2RenderingContextBase: true, ArrayBuffer: true, ArrayBufferView: false, DataView: true, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false, HTMLAudioElement: true, HTMLBRElement: true, HTMLButtonElement: true, HTMLCanvasElement: true, HTMLContentElement: true, HTMLDListElement: true, HTMLDataElement: true, HTMLDataListElement: true, HTMLDetailsElement: true, HTMLDialogElement: true, HTMLDivElement: true, HTMLEmbedElement: true, HTMLFieldSetElement: true, HTMLHRElement: true, HTMLHeadElement: true, HTMLHeadingElement: true, HTMLHtmlElement: true, HTMLIFrameElement: true, HTMLImageElement: true, HTMLInputElement: true, HTMLLIElement: true, HTMLLabelElement: true, HTMLLegendElement: true, HTMLLinkElement: true, HTMLMapElement: true, HTMLMediaElement: true, HTMLMenuElement: true, HTMLMetaElement: true, HTMLMeterElement: true, HTMLModElement: true, HTMLOListElement: true, HTMLObjectElement: true, HTMLOptGroupElement: true, HTMLOptionElement: true, HTMLOutputElement: true, HTMLParagraphElement: true, HTMLParamElement: true, HTMLPictureElement: true, HTMLPreElement: true, HTMLProgressElement: true, HTMLQuoteElement: true, HTMLShadowElement: true, HTMLSlotElement: true, HTMLSourceElement: true, HTMLSpanElement: true, HTMLStyleElement: true, HTMLTableCaptionElement: true, HTMLTableCellElement: true, HTMLTableDataCellElement: true, HTMLTableHeaderCellElement: true, HTMLTableColElement: true, HTMLTextAreaElement: true, HTMLTimeElement: true, HTMLTitleElement: true, HTMLTrackElement: true, HTMLUListElement: true, HTMLUnknownElement: true, HTMLVideoElement: true, HTMLDirectoryElement: true, HTMLFontElement: true, HTMLFrameElement: true, HTMLFrameSetElement: true, HTMLMarqueeElement: true, HTMLElement: false, AccessibleNodeList: true, HTMLAnchorElement: true, HTMLAreaElement: true, HTMLBaseElement: true, Blob: false, HTMLBodyElement: true, CDATASection: true, CharacterData: true, Comment: true, ProcessingInstruction: true, Text: true, CloseEvent: true, CSSPerspective: true, CSSCharsetRule: true, CSSConditionRule: true, CSSFontFaceRule: true, CSSGroupingRule: true, CSSImportRule: true, CSSKeyframeRule: true, MozCSSKeyframeRule: true, WebKitCSSKeyframeRule: true, CSSKeyframesRule: true, MozCSSKeyframesRule: true, WebKitCSSKeyframesRule: true, CSSMediaRule: true, CSSNamespaceRule: true, CSSPageRule: true, CSSRule: true, CSSStyleRule: true, CSSSupportsRule: true, CSSViewportRule: true, CSSStyleDeclaration: true, MSStyleCSSProperties: true, CSS2Properties: true, CSSImageValue: true, CSSKeywordValue: true, CSSNumericValue: true, CSSPositionValue: true, CSSResourceValue: true, CSSUnitValue: true, CSSURLImageValue: true, CSSStyleValue: false, CSSMatrixComponent: true, CSSRotation: true, CSSScale: true, CSSSkew: true, CSSTranslation: true, CSSTransformComponent: false, CSSTransformValue: true, CSSUnparsedValue: true, CustomEvent: true, DataTransferItemList: true, XMLDocument: true, Document: false, DOMException: true, DOMImplementation: true, ClientRectList: true, DOMRectList: true, DOMRectReadOnly: false, DOMStringList: true, DOMTokenList: true, MathMLElement: true, Element: false, AbortPaymentEvent: true, AnimationEvent: true, AnimationPlaybackEvent: true, ApplicationCacheErrorEvent: true, BackgroundFetchClickEvent: true, BackgroundFetchEvent: true, BackgroundFetchFailEvent: true, BackgroundFetchedEvent: true, BeforeInstallPromptEvent: true, BeforeUnloadEvent: true, BlobEvent: true, CanMakePaymentEvent: true, ClipboardEvent: true, DeviceMotionEvent: true, DeviceOrientationEvent: true, ErrorEvent: true, ExtendableEvent: true, ExtendableMessageEvent: true, FetchEvent: true, FontFaceSetLoadEvent: true, ForeignFetchEvent: true, GamepadEvent: true, HashChangeEvent: true, InstallEvent: true, MediaEncryptedEvent: true, MediaKeyMessageEvent: true, MediaQueryListEvent: true, MediaStreamEvent: true, MediaStreamTrackEvent: true, MIDIConnectionEvent: true, MIDIMessageEvent: true, MutationEvent: true, NotificationEvent: true, PageTransitionEvent: true, PaymentRequestEvent: true, PaymentRequestUpdateEvent: true, PopStateEvent: true, PresentationConnectionAvailableEvent: true, PresentationConnectionCloseEvent: true, PromiseRejectionEvent: true, PushEvent: true, RTCDataChannelEvent: true, RTCDTMFToneChangeEvent: true, RTCPeerConnectionIceEvent: true, RTCTrackEvent: true, SecurityPolicyViolationEvent: true, SensorErrorEvent: true, SpeechRecognitionError: true, SpeechRecognitionEvent: true, SpeechSynthesisEvent: true, StorageEvent: true, SyncEvent: true, TrackEvent: true, TransitionEvent: true, WebKitTransitionEvent: true, VRDeviceEvent: true, VRDisplayEvent: true, VRSessionEvent: true, MojoInterfaceRequestEvent: true, USBConnectionEvent: true, IDBVersionChangeEvent: true, AudioProcessingEvent: true, OfflineAudioCompletionEvent: true, WebGLContextEvent: true, Event: false, InputEvent: false, SubmitEvent: false, EventSource: true, AbsoluteOrientationSensor: true, Accelerometer: true, AccessibleNode: true, AmbientLightSensor: true, Animation: true, ApplicationCache: true, DOMApplicationCache: true, OfflineResourceList: true, BackgroundFetchRegistration: true, BatteryManager: true, BroadcastChannel: true, CanvasCaptureMediaStreamTrack: true, FileReader: true, FontFaceSet: true, Gyroscope: true, LinearAccelerationSensor: true, Magnetometer: true, MediaDevices: true, MediaKeySession: true, MediaQueryList: true, MediaRecorder: true, MediaSource: true, MediaStream: true, MediaStreamTrack: true, MIDIAccess: true, MIDIInput: true, MIDIOutput: true, MIDIPort: true, NetworkInformation: true, Notification: true, OffscreenCanvas: true, OrientationSensor: true, PaymentRequest: true, Performance: true, PermissionStatus: true, PresentationAvailability: true, PresentationConnection: true, PresentationConnectionList: true, PresentationRequest: true, RelativeOrientationSensor: true, RemotePlayback: true, RTCDataChannel: true, DataChannel: true, RTCDTMFSender: true, RTCPeerConnection: true, webkitRTCPeerConnection: true, mozRTCPeerConnection: true, ScreenOrientation: true, Sensor: true, ServiceWorker: true, ServiceWorkerContainer: true, ServiceWorkerRegistration: true, SharedWorker: true, SpeechRecognition: true, webkitSpeechRecognition: true, SpeechSynthesis: true, SpeechSynthesisUtterance: true, VR: true, VRDevice: true, VRDisplay: true, VRSession: true, VisualViewport: true, Worker: true, WorkerPerformance: true, BluetoothDevice: true, BluetoothRemoteGATTCharacteristic: true, Clipboard: true, MojoInterfaceInterceptor: true, USB: true, IDBDatabase: true, IDBOpenDBRequest: true, IDBVersionChangeRequest: true, IDBRequest: true, IDBTransaction: true, AnalyserNode: true, RealtimeAnalyserNode: true, AudioBufferSourceNode: true, AudioDestinationNode: true, AudioNode: true, AudioScheduledSourceNode: true, AudioWorkletNode: true, BiquadFilterNode: true, ChannelMergerNode: true, AudioChannelMerger: true, ChannelSplitterNode: true, AudioChannelSplitter: true, ConstantSourceNode: true, ConvolverNode: true, DelayNode: true, DynamicsCompressorNode: true, GainNode: true, AudioGainNode: true, IIRFilterNode: true, MediaElementAudioSourceNode: true, MediaStreamAudioDestinationNode: true, MediaStreamAudioSourceNode: true, OscillatorNode: true, Oscillator: true, PannerNode: true, AudioPannerNode: true, webkitAudioPannerNode: true, ScriptProcessorNode: true, JavaScriptAudioNode: true, StereoPannerNode: true, WaveShaperNode: true, EventTarget: false, File: true, FileList: true, FileWriter: true, HTMLFormElement: true, Gamepad: true, History: true, HTMLCollection: true, HTMLFormControlsCollection: true, HTMLOptionsCollection: true, HTMLDocument: true, XMLHttpRequest: true, XMLHttpRequestUpload: true, XMLHttpRequestEventTarget: false, ImageData: true, KeyboardEvent: true, Location: true, MediaList: true, MessageEvent: true, MessagePort: true, MIDIInputMap: true, MIDIOutputMap: true, MimeType: true, MimeTypeArray: true, DocumentFragment: true, ShadowRoot: true, DocumentType: true, Node: false, NodeList: true, RadioNodeList: true, Plugin: true, PluginArray: true, ProgressEvent: true, ResourceProgressEvent: true, RTCStatsReport: true, HTMLScriptElement: true, HTMLSelectElement: true, SharedArrayBuffer: true, SourceBuffer: true, SourceBufferList: true, SpeechGrammar: true, SpeechGrammarList: true, SpeechRecognitionResult: true, Storage: true, CSSStyleSheet: true, StyleSheet: true, HTMLTableElement: true, HTMLTableRowElement: true, HTMLTableSectionElement: true, HTMLTemplateElement: true, TextTrack: true, TextTrackCue: true, VTTCue: true, TextTrackCueList: true, TextTrackList: true, TimeRanges: true, Touch: true, TouchList: true, TrackDefaultList: true, CompositionEvent: true, FocusEvent: true, MouseEvent: true, DragEvent: true, PointerEvent: true, TextEvent: true, TouchEvent: true, WheelEvent: true, UIEvent: false, URL: true, VideoTrackList: true, WebSocket: true, Window: true, DOMWindow: true, DedicatedWorkerGlobalScope: true, ServiceWorkerGlobalScope: true, SharedWorkerGlobalScope: true, WorkerGlobalScope: true, Attr: true, CSSRuleList: true, ClientRect: true, DOMRect: true, GamepadList: true, NamedNodeMap: true, MozNamedAttrMap: true, SpeechRecognitionResultList: true, StyleSheetList: true, IDBKeyRange: true, SVGLength: true, SVGLengthList: true, SVGNumber: true, SVGNumberList: true, SVGPointList: true, SVGScriptElement: true, SVGStringList: true, SVGAElement: true, SVGAnimateElement: true, SVGAnimateMotionElement: true, SVGAnimateTransformElement: true, SVGAnimationElement: true, SVGCircleElement: true, SVGClipPathElement: true, SVGDefsElement: true, SVGDescElement: true, SVGDiscardElement: true, SVGEllipseElement: true, SVGFEBlendElement: true, SVGFEColorMatrixElement: true, SVGFEComponentTransferElement: true, SVGFECompositeElement: true, SVGFEConvolveMatrixElement: true, SVGFEDiffuseLightingElement: true, SVGFEDisplacementMapElement: true, SVGFEDistantLightElement: true, SVGFEFloodElement: true, SVGFEFuncAElement: true, SVGFEFuncBElement: true, SVGFEFuncGElement: true, SVGFEFuncRElement: true, SVGFEGaussianBlurElement: true, SVGFEImageElement: true, SVGFEMergeElement: true, SVGFEMergeNodeElement: true, SVGFEMorphologyElement: true, SVGFEOffsetElement: true, SVGFEPointLightElement: true, SVGFESpecularLightingElement: true, SVGFESpotLightElement: true, SVGFETileElement: true, SVGFETurbulenceElement: true, SVGFilterElement: true, SVGForeignObjectElement: true, SVGGElement: true, SVGGeometryElement: true, SVGGraphicsElement: true, SVGImageElement: true, SVGLineElement: true, SVGLinearGradientElement: true, SVGMarkerElement: true, SVGMaskElement: true, SVGMetadataElement: true, SVGPathElement: true, SVGPatternElement: true, SVGPolygonElement: true, SVGPolylineElement: true, SVGRadialGradientElement: true, SVGRectElement: true, SVGSetElement: true, SVGStopElement: true, SVGStyleElement: true, SVGSVGElement: true, SVGSwitchElement: true, SVGSymbolElement: true, SVGTSpanElement: true, SVGTextContentElement: true, SVGTextElement: true, SVGTextPathElement: true, SVGTextPositioningElement: true, SVGTitleElement: true, SVGUseElement: true, SVGViewElement: true, SVGGradientElement: true, SVGComponentTransferFunctionElement: true, SVGFEDropShadowElement: true, SVGMPathElement: true, SVGElement: false, SVGTransform: true, SVGTransformList: true, AudioBuffer: true, AudioParamMap: true, AudioTrackList: true, AudioContext: true, webkitAudioContext: true, BaseAudioContext: false, OfflineAudioContext: true});
    A.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfDouble.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView";
    A.NativeTypedArrayOfInt.$nativeSuperclassTag = "ArrayBufferView";
    A._SourceBufferList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    A._SourceBufferList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
    A._TextTrackList_EventTarget_ListMixin.$nativeSuperclassTag = "EventTarget";
    A._TextTrackList_EventTarget_ListMixin_ImmutableListMixin.$nativeSuperclassTag = "EventTarget";
  })();
  Function.prototype.call$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$0 = function() {
    return this();
  };
  Function.prototype.call$1$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$6 = function(a, b, c, d, e, f) {
    return this(a, b, c, d, e, f);
  };
  Function.prototype.call$1$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$2$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$2$5 = function(a, b, c, d, e) {
    return this(a, b, c, d, e);
  };
  Function.prototype.call$2$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$3$1 = function(a) {
    return this(a);
  };
  Function.prototype.call$3$4 = function(a, b, c, d) {
    return this(a, b, c, d);
  };
  Function.prototype.call$2$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$3 = function(a, b, c) {
    return this(a, b, c);
  };
  Function.prototype.call$1$2 = function(a, b) {
    return this(a, b);
  };
  Function.prototype.call$2$0 = function() {
    return this();
  };
  Function.prototype.call$1$0 = function() {
    return this();
  };
  convertAllToFastObject(holders);
  convertToFastObject($);
  (function(callback) {
    if (typeof document === "undefined") {
      callback(null);
      return;
    }
    if (typeof document.currentScript != "undefined") {
      callback(document.currentScript);
      return;
    }
    var scripts = document.scripts;
    function onLoad(event) {
      for (var i = 0; i < scripts.length; ++i) {
        scripts[i].removeEventListener("load", onLoad, false);
      }
      callback(event.target);
    }
    for (var i = 0; i < scripts.length; ++i) {
      scripts[i].addEventListener("load", onLoad, false);
    }
  })(function(currentScript) {
    init.currentScript = currentScript;
    var callMain = A.main;
    if (typeof dartMainRunner === "function") {
      dartMainRunner(callMain, []);
    } else {
      callMain([]);
    }
  });
})();
