var $jscomp = $jscomp || {};
$jscomp.scope = {};
$jscomp.ASSUME_ES5 = !1;
$jscomp.ASSUME_NO_NATIVE_MAP = !1;
$jscomp.ASSUME_NO_NATIVE_SET = !1;
$jscomp.defineProperty = $jscomp.ASSUME_ES5 || "function" == typeof Object.defineProperties ? Object.defineProperty : function(a, e, c) {
  a != Array.prototype && a != Object.prototype && (a[e] = c.value);
};
$jscomp.getGlobal = function(a) {
  return "undefined" != typeof window && window === a ? a : "undefined" != typeof global && null != global ? global : a;
};
$jscomp.global = $jscomp.getGlobal(this);
$jscomp.SYMBOL_PREFIX = "jscomp_symbol_";
$jscomp.initSymbol = function() {
  $jscomp.initSymbol = function() {
  };
  $jscomp.global.Symbol || ($jscomp.global.Symbol = $jscomp.Symbol);
};
$jscomp.Symbol = function() {
  var a = 0;
  return function(e) {
    return $jscomp.SYMBOL_PREFIX + (e || "") + a++;
  };
}();
$jscomp.initSymbolIterator = function() {
  $jscomp.initSymbol();
  var a = $jscomp.global.Symbol.iterator;
  a || (a = $jscomp.global.Symbol.iterator = $jscomp.global.Symbol("iterator"));
  "function" != typeof Array.prototype[a] && $jscomp.defineProperty(Array.prototype, a, {configurable:!0, writable:!0, value:function() {
    return $jscomp.arrayIterator(this);
  }});
  $jscomp.initSymbolIterator = function() {
  };
};
$jscomp.arrayIterator = function(a) {
  var e = 0;
  return $jscomp.iteratorPrototype(function() {
    return e < a.length ? {done:!1, value:a[e++]} : {done:!0};
  });
};
$jscomp.iteratorPrototype = function(a) {
  $jscomp.initSymbolIterator();
  a = {next:a};
  a[$jscomp.global.Symbol.iterator] = function() {
    return this;
  };
  return a;
};
$jscomp.makeIterator = function(a) {
  $jscomp.initSymbolIterator();
  $jscomp.initSymbol();
  $jscomp.initSymbolIterator();
  var e = a[Symbol.iterator];
  return e ? e.call(a) : $jscomp.arrayIterator(a);
};
$jscomp.checkEs6ConformanceViaProxy = function() {
  try {
    var a = {}, e = Object.create(new $jscomp.global.Proxy(a, {get:function(c, g, f) {
      return c == a && "q" == g && f == e;
    }}));
    return !0 === e.q;
  } catch (c) {
    return !1;
  }
};
$jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS = !1;
$jscomp.ES6_CONFORMANCE = $jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS && $jscomp.checkEs6ConformanceViaProxy();
$jscomp.owns = function(a, e) {
  return Object.prototype.hasOwnProperty.call(a, e);
};
$jscomp.polyfill = function(a, e, c, g) {
  if (e) {
    c = $jscomp.global;
    a = a.split(".");
    for (g = 0; g < a.length - 1; g++) {
      var f = a[g];
      f in c || (c[f] = {});
      c = c[f];
    }
    a = a[a.length - 1];
    g = c[a];
    e = e(g);
    e != g && null != e && $jscomp.defineProperty(c, a, {configurable:!0, writable:!0, value:e});
  }
};
$jscomp.polyfill("WeakMap", function(a) {
  function e() {
    if (!a || !Object.seal) {
      return !1;
    }
    try {
      var e = Object.seal({}), y = Object.seal({}), c = new a([[e, 2], [y, 3]]);
      if (2 != c.get(e) || 3 != c.get(y)) {
        return !1;
      }
      c["delete"](e);
      c.set(y, 4);
      return !c.has(e) && 4 == c.get(y);
    } catch (da) {
      return !1;
    }
  }
  function c(a) {
    $jscomp.owns(a, f) || $jscomp.defineProperty(a, f, {value:{}});
  }
  function g(a) {
    var y = Object[a];
    y && (Object[a] = function(a) {
      c(a);
      return y(a);
    });
  }
  if ($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS) {
    if (a && $jscomp.ES6_CONFORMANCE) {
      return a;
    }
  } else {
    if (e()) {
      return a;
    }
  }
  var f = "$jscomp_hidden_" + Math.random();
  g("freeze");
  g("preventExtensions");
  g("seal");
  var S = 0, G = function(a) {
    this.id_ = (S += Math.random() + 1).toString();
    if (a) {
      $jscomp.initSymbol();
      $jscomp.initSymbolIterator();
      a = $jscomp.makeIterator(a);
      for (var y; !(y = a.next()).done;) {
        y = y.value, this.set(y[0], y[1]);
      }
    }
  };
  G.prototype.set = function(a, y) {
    c(a);
    if (!$jscomp.owns(a, f)) {
      throw Error("WeakMap key fail: " + a);
    }
    a[f][this.id_] = y;
    return this;
  };
  G.prototype.get = function(a) {
    return $jscomp.owns(a, f) ? a[f][this.id_] : void 0;
  };
  G.prototype.has = function(a) {
    return $jscomp.owns(a, f) && $jscomp.owns(a[f], this.id_);
  };
  G.prototype["delete"] = function(a) {
    return $jscomp.owns(a, f) && $jscomp.owns(a[f], this.id_) ? delete a[f][this.id_] : !1;
  };
  return G;
}, "es6", "es3");
$jscomp.MapEntry = function() {
};
$jscomp.polyfill("Map", function(a) {
  function e() {
    if ($jscomp.ASSUME_NO_NATIVE_MAP || !a || "function" != typeof a || !a.prototype.entries || "function" != typeof Object.seal) {
      return !1;
    }
    try {
      var y = Object.seal({x:4}), c = new a($jscomp.makeIterator([[y, "s"]]));
      if ("s" != c.get(y) || 1 != c.size || c.get({x:4}) || c.set({x:4}, "t") != c || 2 != c.size) {
        return !1;
      }
      var e = c.entries(), f = e.next();
      if (f.done || f.value[0] != y || "s" != f.value[1]) {
        return !1;
      }
      f = e.next();
      return f.done || 4 != f.value[0].x || "t" != f.value[1] || !e.next().done ? !1 : !0;
    } catch (qa) {
      return !1;
    }
  }
  if ($jscomp.USE_PROXY_FOR_ES6_CONFORMANCE_CHECKS) {
    if (a && $jscomp.ES6_CONFORMANCE) {
      return a;
    }
  } else {
    if (e()) {
      return a;
    }
  }
  $jscomp.initSymbol();
  $jscomp.initSymbolIterator();
  var c = new WeakMap, g = function(a) {
    this.data_ = {};
    this.head_ = G();
    this.size = 0;
    if (a) {
      a = $jscomp.makeIterator(a);
      for (var c; !(c = a.next()).done;) {
        c = c.value, this.set(c[0], c[1]);
      }
    }
  };
  g.prototype.set = function(a, c) {
    var e = f(this, a);
    e.list || (e.list = this.data_[e.id] = []);
    e.entry ? e.entry.value = c : (e.entry = {next:this.head_, previous:this.head_.previous, head:this.head_, key:a, value:c}, e.list.push(e.entry), this.head_.previous.next = e.entry, this.head_.previous = e.entry, this.size++);
    return this;
  };
  g.prototype["delete"] = function(a) {
    a = f(this, a);
    return a.entry && a.list ? (a.list.splice(a.index, 1), a.list.length || delete this.data_[a.id], a.entry.previous.next = a.entry.next, a.entry.next.previous = a.entry.previous, a.entry.head = null, this.size--, !0) : !1;
  };
  g.prototype.clear = function() {
    this.data_ = {};
    this.head_ = this.head_.previous = G();
    this.size = 0;
  };
  g.prototype.has = function(a) {
    return !!f(this, a).entry;
  };
  g.prototype.get = function(a) {
    return (a = f(this, a).entry) && a.value;
  };
  g.prototype.entries = function() {
    return S(this, function(a) {
      return [a.key, a.value];
    });
  };
  g.prototype.keys = function() {
    return S(this, function(a) {
      return a.key;
    });
  };
  g.prototype.values = function() {
    return S(this, function(a) {
      return a.value;
    });
  };
  g.prototype.forEach = function(a, c) {
    for (var e = this.entries(), f; !(f = e.next()).done;) {
      f = f.value, a.call(c, f[1], f[0], this);
    }
  };
  g.prototype[Symbol.iterator] = g.prototype.entries;
  var f = function(a, e) {
    var f = e && typeof e;
    "object" == f || "function" == f ? c.has(e) ? f = c.get(e) : (f = "" + ++Z, c.set(e, f)) : f = "p_" + e;
    var g = a.data_[f];
    if (g && $jscomp.owns(a.data_, f)) {
      for (var y = 0; y < g.length; y++) {
        var n = g[y];
        if (e !== e && n.key !== n.key || e === n.key) {
          return {id:f, list:g, index:y, entry:n};
        }
      }
    }
    return {id:f, list:g, index:-1, entry:void 0};
  }, S = function(a, e) {
    var c = a.head_;
    return $jscomp.iteratorPrototype(function() {
      if (c) {
        for (; c.head != a.head_;) {
          c = c.previous;
        }
        for (; c.next != c.head;) {
          return c = c.next, {done:!1, value:e(c)};
        }
        c = null;
      }
      return {done:!0, value:void 0};
    });
  }, G = function() {
    var a = {};
    return a.previous = a.next = a.head = a;
  }, Z = 0;
  return g;
}, "es6", "es3");
$jscomp.polyfill("String.fromCodePoint", function(a) {
  return a ? a : function(a) {
    for (var c = "", e = 0; e < arguments.length; e++) {
      var f = Number(arguments[e]);
      if (0 > f || 1114111 < f || f !== Math.floor(f)) {
        throw new RangeError("invalid_code_point " + f);
      }
      65535 >= f ? c += String.fromCharCode(f) : (f -= 65536, c += String.fromCharCode(f >>> 10 & 1023 | 55296), c += String.fromCharCode(f & 1023 | 56320));
    }
    return c;
  };
}, "es6", "es3");
$jscomp.checkStringArgs = function(a, e, c) {
  if (null == a) {
    throw new TypeError("The 'this' value for String.prototype." + c + " must not be null or undefined");
  }
  if (e instanceof RegExp) {
    throw new TypeError("First argument to String.prototype." + c + " must not be a regular expression");
  }
  return a + "";
};
$jscomp.polyfill("String.prototype.codePointAt", function(a) {
  return a ? a : function(a) {
    var c = $jscomp.checkStringArgs(this, null, "codePointAt"), e = c.length;
    a = Number(a) || 0;
    if (0 <= a && a < e) {
      a |= 0;
      var f = c.charCodeAt(a);
      if (55296 > f || 56319 < f || a + 1 === e) {
        return f;
      }
      a = c.charCodeAt(a + 1);
      return 56320 > a || 57343 < a ? f : 1024 * (f - 55296) + a + 9216;
    }
  };
}, "es6", "es3");
$jscomp.findInternal = function(a, e, c) {
  a instanceof String && (a = String(a));
  for (var g = a.length, f = 0; f < g; f++) {
    var S = a[f];
    if (e.call(c, S, f, a)) {
      return {i:f, v:S};
    }
  }
  return {i:-1, v:void 0};
};
$jscomp.polyfill("Array.prototype.find", function(a) {
  return a ? a : function(a, c) {
    return $jscomp.findInternal(this, a, c).v;
  };
}, "es6", "es3");
$jscomp.assign = "function" == typeof Object.assign ? Object.assign : function(a, e) {
  for (var c = 1; c < arguments.length; c++) {
    var g = arguments[c];
    if (g) {
      for (var f in g) {
        $jscomp.owns(g, f) && (a[f] = g[f]);
      }
    }
  }
  return a;
};
$jscomp.polyfill("Object.assign", function(a) {
  return a || $jscomp.assign;
}, "es6", "es3");
$jscomp.underscoreProtoCanBeSet = function() {
  var a = {a:!0}, e = {};
  try {
    return e.__proto__ = a, e.a;
  } catch (c) {
  }
  return !1;
};
$jscomp.setPrototypeOf = "function" == typeof Object.setPrototypeOf ? Object.setPrototypeOf : $jscomp.underscoreProtoCanBeSet() ? function(a, e) {
  a.__proto__ = e;
  if (a.__proto__ !== e) {
    throw new TypeError(a + " is not extensible");
  }
  return a;
} : null;
$jscomp.polyfill("Object.setPrototypeOf", function(a) {
  return a || $jscomp.setPrototypeOf;
}, "es6", "es5");
$jscomp.polyfill("Array.prototype.findIndex", function(a) {
  return a ? a : function(a, c) {
    return $jscomp.findInternal(this, a, c).i;
  };
}, "es6", "es3");
$jscomp.iteratorFromArray = function(a, e) {
  $jscomp.initSymbolIterator();
  a instanceof String && (a += "");
  var c = 0, g = {next:function() {
    if (c < a.length) {
      var f = c++;
      return {value:e(f, a[f]), done:!1};
    }
    g.next = function() {
      return {done:!0, value:void 0};
    };
    return g.next();
  }};
  g[Symbol.iterator] = function() {
    return g;
  };
  return g;
};
$jscomp.polyfill("Array.prototype.keys", function(a) {
  return a ? a : function() {
    return $jscomp.iteratorFromArray(this, function(a) {
      return a;
    });
  };
}, "es6", "es3");
var exports = exports || {};
"use strict";
var _JSON = JSON, JSOX = exports;
function privateizeEverything() {
  function a() {
    var a = ea.pop();
    a || (a = {context:0, current_class:null, current_class_field:0, arrayType:-1, elements:null, element_array:null});
    return a;
  }
  function e() {
    var a = qa.pop();
    a ? a.n = 0 : a = {buf:null, n:0};
    return a;
  }
  function c(a) {
    var c = "";
    a = new Uint8Array(a);
    var b = a.byteLength, e = b % 3;
    b -= e;
    for (var f, E, g, v, d = 0; d < b; d += 3) {
      v = a[d] << 16 | a[d + 1] << 8 | a[d + 2], f = (v & 16515072) >> 18, E = (v & 258048) >> 12, g = (v & 4032) >> 6, v &= 63, c += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[f] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[E] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[g] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[v];
    }
    1 == e ? (v = a[b], c += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(v & 252) >> 2] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(v & 3) << 4] + "==") : 2 == e && (v = a[b] << 8 | a[b + 1], c += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(v & 64512) >> 10] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(v & 1008) >> 4] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(v & 15) << 2] + 
    "=");
    return c;
  }
  function g(a) {
    var c = new ArrayBuffer(1 == a.length % 4 ? 3 * ((a.length + 3) / 4 | 0) - 3 : 2 == a.length % 4 ? 3 * ((a.length + 3) / 4 | 0) - 2 : 3 == a.length % 4 ? 3 * ((a.length + 3) / 4 | 0) - 1 : -1 == O[a[a.length - 3]] ? 3 * ((a.length + 3) / 4 | 0) - 3 : -1 == O[a[a.length - 2]] ? 3 * ((a.length + 3) / 4 | 0) - 2 : -1 == O[a[a.length - 1]] ? 3 * ((a.length + 3) / 4 | 0) - 1 : 3 * ((a.length + 3) / 4 | 0)), b = new Uint8Array(c), e, f = a.length + 3 >> 2;
    for (e = 0; e < f; e++) {
      var g = O[a[4 * e]], E = 4 * e + 1 < a.length ? O[a[4 * e + 1]] : -1, v = 0 <= E && 4 * e + 2 < a.length ? O[a[4 * e + 2]] : -1, d = 0 <= v && 4 * e + 3 < a.length ? O[a[4 * e + 3]] : -1;
      0 <= E && (b[3 * e] = g << 2 | E >> 4);
      0 <= v && (b[3 * e + 1] = E << 4 | v >> 2 & 15);
      0 <= d && (b[3 * e + 2] = v << 6 | d & 63);
    }
    return c;
  }
  var f = "function" === typeof BigInt, S = "ab u8 cu8 s8 u16 s16 u32 s32 u64 s64 f32 f64".split(" "), G = null, Z = null, y = [ArrayBuffer, Uint8Array, Uint8ClampedArray, Int8Array, Uint16Array, Int16Array, Uint32Array, Int32Array, null, null, Float32Array, Float64Array], A = {}, da = (A["true"] = !0, A["false"] = !1, A["null"] = null, A.NaN = NaN, A.Infinity = Infinity, A.undefined = void 0, A), ea = [], qa = [];
  JSOX.escape = function(a) {
    var c, b = "";
    if (!a) {
      return a;
    }
    for (c = 0; c < a.length; c++) {
      if ('"' == a[c] || "\\" == a[c] || "`" == a[c] || "'" == a[c]) {
        b += "\\";
      }
      b += a[c];
    }
    return b;
  };
  var n = new WeakMap, aa = new Map, W = new Map;
  JSOX.begin = function(c, n) {
    var b = {name:null, value_type:0, string:"", contains:null, className:null}, E = 1, T = 1, t = 0, r, v = new Map, d = 0, B = !0, u = !1, C = null, I = null, D = void 0, K = [], w = {first:null, last:null, saved:null, push:function(b) {
      var a = this.saved;
      a ? (this.saved = a.next, a.node = b, a.next = null, a.prior = this.last) : a = {node:b, next:null, prior:this.last};
      this.last || (this.first = a);
      this.last = a;
      this.length++;
    }, pop:function() {
      var b = this.last;
      if (!b) {
        return null;
      }
      (this.last = b.prior) || (this.first = null);
      b.next = this.saved;
      this.saved = b;
      this.length--;
      return b.node;
    }, length:0}, na = [], A = {}, z = null, L = 0, p = -1, k = 0, P = 0, G = !1, fa = !1, X = !1, O = !1, oa = !1, l = {first:null, last:null, saved:null, push:function(b) {
      var a = this.saved;
      a ? (this.saved = a.next, a.node = b, a.next = null, a.prior = this.last) : a = {node:b, next:null, prior:this.last};
      this.last || (this.first = a);
      this.last = a;
    }, shift:function() {
      var b = this.first;
      if (!b) {
        return null;
      }
      (this.first = b.next) || (this.last = null);
      b.next = this.saved;
      this.saved = b;
      return b.node;
    }, unshift:function(b) {
      var a = this.saved;
      a ? (this.saved = a.next, a.node = b, a.next = this.first, a.prior = null) : a = {node:b, next:this.first, prior:null};
      this.first || (this.last = a);
      this.first = a;
    }}, ta = null, F = !1, ba = !1, q = !1, pa = !1, ha = !1, Y = !1, ia = !1, H = 0, Q = 0, ja = !1, M = !1, R = !1, ka = !1;
    return {registerFromJSOX:function(b, a) {
      if (v.get(b)) {
        throw Error("Existing fromJSOX has been registered for prototype");
      }
      v.set(b, a);
    }, value:function() {
      var b = C;
      C = void 0;
      return b;
    }, reset:function() {
      d = 0;
      B = !0;
      l.last && (l.last.next = l.save);
      l.save = l.first;
      l.first = l.last = null;
      w.last && (w.last.next = w.save);
      w.save = l.first;
      K = w.first = w.last = null;
      D = void 0;
      k = 0;
      na = [];
      A = {};
      z = null;
      L = 0;
      b.value_type = 0;
      b.name = null;
      b.string = "";
      b.className = null;
      T = E = 1;
      u = !1;
      P = 0;
      pa = q = F = M = !1;
    }, usePrototype:function(b, a) {
      A[b] = a;
    }, write:function(b) {
      "string" !== typeof b && (b = String(b));
      for (b = this._write(b, !1); 0 < b && !(C && ("function" === typeof n && function xa(b, a) {
        var d, c = b[a];
        if (c && "object" === typeof c) {
          for (d in c) {
            if (Object.prototype.hasOwnProperty.call(c, d)) {
              var e = xa(c, d);
              void 0 !== e ? c[d] = e : delete c[d];
            }
          }
        }
        return n.call(b, a, c);
      }({"":C}, ""), c(C), C = void 0), 2 > b); b = this._write()) {
      }
    }, _write:function(c, n) {
      function x(b, a) {
        throw Error(b + " '" + String.fromCodePoint(a) + "' unexpected at " + t + " (near '" + N.substr(4 < t ? t - 4 : 0, 4 < t ? 3 : t - 1) + "[" + String.fromCodePoint(a) + "]" + N.substr(t, 10) + "') [" + E + ":" + T + "]");
      }
      function V() {
        b.value_type = 0;
        b.string = "";
      }
      function wa(b) {
        if (ka) {
          if (f) {
            return BigInt(b);
          }
          throw Error("no builtin BigInt()", 0);
        }
        return R ? new Date(b) : 1 < b.length && !G && !fa && !X && 48 === b.charCodeAt(0) ? (u ? -1 : 1) * Number("0o" + b) : (u ? -1 : 1) * Number(b);
      }
      function ra() {
        var a = null;
        switch(b.value_type) {
          case 5:
            if (ka) {
              if (f) {
                return BigInt(b.string);
              }
              throw Error("no builtin BigInt()", 0);
            }
            return R ? new Date(b.string) : wa(b.string);
          case 4:
            return b.className && ((a = v.get(b.className)) || (a = W.get(b.className)), b.className = null, a) ? a.call(b.string) : b.string;
          case 2:
            return !0;
          case 3:
            return !1;
          case 7:
            return NaN;
          case 8:
            return NaN;
          case 9:
            return -Infinity;
          case 10:
            return Infinity;
          case 1:
            return null;
          case -1:
            break;
          case 12:
            break;
          case 6:
            return b.className && ((a = v.get(b.className)) || (a = W.get(b.className)), b.className = null, a) ? a.call(b.contains) : b.contains;
          case 13:
            if (0 <= p) {
              return a = g(b.string), 0 === p ? a : new y[p](a);
            }
            if (-2 === p) {
              a = I;
              a = b.contains.reduce(function(b, a) {
                return b && b[a];
              }, a);
              if (!a) {
                throw Error("Path did not resolve poperly.");
              }
              p = -1;
              return a;
            }
            return b.className && ((a = v.get(b.className)) || (a = W.get(b.className)), b.className = null, a) ? a.call(b.contains) : b.contains;
          default:
            console.log("Unhandled value conversion.", b);
        }
      }
      function Z() {
        if (-3 == p) {
          p = -1;
        } else {
          switch(b.value_type) {
            case 12:
              K.push(void 0);
              delete K[K.length - 1];
              break;
            default:
              K.push(ra());
          }
          V();
        }
      }
      function la() {
        12 !== b.value_type && (D[b.name] = ra(), V());
      }
      function J(a) {
        if (0 !== d) {
          switch(u && (valstring += "-", u = !1), d) {
            case 31:
              switch(b.value_type) {
                case 2:
                  b.string += "true";
                  break;
                case 3:
                  b.string += "false";
                  break;
                case 1:
                  b.string += "null";
                  break;
                case 10:
                  b.string += "Infinity";
                  break;
                case 9:
                  b.string += "-Infinity";
                  break;
                case 8:
                  b.string += "NaN";
                  break;
                case 7:
                  b.string += "-NaN";
                  break;
                case -1:
                  b.string += "undefined";
                  break;
                case 4:
                  break;
                default:
                  console.log("Value of type " + b.value_type + " is not restored...");
              }case 1:
              b.string += "t";
              break;
            case 2:
              b.string += "tr";
              break;
            case 3:
              b.string += "tru";
              break;
            case 5:
              b.string += "f";
              break;
            case 6:
              b.string += "fa";
              break;
            case 7:
              b.string += "fal";
              break;
            case 8:
              b.string += "fals";
              break;
            case 9:
              b.string += "n";
              break;
            case 10:
              b.string += "nu";
              break;
            case 11:
              b.string += "nul";
              break;
            case 12:
              b.string += "u";
              break;
            case 13:
              b.string += "un";
              break;
            case 14:
              b.string += "und";
              break;
            case 15:
              b.string += "unde";
              break;
            case 16:
              b.string += "undef";
              break;
            case 17:
              b.string += "undefi";
              break;
            case 18:
              b.string += "undefin";
              break;
            case 19:
              b.string += "undefine";
              break;
            case 20:
              b.string += "M";
              break;
            case 21:
              b.string += "Na";
              break;
            case 22:
              b.string += "I";
              break;
            case 23:
              b.string += "In";
              break;
            case 24:
              b.string += "Inf";
              break;
            case 25:
              b.string += "Infi";
              break;
            case 26:
              b.string += "Infin";
              break;
            case 27:
              b.string += "Infini";
              break;
            case 28:
              b.string += "Infinit";
          }
        }
        b.value_type = 4;
        d = 29;
        123 == a ? ca() : 91 == a ? da() : 32 != a && 13 != a && 10 != a && 9 != a && 65279 != a && 2028 != a && 2029 != a && (44 == a || 125 == a || 93 == a || 58 == a ? x("Invalid character near identifier", a) : b.string += r);
      }
      function sa(a) {
        for (var d = 0; 0 == d && t < N.length;) {
          r = N.charAt(t);
          var c = N.codePointAt(t++);
          65536 <= c && (r += N.charAt(t), t++);
          T++;
          if (c == a) {
            q ? (b.string += r, q = !1) : (ja ? x("Incomplete Octal sequence", c) : ia ? x("Incomplete hexidecimal sequence", c) : Y ? x("Incomplete unicode sequence", c) : ha && x("Incomplete long unicode sequence", c), d = 1);
          } else {
            if (q) {
              if (ja) {
                if (3 > Q && 48 <= c && 57 >= c) {
                  H *= 8, H += c - 48, Q++, 3 === Q && (b.string += String.fromCodePoint(H), q = ja = !1);
                } else {
                  if (255 < H) {
                    x("(escaped character, parsing octal escape val=%d) fault while parsing", c);
                    d = -1;
                    break;
                  }
                  b.string += String.fromCodePoint(H);
                  q = ja = !1;
                }
              } else {
                if (ha) {
                  125 == c ? (b.string += String.fromCodePoint(H), q = Y = ha = !1) : (H *= 16, 48 <= c && 57 >= c ? H += c - 48 : 65 <= c && 70 >= c ? H += c - 65 + 10 : 97 <= c && 102 >= c ? H += c - 97 + 10 : (x("(escaped character, parsing hex of \\u)", c), d = -1, q = ha = !1));
                } else {
                  if (ia || Y) {
                    if (0 === Q && 123 === c) {
                      ha = !0;
                      continue;
                    }
                    if (2 > Q || Y && 4 > Q) {
                      H *= 16;
                      if (48 <= c && 57 >= c) {
                        H += c - 48;
                      } else {
                        if (65 <= c && 70 >= c) {
                          H += c - 65 + 10;
                        } else {
                          if (97 <= c && 102 >= c) {
                            H += c - 97 + 10;
                          } else {
                            x(Y ? "(escaped character, parsing hex of \\u)" : "(escaped character, parsing hex of \\x)", c);
                            d = -1;
                            q = ia = !1;
                            continue;
                          }
                        }
                      }
                      Q++;
                      Y ? 4 == Q && (b.string += String.fromCodePoint(H), q = Y = !1) : 2 == Q && (b.string += String.fromCodePoint(H), q = ia = !1);
                      continue;
                    }
                  }
                  switch(c) {
                    case 13:
                      pa = !0;
                      T = 1;
                      continue;
                    case 10:
                    case 2028:
                    case 2029:
                      E++;
                      break;
                    case 116:
                      b.string += "\t";
                      break;
                    case 98:
                      b.string += "\b";
                      break;
                    case 110:
                      b.string += "\n";
                      break;
                    case 114:
                      b.string += "\r";
                      break;
                    case 102:
                      b.string += "\f";
                      break;
                    case 48:
                    case 49:
                    case 50:
                    case 51:
                      ja = !0;
                      H = c - 48;
                      Q = 1;
                      continue;
                    case 120:
                      ia = !0;
                      H = Q = 0;
                      continue;
                    case 117:
                      Y = !0;
                      H = Q = 0;
                      continue;
                    default:
                      b.string += r;
                  }
                  q = !1;
                }
              }
            } else {
              92 === c ? q ? (b.string += "\\", q = !1) : q = !0 : pa ? (pa = !1, 10 == c ? (E++, T = 1, q = !1) : (E++, T = 1)) : b.string += r;
            }
          }
        }
        return d;
      }
      function aa() {
        for (var a; (a = t) < N.length;) {
          r = N.charAt(a);
          var c = N.codePointAt(t++);
          65536 <= c && (x("fault while parsing number;", c), r += N.charAt(t), t++);
          if (95 != c) {
            if (T++, 48 <= c && 57 >= c) {
              X && (oa = !0), b.string += r;
            } else {
              if (45 == c || 43 == c) {
                0 == b.string.length || X && !O && !oa ? (b.string += r, O = !0) : (b.string += r, R = !0);
              } else {
                if (58 == c && R) {
                  b.string += r, R = !0;
                } else {
                  if (84 == c && R) {
                    b.string += r, R = !0;
                  } else {
                    if (90 == c && R) {
                      b.string += r, R = !0;
                    } else {
                      if (46 == c) {
                        if (fa || G || X) {
                          B = !1;
                          x("fault while parsing number;", c);
                          break;
                        } else {
                          b.string += r, fa = !0;
                        }
                      } else {
                        if (110 == c) {
                          ka = !0;
                          break;
                        } else {
                          if (120 == c || 98 == c || 111 == c || 88 == c || 66 == c || 79 == c) {
                            if (G || "0" != b.string) {
                              B = !1;
                              x("fault while parsing number;", c);
                              break;
                            } else {
                              G = !0, b.string += r;
                            }
                          } else {
                            if (101 == c || 69 == c) {
                              if (X) {
                                B = !1;
                                x("fault while parsing number;", c);
                                break;
                              } else {
                                b.string += r, X = !0;
                              }
                            } else {
                              32 == c || 13 == c || 10 == c || 9 == c || 65279 == c || 44 == c || 125 == c || 93 == c || 58 == c ? t = a : n && (B = !1, x("fault while parsing number;", c));
                              break;
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
        n || t != N.length ? (ba = !1, b.value_type = 5, 0 == k && (M = !0)) : ba = !0;
      }
      function ca() {
        var c = null, e = {};
        0 < d && 29 > d && J();
        if (0 == k) {
          if (29 == d && b.string.length) {
            v.get(b.string) ? b.className = b.string : W.get(b.string) && (b.className = b.string);
            if (c = na.find(function(a) {
              return a.name === b.string;
            })) {
              e = Object.assign(e, c.protoObject);
              Object.setPrototypeOf(e, Object.getPrototypeOf(c.protoObject));
              var f = 6;
            } else {
              na.push(c = {name:b.string, protoObject:A[b.string] || Object.create({}), fields:[]}), f = 5;
            }
            d = 0;
          } else {
            f = 3, d = 29;
          }
        } else {
          if (29 == d || 1 === k || 4 === k) {
            0 != d ? (v.get(b.string) ? b.className = b.string : W.get(b.string) && (b.className = b.string), (c = na.find(function(a) {
              return a.name === b.string;
            })) || x("Referenced class " + b.string + " has not been defined", h), e = Object.assign(e, c.protoObject), Object.setPrototypeOf(e, Object.getPrototypeOf(c.protoObject)), f = 6) : f = 3, d = 0;
          } else {
            if (3 == k && 0 == d) {
              return x("fault while parsing; getting field name unexpected ", h), B = !1;
            }
            f = 3;
          }
        }
        var g = a();
        b.value_type = 6;
        0 === k ? D = e : 1 == k ? -1 == p && K.push(e) : 4 == k && (D[b.name] = e);
        g.context = k;
        g.elements = D;
        g.element_array = K;
        g.name = b.name;
        g.current_class = z;
        g.current_class_field = L;
        g.arrayType = -1 == p ? -3 : p;
        g.className = b.className;
        b.className = null;
        z = c;
        L = 0;
        D = e;
        I || (I = D);
        w.push(g);
        V();
        k = f;
        return !0;
      }
      function da() {
        0 < d && 29 > d && J();
        if (29 == d && b.string.length) {
          var c = S.findIndex(function(a) {
            return a === b.string;
          });
          0 <= c ? (d = 0, p = c) : "ref" === b.string ? p = -2 : v.get(b.string) ? b.className = b.string : W.get(b.string) ? b.className = b.string : x("Unknown type specified for array:" + b.string, h);
        } else {
          if (3 == k || 29 == d || 30 == d) {
            return x("Fault while parsing; while getting field name unexpected", h), B = !1;
          }
        }
        c = a();
        b.value_type = 13;
        var e = [];
        0 == k ? K = e : 1 == k ? -1 == p && K.push(e) : 4 == k && (D[b.name] = e);
        c.context = k;
        c.elements = D;
        c.element_array = K;
        c.name = b.name;
        c.current_class = z;
        c.current_class_field = L;
        c.arrayType = -1 == p ? -3 : p;
        c.className = b.className;
        p = -1;
        z = b.className = null;
        L = 0;
        K = e;
        I || (I = K);
        w.push(c);
        V();
        k = 1;
        return !0;
      }
      var ma = 0;
      if (!B) {
        return -1;
      }
      if (c && c.length) {
        var U = e();
        U.buf = c;
        l.push(U);
      } else {
        ba && (ba = !1, b.value_type = 5, 0 == k && (M = !0), ma = 1);
      }
      for (; B && (U = l.shift());) {
        t = U.n;
        var N = U.buf;
        if (F) {
          var m = sa(ta);
          0 > m ? B = !1 : 0 < m && (F = !1, B && (b.value_type = 4));
        }
        for (ba && aa(); !M && B && t < N.length;) {
          r = N.charAt(t);
          var h = N.codePointAt(t++);
          65536 <= h && (r += N.charAt(t), t++);
          T++;
          if (P) {
            if (1 == P) {
              if (42 == h) {
                P = 3;
                continue;
              }
              47 != h ? (x("fault while parsing;", h), B = !1) : P = 2;
              continue;
            }
            if (2 == P) {
              10 == h && (P = 0);
              continue;
            }
            if (3 == P) {
              42 == h && (P = 4);
              continue;
            }
            if (4 == P) {
              47 == h ? P = 0 : 42 != h && (P = 3);
              continue;
            }
          }
          switch(h) {
            case 47:
              P || (P = 1);
              break;
            case 123:
              ca();
              break;
            case 91:
              da();
              break;
            case 58:
              3 == k || 5 == k ? 0 != d && 29 != d && 30 != d ? (B = FALSE, thorwError("fault while parsing; unquoted keyword used as object field name (state:" + d + ")", h)) : (d = 0, b.name = b.string, b.string = "", k = 4, b.value_type = 0) : (1 == k ? x("(in array, got colon out of string):parsing fault;", h) : x("(outside any object, got colon out of string):parsing fault;", h), B = !1);
              break;
            case 125:
              31 == d && (d = 0);
              5 == k ? z ? (b.string && (z.protoObject[b.string] = void 0, z.fields.push(b.string)), V(), m = w.pop(), d = k = 0, b.name = m.name, D = m.elements, K = m.element_array, z = m.current_class, L = m.current_class_field, p = m.arrayType, b.className = m.className, I = null, ea.push(m)) : x("State error; gathering class fields, and lost the class", h) : 3 == k || 6 == k ? (0 != b.value_type && (z && (b.name = z.fields[L++]), la()), b.value_type = 6, b.contains = D, b.string = "", m = w.pop(), 
              k = m.context, b.name = m.name, D = m.elements, K = m.element_array, z = m.current_class, L = m.current_class_field, p = m.arrayType, b.className = m.className, ea.push(m), 0 == k && (M = !0)) : 4 == k ? (0 != b.value_type && la(), b.value_type = 6, b.contains = D, m = w.pop(), b.name = m.name, k = m.context, b.name = m.name, D = m.elements, z = m.current_class, L = m.current_class_field, p = m.arrayType, b.className = m.className, K = m.element_array, ea.push(m), 0 == k && (M = !0)) : 
              (x("Fault while parsing; unexpected", h), B = !1);
              u = !1;
              break;
            case 93:
              31 == d && (d = 0);
              1 == k ? (0 != b.value_type && Z(), b.contains = K, m = w.pop(), b.name = m.name, k = m.context, D = m.elements, z = m.current_class, L = m.current_class_field, p = m.arrayType, b.className = m.className, K = m.element_array, ea.push(m), b.value_type = 13, 0 == k && (M = !0)) : (x("bad context " + k + "; fault while parsing", h), B = !1);
              u = !1;
              break;
            case 44:
              if (31 == d || 29 == d) {
                d = 0;
              }
              5 == k ? z ? (z.protoObject[b.string] = void 0, z.fields.push(b.string), b.string = "", d = 29) : x("State error; gathering class fields, and lost the class", h) : 3 == k ? z ? (b.name = z.fields[L++], 0 != b.value_type && (la(), V())) : x("State error; gathering class values, and lost the class", h) : 6 == k ? z ? (b.name = z.fields[L++], 0 != b.value_type && (la(), V())) : x("State error; gathering class values, and lost the class", h) : 1 == k ? (0 == b.value_type && (b.value_type = 
              12), 0 != b.value_type && (Z(), V())) : 4 == k ? (k = 3, 0 != b.value_type && (la(), V()), d = 0) : (B = !1, x("bad context; excessive commas while parsing;", h));
              u = !1;
              break;
            default:
              if (0 == k || 4 == k && 29 == d || 3 == k || 5 == k) {
                switch(h) {
                  case 96:
                  case 34:
                  case 39:
                    0 == d || 29 == d ? (b.string.length && (b.className = b.string, b.string = ""), sa(h) ? b.value_type = 4 : (ta = h, F = !0)) : x("fault while parsing; quote not at start of field name", h);
                    break;
                  case 10:
                    E++, T = 1;
                  case 13:
                  case 32:
                  case 9:
                  case 65279:
                    if (31 === d) {
                      d = 0;
                      0 === k && (M = !0);
                      break;
                    }
                    0 === d || 30 === d ? 0 == k && b.value_type && (M = !0) : 29 === d ? 0 === k ? (d = 0, M = !0) : b.string.length && (d = 30) : (B = !1, x("fault while parsing; whitepsace unexpected", h));
                    break;
                  default:
                    0 == d && (48 <= h && 57 >= h || 43 == h || 46 == h || 45 == h) ? (fa = oa = O = ka = R = X = G = !1, b.string = r, U.n = t, aa()) : (30 === d && (B = !1, x("fault while parsing; character unexpected", h)), 0 === d && (d = 29, b.value_type = 4), b.string += r);
                }
              } else {
                switch(h) {
                  case 96:
                  case 34:
                  case 39:
                    sa(h) ? (b.value_type = 4, d = 31) : (ta = h, F = !0);
                    break;
                  case 10:
                    E++, T = 1;
                  case 32:
                  case 9:
                  case 13:
                  case 2028:
                  case 2029:
                  case 65279:
                    if (31 == d) {
                      d = 0;
                      0 == k && (M = !0);
                      break;
                    }
                    0 != d && 30 != d && (29 == d ? b.string.length && (d = 30) : (B = !1, x("fault parsing whitespace", h)));
                    break;
                  case 116:
                    0 == d ? d = 1 : 27 == d ? d = 28 : J(h);
                    break;
                  case 114:
                    1 == d ? d = 2 : J(h);
                    break;
                  case 117:
                    2 == d ? d = 3 : 9 == d ? d = 10 : 0 == d ? d = 12 : J(h);
                    break;
                  case 101:
                    3 == d ? (b.value_type = 2, d = 31) : 8 == d ? (b.value_type = 3, d = 31) : 14 == d ? d = 15 : 18 == d ? d = 19 : J(h);
                    break;
                  case 110:
                    0 == d ? d = 9 : 12 == d ? d = 13 : 17 == d ? d = 18 : 22 == d ? d = 23 : 25 == d ? d = 26 : J(h);
                    break;
                  case 100:
                    13 == d ? d = 14 : 19 == d ? (b.value_type = -1, d = 31) : J(h);
                    break;
                  case 105:
                    16 == d ? d = 17 : 24 == d ? d = 25 : 26 == d ? d = 27 : J(h);
                    break;
                  case 108:
                    10 == d ? d = 11 : 11 == d ? (b.value_type = 1, d = 31) : 6 == d ? d = 7 : J(h);
                    break;
                  case 102:
                    0 == d ? d = 5 : 15 == d ? d = 16 : 23 == d ? d = 24 : J(h);
                    break;
                  case 97:
                    5 == d ? d = 6 : 20 == d ? d = 21 : J(h);
                    break;
                  case 115:
                    7 == d ? d = 8 : J(h);
                    break;
                  case 73:
                    0 == d ? d = 22 : J(h);
                    break;
                  case 78:
                    0 == d ? d = 20 : 21 == d ? (b.value_type = u ? 7 : 8, u = !1, d = 31) : J(h);
                    break;
                  case 121:
                    28 == d ? (b.value_type = u ? 9 : 10, u = !1, d = 31) : J(h);
                    break;
                  case 45:
                    0 == d ? u = !u : J(h);
                    break;
                  default:
                    0 == d && (48 <= h && 57 >= h || 43 == h || 46 == h || 45 == h) ? (fa = oa = O = ka = R = X = G = !1, b.string = r, U.n = t, aa()) : J(h);
                }
              }
          }
          if (M) {
            31 == d && (d = 0);
            break;
          }
        }
        t == N.length ? (qa.push(U), F || ba || 3 == k ? ma = 0 : 0 != k || 0 == b.value_type && !C || (M = !0, ma = 1)) : (U.n = t, l.unshift(U), ma = 2);
        if (M) {
          I = null;
          break;
        }
      }
      if (!B) {
        return -1;
      }
      M && 0 != b.value_type && (C = ra(), u = !1, b.string = "", b.value_type = 0);
      M = !1;
      return ma;
    }};
  };
  var ca = [Object.freeze(JSOX.begin())], ua = 0;
  JSOX.parse = function(a, c) {
    var b = ua++;
    ca.length <= b && ca.push(Object.freeze(JSOX.begin()));
    b = ca[b];
    "string" !== typeof a && (a = String(a));
    b.reset();
    if (0 < b._write(a, !0)) {
      return b = b.value(), "function" === typeof c && function r(b, a) {
        var e, d = b[a];
        if (d && "object" === typeof d) {
          for (e in d) {
            if (Object.prototype.hasOwnProperty.call(d, e)) {
              var f = r(d, e);
              void 0 !== f ? d[e] = f : delete d[e];
            }
          }
        }
        return c.call(b, a, d);
      }({"":b}, ""), ua--, b;
    }
  };
  var va = function() {
    return this && this.valueOf();
  };
  n.set(Object.prototype, {external:!1, name:Object.prototype.constructor.name, cb:null});
  n.set(Date.prototype, {external:!1, name:"Date", cb:function() {
    var a = -this.getTimezoneOffset(), c = 0 <= a ? "+" : "-", b = function(b) {
      b = Math.floor(Math.abs(b));
      return (10 > b ? "0" : "") + b;
    };
    return [this.getFullYear(), "-", b(this.getMonth() + 1), "-", b(this.getDate()), "T", b(this.getHours()), ":", b(this.getMinutes()), ":", b(this.getSeconds()), c, b(a / 60), ":", b(a % 60)].join("");
  }});
  n.set(Boolean.prototype, {external:!1, name:"Boolean", cb:va});
  n.set(Number.prototype, {external:!1, name:"Number", cb:function() {
    return isNaN(this) ? "NaN" : isFinite(this) ? String(this) : 0 > this ? "-Infinity" : "Infinity";
  }});
  n.set(String.prototype, {external:!1, name:"String", cb:function() {
    return '"' + JSOX.escape(va.apply(this)) + '"';
  }});
  "function" === typeof BigInt && n.set(BigInt.prototype, {external:!1, name:"BigInt", cb:function() {
    return this + "n";
  }});
  n.set(ArrayBuffer.prototype, {external:!0, name:"ab", cb:function() {
    return "[" + c(this) + "]";
  }});
  n.set(Uint8Array.prototype, {external:!0, name:"u8", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Uint8ClampedArray.prototype, {external:!0, name:"uc8", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Int8Array.prototype, {external:!0, name:"s8", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Uint16Array.prototype, {external:!0, name:"u16", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Int16Array.prototype, {external:!0, name:"s16", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Uint32Array.prototype, {external:!0, name:"u32", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Int32Array.prototype, {external:!0, name:"s32", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  "undefined" != typeof Uint64Array && n.set(Uint64Array.prototype, {external:!0, name:"u64", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  "undefined" != typeof Int64Array && n.set(Int64Array.prototype, {external:!0, name:"s64", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Float32Array.prototype, {external:!0, name:"f32", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Float64Array.prototype, {external:!0, name:"f64", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Float64Array.prototype, {external:!0, name:"f64", cb:function() {
    return "[" + c(this.buffer) + "]";
  }});
  n.set(Map.prototype, Z = {external:!0, name:"map", cb:null});
  W.set("map", function() {
    var a = new Map;
    for (key in this) {
      a.set(key, this[key]);
    }
    return a;
  });
  n.set(Array.prototype, G = {external:!1, name:Array.prototype.constructor.name, cb:null});
  JSOX.registerToJSOX = function(a, c, b) {
    if (c.prototype && c.prototype === Object.prototype) {
      c = Object.keys(c).toString();
      if (aa.get(c)) {
        throw Error("Existing toJSOX has been registered for object type");
      }
      aa.set(c, {external:!0, name:a, cb:b});
    } else {
      if (n.get(c)) {
        throw Error("Existing toJSOX has been registered for prototype");
      }
      n.set(c, {external:!0, name:a || b.constructor.name, cb:b});
    }
  };
  JSOX.registerFromJSOX = function(a, c) {
    if (W.get(a)) {
      throw Error("Existing fromJSOX has been registered for prototype");
    }
    W.set(a, c);
  };
  JSOX.registerToFrom = function(a, c, b, e) {
    JSOX.registerToJSOX(a, c, b);
    JSOX.registerFromJSOX(a, e);
  };
  JSOX.stringifier = function() {
    function a(a) {
      if (null !== a) {
        var b = g.get(a);
        if (b) {
          return b;
        }
        g.set(a, _JSON.stringify(r));
      }
    }
    function c(a, b) {
      var c, d = Object.getPrototypeOf(a);
      if (c = e.find(function(a) {
        if (a.proto && a.proto === d) {
          return !0;
        }
      })) {
        return c;
      }
      if (b) {
        b = b.map(function(a) {
          if ("string" === typeof a) {
            return a;
          }
        });
        var f = b.toString();
      } else {
        f = Object.keys(a).toString();
      }
      return c = e.find(function(a) {
        if (a.tag === f) {
          return !0;
        }
      });
    }
    function b(b, u, C) {
      function B(a) {
        return isNaN(a) ? a in da || /([0-9\-])/.test(a[0]) || /((\n|\r|\t)|[ \{\}\(\)<>!\+\-\*\/\.:, ])/.test(a) ? f + JSOX.escape(a) + f : a : ["'", a.toString(), "'"].join("");
      }
      function t(b, f) {
        function g() {
          for (var a = [], b = r.length, c = 0; c < this.length; c += 1) {
            r[b] = c, a[c] = t(c, this) || "null";
          }
          r.splice(b, 1);
          return 0 === a.length ? "[]" : w ? ["[\n", w, a.join(",\n" + w), "\n", z, "]"].join("") : "[" + a.join(",") + "]";
        }
        function k() {
          for (var a = {tmp:null}, b = "{", c = !0, d = $jscomp.makeIterator(this), e = d.next(); !e.done; e = d.next()) {
            var f = $jscomp.makeIterator(e.value);
            e = f.next().value;
            f = f.next().value;
            a.tmp = f;
            b += (c ? "" : ",") + B(e) + ":" + t("tmp", a);
            c = !1;
          }
          return b + "}";
        }
        y && (G.cb = g, Z.cb = k, y = !1);
        G.cb = g;
        var u, C, z = w, A = r.length, l = f[b], p = void 0 !== l && null !== l && (v.get(Object.getPrototypeOf(l)) || n.get(Object.getPrototypeOf(l)) || null);
        var F = !p && void 0 !== l && null !== l && (d.get(Object.keys(l).toString()) || aa.get(Object.keys(l).toString()) || null);
        var I = p && p.cb || F && F.cb;
        if (void 0 !== l && null !== l && "function" === typeof I) {
          w += L;
          if ("object" === typeof l && (C = a(l))) {
            return "ref" + C;
          }
          l = I.apply(l);
          w = z;
        } else {
          if ("object" === typeof l && (C = a(l))) {
            return "ref" + C;
          }
        }
        "function" === typeof E && (l = E.call(f, b, l));
        switch(typeof l) {
          case "string":
          case "number":
            var q = "";
            "" === b && (q = e.map(function(a) {
              return a.name + "{" + a.fields.join(",") + "}";
            }).join(w ? "\n" : "") + (w ? "\n" : ""));
            return p && p.external ? q + p.name + l : F && F.external ? q + F.name + l : q + l;
          case "boolean":
          case "null":
            return String(l);
          case "object":
            if (C) {
              return "ref" + C;
            }
            if (!l) {
              return "null";
            }
            w += L;
            F = null;
            I = [];
            if (E && "object" === typeof E) {
              var D = E.length;
              F = c(l, E);
              for (u = 0; u < D; u += 1) {
                "string" === typeof E[u] && (q = E[u], r[A] = q, (C = t(q, l)) && (F ? I.push(C) : I.push(B(q) + (w ? ": " : ":") + C)));
              }
            } else {
              F = c(l);
              u = [];
              for (q in l) {
                if (Object.prototype.hasOwnProperty.call(l, q)) {
                  for (D = 0; D < u.length; D++) {
                    if (u[D] > q) {
                      u.splice(D, 0, q);
                      break;
                    }
                  }
                  D == u.length && u.push(q);
                }
              }
              for (D = 0; D < u.length; D++) {
                q = u[D], Object.prototype.hasOwnProperty.call(l, q) && (r[A] = q, (C = t(q, l)) && (F ? I.push(C) : I.push(B(q) + (w ? ": " : ":") + C)));
              }
            }
            r.splice(A, 1);
            l = "" === b ? e.map(function(a) {
              return a.name + "{" + a.fields.join(",") + "}";
            }).join(w ? "\n" : "") + (w ? "\n" : "") : "";
            p && p.external && (l = "" === b ? l + p.name : l + '"' + p.name + '"');
            p = null;
            F && (p = B(F.name));
            C = l + (0 === I.length ? "{}" : w ? (F ? p : "") + "{\n" + w + I.join(",\n" + w) + "\n" + z + "}" : (F ? p : "") + "{" + I.join(",") + "}");
            w = z;
            return C;
        }
      }
      if (void 0 === b) {
        return "undefined";
      }
      if (null !== b) {
        var y = !0, w, E;
        var A = typeof C;
        var z = typeof u;
        var L = w = "";
        if ("number" === A) {
          for (A = 0; A < C; A += 1) {
            L += " ";
          }
        } else {
          "string" === A && (L = C);
        }
        if ((E = u) && "function" !== z && ("object" !== z || "number" !== typeof u.length)) {
          throw Error("JSOX.stringify");
        }
        r = [];
        g = new WeakMap;
        return t("", {"":b});
      }
    }
    var e = [], f = '"', g = new WeakMap, r = [], v = new WeakMap, d = new Map;
    return {defineClass:function(a, b) {
      var c;
      e.push(c = {name:a, tag:Object.keys(b).toString(), proto:Object.getPrototypeOf(b), fields:Object.keys(b)});
      for (var d = 1; d < c.fields.length; d++) {
        if (c.fields[d] < c.fields[d - 1]) {
          var f = c.fields[d - 1];
          c.fields[d - 1] = c.fields[d];
          c.fields[d] = f;
          1 < d && (d -= 2);
        }
      }
      c.proto === Object.getPrototypeOf({}) && (c.proto = null);
    }, stringify:function(a, c, d) {
      return b(a, c, d);
    }, setQuote:function(a) {
      f = a;
    }, registerToJSOX:function(a, b, c) {
      if (b.prototype && b.prototype !== Object.prototype) {
        if (v.get(b)) {
          throw Error("Existing toJSOX has been registered for prototype");
        }
        v.set(b, {external:!0, name:a || c.constructor.name, cb:c});
      } else {
        b = Object.keys(b).toString();
        if (d.get(b)) {
          throw Error("Existing toJSOX has been registered for object type");
        }
        d.set(b, {external:!0, name:a, cb:c});
      }
    }};
  };
  var O = {"~":-1, "=":-1, $:62, _:63, "+":62, "-":62, ".":62, "/":63, ",":63};
  for (A = 0; 256 > A; A++) {
    64 > A && (O["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[A]] = A);
  }
  Object.freeze(O);
  JSOX.stringify = function(a, c, b) {
    return JSOX.stringifier().stringify(a, c, b);
  };
  [[0, 384, [16767487, 16739071, 130048, 3670016, 0, 16777208, 16777215, 8388607, 8388608, 0, 128, 0, 0, 0, 0, 0]]].map(function(a) {
    return {firstChar:a[0], lastChar:a[1], bits:a[2]};
  });
}
privateizeEverything();

